|
|
1.1 root 1: #ifndef _IDE_MODES_H
2: #define _IDE_MODES_H
3: /*
4: * linux/drivers/block/ide_modes.h
5: *
6: * Copyright (C) 1996 Linus Torvalds, Igor Abramov, and Mark Lord
7: */
8:
9: #include <linux/config.h>
10:
11: /*
12: * Shared data/functions for determining best PIO mode for an IDE drive.
13: * Most of this stuff originally lived in cmd640.c, and changes to the
14: * ide_pio_blacklist[] table should be made with EXTREME CAUTION to avoid
15: * breaking the fragile cmd640.c support.
16: */
17:
18: #if defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS)
19:
20: /*
21: * Standard (generic) timings for PIO modes, from ATA2 specification.
22: * These timings are for access to the IDE data port register *only*.
23: * Some drives may specify a mode, while also specifying a different
24: * value for cycle_time (from drive identification data).
25: */
26: typedef struct ide_pio_timings_s {
27: int setup_time; /* Address setup (ns) minimum */
28: int active_time; /* Active pulse (ns) minimum */
29: int cycle_time; /* Cycle time (ns) minimum = (setup + active + recovery) */
30: } ide_pio_timings_t;
31:
32: typedef struct ide_pio_data_s {
33: byte pio_mode;
34: byte use_iordy;
35: byte overridden;
36: byte blacklisted;
37: unsigned int cycle_time;
38: } ide_pio_data_t;
39:
40: #ifndef _IDE_C
41:
42: int ide_scan_pio_blacklist (char *model);
43: byte ide_get_best_pio_mode (ide_drive_t *drive, byte mode_wanted, byte max_mode, ide_pio_data_t *d);
44: extern const ide_pio_timings_t ide_pio_timings[6];
45:
46: #else /* _IDE_C */
47:
48: const ide_pio_timings_t ide_pio_timings[6] = {
49: { 70, 165, 600 }, /* PIO Mode 0 */
50: { 50, 125, 383 }, /* PIO Mode 1 */
51: { 30, 100, 240 }, /* PIO Mode 2 */
52: { 30, 80, 180 }, /* PIO Mode 3 with IORDY */
53: { 25, 70, 120 }, /* PIO Mode 4 with IORDY */
54: { 20, 50, 100 } /* PIO Mode 5 with IORDY (nonstandard) */
55: };
56:
57: /*
58: * Black list. Some drives incorrectly report their maximal PIO mode,
59: * at least in respect to CMD640. Here we keep info on some known drives.
60: */
61: static struct ide_pio_info {
62: const char *name;
63: int pio;
64: } ide_pio_blacklist [] = {
65: /* { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
66: { "Conner Peripherals 540MB - CFS540A", 3 },
67:
68: { "WDC AC2700", 3 },
69: { "WDC AC2540", 3 },
70: { "WDC AC2420", 3 },
71: { "WDC AC2340", 3 },
72: { "WDC AC2250", 0 },
73: { "WDC AC2200", 0 },
74: { "WDC AC21200", 4 },
75: { "WDC AC2120", 0 },
76: { "WDC AC2850", 3 },
77: { "WDC AC1270", 3 },
78: { "WDC AC1170", 1 },
79: { "WDC AC1210", 1 },
80: { "WDC AC280", 0 },
81: /* { "WDC AC21000", 4 }, */
82: { "WDC AC31000", 3 },
83: { "WDC AC31200", 3 },
84: /* { "WDC AC31600", 4 }, */
85:
86: { "Maxtor 7131 AT", 1 },
87: { "Maxtor 7171 AT", 1 },
88: { "Maxtor 7213 AT", 1 },
89: { "Maxtor 7245 AT", 1 },
90: { "Maxtor 7345 AT", 1 },
91: { "Maxtor 7546 AT", 3 },
92: { "Maxtor 7540 AV", 3 },
93:
94: { "SAMSUNG SHD-3121A", 1 },
95: { "SAMSUNG SHD-3122A", 1 },
96: { "SAMSUNG SHD-3172A", 1 },
97:
98: /* { "ST51080A", 4 },
99: * { "ST51270A", 4 },
100: * { "ST31220A", 4 },
101: * { "ST31640A", 4 },
102: * { "ST32140A", 4 },
103: * { "ST3780A", 4 },
104: */
105: { "ST5660A", 3 },
106: { "ST3660A", 3 },
107: { "ST3630A", 3 },
108: { "ST3655A", 3 },
109: { "ST3391A", 3 },
110: { "ST3390A", 1 },
111: { "ST3600A", 1 },
112: { "ST3290A", 0 },
113: { "ST3144A", 0 },
114:
115: { "QUANTUM ELS127A", 0 },
116: { "QUANTUM ELS170A", 0 },
117: { "QUANTUM LPS240A", 0 },
118: { "QUANTUM LPS210A", 3 },
119: { "QUANTUM LPS270A", 3 },
120: { "QUANTUM LPS365A", 3 },
121: { "QUANTUM LPS540A", 3 },
122: { "QUANTUM LIGHTNING 540A", 3 },
123: { "QUANTUM LIGHTNING 730A", 3 },
124: { "QUANTUM FIREBALL", 3 }, /* For models 540/640/1080/1280 */
125: /* 1080A works fine in mode4 with triton */
126: { NULL, 0 }
127: };
128:
129: /*
130: * This routine searches the ide_pio_blacklist for an entry
131: * matching the start/whole of the supplied model name.
132: *
133: * Returns -1 if no match found.
134: * Otherwise returns the recommended PIO mode from ide_pio_blacklist[].
135: */
136: int ide_scan_pio_blacklist (char *model)
137: {
138: struct ide_pio_info *p;
139:
140: for (p = ide_pio_blacklist; p->name != NULL; p++) {
141: if (strncmp(p->name, model, strlen(p->name)) == 0)
142: return p->pio;
143: }
144: return -1;
145: }
146:
147: /*
148: * This routine returns the recommended PIO settings for a given drive,
149: * based on the drive->id information and the ide_pio_blacklist[].
150: * This is used by most chipset support modules when "auto-tuning".
151: */
152:
153: /*
154: * Drive PIO mode auto selection
155: */
156: byte ide_get_best_pio_mode (ide_drive_t *drive, byte mode_wanted, byte max_mode, ide_pio_data_t *d)
157: {
158: int pio_mode;
159: int cycle_time = 0;
160: int use_iordy = 0;
161: struct hd_driveid* id = drive->id;
162: int overridden = 0;
163: int blacklisted = 0;
164:
165: if (mode_wanted != 255) {
166: pio_mode = mode_wanted;
167: } else if (!drive->id) {
168: pio_mode = 0;
169: } else if ((pio_mode = ide_scan_pio_blacklist(id->model)) != -1) {
170: overridden = 1;
171: blacklisted = 1;
172: use_iordy = (pio_mode > 2);
173: } else {
174: pio_mode = id->tPIO;
175: if (pio_mode > 2) { /* 2 is maximum allowed tPIO value */
176: pio_mode = 2;
177: overridden = 1;
178: }
179: if (id->field_valid & 2) { /* drive implements ATA2? */
180: if (id->capability & 8) { /* drive supports use_iordy? */
181: use_iordy = 1;
182: cycle_time = id->eide_pio_iordy;
183: if (id->eide_pio_modes & 7) {
184: overridden = 0;
185: if (id->eide_pio_modes & 4)
186: pio_mode = 5;
187: else if (id->eide_pio_modes & 2)
188: pio_mode = 4;
189: else
190: pio_mode = 3;
191: }
192: } else {
193: cycle_time = id->eide_pio;
194: }
195: }
196:
197: /*
198: * Conservative "downgrade" for all pre-ATA2 drives
199: */
200: if (pio_mode && pio_mode < 4) {
201: pio_mode--;
202: overridden = 1;
203: #if 0
204: use_iordy = (pio_mode > 2);
205: #endif
206: if (cycle_time && cycle_time < ide_pio_timings[pio_mode].cycle_time)
207: cycle_time = 0; /* use standard timing */
208: }
209: }
210: if (pio_mode > max_mode) {
211: pio_mode = max_mode;
212: cycle_time = 0;
213: }
214: if (d) {
215: d->pio_mode = pio_mode;
216: d->cycle_time = cycle_time ? cycle_time : ide_pio_timings[pio_mode].cycle_time;
217: d->use_iordy = use_iordy;
218: d->overridden = overridden;
219: d->blacklisted = blacklisted;
220: }
221: return pio_mode;
222: }
223:
224: #endif /* _IDE_C */
225: #endif /* defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS) */
226: #endif /* _IDE_MODES_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.