Commit 24ffbd62583024f85bdba72cd373d050aa1a1b15
1 parent
34c69b601b
Exists in
master
and in
7 other branches
it821x/jmicron: fix return value of {it821x,jmicron}_init_one()
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Showing 2 changed files with 2 additions and 4 deletions Inline Diff
drivers/ide/pci/it821x.c
1 | 1 | ||
2 | /* | 2 | /* |
3 | * linux/drivers/ide/pci/it821x.c Version 0.16 Jul 3 2007 | 3 | * linux/drivers/ide/pci/it821x.c Version 0.16 Jul 3 2007 |
4 | * | 4 | * |
5 | * Copyright (C) 2004 Red Hat <alan@redhat.com> | 5 | * Copyright (C) 2004 Red Hat <alan@redhat.com> |
6 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz | 6 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz |
7 | * | 7 | * |
8 | * May be copied or modified under the terms of the GNU General Public License | 8 | * May be copied or modified under the terms of the GNU General Public License |
9 | * Based in part on the ITE vendor provided SCSI driver. | 9 | * Based in part on the ITE vendor provided SCSI driver. |
10 | * | 10 | * |
11 | * Documentation available from | 11 | * Documentation available from |
12 | * http://www.ite.com.tw/pc/IT8212F_V04.pdf | 12 | * http://www.ite.com.tw/pc/IT8212F_V04.pdf |
13 | * Some other documents are NDA. | 13 | * Some other documents are NDA. |
14 | * | 14 | * |
15 | * The ITE8212 isn't exactly a standard IDE controller. It has two | 15 | * The ITE8212 isn't exactly a standard IDE controller. It has two |
16 | * modes. In pass through mode then it is an IDE controller. In its smart | 16 | * modes. In pass through mode then it is an IDE controller. In its smart |
17 | * mode its actually quite a capable hardware raid controller disguised | 17 | * mode its actually quite a capable hardware raid controller disguised |
18 | * as an IDE controller. Smart mode only understands DMA read/write and | 18 | * as an IDE controller. Smart mode only understands DMA read/write and |
19 | * identify, none of the fancier commands apply. The IT8211 is identical | 19 | * identify, none of the fancier commands apply. The IT8211 is identical |
20 | * in other respects but lacks the raid mode. | 20 | * in other respects but lacks the raid mode. |
21 | * | 21 | * |
22 | * Errata: | 22 | * Errata: |
23 | * o Rev 0x10 also requires master/slave hold the same DMA timings and | 23 | * o Rev 0x10 also requires master/slave hold the same DMA timings and |
24 | * cannot do ATAPI MWDMA. | 24 | * cannot do ATAPI MWDMA. |
25 | * o The identify data for raid volumes lacks CHS info (technically ok) | 25 | * o The identify data for raid volumes lacks CHS info (technically ok) |
26 | * but also fails to set the LBA28 and other bits. We fix these in | 26 | * but also fails to set the LBA28 and other bits. We fix these in |
27 | * the IDE probe quirk code. | 27 | * the IDE probe quirk code. |
28 | * o If you write LBA48 sized I/O's (ie > 256 sector) in smart mode | 28 | * o If you write LBA48 sized I/O's (ie > 256 sector) in smart mode |
29 | * raid then the controller firmware dies | 29 | * raid then the controller firmware dies |
30 | * o Smart mode without RAID doesn't clear all the necessary identify | 30 | * o Smart mode without RAID doesn't clear all the necessary identify |
31 | * bits to reduce the command set to the one used | 31 | * bits to reduce the command set to the one used |
32 | * | 32 | * |
33 | * This has a few impacts on the driver | 33 | * This has a few impacts on the driver |
34 | * - In pass through mode we do all the work you would expect | 34 | * - In pass through mode we do all the work you would expect |
35 | * - In smart mode the clocking set up is done by the controller generally | 35 | * - In smart mode the clocking set up is done by the controller generally |
36 | * but we must watch the other limits and filter. | 36 | * but we must watch the other limits and filter. |
37 | * - There are a few extra vendor commands that actually talk to the | 37 | * - There are a few extra vendor commands that actually talk to the |
38 | * controller but only work PIO with no IRQ. | 38 | * controller but only work PIO with no IRQ. |
39 | * | 39 | * |
40 | * Vendor areas of the identify block in smart mode are used for the | 40 | * Vendor areas of the identify block in smart mode are used for the |
41 | * timing and policy set up. Each HDD in raid mode also has a serial | 41 | * timing and policy set up. Each HDD in raid mode also has a serial |
42 | * block on the disk. The hardware extra commands are get/set chip status, | 42 | * block on the disk. The hardware extra commands are get/set chip status, |
43 | * rebuild, get rebuild status. | 43 | * rebuild, get rebuild status. |
44 | * | 44 | * |
45 | * In Linux the driver supports pass through mode as if the device was | 45 | * In Linux the driver supports pass through mode as if the device was |
46 | * just another IDE controller. If the smart mode is running then | 46 | * just another IDE controller. If the smart mode is running then |
47 | * volumes are managed by the controller firmware and each IDE "disk" | 47 | * volumes are managed by the controller firmware and each IDE "disk" |
48 | * is a raid volume. Even more cute - the controller can do automated | 48 | * is a raid volume. Even more cute - the controller can do automated |
49 | * hotplug and rebuild. | 49 | * hotplug and rebuild. |
50 | * | 50 | * |
51 | * The pass through controller itself is a little demented. It has a | 51 | * The pass through controller itself is a little demented. It has a |
52 | * flaw that it has a single set of PIO/MWDMA timings per channel so | 52 | * flaw that it has a single set of PIO/MWDMA timings per channel so |
53 | * non UDMA devices restrict each others performance. It also has a | 53 | * non UDMA devices restrict each others performance. It also has a |
54 | * single clock source per channel so mixed UDMA100/133 performance | 54 | * single clock source per channel so mixed UDMA100/133 performance |
55 | * isn't perfect and we have to pick a clock. Thankfully none of this | 55 | * isn't perfect and we have to pick a clock. Thankfully none of this |
56 | * matters in smart mode. ATAPI DMA is not currently supported. | 56 | * matters in smart mode. ATAPI DMA is not currently supported. |
57 | * | 57 | * |
58 | * It seems the smart mode is a win for RAID1/RAID10 but otherwise not. | 58 | * It seems the smart mode is a win for RAID1/RAID10 but otherwise not. |
59 | * | 59 | * |
60 | * TODO | 60 | * TODO |
61 | * - ATAPI UDMA is ok but not MWDMA it seems | 61 | * - ATAPI UDMA is ok but not MWDMA it seems |
62 | * - RAID configuration ioctls | 62 | * - RAID configuration ioctls |
63 | * - Move to libata once it grows up | 63 | * - Move to libata once it grows up |
64 | */ | 64 | */ |
65 | 65 | ||
66 | #include <linux/types.h> | 66 | #include <linux/types.h> |
67 | #include <linux/module.h> | 67 | #include <linux/module.h> |
68 | #include <linux/pci.h> | 68 | #include <linux/pci.h> |
69 | #include <linux/delay.h> | 69 | #include <linux/delay.h> |
70 | #include <linux/hdreg.h> | 70 | #include <linux/hdreg.h> |
71 | #include <linux/ide.h> | 71 | #include <linux/ide.h> |
72 | #include <linux/init.h> | 72 | #include <linux/init.h> |
73 | 73 | ||
74 | #include <asm/io.h> | 74 | #include <asm/io.h> |
75 | 75 | ||
76 | struct it821x_dev | 76 | struct it821x_dev |
77 | { | 77 | { |
78 | unsigned int smart:1, /* Are we in smart raid mode */ | 78 | unsigned int smart:1, /* Are we in smart raid mode */ |
79 | timing10:1; /* Rev 0x10 */ | 79 | timing10:1; /* Rev 0x10 */ |
80 | u8 clock_mode; /* 0, ATA_50 or ATA_66 */ | 80 | u8 clock_mode; /* 0, ATA_50 or ATA_66 */ |
81 | u8 want[2][2]; /* Mode/Pri log for master slave */ | 81 | u8 want[2][2]; /* Mode/Pri log for master slave */ |
82 | /* We need these for switching the clock when DMA goes on/off | 82 | /* We need these for switching the clock when DMA goes on/off |
83 | The high byte is the 66Mhz timing */ | 83 | The high byte is the 66Mhz timing */ |
84 | u16 pio[2]; /* Cached PIO values */ | 84 | u16 pio[2]; /* Cached PIO values */ |
85 | u16 mwdma[2]; /* Cached MWDMA values */ | 85 | u16 mwdma[2]; /* Cached MWDMA values */ |
86 | u16 udma[2]; /* Cached UDMA values (per drive) */ | 86 | u16 udma[2]; /* Cached UDMA values (per drive) */ |
87 | }; | 87 | }; |
88 | 88 | ||
89 | #define ATA_66 0 | 89 | #define ATA_66 0 |
90 | #define ATA_50 1 | 90 | #define ATA_50 1 |
91 | #define ATA_ANY 2 | 91 | #define ATA_ANY 2 |
92 | 92 | ||
93 | #define UDMA_OFF 0 | 93 | #define UDMA_OFF 0 |
94 | #define MWDMA_OFF 0 | 94 | #define MWDMA_OFF 0 |
95 | 95 | ||
96 | /* | 96 | /* |
97 | * We allow users to force the card into non raid mode without | 97 | * We allow users to force the card into non raid mode without |
98 | * flashing the alternative BIOS. This is also necessary right now | 98 | * flashing the alternative BIOS. This is also necessary right now |
99 | * for embedded platforms that cannot run a PC BIOS but are using this | 99 | * for embedded platforms that cannot run a PC BIOS but are using this |
100 | * device. | 100 | * device. |
101 | */ | 101 | */ |
102 | 102 | ||
103 | static int it8212_noraid; | 103 | static int it8212_noraid; |
104 | 104 | ||
105 | /** | 105 | /** |
106 | * it821x_program - program the PIO/MWDMA registers | 106 | * it821x_program - program the PIO/MWDMA registers |
107 | * @drive: drive to tune | 107 | * @drive: drive to tune |
108 | * @timing: timing info | 108 | * @timing: timing info |
109 | * | 109 | * |
110 | * Program the PIO/MWDMA timing for this channel according to the | 110 | * Program the PIO/MWDMA timing for this channel according to the |
111 | * current clock. | 111 | * current clock. |
112 | */ | 112 | */ |
113 | 113 | ||
114 | static void it821x_program(ide_drive_t *drive, u16 timing) | 114 | static void it821x_program(ide_drive_t *drive, u16 timing) |
115 | { | 115 | { |
116 | ide_hwif_t *hwif = drive->hwif; | 116 | ide_hwif_t *hwif = drive->hwif; |
117 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 117 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
118 | int channel = hwif->channel; | 118 | int channel = hwif->channel; |
119 | u8 conf; | 119 | u8 conf; |
120 | 120 | ||
121 | /* Program PIO/MWDMA timing bits */ | 121 | /* Program PIO/MWDMA timing bits */ |
122 | if(itdev->clock_mode == ATA_66) | 122 | if(itdev->clock_mode == ATA_66) |
123 | conf = timing >> 8; | 123 | conf = timing >> 8; |
124 | else | 124 | else |
125 | conf = timing & 0xFF; | 125 | conf = timing & 0xFF; |
126 | pci_write_config_byte(hwif->pci_dev, 0x54 + 4 * channel, conf); | 126 | pci_write_config_byte(hwif->pci_dev, 0x54 + 4 * channel, conf); |
127 | } | 127 | } |
128 | 128 | ||
129 | /** | 129 | /** |
130 | * it821x_program_udma - program the UDMA registers | 130 | * it821x_program_udma - program the UDMA registers |
131 | * @drive: drive to tune | 131 | * @drive: drive to tune |
132 | * @timing: timing info | 132 | * @timing: timing info |
133 | * | 133 | * |
134 | * Program the UDMA timing for this drive according to the | 134 | * Program the UDMA timing for this drive according to the |
135 | * current clock. | 135 | * current clock. |
136 | */ | 136 | */ |
137 | 137 | ||
138 | static void it821x_program_udma(ide_drive_t *drive, u16 timing) | 138 | static void it821x_program_udma(ide_drive_t *drive, u16 timing) |
139 | { | 139 | { |
140 | ide_hwif_t *hwif = drive->hwif; | 140 | ide_hwif_t *hwif = drive->hwif; |
141 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 141 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
142 | int channel = hwif->channel; | 142 | int channel = hwif->channel; |
143 | int unit = drive->select.b.unit; | 143 | int unit = drive->select.b.unit; |
144 | u8 conf; | 144 | u8 conf; |
145 | 145 | ||
146 | /* Program UDMA timing bits */ | 146 | /* Program UDMA timing bits */ |
147 | if(itdev->clock_mode == ATA_66) | 147 | if(itdev->clock_mode == ATA_66) |
148 | conf = timing >> 8; | 148 | conf = timing >> 8; |
149 | else | 149 | else |
150 | conf = timing & 0xFF; | 150 | conf = timing & 0xFF; |
151 | if(itdev->timing10 == 0) | 151 | if(itdev->timing10 == 0) |
152 | pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel + unit, conf); | 152 | pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel + unit, conf); |
153 | else { | 153 | else { |
154 | pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel, conf); | 154 | pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel, conf); |
155 | pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel + 1, conf); | 155 | pci_write_config_byte(hwif->pci_dev, 0x56 + 4 * channel + 1, conf); |
156 | } | 156 | } |
157 | } | 157 | } |
158 | 158 | ||
159 | /** | 159 | /** |
160 | * it821x_clock_strategy | 160 | * it821x_clock_strategy |
161 | * @drive: drive to set up | 161 | * @drive: drive to set up |
162 | * | 162 | * |
163 | * Select between the 50 and 66Mhz base clocks to get the best | 163 | * Select between the 50 and 66Mhz base clocks to get the best |
164 | * results for this interface. | 164 | * results for this interface. |
165 | */ | 165 | */ |
166 | 166 | ||
167 | static void it821x_clock_strategy(ide_drive_t *drive) | 167 | static void it821x_clock_strategy(ide_drive_t *drive) |
168 | { | 168 | { |
169 | ide_hwif_t *hwif = drive->hwif; | 169 | ide_hwif_t *hwif = drive->hwif; |
170 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 170 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
171 | 171 | ||
172 | u8 unit = drive->select.b.unit; | 172 | u8 unit = drive->select.b.unit; |
173 | ide_drive_t *pair = &hwif->drives[1-unit]; | 173 | ide_drive_t *pair = &hwif->drives[1-unit]; |
174 | 174 | ||
175 | int clock, altclock; | 175 | int clock, altclock; |
176 | u8 v; | 176 | u8 v; |
177 | int sel = 0; | 177 | int sel = 0; |
178 | 178 | ||
179 | if(itdev->want[0][0] > itdev->want[1][0]) { | 179 | if(itdev->want[0][0] > itdev->want[1][0]) { |
180 | clock = itdev->want[0][1]; | 180 | clock = itdev->want[0][1]; |
181 | altclock = itdev->want[1][1]; | 181 | altclock = itdev->want[1][1]; |
182 | } else { | 182 | } else { |
183 | clock = itdev->want[1][1]; | 183 | clock = itdev->want[1][1]; |
184 | altclock = itdev->want[0][1]; | 184 | altclock = itdev->want[0][1]; |
185 | } | 185 | } |
186 | 186 | ||
187 | /* | 187 | /* |
188 | * if both clocks can be used for the mode with the higher priority | 188 | * if both clocks can be used for the mode with the higher priority |
189 | * use the clock needed by the mode with the lower priority | 189 | * use the clock needed by the mode with the lower priority |
190 | */ | 190 | */ |
191 | if (clock == ATA_ANY) | 191 | if (clock == ATA_ANY) |
192 | clock = altclock; | 192 | clock = altclock; |
193 | 193 | ||
194 | /* Nobody cares - keep the same clock */ | 194 | /* Nobody cares - keep the same clock */ |
195 | if(clock == ATA_ANY) | 195 | if(clock == ATA_ANY) |
196 | return; | 196 | return; |
197 | /* No change */ | 197 | /* No change */ |
198 | if(clock == itdev->clock_mode) | 198 | if(clock == itdev->clock_mode) |
199 | return; | 199 | return; |
200 | 200 | ||
201 | /* Load this into the controller ? */ | 201 | /* Load this into the controller ? */ |
202 | if(clock == ATA_66) | 202 | if(clock == ATA_66) |
203 | itdev->clock_mode = ATA_66; | 203 | itdev->clock_mode = ATA_66; |
204 | else { | 204 | else { |
205 | itdev->clock_mode = ATA_50; | 205 | itdev->clock_mode = ATA_50; |
206 | sel = 1; | 206 | sel = 1; |
207 | } | 207 | } |
208 | pci_read_config_byte(hwif->pci_dev, 0x50, &v); | 208 | pci_read_config_byte(hwif->pci_dev, 0x50, &v); |
209 | v &= ~(1 << (1 + hwif->channel)); | 209 | v &= ~(1 << (1 + hwif->channel)); |
210 | v |= sel << (1 + hwif->channel); | 210 | v |= sel << (1 + hwif->channel); |
211 | pci_write_config_byte(hwif->pci_dev, 0x50, v); | 211 | pci_write_config_byte(hwif->pci_dev, 0x50, v); |
212 | 212 | ||
213 | /* | 213 | /* |
214 | * Reprogram the UDMA/PIO of the pair drive for the switch | 214 | * Reprogram the UDMA/PIO of the pair drive for the switch |
215 | * MWDMA will be dealt with by the dma switcher | 215 | * MWDMA will be dealt with by the dma switcher |
216 | */ | 216 | */ |
217 | if(pair && itdev->udma[1-unit] != UDMA_OFF) { | 217 | if(pair && itdev->udma[1-unit] != UDMA_OFF) { |
218 | it821x_program_udma(pair, itdev->udma[1-unit]); | 218 | it821x_program_udma(pair, itdev->udma[1-unit]); |
219 | it821x_program(pair, itdev->pio[1-unit]); | 219 | it821x_program(pair, itdev->pio[1-unit]); |
220 | } | 220 | } |
221 | /* | 221 | /* |
222 | * Reprogram the UDMA/PIO of our drive for the switch. | 222 | * Reprogram the UDMA/PIO of our drive for the switch. |
223 | * MWDMA will be dealt with by the dma switcher | 223 | * MWDMA will be dealt with by the dma switcher |
224 | */ | 224 | */ |
225 | if(itdev->udma[unit] != UDMA_OFF) { | 225 | if(itdev->udma[unit] != UDMA_OFF) { |
226 | it821x_program_udma(drive, itdev->udma[unit]); | 226 | it821x_program_udma(drive, itdev->udma[unit]); |
227 | it821x_program(drive, itdev->pio[unit]); | 227 | it821x_program(drive, itdev->pio[unit]); |
228 | } | 228 | } |
229 | } | 229 | } |
230 | 230 | ||
231 | /** | 231 | /** |
232 | * it821x_set_pio_mode - set host controller for PIO mode | 232 | * it821x_set_pio_mode - set host controller for PIO mode |
233 | * @drive: drive | 233 | * @drive: drive |
234 | * @pio: PIO mode number | 234 | * @pio: PIO mode number |
235 | * | 235 | * |
236 | * Tune the host to the desired PIO mode taking into the consideration | 236 | * Tune the host to the desired PIO mode taking into the consideration |
237 | * the maximum PIO mode supported by the other device on the cable. | 237 | * the maximum PIO mode supported by the other device on the cable. |
238 | */ | 238 | */ |
239 | 239 | ||
240 | static void it821x_set_pio_mode(ide_drive_t *drive, const u8 pio) | 240 | static void it821x_set_pio_mode(ide_drive_t *drive, const u8 pio) |
241 | { | 241 | { |
242 | ide_hwif_t *hwif = drive->hwif; | 242 | ide_hwif_t *hwif = drive->hwif; |
243 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 243 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
244 | int unit = drive->select.b.unit; | 244 | int unit = drive->select.b.unit; |
245 | ide_drive_t *pair = &hwif->drives[1 - unit]; | 245 | ide_drive_t *pair = &hwif->drives[1 - unit]; |
246 | u8 set_pio = pio; | 246 | u8 set_pio = pio; |
247 | 247 | ||
248 | /* Spec says 89 ref driver uses 88 */ | 248 | /* Spec says 89 ref driver uses 88 */ |
249 | static u16 pio_timings[]= { 0xAA88, 0xA382, 0xA181, 0x3332, 0x3121 }; | 249 | static u16 pio_timings[]= { 0xAA88, 0xA382, 0xA181, 0x3332, 0x3121 }; |
250 | static u8 pio_want[] = { ATA_66, ATA_66, ATA_66, ATA_66, ATA_ANY }; | 250 | static u8 pio_want[] = { ATA_66, ATA_66, ATA_66, ATA_66, ATA_ANY }; |
251 | 251 | ||
252 | /* | 252 | /* |
253 | * Compute the best PIO mode we can for a given device. We must | 253 | * Compute the best PIO mode we can for a given device. We must |
254 | * pick a speed that does not cause problems with the other device | 254 | * pick a speed that does not cause problems with the other device |
255 | * on the cable. | 255 | * on the cable. |
256 | */ | 256 | */ |
257 | if (pair) { | 257 | if (pair) { |
258 | u8 pair_pio = ide_get_best_pio_mode(pair, 255, 4); | 258 | u8 pair_pio = ide_get_best_pio_mode(pair, 255, 4); |
259 | /* trim PIO to the slowest of the master/slave */ | 259 | /* trim PIO to the slowest of the master/slave */ |
260 | if (pair_pio < set_pio) | 260 | if (pair_pio < set_pio) |
261 | set_pio = pair_pio; | 261 | set_pio = pair_pio; |
262 | } | 262 | } |
263 | 263 | ||
264 | /* We prefer 66Mhz clock for PIO 0-3, don't care for PIO4 */ | 264 | /* We prefer 66Mhz clock for PIO 0-3, don't care for PIO4 */ |
265 | itdev->want[unit][1] = pio_want[set_pio]; | 265 | itdev->want[unit][1] = pio_want[set_pio]; |
266 | itdev->want[unit][0] = 1; /* PIO is lowest priority */ | 266 | itdev->want[unit][0] = 1; /* PIO is lowest priority */ |
267 | itdev->pio[unit] = pio_timings[set_pio]; | 267 | itdev->pio[unit] = pio_timings[set_pio]; |
268 | it821x_clock_strategy(drive); | 268 | it821x_clock_strategy(drive); |
269 | it821x_program(drive, itdev->pio[unit]); | 269 | it821x_program(drive, itdev->pio[unit]); |
270 | } | 270 | } |
271 | 271 | ||
272 | /** | 272 | /** |
273 | * it821x_tune_mwdma - tune a channel for MWDMA | 273 | * it821x_tune_mwdma - tune a channel for MWDMA |
274 | * @drive: drive to set up | 274 | * @drive: drive to set up |
275 | * @mode_wanted: the target operating mode | 275 | * @mode_wanted: the target operating mode |
276 | * | 276 | * |
277 | * Load the timing settings for this device mode into the | 277 | * Load the timing settings for this device mode into the |
278 | * controller when doing MWDMA in pass through mode. The caller | 278 | * controller when doing MWDMA in pass through mode. The caller |
279 | * must manage the whole lack of per device MWDMA/PIO timings and | 279 | * must manage the whole lack of per device MWDMA/PIO timings and |
280 | * the shared MWDMA/PIO timing register. | 280 | * the shared MWDMA/PIO timing register. |
281 | */ | 281 | */ |
282 | 282 | ||
283 | static void it821x_tune_mwdma (ide_drive_t *drive, byte mode_wanted) | 283 | static void it821x_tune_mwdma (ide_drive_t *drive, byte mode_wanted) |
284 | { | 284 | { |
285 | ide_hwif_t *hwif = drive->hwif; | 285 | ide_hwif_t *hwif = drive->hwif; |
286 | struct it821x_dev *itdev = (void *)ide_get_hwifdata(hwif); | 286 | struct it821x_dev *itdev = (void *)ide_get_hwifdata(hwif); |
287 | int unit = drive->select.b.unit; | 287 | int unit = drive->select.b.unit; |
288 | int channel = hwif->channel; | 288 | int channel = hwif->channel; |
289 | u8 conf; | 289 | u8 conf; |
290 | 290 | ||
291 | static u16 dma[] = { 0x8866, 0x3222, 0x3121 }; | 291 | static u16 dma[] = { 0x8866, 0x3222, 0x3121 }; |
292 | static u8 mwdma_want[] = { ATA_ANY, ATA_66, ATA_ANY }; | 292 | static u8 mwdma_want[] = { ATA_ANY, ATA_66, ATA_ANY }; |
293 | 293 | ||
294 | itdev->want[unit][1] = mwdma_want[mode_wanted]; | 294 | itdev->want[unit][1] = mwdma_want[mode_wanted]; |
295 | itdev->want[unit][0] = 2; /* MWDMA is low priority */ | 295 | itdev->want[unit][0] = 2; /* MWDMA is low priority */ |
296 | itdev->mwdma[unit] = dma[mode_wanted]; | 296 | itdev->mwdma[unit] = dma[mode_wanted]; |
297 | itdev->udma[unit] = UDMA_OFF; | 297 | itdev->udma[unit] = UDMA_OFF; |
298 | 298 | ||
299 | /* UDMA bits off - Revision 0x10 do them in pairs */ | 299 | /* UDMA bits off - Revision 0x10 do them in pairs */ |
300 | pci_read_config_byte(hwif->pci_dev, 0x50, &conf); | 300 | pci_read_config_byte(hwif->pci_dev, 0x50, &conf); |
301 | if(itdev->timing10) | 301 | if(itdev->timing10) |
302 | conf |= channel ? 0x60: 0x18; | 302 | conf |= channel ? 0x60: 0x18; |
303 | else | 303 | else |
304 | conf |= 1 << (3 + 2 * channel + unit); | 304 | conf |= 1 << (3 + 2 * channel + unit); |
305 | pci_write_config_byte(hwif->pci_dev, 0x50, conf); | 305 | pci_write_config_byte(hwif->pci_dev, 0x50, conf); |
306 | 306 | ||
307 | it821x_clock_strategy(drive); | 307 | it821x_clock_strategy(drive); |
308 | /* FIXME: do we need to program this ? */ | 308 | /* FIXME: do we need to program this ? */ |
309 | /* it821x_program(drive, itdev->mwdma[unit]); */ | 309 | /* it821x_program(drive, itdev->mwdma[unit]); */ |
310 | } | 310 | } |
311 | 311 | ||
312 | /** | 312 | /** |
313 | * it821x_tune_udma - tune a channel for UDMA | 313 | * it821x_tune_udma - tune a channel for UDMA |
314 | * @drive: drive to set up | 314 | * @drive: drive to set up |
315 | * @mode_wanted: the target operating mode | 315 | * @mode_wanted: the target operating mode |
316 | * | 316 | * |
317 | * Load the timing settings for this device mode into the | 317 | * Load the timing settings for this device mode into the |
318 | * controller when doing UDMA modes in pass through. | 318 | * controller when doing UDMA modes in pass through. |
319 | */ | 319 | */ |
320 | 320 | ||
321 | static void it821x_tune_udma (ide_drive_t *drive, byte mode_wanted) | 321 | static void it821x_tune_udma (ide_drive_t *drive, byte mode_wanted) |
322 | { | 322 | { |
323 | ide_hwif_t *hwif = drive->hwif; | 323 | ide_hwif_t *hwif = drive->hwif; |
324 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 324 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
325 | int unit = drive->select.b.unit; | 325 | int unit = drive->select.b.unit; |
326 | int channel = hwif->channel; | 326 | int channel = hwif->channel; |
327 | u8 conf; | 327 | u8 conf; |
328 | 328 | ||
329 | static u16 udma[] = { 0x4433, 0x4231, 0x3121, 0x2121, 0x1111, 0x2211, 0x1111 }; | 329 | static u16 udma[] = { 0x4433, 0x4231, 0x3121, 0x2121, 0x1111, 0x2211, 0x1111 }; |
330 | static u8 udma_want[] = { ATA_ANY, ATA_50, ATA_ANY, ATA_66, ATA_66, ATA_50, ATA_66 }; | 330 | static u8 udma_want[] = { ATA_ANY, ATA_50, ATA_ANY, ATA_66, ATA_66, ATA_50, ATA_66 }; |
331 | 331 | ||
332 | itdev->want[unit][1] = udma_want[mode_wanted]; | 332 | itdev->want[unit][1] = udma_want[mode_wanted]; |
333 | itdev->want[unit][0] = 3; /* UDMA is high priority */ | 333 | itdev->want[unit][0] = 3; /* UDMA is high priority */ |
334 | itdev->mwdma[unit] = MWDMA_OFF; | 334 | itdev->mwdma[unit] = MWDMA_OFF; |
335 | itdev->udma[unit] = udma[mode_wanted]; | 335 | itdev->udma[unit] = udma[mode_wanted]; |
336 | if(mode_wanted >= 5) | 336 | if(mode_wanted >= 5) |
337 | itdev->udma[unit] |= 0x8080; /* UDMA 5/6 select on */ | 337 | itdev->udma[unit] |= 0x8080; /* UDMA 5/6 select on */ |
338 | 338 | ||
339 | /* UDMA on. Again revision 0x10 must do the pair */ | 339 | /* UDMA on. Again revision 0x10 must do the pair */ |
340 | pci_read_config_byte(hwif->pci_dev, 0x50, &conf); | 340 | pci_read_config_byte(hwif->pci_dev, 0x50, &conf); |
341 | if(itdev->timing10) | 341 | if(itdev->timing10) |
342 | conf &= channel ? 0x9F: 0xE7; | 342 | conf &= channel ? 0x9F: 0xE7; |
343 | else | 343 | else |
344 | conf &= ~ (1 << (3 + 2 * channel + unit)); | 344 | conf &= ~ (1 << (3 + 2 * channel + unit)); |
345 | pci_write_config_byte(hwif->pci_dev, 0x50, conf); | 345 | pci_write_config_byte(hwif->pci_dev, 0x50, conf); |
346 | 346 | ||
347 | it821x_clock_strategy(drive); | 347 | it821x_clock_strategy(drive); |
348 | it821x_program_udma(drive, itdev->udma[unit]); | 348 | it821x_program_udma(drive, itdev->udma[unit]); |
349 | 349 | ||
350 | } | 350 | } |
351 | 351 | ||
352 | /** | 352 | /** |
353 | * it821x_dma_read - DMA hook | 353 | * it821x_dma_read - DMA hook |
354 | * @drive: drive for DMA | 354 | * @drive: drive for DMA |
355 | * | 355 | * |
356 | * The IT821x has a single timing register for MWDMA and for PIO | 356 | * The IT821x has a single timing register for MWDMA and for PIO |
357 | * operations. As we flip back and forth we have to reload the | 357 | * operations. As we flip back and forth we have to reload the |
358 | * clock. In addition the rev 0x10 device only works if the same | 358 | * clock. In addition the rev 0x10 device only works if the same |
359 | * timing value is loaded into the master and slave UDMA clock | 359 | * timing value is loaded into the master and slave UDMA clock |
360 | * so we must also reload that. | 360 | * so we must also reload that. |
361 | * | 361 | * |
362 | * FIXME: we could figure out in advance if we need to do reloads | 362 | * FIXME: we could figure out in advance if we need to do reloads |
363 | */ | 363 | */ |
364 | 364 | ||
365 | static void it821x_dma_start(ide_drive_t *drive) | 365 | static void it821x_dma_start(ide_drive_t *drive) |
366 | { | 366 | { |
367 | ide_hwif_t *hwif = drive->hwif; | 367 | ide_hwif_t *hwif = drive->hwif; |
368 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 368 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
369 | int unit = drive->select.b.unit; | 369 | int unit = drive->select.b.unit; |
370 | if(itdev->mwdma[unit] != MWDMA_OFF) | 370 | if(itdev->mwdma[unit] != MWDMA_OFF) |
371 | it821x_program(drive, itdev->mwdma[unit]); | 371 | it821x_program(drive, itdev->mwdma[unit]); |
372 | else if(itdev->udma[unit] != UDMA_OFF && itdev->timing10) | 372 | else if(itdev->udma[unit] != UDMA_OFF && itdev->timing10) |
373 | it821x_program_udma(drive, itdev->udma[unit]); | 373 | it821x_program_udma(drive, itdev->udma[unit]); |
374 | ide_dma_start(drive); | 374 | ide_dma_start(drive); |
375 | } | 375 | } |
376 | 376 | ||
377 | /** | 377 | /** |
378 | * it821x_dma_write - DMA hook | 378 | * it821x_dma_write - DMA hook |
379 | * @drive: drive for DMA stop | 379 | * @drive: drive for DMA stop |
380 | * | 380 | * |
381 | * The IT821x has a single timing register for MWDMA and for PIO | 381 | * The IT821x has a single timing register for MWDMA and for PIO |
382 | * operations. As we flip back and forth we have to reload the | 382 | * operations. As we flip back and forth we have to reload the |
383 | * clock. | 383 | * clock. |
384 | */ | 384 | */ |
385 | 385 | ||
386 | static int it821x_dma_end(ide_drive_t *drive) | 386 | static int it821x_dma_end(ide_drive_t *drive) |
387 | { | 387 | { |
388 | ide_hwif_t *hwif = drive->hwif; | 388 | ide_hwif_t *hwif = drive->hwif; |
389 | int unit = drive->select.b.unit; | 389 | int unit = drive->select.b.unit; |
390 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 390 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
391 | int ret = __ide_dma_end(drive); | 391 | int ret = __ide_dma_end(drive); |
392 | if(itdev->mwdma[unit] != MWDMA_OFF) | 392 | if(itdev->mwdma[unit] != MWDMA_OFF) |
393 | it821x_program(drive, itdev->pio[unit]); | 393 | it821x_program(drive, itdev->pio[unit]); |
394 | return ret; | 394 | return ret; |
395 | } | 395 | } |
396 | 396 | ||
397 | /** | 397 | /** |
398 | * it821x_set_dma_mode - set host controller for DMA mode | 398 | * it821x_set_dma_mode - set host controller for DMA mode |
399 | * @drive: drive | 399 | * @drive: drive |
400 | * @speed: DMA mode | 400 | * @speed: DMA mode |
401 | * | 401 | * |
402 | * Tune the ITE chipset for the desired DMA mode. | 402 | * Tune the ITE chipset for the desired DMA mode. |
403 | */ | 403 | */ |
404 | 404 | ||
405 | static void it821x_set_dma_mode(ide_drive_t *drive, const u8 speed) | 405 | static void it821x_set_dma_mode(ide_drive_t *drive, const u8 speed) |
406 | { | 406 | { |
407 | /* | 407 | /* |
408 | * MWDMA tuning is really hard because our MWDMA and PIO | 408 | * MWDMA tuning is really hard because our MWDMA and PIO |
409 | * timings are kept in the same place. We can switch in the | 409 | * timings are kept in the same place. We can switch in the |
410 | * host dma on/off callbacks. | 410 | * host dma on/off callbacks. |
411 | */ | 411 | */ |
412 | if (speed >= XFER_UDMA_0 && speed <= XFER_UDMA_6) | 412 | if (speed >= XFER_UDMA_0 && speed <= XFER_UDMA_6) |
413 | it821x_tune_udma(drive, speed - XFER_UDMA_0); | 413 | it821x_tune_udma(drive, speed - XFER_UDMA_0); |
414 | else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) | 414 | else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) |
415 | it821x_tune_mwdma(drive, speed - XFER_MW_DMA_0); | 415 | it821x_tune_mwdma(drive, speed - XFER_MW_DMA_0); |
416 | } | 416 | } |
417 | 417 | ||
418 | /** | 418 | /** |
419 | * ata66_it821x - check for 80 pin cable | 419 | * ata66_it821x - check for 80 pin cable |
420 | * @hwif: interface to check | 420 | * @hwif: interface to check |
421 | * | 421 | * |
422 | * Check for the presence of an ATA66 capable cable on the | 422 | * Check for the presence of an ATA66 capable cable on the |
423 | * interface. Problematic as it seems some cards don't have | 423 | * interface. Problematic as it seems some cards don't have |
424 | * the needed logic onboard. | 424 | * the needed logic onboard. |
425 | */ | 425 | */ |
426 | 426 | ||
427 | static u8 __devinit ata66_it821x(ide_hwif_t *hwif) | 427 | static u8 __devinit ata66_it821x(ide_hwif_t *hwif) |
428 | { | 428 | { |
429 | /* The reference driver also only does disk side */ | 429 | /* The reference driver also only does disk side */ |
430 | return ATA_CBL_PATA80; | 430 | return ATA_CBL_PATA80; |
431 | } | 431 | } |
432 | 432 | ||
433 | /** | 433 | /** |
434 | * it821x_fixup - post init callback | 434 | * it821x_fixup - post init callback |
435 | * @hwif: interface | 435 | * @hwif: interface |
436 | * | 436 | * |
437 | * This callback is run after the drives have been probed but | 437 | * This callback is run after the drives have been probed but |
438 | * before anything gets attached. It allows drivers to do any | 438 | * before anything gets attached. It allows drivers to do any |
439 | * final tuning that is needed, or fixups to work around bugs. | 439 | * final tuning that is needed, or fixups to work around bugs. |
440 | */ | 440 | */ |
441 | 441 | ||
442 | static void __devinit it821x_fixups(ide_hwif_t *hwif) | 442 | static void __devinit it821x_fixups(ide_hwif_t *hwif) |
443 | { | 443 | { |
444 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); | 444 | struct it821x_dev *itdev = ide_get_hwifdata(hwif); |
445 | int i; | 445 | int i; |
446 | 446 | ||
447 | if(!itdev->smart) { | 447 | if(!itdev->smart) { |
448 | /* | 448 | /* |
449 | * If we are in pass through mode then not much | 449 | * If we are in pass through mode then not much |
450 | * needs to be done, but we do bother to clear the | 450 | * needs to be done, but we do bother to clear the |
451 | * IRQ mask as we may well be in PIO (eg rev 0x10) | 451 | * IRQ mask as we may well be in PIO (eg rev 0x10) |
452 | * for now and we know unmasking is safe on this chipset. | 452 | * for now and we know unmasking is safe on this chipset. |
453 | */ | 453 | */ |
454 | for (i = 0; i < 2; i++) { | 454 | for (i = 0; i < 2; i++) { |
455 | ide_drive_t *drive = &hwif->drives[i]; | 455 | ide_drive_t *drive = &hwif->drives[i]; |
456 | if(drive->present) | 456 | if(drive->present) |
457 | drive->unmask = 1; | 457 | drive->unmask = 1; |
458 | } | 458 | } |
459 | return; | 459 | return; |
460 | } | 460 | } |
461 | /* | 461 | /* |
462 | * Perform fixups on smart mode. We need to "lose" some | 462 | * Perform fixups on smart mode. We need to "lose" some |
463 | * capabilities the firmware lacks but does not filter, and | 463 | * capabilities the firmware lacks but does not filter, and |
464 | * also patch up some capability bits that it forgets to set | 464 | * also patch up some capability bits that it forgets to set |
465 | * in RAID mode. | 465 | * in RAID mode. |
466 | */ | 466 | */ |
467 | 467 | ||
468 | for(i = 0; i < 2; i++) { | 468 | for(i = 0; i < 2; i++) { |
469 | ide_drive_t *drive = &hwif->drives[i]; | 469 | ide_drive_t *drive = &hwif->drives[i]; |
470 | struct hd_driveid *id; | 470 | struct hd_driveid *id; |
471 | u16 *idbits; | 471 | u16 *idbits; |
472 | 472 | ||
473 | if(!drive->present) | 473 | if(!drive->present) |
474 | continue; | 474 | continue; |
475 | id = drive->id; | 475 | id = drive->id; |
476 | idbits = (u16 *)drive->id; | 476 | idbits = (u16 *)drive->id; |
477 | 477 | ||
478 | /* Check for RAID v native */ | 478 | /* Check for RAID v native */ |
479 | if(strstr(id->model, "Integrated Technology Express")) { | 479 | if(strstr(id->model, "Integrated Technology Express")) { |
480 | /* In raid mode the ident block is slightly buggy | 480 | /* In raid mode the ident block is slightly buggy |
481 | We need to set the bits so that the IDE layer knows | 481 | We need to set the bits so that the IDE layer knows |
482 | LBA28. LBA48 and DMA ar valid */ | 482 | LBA28. LBA48 and DMA ar valid */ |
483 | id->capability |= 3; /* LBA28, DMA */ | 483 | id->capability |= 3; /* LBA28, DMA */ |
484 | id->command_set_2 |= 0x0400; /* LBA48 valid */ | 484 | id->command_set_2 |= 0x0400; /* LBA48 valid */ |
485 | id->cfs_enable_2 |= 0x0400; /* LBA48 on */ | 485 | id->cfs_enable_2 |= 0x0400; /* LBA48 on */ |
486 | /* Reporting logic */ | 486 | /* Reporting logic */ |
487 | printk(KERN_INFO "%s: IT8212 %sRAID %d volume", | 487 | printk(KERN_INFO "%s: IT8212 %sRAID %d volume", |
488 | drive->name, | 488 | drive->name, |
489 | idbits[147] ? "Bootable ":"", | 489 | idbits[147] ? "Bootable ":"", |
490 | idbits[129]); | 490 | idbits[129]); |
491 | if(idbits[129] != 1) | 491 | if(idbits[129] != 1) |
492 | printk("(%dK stripe)", idbits[146]); | 492 | printk("(%dK stripe)", idbits[146]); |
493 | printk(".\n"); | 493 | printk(".\n"); |
494 | } else { | 494 | } else { |
495 | /* Non RAID volume. Fixups to stop the core code | 495 | /* Non RAID volume. Fixups to stop the core code |
496 | doing unsupported things */ | 496 | doing unsupported things */ |
497 | id->field_valid &= 3; | 497 | id->field_valid &= 3; |
498 | id->queue_depth = 0; | 498 | id->queue_depth = 0; |
499 | id->command_set_1 = 0; | 499 | id->command_set_1 = 0; |
500 | id->command_set_2 &= 0xC400; | 500 | id->command_set_2 &= 0xC400; |
501 | id->cfsse &= 0xC000; | 501 | id->cfsse &= 0xC000; |
502 | id->cfs_enable_1 = 0; | 502 | id->cfs_enable_1 = 0; |
503 | id->cfs_enable_2 &= 0xC400; | 503 | id->cfs_enable_2 &= 0xC400; |
504 | id->csf_default &= 0xC000; | 504 | id->csf_default &= 0xC000; |
505 | id->word127 = 0; | 505 | id->word127 = 0; |
506 | id->dlf = 0; | 506 | id->dlf = 0; |
507 | id->csfo = 0; | 507 | id->csfo = 0; |
508 | id->cfa_power = 0; | 508 | id->cfa_power = 0; |
509 | printk(KERN_INFO "%s: Performing identify fixups.\n", | 509 | printk(KERN_INFO "%s: Performing identify fixups.\n", |
510 | drive->name); | 510 | drive->name); |
511 | } | 511 | } |
512 | 512 | ||
513 | /* | 513 | /* |
514 | * Set MWDMA0 mode as enabled/support - just to tell | 514 | * Set MWDMA0 mode as enabled/support - just to tell |
515 | * IDE core that DMA is supported (it821x hardware | 515 | * IDE core that DMA is supported (it821x hardware |
516 | * takes care of DMA mode programming). | 516 | * takes care of DMA mode programming). |
517 | */ | 517 | */ |
518 | if (id->capability & 1) { | 518 | if (id->capability & 1) { |
519 | id->dma_mword |= 0x0101; | 519 | id->dma_mword |= 0x0101; |
520 | drive->current_speed = XFER_MW_DMA_0; | 520 | drive->current_speed = XFER_MW_DMA_0; |
521 | } | 521 | } |
522 | } | 522 | } |
523 | 523 | ||
524 | } | 524 | } |
525 | 525 | ||
526 | /** | 526 | /** |
527 | * init_hwif_it821x - set up hwif structs | 527 | * init_hwif_it821x - set up hwif structs |
528 | * @hwif: interface to set up | 528 | * @hwif: interface to set up |
529 | * | 529 | * |
530 | * We do the basic set up of the interface structure. The IT8212 | 530 | * We do the basic set up of the interface structure. The IT8212 |
531 | * requires several custom handlers so we override the default | 531 | * requires several custom handlers so we override the default |
532 | * ide DMA handlers appropriately | 532 | * ide DMA handlers appropriately |
533 | */ | 533 | */ |
534 | 534 | ||
535 | static void __devinit init_hwif_it821x(ide_hwif_t *hwif) | 535 | static void __devinit init_hwif_it821x(ide_hwif_t *hwif) |
536 | { | 536 | { |
537 | struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL); | 537 | struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL); |
538 | u8 conf; | 538 | u8 conf; |
539 | 539 | ||
540 | if (idev == NULL) { | 540 | if (idev == NULL) { |
541 | printk(KERN_ERR "it821x: out of memory, falling back to legacy behaviour.\n"); | 541 | printk(KERN_ERR "it821x: out of memory, falling back to legacy behaviour.\n"); |
542 | return; | 542 | return; |
543 | } | 543 | } |
544 | 544 | ||
545 | ide_set_hwifdata(hwif, idev); | 545 | ide_set_hwifdata(hwif, idev); |
546 | 546 | ||
547 | pci_read_config_byte(hwif->pci_dev, 0x50, &conf); | 547 | pci_read_config_byte(hwif->pci_dev, 0x50, &conf); |
548 | if (conf & 1) { | 548 | if (conf & 1) { |
549 | idev->smart = 1; | 549 | idev->smart = 1; |
550 | hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; | 550 | hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; |
551 | /* Long I/O's although allowed in LBA48 space cause the | 551 | /* Long I/O's although allowed in LBA48 space cause the |
552 | onboard firmware to enter the twighlight zone */ | 552 | onboard firmware to enter the twighlight zone */ |
553 | hwif->rqsize = 256; | 553 | hwif->rqsize = 256; |
554 | } | 554 | } |
555 | 555 | ||
556 | /* Pull the current clocks from 0x50 also */ | 556 | /* Pull the current clocks from 0x50 also */ |
557 | if (conf & (1 << (1 + hwif->channel))) | 557 | if (conf & (1 << (1 + hwif->channel))) |
558 | idev->clock_mode = ATA_50; | 558 | idev->clock_mode = ATA_50; |
559 | else | 559 | else |
560 | idev->clock_mode = ATA_66; | 560 | idev->clock_mode = ATA_66; |
561 | 561 | ||
562 | idev->want[0][1] = ATA_ANY; | 562 | idev->want[0][1] = ATA_ANY; |
563 | idev->want[1][1] = ATA_ANY; | 563 | idev->want[1][1] = ATA_ANY; |
564 | 564 | ||
565 | /* | 565 | /* |
566 | * Not in the docs but according to the reference driver | 566 | * Not in the docs but according to the reference driver |
567 | * this is necessary. | 567 | * this is necessary. |
568 | */ | 568 | */ |
569 | 569 | ||
570 | pci_read_config_byte(hwif->pci_dev, 0x08, &conf); | 570 | pci_read_config_byte(hwif->pci_dev, 0x08, &conf); |
571 | if (conf == 0x10) { | 571 | if (conf == 0x10) { |
572 | idev->timing10 = 1; | 572 | idev->timing10 = 1; |
573 | hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; | 573 | hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; |
574 | if (idev->smart == 0) | 574 | if (idev->smart == 0) |
575 | printk(KERN_WARNING "it821x: Revision 0x10, workarounds activated.\n"); | 575 | printk(KERN_WARNING "it821x: Revision 0x10, workarounds activated.\n"); |
576 | } | 576 | } |
577 | 577 | ||
578 | if (idev->smart == 0) { | 578 | if (idev->smart == 0) { |
579 | hwif->set_pio_mode = &it821x_set_pio_mode; | 579 | hwif->set_pio_mode = &it821x_set_pio_mode; |
580 | hwif->set_dma_mode = &it821x_set_dma_mode; | 580 | hwif->set_dma_mode = &it821x_set_dma_mode; |
581 | 581 | ||
582 | /* MWDMA/PIO clock switching for pass through mode */ | 582 | /* MWDMA/PIO clock switching for pass through mode */ |
583 | hwif->dma_start = &it821x_dma_start; | 583 | hwif->dma_start = &it821x_dma_start; |
584 | hwif->ide_dma_end = &it821x_dma_end; | 584 | hwif->ide_dma_end = &it821x_dma_end; |
585 | } else | 585 | } else |
586 | hwif->host_flags |= IDE_HFLAG_NO_SET_MODE; | 586 | hwif->host_flags |= IDE_HFLAG_NO_SET_MODE; |
587 | 587 | ||
588 | if (hwif->dma_base == 0) | 588 | if (hwif->dma_base == 0) |
589 | return; | 589 | return; |
590 | 590 | ||
591 | hwif->ultra_mask = ATA_UDMA6; | 591 | hwif->ultra_mask = ATA_UDMA6; |
592 | hwif->mwdma_mask = ATA_MWDMA2; | 592 | hwif->mwdma_mask = ATA_MWDMA2; |
593 | 593 | ||
594 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) | 594 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
595 | hwif->cbl = ata66_it821x(hwif); | 595 | hwif->cbl = ata66_it821x(hwif); |
596 | } | 596 | } |
597 | 597 | ||
598 | static void __devinit it8212_disable_raid(struct pci_dev *dev) | 598 | static void __devinit it8212_disable_raid(struct pci_dev *dev) |
599 | { | 599 | { |
600 | /* Reset local CPU, and set BIOS not ready */ | 600 | /* Reset local CPU, and set BIOS not ready */ |
601 | pci_write_config_byte(dev, 0x5E, 0x01); | 601 | pci_write_config_byte(dev, 0x5E, 0x01); |
602 | 602 | ||
603 | /* Set to bypass mode, and reset PCI bus */ | 603 | /* Set to bypass mode, and reset PCI bus */ |
604 | pci_write_config_byte(dev, 0x50, 0x00); | 604 | pci_write_config_byte(dev, 0x50, 0x00); |
605 | pci_write_config_word(dev, PCI_COMMAND, | 605 | pci_write_config_word(dev, PCI_COMMAND, |
606 | PCI_COMMAND_PARITY | PCI_COMMAND_IO | | 606 | PCI_COMMAND_PARITY | PCI_COMMAND_IO | |
607 | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); | 607 | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); |
608 | pci_write_config_word(dev, 0x40, 0xA0F3); | 608 | pci_write_config_word(dev, 0x40, 0xA0F3); |
609 | 609 | ||
610 | pci_write_config_dword(dev,0x4C, 0x02040204); | 610 | pci_write_config_dword(dev,0x4C, 0x02040204); |
611 | pci_write_config_byte(dev, 0x42, 0x36); | 611 | pci_write_config_byte(dev, 0x42, 0x36); |
612 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x20); | 612 | pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x20); |
613 | } | 613 | } |
614 | 614 | ||
615 | static unsigned int __devinit init_chipset_it821x(struct pci_dev *dev, const char *name) | 615 | static unsigned int __devinit init_chipset_it821x(struct pci_dev *dev, const char *name) |
616 | { | 616 | { |
617 | u8 conf; | 617 | u8 conf; |
618 | static char *mode[2] = { "pass through", "smart" }; | 618 | static char *mode[2] = { "pass through", "smart" }; |
619 | 619 | ||
620 | /* Force the card into bypass mode if so requested */ | 620 | /* Force the card into bypass mode if so requested */ |
621 | if (it8212_noraid) { | 621 | if (it8212_noraid) { |
622 | printk(KERN_INFO "it8212: forcing bypass mode.\n"); | 622 | printk(KERN_INFO "it8212: forcing bypass mode.\n"); |
623 | it8212_disable_raid(dev); | 623 | it8212_disable_raid(dev); |
624 | } | 624 | } |
625 | pci_read_config_byte(dev, 0x50, &conf); | 625 | pci_read_config_byte(dev, 0x50, &conf); |
626 | printk(KERN_INFO "it821x: controller in %s mode.\n", mode[conf & 1]); | 626 | printk(KERN_INFO "it821x: controller in %s mode.\n", mode[conf & 1]); |
627 | return 0; | 627 | return 0; |
628 | } | 628 | } |
629 | 629 | ||
630 | 630 | ||
631 | #define DECLARE_ITE_DEV(name_str) \ | 631 | #define DECLARE_ITE_DEV(name_str) \ |
632 | { \ | 632 | { \ |
633 | .name = name_str, \ | 633 | .name = name_str, \ |
634 | .init_chipset = init_chipset_it821x, \ | 634 | .init_chipset = init_chipset_it821x, \ |
635 | .init_hwif = init_hwif_it821x, \ | 635 | .init_hwif = init_hwif_it821x, \ |
636 | .fixup = it821x_fixups, \ | 636 | .fixup = it821x_fixups, \ |
637 | .host_flags = IDE_HFLAG_BOOTABLE, \ | 637 | .host_flags = IDE_HFLAG_BOOTABLE, \ |
638 | .pio_mask = ATA_PIO4, \ | 638 | .pio_mask = ATA_PIO4, \ |
639 | } | 639 | } |
640 | 640 | ||
641 | static const struct ide_port_info it821x_chipsets[] __devinitdata = { | 641 | static const struct ide_port_info it821x_chipsets[] __devinitdata = { |
642 | /* 0 */ DECLARE_ITE_DEV("IT8212"), | 642 | /* 0 */ DECLARE_ITE_DEV("IT8212"), |
643 | }; | 643 | }; |
644 | 644 | ||
645 | /** | 645 | /** |
646 | * it821x_init_one - pci layer discovery entry | 646 | * it821x_init_one - pci layer discovery entry |
647 | * @dev: PCI device | 647 | * @dev: PCI device |
648 | * @id: ident table entry | 648 | * @id: ident table entry |
649 | * | 649 | * |
650 | * Called by the PCI code when it finds an ITE821x controller. | 650 | * Called by the PCI code when it finds an ITE821x controller. |
651 | * We then use the IDE PCI generic helper to do most of the work. | 651 | * We then use the IDE PCI generic helper to do most of the work. |
652 | */ | 652 | */ |
653 | 653 | ||
654 | static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 654 | static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
655 | { | 655 | { |
656 | ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]); | 656 | return ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]); |
657 | return 0; | ||
658 | } | 657 | } |
659 | 658 | ||
660 | static const struct pci_device_id it821x_pci_tbl[] = { | 659 | static const struct pci_device_id it821x_pci_tbl[] = { |
661 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 }, | 660 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 }, |
662 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 }, | 661 | { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 }, |
663 | { 0, }, | 662 | { 0, }, |
664 | }; | 663 | }; |
665 | 664 | ||
666 | MODULE_DEVICE_TABLE(pci, it821x_pci_tbl); | 665 | MODULE_DEVICE_TABLE(pci, it821x_pci_tbl); |
667 | 666 | ||
668 | static struct pci_driver driver = { | 667 | static struct pci_driver driver = { |
669 | .name = "ITE821x IDE", | 668 | .name = "ITE821x IDE", |
670 | .id_table = it821x_pci_tbl, | 669 | .id_table = it821x_pci_tbl, |
671 | .probe = it821x_init_one, | 670 | .probe = it821x_init_one, |
672 | }; | 671 | }; |
673 | 672 | ||
674 | static int __init it821x_ide_init(void) | 673 | static int __init it821x_ide_init(void) |
675 | { | 674 | { |
676 | return ide_pci_register_driver(&driver); | 675 | return ide_pci_register_driver(&driver); |
677 | } | 676 | } |
678 | 677 | ||
679 | module_init(it821x_ide_init); | 678 | module_init(it821x_ide_init); |
680 | 679 | ||
681 | module_param_named(noraid, it8212_noraid, int, S_IRUGO); | 680 | module_param_named(noraid, it8212_noraid, int, S_IRUGO); |
682 | MODULE_PARM_DESC(it8212_noraid, "Force card into bypass mode"); | 681 | MODULE_PARM_DESC(it8212_noraid, "Force card into bypass mode"); |
683 | 682 | ||
684 | MODULE_AUTHOR("Alan Cox"); | 683 | MODULE_AUTHOR("Alan Cox"); |
685 | MODULE_DESCRIPTION("PCI driver module for the ITE 821x"); | 684 | MODULE_DESCRIPTION("PCI driver module for the ITE 821x"); |
686 | MODULE_LICENSE("GPL"); | 685 | MODULE_LICENSE("GPL"); |
687 | 686 |
drivers/ide/pci/jmicron.c
1 | 1 | ||
2 | /* | 2 | /* |
3 | * Copyright (C) 2006 Red Hat <alan@redhat.com> | 3 | * Copyright (C) 2006 Red Hat <alan@redhat.com> |
4 | * | 4 | * |
5 | * May be copied or modified under the terms of the GNU General Public License | 5 | * May be copied or modified under the terms of the GNU General Public License |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <linux/types.h> | 8 | #include <linux/types.h> |
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
11 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
12 | #include <linux/hdreg.h> | 12 | #include <linux/hdreg.h> |
13 | #include <linux/ide.h> | 13 | #include <linux/ide.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | 15 | ||
16 | #include <asm/io.h> | 16 | #include <asm/io.h> |
17 | 17 | ||
18 | typedef enum { | 18 | typedef enum { |
19 | PORT_PATA0 = 0, | 19 | PORT_PATA0 = 0, |
20 | PORT_PATA1 = 1, | 20 | PORT_PATA1 = 1, |
21 | PORT_SATA = 2, | 21 | PORT_SATA = 2, |
22 | } port_type; | 22 | } port_type; |
23 | 23 | ||
24 | /** | 24 | /** |
25 | * ata66_jmicron - Cable check | 25 | * ata66_jmicron - Cable check |
26 | * @hwif: IDE port | 26 | * @hwif: IDE port |
27 | * | 27 | * |
28 | * Returns the cable type. | 28 | * Returns the cable type. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | static u8 __devinit ata66_jmicron(ide_hwif_t *hwif) | 31 | static u8 __devinit ata66_jmicron(ide_hwif_t *hwif) |
32 | { | 32 | { |
33 | struct pci_dev *pdev = hwif->pci_dev; | 33 | struct pci_dev *pdev = hwif->pci_dev; |
34 | 34 | ||
35 | u32 control; | 35 | u32 control; |
36 | u32 control5; | 36 | u32 control5; |
37 | 37 | ||
38 | int port = hwif->channel; | 38 | int port = hwif->channel; |
39 | port_type port_map[2]; | 39 | port_type port_map[2]; |
40 | 40 | ||
41 | pci_read_config_dword(pdev, 0x40, &control); | 41 | pci_read_config_dword(pdev, 0x40, &control); |
42 | 42 | ||
43 | /* There are two basic mappings. One has the two SATA ports merged | 43 | /* There are two basic mappings. One has the two SATA ports merged |
44 | as master/slave and the secondary as PATA, the other has only the | 44 | as master/slave and the secondary as PATA, the other has only the |
45 | SATA port mapped */ | 45 | SATA port mapped */ |
46 | if (control & (1 << 23)) { | 46 | if (control & (1 << 23)) { |
47 | port_map[0] = PORT_SATA; | 47 | port_map[0] = PORT_SATA; |
48 | port_map[1] = PORT_PATA0; | 48 | port_map[1] = PORT_PATA0; |
49 | } else { | 49 | } else { |
50 | port_map[0] = PORT_SATA; | 50 | port_map[0] = PORT_SATA; |
51 | port_map[1] = PORT_SATA; | 51 | port_map[1] = PORT_SATA; |
52 | } | 52 | } |
53 | 53 | ||
54 | /* The 365/366 may have this bit set to map the second PATA port | 54 | /* The 365/366 may have this bit set to map the second PATA port |
55 | as the internal primary channel */ | 55 | as the internal primary channel */ |
56 | pci_read_config_dword(pdev, 0x80, &control5); | 56 | pci_read_config_dword(pdev, 0x80, &control5); |
57 | if (control5 & (1<<24)) | 57 | if (control5 & (1<<24)) |
58 | port_map[0] = PORT_PATA1; | 58 | port_map[0] = PORT_PATA1; |
59 | 59 | ||
60 | /* The two ports may then be logically swapped by the firmware */ | 60 | /* The two ports may then be logically swapped by the firmware */ |
61 | if (control & (1 << 22)) | 61 | if (control & (1 << 22)) |
62 | port = port ^ 1; | 62 | port = port ^ 1; |
63 | 63 | ||
64 | /* | 64 | /* |
65 | * Now we know which physical port we are talking about we can | 65 | * Now we know which physical port we are talking about we can |
66 | * actually do our cable checking etc. Thankfully we don't need | 66 | * actually do our cable checking etc. Thankfully we don't need |
67 | * to do the plumbing for other cases. | 67 | * to do the plumbing for other cases. |
68 | */ | 68 | */ |
69 | switch (port_map[port]) | 69 | switch (port_map[port]) |
70 | { | 70 | { |
71 | case PORT_PATA0: | 71 | case PORT_PATA0: |
72 | if (control & (1 << 3)) /* 40/80 pin primary */ | 72 | if (control & (1 << 3)) /* 40/80 pin primary */ |
73 | return ATA_CBL_PATA40; | 73 | return ATA_CBL_PATA40; |
74 | return ATA_CBL_PATA80; | 74 | return ATA_CBL_PATA80; |
75 | case PORT_PATA1: | 75 | case PORT_PATA1: |
76 | if (control5 & (1 << 19)) /* 40/80 pin secondary */ | 76 | if (control5 & (1 << 19)) /* 40/80 pin secondary */ |
77 | return ATA_CBL_PATA40; | 77 | return ATA_CBL_PATA40; |
78 | return ATA_CBL_PATA80; | 78 | return ATA_CBL_PATA80; |
79 | case PORT_SATA: | 79 | case PORT_SATA: |
80 | break; | 80 | break; |
81 | } | 81 | } |
82 | /* Avoid bogus "control reaches end of non-void function" */ | 82 | /* Avoid bogus "control reaches end of non-void function" */ |
83 | return ATA_CBL_PATA80; | 83 | return ATA_CBL_PATA80; |
84 | } | 84 | } |
85 | 85 | ||
86 | static void jmicron_set_pio_mode(ide_drive_t *drive, const u8 pio) | 86 | static void jmicron_set_pio_mode(ide_drive_t *drive, const u8 pio) |
87 | { | 87 | { |
88 | } | 88 | } |
89 | 89 | ||
90 | /** | 90 | /** |
91 | * jmicron_set_dma_mode - set host controller for DMA mode | 91 | * jmicron_set_dma_mode - set host controller for DMA mode |
92 | * @drive: drive | 92 | * @drive: drive |
93 | * @mode: DMA mode | 93 | * @mode: DMA mode |
94 | * | 94 | * |
95 | * As the JMicron snoops for timings we don't need to do anything here. | 95 | * As the JMicron snoops for timings we don't need to do anything here. |
96 | */ | 96 | */ |
97 | 97 | ||
98 | static void jmicron_set_dma_mode(ide_drive_t *drive, const u8 mode) | 98 | static void jmicron_set_dma_mode(ide_drive_t *drive, const u8 mode) |
99 | { | 99 | { |
100 | } | 100 | } |
101 | 101 | ||
102 | /** | 102 | /** |
103 | * init_hwif_jmicron - set up hwif structs | 103 | * init_hwif_jmicron - set up hwif structs |
104 | * @hwif: interface to set up | 104 | * @hwif: interface to set up |
105 | * | 105 | * |
106 | * Minimal set up is required for the Jmicron hardware. | 106 | * Minimal set up is required for the Jmicron hardware. |
107 | */ | 107 | */ |
108 | 108 | ||
109 | static void __devinit init_hwif_jmicron(ide_hwif_t *hwif) | 109 | static void __devinit init_hwif_jmicron(ide_hwif_t *hwif) |
110 | { | 110 | { |
111 | hwif->set_pio_mode = &jmicron_set_pio_mode; | 111 | hwif->set_pio_mode = &jmicron_set_pio_mode; |
112 | hwif->set_dma_mode = &jmicron_set_dma_mode; | 112 | hwif->set_dma_mode = &jmicron_set_dma_mode; |
113 | 113 | ||
114 | if (hwif->dma_base == 0) | 114 | if (hwif->dma_base == 0) |
115 | return; | 115 | return; |
116 | 116 | ||
117 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) | 117 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) |
118 | hwif->cbl = ata66_jmicron(hwif); | 118 | hwif->cbl = ata66_jmicron(hwif); |
119 | } | 119 | } |
120 | 120 | ||
121 | static const struct ide_port_info jmicron_chipset __devinitdata = { | 121 | static const struct ide_port_info jmicron_chipset __devinitdata = { |
122 | .name = "JMB", | 122 | .name = "JMB", |
123 | .init_hwif = init_hwif_jmicron, | 123 | .init_hwif = init_hwif_jmicron, |
124 | .host_flags = IDE_HFLAG_BOOTABLE, | 124 | .host_flags = IDE_HFLAG_BOOTABLE, |
125 | .enablebits = { { 0x40, 0x01, 0x01 }, { 0x40, 0x10, 0x10 } }, | 125 | .enablebits = { { 0x40, 0x01, 0x01 }, { 0x40, 0x10, 0x10 } }, |
126 | .pio_mask = ATA_PIO5, | 126 | .pio_mask = ATA_PIO5, |
127 | .mwdma_mask = ATA_MWDMA2, | 127 | .mwdma_mask = ATA_MWDMA2, |
128 | .udma_mask = ATA_UDMA6, | 128 | .udma_mask = ATA_UDMA6, |
129 | }; | 129 | }; |
130 | 130 | ||
131 | /** | 131 | /** |
132 | * jmicron_init_one - pci layer discovery entry | 132 | * jmicron_init_one - pci layer discovery entry |
133 | * @dev: PCI device | 133 | * @dev: PCI device |
134 | * @id: ident table entry | 134 | * @id: ident table entry |
135 | * | 135 | * |
136 | * Called by the PCI code when it finds a Jmicron controller. | 136 | * Called by the PCI code when it finds a Jmicron controller. |
137 | * We then use the IDE PCI generic helper to do most of the work. | 137 | * We then use the IDE PCI generic helper to do most of the work. |
138 | */ | 138 | */ |
139 | 139 | ||
140 | static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 140 | static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
141 | { | 141 | { |
142 | ide_setup_pci_device(dev, &jmicron_chipset); | 142 | return ide_setup_pci_device(dev, &jmicron_chipset); |
143 | return 0; | ||
144 | } | 143 | } |
145 | 144 | ||
146 | /* All JMB PATA controllers have and will continue to have the same | 145 | /* All JMB PATA controllers have and will continue to have the same |
147 | * interface. Matching vendor and device class is enough for all | 146 | * interface. Matching vendor and device class is enough for all |
148 | * current and future controllers if the controller is programmed | 147 | * current and future controllers if the controller is programmed |
149 | * properly. | 148 | * properly. |
150 | * | 149 | * |
151 | * If libata is configured, jmicron PCI quirk programs the controller | 150 | * If libata is configured, jmicron PCI quirk programs the controller |
152 | * into the correct mode. If libata isn't configured, match known | 151 | * into the correct mode. If libata isn't configured, match known |
153 | * device IDs too to maintain backward compatibility. | 152 | * device IDs too to maintain backward compatibility. |
154 | */ | 153 | */ |
155 | static struct pci_device_id jmicron_pci_tbl[] = { | 154 | static struct pci_device_id jmicron_pci_tbl[] = { |
156 | #if !defined(CONFIG_ATA) && !defined(CONFIG_ATA_MODULE) | 155 | #if !defined(CONFIG_ATA) && !defined(CONFIG_ATA_MODULE) |
157 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB361) }, | 156 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB361) }, |
158 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB363) }, | 157 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB363) }, |
159 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB365) }, | 158 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB365) }, |
160 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB366) }, | 159 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB366) }, |
161 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB368) }, | 160 | { PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB368) }, |
162 | #endif | 161 | #endif |
163 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 162 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
164 | PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 0 }, | 163 | PCI_CLASS_STORAGE_IDE << 8, 0xffff00, 0 }, |
165 | { 0, }, | 164 | { 0, }, |
166 | }; | 165 | }; |
167 | 166 | ||
168 | MODULE_DEVICE_TABLE(pci, jmicron_pci_tbl); | 167 | MODULE_DEVICE_TABLE(pci, jmicron_pci_tbl); |
169 | 168 | ||
170 | static struct pci_driver driver = { | 169 | static struct pci_driver driver = { |
171 | .name = "JMicron IDE", | 170 | .name = "JMicron IDE", |
172 | .id_table = jmicron_pci_tbl, | 171 | .id_table = jmicron_pci_tbl, |
173 | .probe = jmicron_init_one, | 172 | .probe = jmicron_init_one, |
174 | }; | 173 | }; |
175 | 174 | ||
176 | static int __init jmicron_ide_init(void) | 175 | static int __init jmicron_ide_init(void) |
177 | { | 176 | { |
178 | return ide_pci_register_driver(&driver); | 177 | return ide_pci_register_driver(&driver); |
179 | } | 178 | } |
180 | 179 | ||
181 | module_init(jmicron_ide_init); | 180 | module_init(jmicron_ide_init); |
182 | 181 | ||
183 | MODULE_AUTHOR("Alan Cox"); | 182 | MODULE_AUTHOR("Alan Cox"); |
184 | MODULE_DESCRIPTION("PCI driver module for the JMicron in legacy modes"); | 183 | MODULE_DESCRIPTION("PCI driver module for the JMicron in legacy modes"); |
185 | MODULE_LICENSE("GPL"); | 184 | MODULE_LICENSE("GPL"); |
186 | 185 |