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 /*
10 * Shared data/functions for determining best PIO mode for an IDE drive.
11 * Most of this stuff originally lived in cmd640.c, and changes to the
12 * ide_pio_blacklist[] table should be made with EXTREME CAUTION to avoid
13 * breaking the fragile cmd640.c support.
14 */
15
16 #if defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS)
17
18 #ifndef _IDE_C
19
20 int ide_scan_pio_blacklist (char *model);
21 unsigned int ide_get_best_pio_mode (ide_drive_t *drive);
22
23 #else /* _IDE_C */
24
25 /*
26 * Black list. Some drives incorrectly report their maximal PIO mode,
27 * at least in respect to CMD640. Here we keep info on some known drives.
28 */
29 static struct ide_pio_info {
30 const char *name;
31 int pio;
32 } ide_pio_blacklist [] = {
33 /* { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
34
35 { "WDC AC2700", 3 },
36 { "WDC AC2540", 3 },
37 { "WDC AC2420", 3 },
38 { "WDC AC2340", 3 },
39 { "WDC AC2250", 0 },
40 { "WDC AC2200", 0 },
41 { "WDC AC2120", 0 },
42 { "WDC AC2850", 3 },
43 { "WDC AC1270", 3 },
44 { "WDC AC1170", 3 },
45 { "WDC AC1210", 1 },
46 { "WDC AC280", 0 },
47 /* { "WDC AC21000", 4 }, */
48 { "WDC AC31000", 3 },
49 /* { "WDC AC21200", 4 }, */
50 { "WDC AC31200", 3 },
51 /* { "WDC AC31600", 4 }, */
52
53 { "Maxtor 7131 AT", 1 },
54 { "Maxtor 7171 AT", 1 },
55 { "Maxtor 7213 AT", 1 },
56 { "Maxtor 7245 AT", 1 },
57 { "Maxtor 7345 AT", 1 },
58 { "Maxtor 7546 AT", 3 },
59 { "Maxtor 7540 AV", 3 },
60
61 { "SAMSUNG SHD-3121A", 1 },
62 { "SAMSUNG SHD-3122A", 1 },
63 { "SAMSUNG SHD-3172A", 1 },
64
65 /* { "ST51080A", 4 },
66 * { "ST51270A", 4 },
67 * { "ST31220A", 4 },
68 * { "ST31640A", 4 },
69 * { "ST32140A", 4 },
70 * { "ST3780A", 4 },
71 */
72 { "ST5660A", 3 },
73 { "ST3660A", 3 },
74 { "ST3630A", 3 },
75 { "ST3655A", 3 },
76 { "ST3391A", 3 },
77 { "ST3390A", 1 },
78 { "ST3600A", 1 },
79 { "ST3290A", 0 },
80 { "ST3144A", 0 },
81
82 { "QUANTUM ELS127A", 0 },
83 { "QUANTUM ELS170A", 0 },
84 { "QUANTUM LPS240A", 0 },
85 { "QUANTUM LPS210A", 3 },
86 { "QUANTUM LPS270A", 3 },
87 { "QUANTUM LPS365A", 3 },
88 { "QUANTUM LPS540A", 3 },
89 { "QUANTUM FIREBALL", 3 }, /* For models 540/640/1080/1280 */
90 /* 1080A works fine in mode4 with triton */
91 { NULL, 0 }
92 };
93
94 /*
95 * This routine searches the ide_pio_blacklist for an entry
96 * matching the start/whole of the supplied model name.
97 *
98 * Returns -1 if no match found.
99 * Otherwise returns the recommended PIO mode from ide_pio_blacklist[].
100 */
101 int ide_scan_pio_blacklist (char *model)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
102 {
103 struct ide_pio_info *p;
104
105 for (p = ide_pio_blacklist; p->name != NULL; p++) {
106 if (strncmp(p->name, model, strlen(p->name)) == 0)
107 return p->pio;
108 }
109 return -1;
110 }
111
112 /*
113 * This routine returns the recommended PIO mode for a given drive,
114 * based on the drive->id information and the ide_pio_blacklist[].
115 * This is used by most chipset support modules when "auto-tuning".
116 */
117 unsigned int ide_get_best_pio_mode (ide_drive_t *drive)
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
118 {
119 unsigned int pio = 0;
120 struct hd_driveid *id = drive->id;
121
122 if (id != NULL) {
123 if (HWIF(drive)->chipset != ide_cmd640 && !strcmp("QUANTUM FIREBALL1080A", id->model))
124 pio = 4;
125 else
126 pio = ide_scan_pio_blacklist(id->model);
127 if (pio == -1) {
128 pio = (id->tPIO < 2) ? id->tPIO : 2;
129 if (id->field_valid & 2) {
130 byte modes = id->eide_pio_modes;
131 if (modes & 4) pio = 5;
132 else if (modes & 2) pio = 4;
133 else if (modes & 1) pio = 3;
134 }
135 }
136 }
137 return pio;
138 }
139
140 #endif /* _IDE_C */
141 #endif /* defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS) */
142 #endif /* _IDE_MODES_H */