Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
[deliverable/linux.git] / drivers / ide / pci / hpt366.c
CommitLineData
1da177e4
LT
1/*
2 * linux/drivers/ide/pci/hpt366.c Version 0.36 April 25, 2003
3 *
4 * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org>
5 * Portions Copyright (C) 2001 Sun Microsystems, Inc.
6 * Portions Copyright (C) 2003 Red Hat Inc
836c0063 7 * Portions Copyright (C) 2005-2006 MontaVista Software, Inc.
1da177e4
LT
8 *
9 * Thanks to HighPoint Technologies for their assistance, and hardware.
10 * Special Thanks to Jon Burchmore in SanDiego for the deep pockets, his
11 * donation of an ABit BP6 mainboard, processor, and memory acellerated
12 * development and support.
13 *
b39b01ff 14 *
836c0063
SS
15 * HighPoint has its own drivers (open source except for the RAID part)
16 * available from http://www.highpoint-tech.com/BIOS%20+%20Driver/.
17 * This may be useful to anyone wanting to work on this driver, however do not
18 * trust them too much since the code tends to become less and less meaningful
19 * as the time passes... :-/
b39b01ff 20 *
1da177e4
LT
21 * Note that final HPT370 support was done by force extraction of GPL.
22 *
23 * - add function for getting/setting power status of drive
24 * - the HPT370's state machine can get confused. reset it before each dma
25 * xfer to prevent that from happening.
26 * - reset state engine whenever we get an error.
27 * - check for busmaster state at end of dma.
28 * - use new highpoint timings.
29 * - detect bus speed using highpoint register.
30 * - use pll if we don't have a clock table. added a 66MHz table that's
31 * just 2x the 33MHz table.
32 * - removed turnaround. NOTE: we never want to switch between pll and
33 * pci clocks as the chip can glitch in those cases. the highpoint
34 * approved workaround slows everything down too much to be useful. in
35 * addition, we would have to serialize access to each chip.
36 * Adrian Sun <a.sun@sun.com>
37 *
38 * add drive timings for 66MHz PCI bus,
39 * fix ATA Cable signal detection, fix incorrect /proc info
40 * add /proc display for per-drive PIO/DMA/UDMA mode and
41 * per-channel ATA-33/66 Cable detect.
42 * Duncan Laurie <void@sun.com>
43 *
44 * fixup /proc output for multiple controllers
45 * Tim Hockin <thockin@sun.com>
46 *
47 * On hpt366:
48 * Reset the hpt366 on error, reset on dma
49 * Fix disabling Fast Interrupt hpt366.
50 * Mike Waychison <crlf@sun.com>
51 *
52 * Added support for 372N clocking and clock switching. The 372N needs
53 * different clocks on read/write. This requires overloading rw_disk and
54 * other deeply crazy things. Thanks to <http://www.hoerstreich.de> for
55 * keeping me sane.
56 * Alan Cox <alan@redhat.com>
57 *
836c0063
SS
58 * - fix the clock turnaround code: it was writing to the wrong ports when
59 * called for the secondary channel, caching the current clock mode per-
60 * channel caused the cached register value to get out of sync with the
61 * actual one, the channels weren't serialized, the turnaround shouldn't
62 * be done on 66 MHz PCI bus
63 * - avoid calibrating PLL twice as the second time results in a wrong PCI
64 * frequency and thus in the wrong timings for the secondary channel
65 * - disable UltraATA/133 for HPT372 by default (50 MHz DPLL clock do not
66 * allow for this speed anyway)
67 * - add support for HPT302N and HPT371N clocking (the same as for HPT372N)
68 * - HPT371/N are single channel chips, so avoid touching the primary channel
69 * which exists only virtually (there's no pins for it)
471a0bda
SS
70 * - fix/remove bad/unused timing tables and use one set of tables for the whole
71 * HPT37x chip family; save space by introducing the separate transfer mode
72 * table in which the mode lookup is done
26c068da
SS
73 * - use f_CNT value saved by the HighPoint BIOS as reading it directly gives
74 * the wrong PCI frequency since DPLL has already been calibrated by BIOS
33b18a60
SS
75 * - fix the hotswap code: it caused RESET- to glitch when tristating the bus,
76 * and for HPT36x the obsolete HDIO_TRISTATE_HWIF handler was called instead
73d1dd93
SS
77 * - pass to init_chipset() handlers a copy of the IDE PCI device structure as
78 * they tamper with its fields
836c0063
SS
79 * <source@mvista.com>
80 *
1da177e4
LT
81 */
82
83
1da177e4
LT
84#include <linux/types.h>
85#include <linux/module.h>
86#include <linux/kernel.h>
87#include <linux/delay.h>
88#include <linux/timer.h>
89#include <linux/mm.h>
90#include <linux/ioport.h>
91#include <linux/blkdev.h>
92#include <linux/hdreg.h>
93
94#include <linux/interrupt.h>
95#include <linux/pci.h>
96#include <linux/init.h>
97#include <linux/ide.h>
98
99#include <asm/uaccess.h>
100#include <asm/io.h>
101#include <asm/irq.h>
102
103/* various tuning parameters */
104#define HPT_RESET_STATE_ENGINE
836c0063
SS
105#undef HPT_DELAY_INTERRUPT
106#define HPT_SERIALIZE_IO 0
1da177e4
LT
107
108static const char *quirk_drives[] = {
109 "QUANTUM FIREBALLlct08 08",
110 "QUANTUM FIREBALLP KA6.4",
111 "QUANTUM FIREBALLP LM20.4",
112 "QUANTUM FIREBALLP LM20.5",
113 NULL
114};
115
116static const char *bad_ata100_5[] = {
117 "IBM-DTLA-307075",
118 "IBM-DTLA-307060",
119 "IBM-DTLA-307045",
120 "IBM-DTLA-307030",
121 "IBM-DTLA-307020",
122 "IBM-DTLA-307015",
123 "IBM-DTLA-305040",
124 "IBM-DTLA-305030",
125 "IBM-DTLA-305020",
126 "IC35L010AVER07-0",
127 "IC35L020AVER07-0",
128 "IC35L030AVER07-0",
129 "IC35L040AVER07-0",
130 "IC35L060AVER07-0",
131 "WDC AC310200R",
132 NULL
133};
134
135static const char *bad_ata66_4[] = {
136 "IBM-DTLA-307075",
137 "IBM-DTLA-307060",
138 "IBM-DTLA-307045",
139 "IBM-DTLA-307030",
140 "IBM-DTLA-307020",
141 "IBM-DTLA-307015",
142 "IBM-DTLA-305040",
143 "IBM-DTLA-305030",
144 "IBM-DTLA-305020",
145 "IC35L010AVER07-0",
146 "IC35L020AVER07-0",
147 "IC35L030AVER07-0",
148 "IC35L040AVER07-0",
149 "IC35L060AVER07-0",
150 "WDC AC310200R",
151 NULL
152};
153
154static const char *bad_ata66_3[] = {
155 "WDC AC310200R",
156 NULL
157};
158
159static const char *bad_ata33[] = {
160 "Maxtor 92720U8", "Maxtor 92040U6", "Maxtor 91360U4", "Maxtor 91020U3", "Maxtor 90845U3", "Maxtor 90650U2",
161 "Maxtor 91360D8", "Maxtor 91190D7", "Maxtor 91020D6", "Maxtor 90845D5", "Maxtor 90680D4", "Maxtor 90510D3", "Maxtor 90340D2",
162 "Maxtor 91152D8", "Maxtor 91008D7", "Maxtor 90845D6", "Maxtor 90840D6", "Maxtor 90720D5", "Maxtor 90648D5", "Maxtor 90576D4",
163 "Maxtor 90510D4",
164 "Maxtor 90432D3", "Maxtor 90288D2", "Maxtor 90256D2",
165 "Maxtor 91000D8", "Maxtor 90910D8", "Maxtor 90875D7", "Maxtor 90840D7", "Maxtor 90750D6", "Maxtor 90625D5", "Maxtor 90500D4",
166 "Maxtor 91728D8", "Maxtor 91512D7", "Maxtor 91303D6", "Maxtor 91080D5", "Maxtor 90845D4", "Maxtor 90680D4", "Maxtor 90648D3", "Maxtor 90432D2",
167 NULL
168};
169
471a0bda
SS
170static u8 xfer_speeds[] = {
171 XFER_UDMA_6,
172 XFER_UDMA_5,
173 XFER_UDMA_4,
174 XFER_UDMA_3,
175 XFER_UDMA_2,
176 XFER_UDMA_1,
177 XFER_UDMA_0,
178
179 XFER_MW_DMA_2,
180 XFER_MW_DMA_1,
181 XFER_MW_DMA_0,
182
183 XFER_PIO_4,
184 XFER_PIO_3,
185 XFER_PIO_2,
186 XFER_PIO_1,
187 XFER_PIO_0
1da177e4
LT
188};
189
471a0bda
SS
190/* Key for bus clock timings
191 * 36x 37x
192 * bits bits
193 * 0:3 0:3 data_high_time. Inactive time of DIOW_/DIOR_ for PIO and MW DMA.
194 * cycles = value + 1
195 * 4:7 4:8 data_low_time. Active time of DIOW_/DIOR_ for PIO and MW DMA.
196 * cycles = value + 1
197 * 8:11 9:12 cmd_high_time. Inactive time of DIOW_/DIOR_ during task file
198 * register access.
199 * 12:15 13:17 cmd_low_time. Active time of DIOW_/DIOR_ during task file
200 * register access.
201 * 16:18 18:20 udma_cycle_time. Clock cycles for UDMA xfer.
202 * - 21 CLK frequency: 0=ATA clock, 1=dual ATA clock.
203 * 19:21 22:24 pre_high_time. Time to initialize the 1st cycle for PIO and
204 * MW DMA xfer.
205 * 22:24 25:27 cmd_pre_high_time. Time to initialize the 1st PIO cycle for
206 * task file register access.
207 * 28 28 UDMA enable.
208 * 29 29 DMA enable.
209 * 30 30 PIO MST enable. If set, the chip is in bus master mode during
210 * PIO xfer.
211 * 31 31 FIFO enable.
1da177e4 212 */
1da177e4 213
471a0bda
SS
214static u32 forty_base_hpt36x[] = {
215 /* XFER_UDMA_6 */ 0x900fd943,
216 /* XFER_UDMA_5 */ 0x900fd943,
217 /* XFER_UDMA_4 */ 0x900fd943,
218 /* XFER_UDMA_3 */ 0x900ad943,
219 /* XFER_UDMA_2 */ 0x900bd943,
220 /* XFER_UDMA_1 */ 0x9008d943,
221 /* XFER_UDMA_0 */ 0x9008d943,
222
223 /* XFER_MW_DMA_2 */ 0xa008d943,
224 /* XFER_MW_DMA_1 */ 0xa010d955,
225 /* XFER_MW_DMA_0 */ 0xa010d9fc,
226
227 /* XFER_PIO_4 */ 0xc008d963,
228 /* XFER_PIO_3 */ 0xc010d974,
229 /* XFER_PIO_2 */ 0xc010d997,
230 /* XFER_PIO_1 */ 0xc010d9c7,
231 /* XFER_PIO_0 */ 0xc018d9d9
1da177e4
LT
232};
233
471a0bda
SS
234static u32 thirty_three_base_hpt36x[] = {
235 /* XFER_UDMA_6 */ 0x90c9a731,
236 /* XFER_UDMA_5 */ 0x90c9a731,
237 /* XFER_UDMA_4 */ 0x90c9a731,
238 /* XFER_UDMA_3 */ 0x90cfa731,
239 /* XFER_UDMA_2 */ 0x90caa731,
240 /* XFER_UDMA_1 */ 0x90cba731,
241 /* XFER_UDMA_0 */ 0x90c8a731,
242
243 /* XFER_MW_DMA_2 */ 0xa0c8a731,
244 /* XFER_MW_DMA_1 */ 0xa0c8a732, /* 0xa0c8a733 */
245 /* XFER_MW_DMA_0 */ 0xa0c8a797,
246
247 /* XFER_PIO_4 */ 0xc0c8a731,
248 /* XFER_PIO_3 */ 0xc0c8a742,
249 /* XFER_PIO_2 */ 0xc0d0a753,
250 /* XFER_PIO_1 */ 0xc0d0a7a3, /* 0xc0d0a793 */
251 /* XFER_PIO_0 */ 0xc0d0a7aa /* 0xc0d0a7a7 */
1da177e4
LT
252};
253
471a0bda
SS
254static u32 twenty_five_base_hpt36x[] = {
255 /* XFER_UDMA_6 */ 0x90c98521,
256 /* XFER_UDMA_5 */ 0x90c98521,
257 /* XFER_UDMA_4 */ 0x90c98521,
258 /* XFER_UDMA_3 */ 0x90cf8521,
259 /* XFER_UDMA_2 */ 0x90cf8521,
260 /* XFER_UDMA_1 */ 0x90cb8521,
261 /* XFER_UDMA_0 */ 0x90cb8521,
262
263 /* XFER_MW_DMA_2 */ 0xa0ca8521,
264 /* XFER_MW_DMA_1 */ 0xa0ca8532,
265 /* XFER_MW_DMA_0 */ 0xa0ca8575,
266
267 /* XFER_PIO_4 */ 0xc0ca8521,
268 /* XFER_PIO_3 */ 0xc0ca8532,
269 /* XFER_PIO_2 */ 0xc0ca8542,
270 /* XFER_PIO_1 */ 0xc0d08572,
271 /* XFER_PIO_0 */ 0xc0d08585
1da177e4
LT
272};
273
471a0bda
SS
274static u32 thirty_three_base_hpt37x[] = {
275 /* XFER_UDMA_6 */ 0x12446231, /* 0x12646231 ?? */
276 /* XFER_UDMA_5 */ 0x12446231,
277 /* XFER_UDMA_4 */ 0x12446231,
278 /* XFER_UDMA_3 */ 0x126c6231,
279 /* XFER_UDMA_2 */ 0x12486231,
280 /* XFER_UDMA_1 */ 0x124c6233,
281 /* XFER_UDMA_0 */ 0x12506297,
282
283 /* XFER_MW_DMA_2 */ 0x22406c31,
284 /* XFER_MW_DMA_1 */ 0x22406c33,
285 /* XFER_MW_DMA_0 */ 0x22406c97,
286
287 /* XFER_PIO_4 */ 0x06414e31,
288 /* XFER_PIO_3 */ 0x06414e42,
289 /* XFER_PIO_2 */ 0x06414e53,
290 /* XFER_PIO_1 */ 0x06814e93,
291 /* XFER_PIO_0 */ 0x06814ea7
1da177e4
LT
292};
293
471a0bda
SS
294static u32 fifty_base_hpt37x[] = {
295 /* XFER_UDMA_6 */ 0x12848242,
296 /* XFER_UDMA_5 */ 0x12848242,
297 /* XFER_UDMA_4 */ 0x12ac8242,
298 /* XFER_UDMA_3 */ 0x128c8242,
299 /* XFER_UDMA_2 */ 0x120c8242,
300 /* XFER_UDMA_1 */ 0x12148254,
301 /* XFER_UDMA_0 */ 0x121882ea,
302
303 /* XFER_MW_DMA_2 */ 0x22808242,
304 /* XFER_MW_DMA_1 */ 0x22808254,
305 /* XFER_MW_DMA_0 */ 0x228082ea,
306
307 /* XFER_PIO_4 */ 0x0a81f442,
308 /* XFER_PIO_3 */ 0x0a81f443,
309 /* XFER_PIO_2 */ 0x0a81f454,
310 /* XFER_PIO_1 */ 0x0ac1f465,
311 /* XFER_PIO_0 */ 0x0ac1f48a
1da177e4
LT
312};
313
471a0bda
SS
314static u32 sixty_six_base_hpt37x[] = {
315 /* XFER_UDMA_6 */ 0x1c869c62,
316 /* XFER_UDMA_5 */ 0x1cae9c62, /* 0x1c8a9c62 */
317 /* XFER_UDMA_4 */ 0x1c8a9c62,
318 /* XFER_UDMA_3 */ 0x1c8e9c62,
319 /* XFER_UDMA_2 */ 0x1c929c62,
320 /* XFER_UDMA_1 */ 0x1c9a9c62,
321 /* XFER_UDMA_0 */ 0x1c829c62,
322
323 /* XFER_MW_DMA_2 */ 0x2c829c62,
324 /* XFER_MW_DMA_1 */ 0x2c829c66,
325 /* XFER_MW_DMA_0 */ 0x2c829d2e,
326
327 /* XFER_PIO_4 */ 0x0c829c62,
328 /* XFER_PIO_3 */ 0x0c829c84,
329 /* XFER_PIO_2 */ 0x0c829ca6,
330 /* XFER_PIO_1 */ 0x0d029d26,
331 /* XFER_PIO_0 */ 0x0d029d5e
1da177e4
LT
332};
333
1da177e4
LT
334#define HPT366_DEBUG_DRIVE_INFO 0
335#define HPT374_ALLOW_ATA133_6 0
336#define HPT371_ALLOW_ATA133_6 0
337#define HPT302_ALLOW_ATA133_6 0
836c0063 338#define HPT372_ALLOW_ATA133_6 0
1da177e4
LT
339#define HPT370_ALLOW_ATA100_5 1
340#define HPT366_ALLOW_ATA66_4 1
341#define HPT366_ALLOW_ATA66_3 1
342#define HPT366_MAX_DEVS 8
343
344#define F_LOW_PCI_33 0x23
345#define F_LOW_PCI_40 0x29
346#define F_LOW_PCI_50 0x2d
347#define F_LOW_PCI_66 0x42
348
b39b01ff
AC
349/*
350 * Hold all the highpoint quirks and revision information in one
351 * place.
352 */
1da177e4 353
b39b01ff
AC
354struct hpt_info
355{
356 u8 max_mode; /* Speeds allowed */
357 int revision; /* Chipset revision */
358 int flags; /* Chipset properties */
359#define PLL_MODE 1
836c0063
SS
360#define IS_3xxN 2
361#define PCI_66MHZ 4
b39b01ff 362 /* Speed table */
471a0bda 363 u32 *speed;
b39b01ff
AC
364};
365
366/*
367 * This wants fixing so that we do everything not by classrev
368 * (which breaks on the newest chips) but by creating an
369 * enumeration of chip variants and using that
370 */
371
372static __devinit u32 hpt_revision (struct pci_dev *dev)
1da177e4
LT
373{
374 u32 class_rev;
375 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
376 class_rev &= 0xff;
377
378 switch(dev->device) {
379 /* Remap new 372N onto 372 */
380 case PCI_DEVICE_ID_TTI_HPT372N:
381 class_rev = PCI_DEVICE_ID_TTI_HPT372; break;
382 case PCI_DEVICE_ID_TTI_HPT374:
383 class_rev = PCI_DEVICE_ID_TTI_HPT374; break;
384 case PCI_DEVICE_ID_TTI_HPT371:
385 class_rev = PCI_DEVICE_ID_TTI_HPT371; break;
386 case PCI_DEVICE_ID_TTI_HPT302:
387 class_rev = PCI_DEVICE_ID_TTI_HPT302; break;
388 case PCI_DEVICE_ID_TTI_HPT372:
389 class_rev = PCI_DEVICE_ID_TTI_HPT372; break;
390 default:
391 break;
392 }
393 return class_rev;
394}
395
1da177e4
LT
396static int check_in_drive_lists(ide_drive_t *drive, const char **list);
397
398static u8 hpt3xx_ratemask (ide_drive_t *drive)
399{
b39b01ff
AC
400 ide_hwif_t *hwif = drive->hwif;
401 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4
LT
402 u8 mode = 0;
403
b39b01ff
AC
404 /* FIXME: TODO - move this to set info->mode once at boot */
405
406 if (info->revision >= 8) { /* HPT374 */
1da177e4 407 mode = (HPT374_ALLOW_ATA133_6) ? 4 : 3;
b39b01ff 408 } else if (info->revision >= 7) { /* HPT371 */
1da177e4 409 mode = (HPT371_ALLOW_ATA133_6) ? 4 : 3;
b39b01ff 410 } else if (info->revision >= 6) { /* HPT302 */
1da177e4 411 mode = (HPT302_ALLOW_ATA133_6) ? 4 : 3;
b39b01ff 412 } else if (info->revision >= 5) { /* HPT372 */
1da177e4 413 mode = (HPT372_ALLOW_ATA133_6) ? 4 : 3;
b39b01ff 414 } else if (info->revision >= 4) { /* HPT370A */
1da177e4 415 mode = (HPT370_ALLOW_ATA100_5) ? 3 : 2;
b39b01ff 416 } else if (info->revision >= 3) { /* HPT370 */
1da177e4
LT
417 mode = (HPT370_ALLOW_ATA100_5) ? 3 : 2;
418 mode = (check_in_drive_lists(drive, bad_ata33)) ? 0 : mode;
419 } else { /* HPT366 and HPT368 */
420 mode = (check_in_drive_lists(drive, bad_ata33)) ? 0 : 2;
421 }
b39b01ff 422 if (!eighty_ninty_three(drive) && mode)
1da177e4
LT
423 mode = min(mode, (u8)1);
424 return mode;
425}
426
427/*
428 * Note for the future; the SATA hpt37x we must set
429 * either PIO or UDMA modes 0,4,5
430 */
431
432static u8 hpt3xx_ratefilter (ide_drive_t *drive, u8 speed)
433{
b39b01ff
AC
434 ide_hwif_t *hwif = drive->hwif;
435 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4
LT
436 u8 mode = hpt3xx_ratemask(drive);
437
438 if (drive->media != ide_disk)
439 return min(speed, (u8)XFER_PIO_4);
440
441 switch(mode) {
442 case 0x04:
443 speed = min(speed, (u8)XFER_UDMA_6);
444 break;
445 case 0x03:
446 speed = min(speed, (u8)XFER_UDMA_5);
b39b01ff 447 if (info->revision >= 5)
1da177e4
LT
448 break;
449 if (check_in_drive_lists(drive, bad_ata100_5))
450 speed = min(speed, (u8)XFER_UDMA_4);
451 break;
452 case 0x02:
453 speed = min(speed, (u8)XFER_UDMA_4);
454 /*
455 * CHECK ME, Does this need to be set to 5 ??
456 */
b39b01ff 457 if (info->revision >= 3)
1da177e4
LT
458 break;
459 if ((check_in_drive_lists(drive, bad_ata66_4)) ||
460 (!(HPT366_ALLOW_ATA66_4)))
461 speed = min(speed, (u8)XFER_UDMA_3);
462 if ((check_in_drive_lists(drive, bad_ata66_3)) ||
463 (!(HPT366_ALLOW_ATA66_3)))
464 speed = min(speed, (u8)XFER_UDMA_2);
465 break;
466 case 0x01:
467 speed = min(speed, (u8)XFER_UDMA_2);
468 /*
469 * CHECK ME, Does this need to be set to 5 ??
470 */
b39b01ff 471 if (info->revision >= 3)
1da177e4
LT
472 break;
473 if (check_in_drive_lists(drive, bad_ata33))
474 speed = min(speed, (u8)XFER_MW_DMA_2);
475 break;
476 case 0x00:
477 default:
478 speed = min(speed, (u8)XFER_MW_DMA_2);
479 break;
480 }
481 return speed;
482}
483
484static int check_in_drive_lists (ide_drive_t *drive, const char **list)
485{
486 struct hd_driveid *id = drive->id;
487
488 if (quirk_drives == list) {
489 while (*list)
490 if (strstr(id->model, *list++))
491 return 1;
492 } else {
493 while (*list)
494 if (!strcmp(*list++,id->model))
495 return 1;
496 }
497 return 0;
498}
499
471a0bda 500static u32 pci_bus_clock_list(u8 speed, u32 *chipset_table)
1da177e4 501{
471a0bda
SS
502 int i;
503
504 /*
505 * Lookup the transfer mode table to get the index into
506 * the timing table.
507 *
508 * NOTE: For XFER_PIO_SLOW, PIO mode 0 timings will be used.
509 */
510 for (i = 0; i < ARRAY_SIZE(xfer_speeds) - 1; i++)
511 if (xfer_speeds[i] == speed)
512 break;
513 return chipset_table[i];
1da177e4
LT
514}
515
516static int hpt36x_tune_chipset(ide_drive_t *drive, u8 xferspeed)
517{
b39b01ff
AC
518 ide_hwif_t *hwif = drive->hwif;
519 struct pci_dev *dev = hwif->pci_dev;
520 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4 521 u8 speed = hpt3xx_ratefilter(drive, xferspeed);
1da177e4 522 u8 regtime = (drive->select.b.unit & 0x01) ? 0x44 : 0x40;
b39b01ff 523 u8 regfast = (hwif->channel) ? 0x55 : 0x51;
1da177e4
LT
524 u8 drive_fast = 0;
525 u32 reg1 = 0, reg2 = 0;
526
527 /*
528 * Disable the "fast interrupt" prediction.
529 */
530 pci_read_config_byte(dev, regfast, &drive_fast);
1da177e4
LT
531 if (drive_fast & 0x80)
532 pci_write_config_byte(dev, regfast, drive_fast & ~0x80);
1da177e4 533
b39b01ff
AC
534 reg2 = pci_bus_clock_list(speed, info->speed);
535
1da177e4
LT
536 /*
537 * Disable on-chip PIO FIFO/buffer
538 * (to avoid problems handling I/O errors later)
539 */
540 pci_read_config_dword(dev, regtime, &reg1);
541 if (speed >= XFER_MW_DMA_0) {
542 reg2 = (reg2 & ~0xc0000000) | (reg1 & 0xc0000000);
543 } else {
544 reg2 = (reg2 & ~0x30070000) | (reg1 & 0x30070000);
545 }
546 reg2 &= ~0x80000000;
547
548 pci_write_config_dword(dev, regtime, reg2);
549
550 return ide_config_drive_speed(drive, speed);
551}
552
553static int hpt370_tune_chipset(ide_drive_t *drive, u8 xferspeed)
554{
b39b01ff
AC
555 ide_hwif_t *hwif = drive->hwif;
556 struct pci_dev *dev = hwif->pci_dev;
557 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4 558 u8 speed = hpt3xx_ratefilter(drive, xferspeed);
b39b01ff 559 u8 regfast = (drive->hwif->channel) ? 0x55 : 0x51;
1da177e4
LT
560 u8 drive_pci = 0x40 + (drive->dn * 4);
561 u8 new_fast = 0, drive_fast = 0;
562 u32 list_conf = 0, drive_conf = 0;
563 u32 conf_mask = (speed >= XFER_MW_DMA_0) ? 0xc0000000 : 0x30070000;
564
565 /*
566 * Disable the "fast interrupt" prediction.
567 * don't holdoff on interrupts. (== 0x01 despite what the docs say)
568 */
569 pci_read_config_byte(dev, regfast, &drive_fast);
570 new_fast = drive_fast;
571 if (new_fast & 0x02)
572 new_fast &= ~0x02;
573
574#ifdef HPT_DELAY_INTERRUPT
575 if (new_fast & 0x01)
576 new_fast &= ~0x01;
577#else
578 if ((new_fast & 0x01) == 0)
579 new_fast |= 0x01;
580#endif
581 if (new_fast != drive_fast)
582 pci_write_config_byte(dev, regfast, new_fast);
583
b39b01ff 584 list_conf = pci_bus_clock_list(speed, info->speed);
1da177e4
LT
585
586 pci_read_config_dword(dev, drive_pci, &drive_conf);
587 list_conf = (list_conf & ~conf_mask) | (drive_conf & conf_mask);
588
b39b01ff 589 if (speed < XFER_MW_DMA_0)
1da177e4 590 list_conf &= ~0x80000000; /* Disable on-chip PIO FIFO/buffer */
1da177e4
LT
591 pci_write_config_dword(dev, drive_pci, list_conf);
592
593 return ide_config_drive_speed(drive, speed);
594}
595
596static int hpt372_tune_chipset(ide_drive_t *drive, u8 xferspeed)
597{
b39b01ff
AC
598 ide_hwif_t *hwif = drive->hwif;
599 struct pci_dev *dev = hwif->pci_dev;
600 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4 601 u8 speed = hpt3xx_ratefilter(drive, xferspeed);
b39b01ff 602 u8 regfast = (drive->hwif->channel) ? 0x55 : 0x51;
1da177e4
LT
603 u8 drive_fast = 0, drive_pci = 0x40 + (drive->dn * 4);
604 u32 list_conf = 0, drive_conf = 0;
605 u32 conf_mask = (speed >= XFER_MW_DMA_0) ? 0xc0000000 : 0x30070000;
606
607 /*
608 * Disable the "fast interrupt" prediction.
609 * don't holdoff on interrupts. (== 0x01 despite what the docs say)
610 */
611 pci_read_config_byte(dev, regfast, &drive_fast);
612 drive_fast &= ~0x07;
613 pci_write_config_byte(dev, regfast, drive_fast);
b39b01ff
AC
614
615 list_conf = pci_bus_clock_list(speed, info->speed);
1da177e4
LT
616 pci_read_config_dword(dev, drive_pci, &drive_conf);
617 list_conf = (list_conf & ~conf_mask) | (drive_conf & conf_mask);
618 if (speed < XFER_MW_DMA_0)
619 list_conf &= ~0x80000000; /* Disable on-chip PIO FIFO/buffer */
620 pci_write_config_dword(dev, drive_pci, list_conf);
621
622 return ide_config_drive_speed(drive, speed);
623}
624
625static int hpt3xx_tune_chipset (ide_drive_t *drive, u8 speed)
626{
b39b01ff
AC
627 ide_hwif_t *hwif = drive->hwif;
628 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4 629
b39b01ff 630 if (info->revision >= 8)
1da177e4 631 return hpt372_tune_chipset(drive, speed); /* not a typo */
b39b01ff 632 else if (info->revision >= 5)
1da177e4 633 return hpt372_tune_chipset(drive, speed);
b39b01ff 634 else if (info->revision >= 3)
1da177e4
LT
635 return hpt370_tune_chipset(drive, speed);
636 else /* hpt368: hpt_minimum_revision(dev, 2) */
637 return hpt36x_tune_chipset(drive, speed);
638}
639
640static void hpt3xx_tune_drive (ide_drive_t *drive, u8 pio)
641{
642 pio = ide_get_best_pio_mode(drive, 255, pio, NULL);
643 (void) hpt3xx_tune_chipset(drive, (XFER_PIO_0 + pio));
644}
645
646/*
647 * This allows the configuration of ide_pci chipset registers
648 * for cards that learn about the drive's UDMA, DMA, PIO capabilities
649 * after the drive is reported by the OS. Initially for designed for
650 * HPT366 UDMA chipset by HighPoint|Triones Technologies, Inc.
651 *
652 * check_in_drive_lists(drive, bad_ata66_4)
653 * check_in_drive_lists(drive, bad_ata66_3)
654 * check_in_drive_lists(drive, bad_ata33)
655 *
656 */
657static int config_chipset_for_dma (ide_drive_t *drive)
658{
659 u8 speed = ide_dma_speed(drive, hpt3xx_ratemask(drive));
b39b01ff
AC
660 ide_hwif_t *hwif = drive->hwif;
661 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4 662
b39b01ff
AC
663 if (!speed)
664 return 0;
665
666 /* If we don't have any timings we can't do a lot */
667 if (info->speed == NULL)
1da177e4
LT
668 return 0;
669
670 (void) hpt3xx_tune_chipset(drive, speed);
671 return ide_dma_enable(drive);
672}
673
674static int hpt3xx_quirkproc (ide_drive_t *drive)
675{
676 return ((int) check_in_drive_lists(drive, quirk_drives));
677}
678
679static void hpt3xx_intrproc (ide_drive_t *drive)
680{
b39b01ff 681 ide_hwif_t *hwif = drive->hwif;
1da177e4
LT
682
683 if (drive->quirk_list)
684 return;
685 /* drives in the quirk_list may not like intr setups/cleanups */
686 hwif->OUTB(drive->ctl|2, IDE_CONTROL_REG);
687}
688
689static void hpt3xx_maskproc (ide_drive_t *drive, int mask)
690{
b39b01ff
AC
691 ide_hwif_t *hwif = drive->hwif;
692 struct hpt_info *info = ide_get_hwifdata(hwif);
693 struct pci_dev *dev = hwif->pci_dev;
1da177e4
LT
694
695 if (drive->quirk_list) {
b39b01ff 696 if (info->revision >= 3) {
1da177e4
LT
697 u8 reg5a = 0;
698 pci_read_config_byte(dev, 0x5a, &reg5a);
699 if (((reg5a & 0x10) >> 4) != mask)
700 pci_write_config_byte(dev, 0x5a, mask ? (reg5a | 0x10) : (reg5a & ~0x10));
701 } else {
702 if (mask) {
b39b01ff 703 disable_irq(hwif->irq);
1da177e4 704 } else {
b39b01ff 705 enable_irq(hwif->irq);
1da177e4
LT
706 }
707 }
708 } else {
709 if (IDE_CONTROL_REG)
b39b01ff 710 hwif->OUTB(mask ? (drive->ctl | 2) :
1da177e4
LT
711 (drive->ctl & ~2),
712 IDE_CONTROL_REG);
713 }
714}
715
716static int hpt366_config_drive_xfer_rate (ide_drive_t *drive)
717{
b39b01ff 718 ide_hwif_t *hwif = drive->hwif;
1da177e4
LT
719 struct hd_driveid *id = drive->id;
720
721 drive->init_speed = 0;
722
b39b01ff 723 if ((id->capability & 1) && drive->autodma) {
1da177e4
LT
724
725 if (ide_use_dma(drive)) {
726 if (config_chipset_for_dma(drive))
727 return hwif->ide_dma_on(drive);
728 }
729
730 goto fast_ata_pio;
731
732 } else if ((id->capability & 8) || (id->field_valid & 2)) {
733fast_ata_pio:
734 hpt3xx_tune_drive(drive, 5);
735 return hwif->ide_dma_off_quietly(drive);
736 }
737 /* IORDY not supported */
738 return 0;
739}
740
741/*
742 * This is specific to the HPT366 UDMA bios chipset
743 * by HighPoint|Triones Technologies, Inc.
744 */
745static int hpt366_ide_dma_lostirq (ide_drive_t *drive)
746{
747 struct pci_dev *dev = HWIF(drive)->pci_dev;
748 u8 reg50h = 0, reg52h = 0, reg5ah = 0;
749
750 pci_read_config_byte(dev, 0x50, &reg50h);
751 pci_read_config_byte(dev, 0x52, &reg52h);
752 pci_read_config_byte(dev, 0x5a, &reg5ah);
753 printk("%s: (%s) reg50h=0x%02x, reg52h=0x%02x, reg5ah=0x%02x\n",
754 drive->name, __FUNCTION__, reg50h, reg52h, reg5ah);
755 if (reg5ah & 0x10)
756 pci_write_config_byte(dev, 0x5a, reg5ah & ~0x10);
1da177e4
LT
757 return __ide_dma_lostirq(drive);
758}
759
760static void hpt370_clear_engine (ide_drive_t *drive)
761{
762 u8 regstate = HWIF(drive)->channel ? 0x54 : 0x50;
763 pci_write_config_byte(HWIF(drive)->pci_dev, regstate, 0x37);
764 udelay(10);
765}
766
767static void hpt370_ide_dma_start(ide_drive_t *drive)
768{
769#ifdef HPT_RESET_STATE_ENGINE
770 hpt370_clear_engine(drive);
771#endif
772 ide_dma_start(drive);
773}
774
775static int hpt370_ide_dma_end (ide_drive_t *drive)
776{
777 ide_hwif_t *hwif = HWIF(drive);
778 u8 dma_stat = hwif->INB(hwif->dma_status);
779
780 if (dma_stat & 0x01) {
781 /* wait a little */
782 udelay(20);
783 dma_stat = hwif->INB(hwif->dma_status);
784 }
785 if ((dma_stat & 0x01) != 0)
786 /* fallthrough */
787 (void) HWIF(drive)->ide_dma_timeout(drive);
788
789 return __ide_dma_end(drive);
790}
791
792static void hpt370_lostirq_timeout (ide_drive_t *drive)
793{
794 ide_hwif_t *hwif = HWIF(drive);
795 u8 bfifo = 0, reginfo = hwif->channel ? 0x56 : 0x52;
796 u8 dma_stat = 0, dma_cmd = 0;
797
798 pci_read_config_byte(HWIF(drive)->pci_dev, reginfo, &bfifo);
b39b01ff 799 printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo);
1da177e4
LT
800 hpt370_clear_engine(drive);
801 /* get dma command mode */
802 dma_cmd = hwif->INB(hwif->dma_command);
803 /* stop dma */
804 hwif->OUTB(dma_cmd & ~0x1, hwif->dma_command);
805 dma_stat = hwif->INB(hwif->dma_status);
806 /* clear errors */
807 hwif->OUTB(dma_stat | 0x6, hwif->dma_status);
808}
809
810static int hpt370_ide_dma_timeout (ide_drive_t *drive)
811{
812 hpt370_lostirq_timeout(drive);
813 hpt370_clear_engine(drive);
814 return __ide_dma_timeout(drive);
815}
816
817static int hpt370_ide_dma_lostirq (ide_drive_t *drive)
818{
819 hpt370_lostirq_timeout(drive);
820 hpt370_clear_engine(drive);
821 return __ide_dma_lostirq(drive);
822}
823
824/* returns 1 if DMA IRQ issued, 0 otherwise */
825static int hpt374_ide_dma_test_irq(ide_drive_t *drive)
826{
827 ide_hwif_t *hwif = HWIF(drive);
828 u16 bfifo = 0;
829 u8 reginfo = hwif->channel ? 0x56 : 0x52;
830 u8 dma_stat;
831
832 pci_read_config_word(hwif->pci_dev, reginfo, &bfifo);
833 if (bfifo & 0x1FF) {
834// printk("%s: %d bytes in FIFO\n", drive->name, bfifo);
835 return 0;
836 }
837
838 dma_stat = hwif->INB(hwif->dma_status);
839 /* return 1 if INTR asserted */
840 if ((dma_stat & 4) == 4)
841 return 1;
842
843 if (!drive->waiting_for_dma)
844 printk(KERN_WARNING "%s: (%s) called while not waiting\n",
845 drive->name, __FUNCTION__);
846 return 0;
847}
848
849static int hpt374_ide_dma_end (ide_drive_t *drive)
850{
851 struct pci_dev *dev = HWIF(drive)->pci_dev;
852 ide_hwif_t *hwif = HWIF(drive);
853 u8 msc_stat = 0, mscreg = hwif->channel ? 0x54 : 0x50;
854 u8 bwsr_stat = 0, bwsr_mask = hwif->channel ? 0x02 : 0x01;
855
856 pci_read_config_byte(dev, 0x6a, &bwsr_stat);
857 pci_read_config_byte(dev, mscreg, &msc_stat);
858 if ((bwsr_stat & bwsr_mask) == bwsr_mask)
859 pci_write_config_byte(dev, mscreg, msc_stat|0x30);
860 return __ide_dma_end(drive);
861}
862
863/**
836c0063
SS
864 * hpt3xxn_set_clock - perform clock switching dance
865 * @hwif: hwif to switch
866 * @mode: clocking mode (0x21 for write, 0x23 otherwise)
1da177e4 867 *
836c0063
SS
868 * Switch the DPLL clock on the HPT3xxN devices. This is a right mess.
869 * NOTE: avoid touching the disabled primary channel on HPT371N -- it
870 * doesn't physically exist anyway...
1da177e4 871 */
836c0063
SS
872
873static void hpt3xxn_set_clock(ide_hwif_t *hwif, u8 mode)
1da177e4 874{
836c0063
SS
875 u8 mcr1, scr2 = hwif->INB(hwif->dma_master + 0x7b);
876
877 if ((scr2 & 0x7f) == mode)
878 return;
879
880 /* MISC. control register 1 has the channel enable bit... */
881 mcr1 = hwif->INB(hwif->dma_master + 0x70);
882
1da177e4 883 /* Tristate the bus */
836c0063
SS
884 if (mcr1 & 0x04)
885 hwif->OUTB(0x80, hwif->dma_master + 0x73);
886 hwif->OUTB(0x80, hwif->dma_master + 0x77);
887
1da177e4 888 /* Switch clock and reset channels */
836c0063
SS
889 hwif->OUTB(mode, hwif->dma_master + 0x7b);
890 hwif->OUTB(0xc0, hwif->dma_master + 0x79);
891
1da177e4 892 /* Reset state machines */
836c0063
SS
893 if (mcr1 & 0x04)
894 hwif->OUTB(0x37, hwif->dma_master + 0x70);
895 hwif->OUTB(0x37, hwif->dma_master + 0x74);
896
1da177e4 897 /* Complete reset */
836c0063
SS
898 hwif->OUTB(0x00, hwif->dma_master + 0x79);
899
1da177e4 900 /* Reconnect channels to bus */
836c0063
SS
901 if (mcr1 & 0x04)
902 hwif->OUTB(0x00, hwif->dma_master + 0x73);
903 hwif->OUTB(0x00, hwif->dma_master + 0x77);
1da177e4
LT
904}
905
906/**
836c0063 907 * hpt3xxn_rw_disk - prepare for I/O
1da177e4
LT
908 * @drive: drive for command
909 * @rq: block request structure
910 *
836c0063 911 * This is called when a disk I/O is issued to HPT3xxN.
1da177e4
LT
912 * We need it because of the clock switching.
913 */
914
836c0063 915static void hpt3xxn_rw_disk(ide_drive_t *drive, struct request *rq)
1da177e4 916{
836c0063
SS
917 ide_hwif_t *hwif = HWIF(drive);
918 u8 wantclock = rq_data_dir(rq) ? 0x23 : 0x21;
1da177e4 919
836c0063 920 hpt3xxn_set_clock(hwif, wantclock);
1da177e4
LT
921}
922
1da177e4 923/*
33b18a60 924 * Set/get power state for a drive.
1da177e4 925 *
33b18a60 926 * When we turn the power back on, we need to re-initialize things.
1da177e4
LT
927 */
928#define TRISTATE_BIT 0x8000
33b18a60
SS
929
930static int hpt3xx_busproc(ide_drive_t *drive, int state)
1da177e4 931{
b39b01ff 932 ide_hwif_t *hwif = drive->hwif;
1da177e4 933 struct pci_dev *dev = hwif->pci_dev;
33b18a60
SS
934 u8 tristate, resetmask, bus_reg = 0;
935 u16 tri_reg = 0;
1da177e4
LT
936
937 hwif->bus_state = state;
938
939 if (hwif->channel) {
940 /* secondary channel */
33b18a60
SS
941 tristate = 0x56;
942 resetmask = 0x80;
1da177e4
LT
943 } else {
944 /* primary channel */
33b18a60 945 tristate = 0x52;
1da177e4
LT
946 resetmask = 0x40;
947 }
948
33b18a60 949 /* Grab the status. */
1da177e4
LT
950 pci_read_config_word(dev, tristate, &tri_reg);
951 pci_read_config_byte(dev, 0x59, &bus_reg);
952
33b18a60
SS
953 /*
954 * Set the state. We don't set it if we don't need to do so.
955 * Make sure that the drive knows that it has failed if it's off.
956 */
1da177e4
LT
957 switch (state) {
958 case BUSSTATE_ON:
33b18a60 959 if (!(bus_reg & resetmask))
1da177e4 960 return 0;
33b18a60
SS
961 hwif->drives[0].failures = hwif->drives[1].failures = 0;
962
963 pci_write_config_byte(dev, 0x59, bus_reg & ~resetmask);
964 pci_write_config_word(dev, tristate, tri_reg & ~TRISTATE_BIT);
965 return 0;
1da177e4 966 case BUSSTATE_OFF:
33b18a60 967 if ((bus_reg & resetmask) && !(tri_reg & TRISTATE_BIT))
1da177e4
LT
968 return 0;
969 tri_reg &= ~TRISTATE_BIT;
1da177e4
LT
970 break;
971 case BUSSTATE_TRISTATE:
33b18a60 972 if ((bus_reg & resetmask) && (tri_reg & TRISTATE_BIT))
1da177e4
LT
973 return 0;
974 tri_reg |= TRISTATE_BIT;
1da177e4 975 break;
33b18a60
SS
976 default:
977 return -EINVAL;
1da177e4 978 }
1da177e4 979
33b18a60
SS
980 hwif->drives[0].failures = hwif->drives[0].max_failures + 1;
981 hwif->drives[1].failures = hwif->drives[1].max_failures + 1;
982
983 pci_write_config_word(dev, tristate, tri_reg);
984 pci_write_config_byte(dev, 0x59, bus_reg | resetmask);
1da177e4
LT
985 return 0;
986}
987
b39b01ff 988static void __devinit hpt366_clocking(ide_hwif_t *hwif)
1da177e4 989{
b39b01ff
AC
990 u32 reg1 = 0;
991 struct hpt_info *info = ide_get_hwifdata(hwif);
992
993 pci_read_config_dword(hwif->pci_dev, 0x40, &reg1);
994
995 /* detect bus speed by looking at control reg timing: */
996 switch((reg1 >> 8) & 7) {
997 case 5:
471a0bda 998 info->speed = forty_base_hpt36x;
b39b01ff
AC
999 break;
1000 case 9:
471a0bda 1001 info->speed = twenty_five_base_hpt36x;
b39b01ff
AC
1002 break;
1003 case 7:
1004 default:
471a0bda 1005 info->speed = thirty_three_base_hpt36x;
b39b01ff
AC
1006 break;
1007 }
1008}
1009
1010static void __devinit hpt37x_clocking(ide_hwif_t *hwif)
1011{
1012 struct hpt_info *info = ide_get_hwifdata(hwif);
1013 struct pci_dev *dev = hwif->pci_dev;
1da177e4 1014 int adjust, i;
26c068da
SS
1015 u16 freq = 0;
1016 u32 pll, temp = 0;
836c0063 1017 u8 reg5bh = 0, mcr1 = 0;
1da177e4 1018
1da177e4
LT
1019 /*
1020 * default to pci clock. make sure MA15/16 are set to output
b39b01ff
AC
1021 * to prevent drives having problems with 40-pin cables. Needed
1022 * for some drives such as IBM-DTLA which will not enter ready
1023 * state on reset when PDIAG is a input.
1024 *
1025 * ToDo: should we set 0x21 when using PLL mode ?
1da177e4
LT
1026 */
1027 pci_write_config_byte(dev, 0x5b, 0x23);
1028
1029 /*
26c068da
SS
1030 * We'll have to read f_CNT value in order to determine
1031 * the PCI clock frequency according to the following ratio:
1da177e4 1032 *
26c068da
SS
1033 * f_CNT = Fpci * 192 / Fdpll
1034 *
1035 * First try reading the register in which the HighPoint BIOS
1036 * saves f_CNT value before reprogramming the DPLL from its
1037 * default setting (which differs for the various chips).
f13c1526
SS
1038 * NOTE: This register is only accessible via I/O space.
1039 *
26c068da
SS
1040 * In case the signature check fails, we'll have to resort to
1041 * reading the f_CNT register itself in hopes that nobody has
1042 * touched the DPLL yet...
1da177e4 1043 */
f13c1526 1044 temp = inl(pci_resource_start(dev, 4) + 0x90);
26c068da 1045 if ((temp & 0xFFFFF000) != 0xABCDE000) {
26c068da
SS
1046 printk(KERN_WARNING "HPT37X: no clock data saved by BIOS\n");
1047
1048 /* Calculate the average value of f_CNT */
1049 for (temp = i = 0; i < 128; i++) {
1050 pci_read_config_word(dev, 0x78, &freq);
1051 temp += freq & 0x1ff;
1052 mdelay(1);
1053 }
1054 freq = temp / 128;
1055 } else
1056 freq = temp & 0x1ff;
1057
1da177e4 1058 /*
836c0063
SS
1059 * HPT3xxN chips use different PCI clock information.
1060 * Currently we always set up the PLL for them.
1da177e4 1061 */
836c0063
SS
1062
1063 if (info->flags & IS_3xxN) {
1da177e4
LT
1064 if(freq < 0x55)
1065 pll = F_LOW_PCI_33;
1066 else if(freq < 0x70)
1067 pll = F_LOW_PCI_40;
1068 else if(freq < 0x7F)
1069 pll = F_LOW_PCI_50;
1070 else
1071 pll = F_LOW_PCI_66;
836c0063
SS
1072
1073 printk(KERN_INFO "HPT3xxN detected, FREQ: %d, PLL: %d\n", freq, pll);
1da177e4
LT
1074 }
1075 else
1076 {
1077 if(freq < 0x9C)
1078 pll = F_LOW_PCI_33;
1079 else if(freq < 0xb0)
1080 pll = F_LOW_PCI_40;
1081 else if(freq <0xc8)
1082 pll = F_LOW_PCI_50;
1083 else
1084 pll = F_LOW_PCI_66;
1085
1086 if (pll == F_LOW_PCI_33) {
471a0bda 1087 info->speed = thirty_three_base_hpt37x;
b39b01ff 1088 printk(KERN_DEBUG "HPT37X: using 33MHz PCI clock\n");
1da177e4
LT
1089 } else if (pll == F_LOW_PCI_40) {
1090 /* Unsupported */
1091 } else if (pll == F_LOW_PCI_50) {
471a0bda 1092 info->speed = fifty_base_hpt37x;
b39b01ff 1093 printk(KERN_DEBUG "HPT37X: using 50MHz PCI clock\n");
1da177e4 1094 } else {
471a0bda
SS
1095 info->speed = sixty_six_base_hpt37x;
1096 printk(KERN_DEBUG "HPT37X: using 66MHz PCI clock\n");
1da177e4
LT
1097 }
1098 }
836c0063
SS
1099
1100 if (pll == F_LOW_PCI_66)
1101 info->flags |= PCI_66MHZ;
1102
1da177e4
LT
1103 /*
1104 * only try the pll if we don't have a table for the clock
1105 * speed that we're running at. NOTE: the internal PLL will
1106 * result in slow reads when using a 33MHz PCI clock. we also
1107 * don't like to use the PLL because it will cause glitches
1108 * on PRST/SRST when the HPT state engine gets reset.
b39b01ff
AC
1109 *
1110 * ToDo: Use 66MHz PLL when ATA133 devices are present on a
1111 * 372 device so we can get ATA133 support
1da177e4 1112 */
b39b01ff 1113 if (info->speed)
1da177e4 1114 goto init_hpt37X_done;
b39b01ff
AC
1115
1116 info->flags |= PLL_MODE;
1da177e4
LT
1117
1118 /*
26c068da
SS
1119 * Adjust the PLL based upon the PCI clock, enable it, and
1120 * wait for stabilization...
1da177e4
LT
1121 */
1122 adjust = 0;
1123 freq = (pll < F_LOW_PCI_50) ? 2 : 4;
1124 while (adjust++ < 6) {
1125 pci_write_config_dword(dev, 0x5c, (freq + pll) << 16 |
1126 pll | 0x100);
1127
1128 /* wait for clock stabilization */
1129 for (i = 0; i < 0x50000; i++) {
1130 pci_read_config_byte(dev, 0x5b, &reg5bh);
1131 if (reg5bh & 0x80) {
1132 /* spin looking for the clock to destabilize */
1133 for (i = 0; i < 0x1000; ++i) {
1134 pci_read_config_byte(dev, 0x5b,
1135 &reg5bh);
1136 if ((reg5bh & 0x80) == 0)
1137 goto pll_recal;
1138 }
1139 pci_read_config_dword(dev, 0x5c, &pll);
1140 pci_write_config_dword(dev, 0x5c,
1141 pll & ~0x100);
1142 pci_write_config_byte(dev, 0x5b, 0x21);
471a0bda
SS
1143
1144 info->speed = fifty_base_hpt37x;
1da177e4
LT
1145 printk("HPT37X: using 50MHz internal PLL\n");
1146 goto init_hpt37X_done;
1147 }
1148 }
1149pll_recal:
1150 if (adjust & 1)
1151 pll -= (adjust >> 1);
1152 else
1153 pll += (adjust >> 1);
1154 }
1155
1156init_hpt37X_done:
b39b01ff 1157 if (!info->speed)
836c0063
SS
1158 printk(KERN_ERR "HPT37x%s: unknown bus timing [%d %d].\n",
1159 (info->flags & IS_3xxN) ? "N" : "", pll, freq);
1160 /*
1161 * Reset the state engines.
1162 * NOTE: avoid accidentally enabling the primary channel on HPT371N.
1163 */
1164 pci_read_config_byte(dev, 0x50, &mcr1);
1165 if (mcr1 & 0x04)
1166 pci_write_config_byte(dev, 0x50, 0x37);
1167 pci_write_config_byte(dev, 0x54, 0x37);
1da177e4 1168 udelay(100);
b39b01ff
AC
1169}
1170
1171static int __devinit init_hpt37x(struct pci_dev *dev)
1172{
1173 u8 reg5ah;
1174
1175 pci_read_config_byte(dev, 0x5a, &reg5ah);
1176 /* interrupt force enable */
1177 pci_write_config_byte(dev, 0x5a, (reg5ah & ~0x10));
1da177e4
LT
1178 return 0;
1179}
1180
1181static int __devinit init_hpt366(struct pci_dev *dev)
1182{
1183 u32 reg1 = 0;
1184 u8 drive_fast = 0;
1185
1186 /*
1187 * Disable the "fast interrupt" prediction.
1188 */
1189 pci_read_config_byte(dev, 0x51, &drive_fast);
1190 if (drive_fast & 0x80)
1191 pci_write_config_byte(dev, 0x51, drive_fast & ~0x80);
1192 pci_read_config_dword(dev, 0x40, &reg1);
1193
1da177e4
LT
1194 return 0;
1195}
1196
1197static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const char *name)
1198{
1199 int ret = 0;
9ec4ff42
LT
1200
1201 /*
1202 * FIXME: Not portable. Also, why do we enable the ROM in the first place?
1203 * We don't seem to be using it.
1204 */
1da177e4 1205 if (dev->resource[PCI_ROM_RESOURCE].start)
9ec4ff42 1206 pci_write_config_dword(dev, PCI_ROM_ADDRESS,
1da177e4
LT
1207 dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
1208
b39b01ff
AC
1209 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4));
1210 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78);
1211 pci_write_config_byte(dev, PCI_MIN_GNT, 0x08);
1212 pci_write_config_byte(dev, PCI_MAX_LAT, 0x08);
1da177e4 1213
b39b01ff 1214 if (hpt_revision(dev) >= 3)
1da177e4 1215 ret = init_hpt37x(dev);
b39b01ff
AC
1216 else
1217 ret = init_hpt366(dev);
1218
1da177e4
LT
1219 if (ret)
1220 return ret;
1221
1222 return dev->irq;
1223}
1224
1225static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
1226{
1227 struct pci_dev *dev = hwif->pci_dev;
b39b01ff 1228 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4 1229 u8 ata66 = 0, regmask = (hwif->channel) ? 0x01 : 0x02;
836c0063 1230 int serialize = HPT_SERIALIZE_IO;
1da177e4 1231
1da177e4
LT
1232 hwif->tuneproc = &hpt3xx_tune_drive;
1233 hwif->speedproc = &hpt3xx_tune_chipset;
1234 hwif->quirkproc = &hpt3xx_quirkproc;
1235 hwif->intrproc = &hpt3xx_intrproc;
1236 hwif->maskproc = &hpt3xx_maskproc;
1237
836c0063
SS
1238 /*
1239 * HPT3xxN chips have some complications:
1240 *
1241 * - on 33 MHz PCI we must clock switch
1242 * - on 66 MHz PCI we must NOT use the PCI clock
1243 */
1244 if ((info->flags & (IS_3xxN | PCI_66MHZ)) == IS_3xxN) {
1245 /*
1246 * Clock is shared between the channels,
1247 * so we'll have to serialize them... :-(
1248 */
1249 serialize = 1;
1250 hwif->rw_disk = &hpt3xxn_rw_disk;
1251 }
1da177e4
LT
1252
1253 /*
1254 * The HPT37x uses the CBLID pins as outputs for MA15/MA16
1255 * address lines to access an external eeprom. To read valid
1256 * cable detect state the pins must be enabled as inputs.
1257 */
b39b01ff 1258 if (info->revision >= 8 && (PCI_FUNC(dev->devfn) & 1)) {
1da177e4
LT
1259 /*
1260 * HPT374 PCI function 1
1261 * - set bit 15 of reg 0x52 to enable TCBLID as input
1262 * - set bit 15 of reg 0x56 to enable FCBLID as input
1263 */
1264 u16 mcr3, mcr6;
1265 pci_read_config_word(dev, 0x52, &mcr3);
1266 pci_read_config_word(dev, 0x56, &mcr6);
1267 pci_write_config_word(dev, 0x52, mcr3 | 0x8000);
1268 pci_write_config_word(dev, 0x56, mcr6 | 0x8000);
1269 /* now read cable id register */
1270 pci_read_config_byte(dev, 0x5a, &ata66);
1271 pci_write_config_word(dev, 0x52, mcr3);
1272 pci_write_config_word(dev, 0x56, mcr6);
b39b01ff 1273 } else if (info->revision >= 3) {
1da177e4
LT
1274 /*
1275 * HPT370/372 and 374 pcifn 0
1276 * - clear bit 0 of 0x5b to enable P/SCBLID as inputs
1277 */
1278 u8 scr2;
1279 pci_read_config_byte(dev, 0x5b, &scr2);
1280 pci_write_config_byte(dev, 0x5b, scr2 & ~1);
1281 /* now read cable id register */
1282 pci_read_config_byte(dev, 0x5a, &ata66);
1283 pci_write_config_byte(dev, 0x5b, scr2);
1284 } else {
1285 pci_read_config_byte(dev, 0x5a, &ata66);
1286 }
1287
1288#ifdef DEBUG
1289 printk("HPT366: reg5ah=0x%02x ATA-%s Cable Port%d\n",
1290 ata66, (ata66 & regmask) ? "33" : "66",
1291 PCI_FUNC(hwif->pci_dev->devfn));
1292#endif /* DEBUG */
1293
836c0063
SS
1294 /* Serialize access to this device */
1295 if (serialize && hwif->mate)
1da177e4 1296 hwif->serialized = hwif->mate->serialized = 1;
1da177e4 1297
33b18a60
SS
1298 /*
1299 * Set up ioctl for power status.
1300 * NOTE: power affects both drives on each channel.
1301 */
1302 hwif->busproc = &hpt3xx_busproc;
1da177e4
LT
1303
1304 if (!hwif->dma_base) {
1305 hwif->drives[0].autotune = 1;
1306 hwif->drives[1].autotune = 1;
1307 return;
1308 }
1309
1310 hwif->ultra_mask = 0x7f;
1311 hwif->mwdma_mask = 0x07;
1312
1313 if (!(hwif->udma_four))
1314 hwif->udma_four = ((ata66 & regmask) ? 0 : 1);
1315 hwif->ide_dma_check = &hpt366_config_drive_xfer_rate;
1316
b39b01ff 1317 if (info->revision >= 8) {
1da177e4
LT
1318 hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq;
1319 hwif->ide_dma_end = &hpt374_ide_dma_end;
b39b01ff 1320 } else if (info->revision >= 5) {
1da177e4
LT
1321 hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq;
1322 hwif->ide_dma_end = &hpt374_ide_dma_end;
b39b01ff 1323 } else if (info->revision >= 3) {
1da177e4
LT
1324 hwif->dma_start = &hpt370_ide_dma_start;
1325 hwif->ide_dma_end = &hpt370_ide_dma_end;
1326 hwif->ide_dma_timeout = &hpt370_ide_dma_timeout;
1327 hwif->ide_dma_lostirq = &hpt370_ide_dma_lostirq;
b39b01ff 1328 } else if (info->revision >= 2)
1da177e4
LT
1329 hwif->ide_dma_lostirq = &hpt366_ide_dma_lostirq;
1330 else
1331 hwif->ide_dma_lostirq = &hpt366_ide_dma_lostirq;
1332
1333 if (!noautodma)
1334 hwif->autodma = 1;
1335 hwif->drives[0].autodma = hwif->autodma;
1336 hwif->drives[1].autodma = hwif->autodma;
1337}
1338
1339static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase)
1340{
b39b01ff 1341 struct hpt_info *info = ide_get_hwifdata(hwif);
1da177e4
LT
1342 u8 masterdma = 0, slavedma = 0;
1343 u8 dma_new = 0, dma_old = 0;
1344 u8 primary = hwif->channel ? 0x4b : 0x43;
1345 u8 secondary = hwif->channel ? 0x4f : 0x47;
1346 unsigned long flags;
1347
1348 if (!dmabase)
1349 return;
1350
b39b01ff 1351 if(info->speed == NULL) {
836c0063 1352 printk(KERN_WARNING "hpt366: no known IDE timings, disabling DMA.\n");
1da177e4
LT
1353 return;
1354 }
1355
1356 dma_old = hwif->INB(dmabase+2);
1357
1358 local_irq_save(flags);
1359
1360 dma_new = dma_old;
1361 pci_read_config_byte(hwif->pci_dev, primary, &masterdma);
1362 pci_read_config_byte(hwif->pci_dev, secondary, &slavedma);
1363
1364 if (masterdma & 0x30) dma_new |= 0x20;
1365 if (slavedma & 0x30) dma_new |= 0x40;
1366 if (dma_new != dma_old)
1367 hwif->OUTB(dma_new, dmabase+2);
1368
1369 local_irq_restore(flags);
1370
1371 ide_setup_dma(hwif, dmabase, 8);
1372}
1373
b39b01ff
AC
1374/*
1375 * We "borrow" this hook in order to set the data structures
1376 * up early enough before dma or init_hwif calls are made.
1377 */
1378
1379static void __devinit init_iops_hpt366(ide_hwif_t *hwif)
1380{
836c0063
SS
1381 struct hpt_info *info = kzalloc(sizeof(struct hpt_info), GFP_KERNEL);
1382 struct pci_dev *dev = hwif->pci_dev;
1383 u16 did = dev->device;
1384 u8 rid = 0;
b39b01ff
AC
1385
1386 if(info == NULL) {
1387 printk(KERN_WARNING "hpt366: out of memory.\n");
1388 return;
1389 }
b39b01ff
AC
1390 ide_set_hwifdata(hwif, info);
1391
836c0063
SS
1392 /* Avoid doing the same thing twice. */
1393 if (hwif->channel && hwif->mate) {
1394 memcpy(info, ide_get_hwifdata(hwif->mate), sizeof(struct hpt_info));
1395 return;
b39b01ff
AC
1396 }
1397
836c0063
SS
1398 pci_read_config_byte(dev, PCI_CLASS_REVISION, &rid);
1399
1400 if (( did == PCI_DEVICE_ID_TTI_HPT366 && rid == 6) ||
1401 ((did == PCI_DEVICE_ID_TTI_HPT372 ||
1402 did == PCI_DEVICE_ID_TTI_HPT302 ||
1403 did == PCI_DEVICE_ID_TTI_HPT371) && rid > 1) ||
1404 did == PCI_DEVICE_ID_TTI_HPT372N)
1405 info->flags |= IS_3xxN;
1406
1407 info->revision = hpt_revision(dev);
b39b01ff
AC
1408
1409 if (info->revision >= 3)
1410 hpt37x_clocking(hwif);
1411 else
1412 hpt366_clocking(hwif);
1413}
1414
1da177e4
LT
1415static int __devinit init_setup_hpt374(struct pci_dev *dev, ide_pci_device_t *d)
1416{
1417 struct pci_dev *findev = NULL;
1418
1419 if (PCI_FUNC(dev->devfn) & 1)
1420 return -ENODEV;
1421
1422 while ((findev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, findev)) != NULL) {
1423 if ((findev->vendor == dev->vendor) &&
1424 (findev->device == dev->device) &&
1425 ((findev->devfn - dev->devfn) == 1) &&
1426 (PCI_FUNC(findev->devfn) & 1)) {
1427 if (findev->irq != dev->irq) {
1428 /* FIXME: we need a core pci_set_interrupt() */
1429 findev->irq = dev->irq;
1430 printk(KERN_WARNING "%s: pci-config space interrupt "
1431 "fixed.\n", d->name);
1432 }
1433 return ide_setup_pci_devices(dev, findev, d);
1434 }
1435 }
1436 return ide_setup_pci_device(dev, d);
1437}
1438
1439static int __devinit init_setup_hpt37x(struct pci_dev *dev, ide_pci_device_t *d)
1440{
1441 return ide_setup_pci_device(dev, d);
1442}
1443
836c0063
SS
1444static int __devinit init_setup_hpt371(struct pci_dev *dev, ide_pci_device_t *d)
1445{
1446 u8 mcr1 = 0;
1447
1448 /*
1449 * HPT371 chips physically have only one channel, the secondary one,
1450 * but the primary channel registers do exist! Go figure...
1451 * So, we manually disable the non-existing channel here
1452 * (if the BIOS hasn't done this already).
1453 */
1454 pci_read_config_byte(dev, 0x50, &mcr1);
1455 if (mcr1 & 0x04)
1456 pci_write_config_byte(dev, 0x50, (mcr1 & ~0x04));
1457
1458 return ide_setup_pci_device(dev, d);
1459}
1460
1da177e4
LT
1461static int __devinit init_setup_hpt366(struct pci_dev *dev, ide_pci_device_t *d)
1462{
1463 struct pci_dev *findev = NULL;
1464 u8 pin1 = 0, pin2 = 0;
1465 unsigned int class_rev;
1466 char *chipset_names[] = {"HPT366", "HPT366", "HPT368",
1467 "HPT370", "HPT370A", "HPT372",
1468 "HPT372N" };
1469
1470 if (PCI_FUNC(dev->devfn) & 1)
1471 return -ENODEV;
1472
1473 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
1474 class_rev &= 0xff;
1475
1476 if(dev->device == PCI_DEVICE_ID_TTI_HPT372N)
1477 class_rev = 6;
1478
1479 if(class_rev <= 6)
1480 d->name = chipset_names[class_rev];
1481
1482 switch(class_rev) {
1483 case 6:
1484 case 5:
1485 case 4:
1486 case 3:
1487 goto init_single;
1488 default:
1489 break;
1490 }
1491
1492 d->channels = 1;
1493
1494 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin1);
1495 while ((findev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, findev)) != NULL) {
1496 if ((findev->vendor == dev->vendor) &&
1497 (findev->device == dev->device) &&
1498 ((findev->devfn - dev->devfn) == 1) &&
1499 (PCI_FUNC(findev->devfn) & 1)) {
1500 pci_read_config_byte(findev, PCI_INTERRUPT_PIN, &pin2);
1501 if ((pin1 != pin2) && (dev->irq == findev->irq)) {
1502 d->bootable = ON_BOARD;
1503 printk("%s: onboard version of chipset, "
1504 "pin1=%d pin2=%d\n", d->name,
1505 pin1, pin2);
1506 }
1507 return ide_setup_pci_devices(dev, findev, d);
1508 }
1509 }
1510init_single:
1511 return ide_setup_pci_device(dev, d);
1512}
1513
1514static ide_pci_device_t hpt366_chipsets[] __devinitdata = {
1515 { /* 0 */
1516 .name = "HPT366",
1517 .init_setup = init_setup_hpt366,
1518 .init_chipset = init_chipset_hpt366,
b39b01ff 1519 .init_iops = init_iops_hpt366,
1da177e4
LT
1520 .init_hwif = init_hwif_hpt366,
1521 .init_dma = init_dma_hpt366,
1522 .channels = 2,
1523 .autodma = AUTODMA,
1524 .bootable = OFF_BOARD,
1525 .extra = 240
1526 },{ /* 1 */
1527 .name = "HPT372A",
1528 .init_setup = init_setup_hpt37x,
1529 .init_chipset = init_chipset_hpt366,
b39b01ff 1530 .init_iops = init_iops_hpt366,
1da177e4
LT
1531 .init_hwif = init_hwif_hpt366,
1532 .init_dma = init_dma_hpt366,
1533 .channels = 2,
1534 .autodma = AUTODMA,
1535 .bootable = OFF_BOARD,
1536 },{ /* 2 */
1537 .name = "HPT302",
1538 .init_setup = init_setup_hpt37x,
1539 .init_chipset = init_chipset_hpt366,
b39b01ff 1540 .init_iops = init_iops_hpt366,
1da177e4
LT
1541 .init_hwif = init_hwif_hpt366,
1542 .init_dma = init_dma_hpt366,
1543 .channels = 2,
1544 .autodma = AUTODMA,
1545 .bootable = OFF_BOARD,
1546 },{ /* 3 */
1547 .name = "HPT371",
836c0063 1548 .init_setup = init_setup_hpt371,
1da177e4 1549 .init_chipset = init_chipset_hpt366,
b39b01ff 1550 .init_iops = init_iops_hpt366,
1da177e4
LT
1551 .init_hwif = init_hwif_hpt366,
1552 .init_dma = init_dma_hpt366,
1553 .channels = 2,
1554 .autodma = AUTODMA,
836c0063 1555 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
1da177e4
LT
1556 .bootable = OFF_BOARD,
1557 },{ /* 4 */
1558 .name = "HPT374",
1559 .init_setup = init_setup_hpt374,
1560 .init_chipset = init_chipset_hpt366,
b39b01ff 1561 .init_iops = init_iops_hpt366,
1da177e4
LT
1562 .init_hwif = init_hwif_hpt366,
1563 .init_dma = init_dma_hpt366,
1564 .channels = 2, /* 4 */
1565 .autodma = AUTODMA,
1566 .bootable = OFF_BOARD,
1567 },{ /* 5 */
1568 .name = "HPT372N",
1569 .init_setup = init_setup_hpt37x,
1570 .init_chipset = init_chipset_hpt366,
b39b01ff 1571 .init_iops = init_iops_hpt366,
1da177e4
LT
1572 .init_hwif = init_hwif_hpt366,
1573 .init_dma = init_dma_hpt366,
1574 .channels = 2, /* 4 */
1575 .autodma = AUTODMA,
1576 .bootable = OFF_BOARD,
1577 }
1578};
1579
1580/**
1581 * hpt366_init_one - called when an HPT366 is found
1582 * @dev: the hpt366 device
1583 * @id: the matching pci id
1584 *
1585 * Called when the PCI registration layer (or the IDE initialization)
1586 * finds a device matching our IDE device tables.
73d1dd93
SS
1587 *
1588 * NOTE: since we'll have to modify some fields of the ide_pci_device_t
1589 * structure depending on the chip's revision, we'd better pass a local
1590 * copy down the call chain...
1da177e4 1591 */
1da177e4
LT
1592static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_device_id *id)
1593{
73d1dd93 1594 ide_pci_device_t d = hpt366_chipsets[id->driver_data];
1da177e4 1595
73d1dd93 1596 return d.init_setup(dev, &d);
1da177e4
LT
1597}
1598
1599static struct pci_device_id hpt366_pci_tbl[] = {
1600 { PCI_VENDOR_ID_TTI, PCI_DEVICE_ID_TTI_HPT366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1601 { PCI_VENDOR_ID_TTI, PCI_DEVICE_ID_TTI_HPT372, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
1602 { PCI_VENDOR_ID_TTI, PCI_DEVICE_ID_TTI_HPT302, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
1603 { PCI_VENDOR_ID_TTI, PCI_DEVICE_ID_TTI_HPT371, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
1604 { PCI_VENDOR_ID_TTI, PCI_DEVICE_ID_TTI_HPT374, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
1605 { PCI_VENDOR_ID_TTI, PCI_DEVICE_ID_TTI_HPT372N, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5},
1606 { 0, },
1607};
1608MODULE_DEVICE_TABLE(pci, hpt366_pci_tbl);
1609
1610static struct pci_driver driver = {
1611 .name = "HPT366_IDE",
1612 .id_table = hpt366_pci_tbl,
1613 .probe = hpt366_init_one,
1614};
1615
82ab1eec 1616static int __init hpt366_ide_init(void)
1da177e4
LT
1617{
1618 return ide_pci_register_driver(&driver);
1619}
1620
1621module_init(hpt366_ide_init);
1622
1623MODULE_AUTHOR("Andre Hedrick");
1624MODULE_DESCRIPTION("PCI driver module for Highpoint HPT366 IDE");
1625MODULE_LICENSE("GPL");
This page took 0.25696 seconds and 5 git commands to generate.