mm: update get_user_pages_longterm to migrate pages allocated from CMA region
[linux-2.6-block.git] / drivers / ide / hpt366.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org>
3 * Portions Copyright (C) 2001 Sun Microsystems, Inc.
4 * Portions Copyright (C) 2003 Red Hat Inc
fbf47840 5 * Portions Copyright (C) 2007 Bartlomiej Zolnierkiewicz
59c8d04f 6 * Portions Copyright (C) 2005-2009 MontaVista Software, Inc.
1da177e4
LT
7 *
8 * Thanks to HighPoint Technologies for their assistance, and hardware.
9 * Special Thanks to Jon Burchmore in SanDiego for the deep pockets, his
10 * donation of an ABit BP6 mainboard, processor, and memory acellerated
11 * development and support.
12 *
b39b01ff 13 *
836c0063 14 * HighPoint has its own drivers (open source except for the RAID part)
631dd1a8 15 * available from http://www.highpoint-tech.com/USA_new/service_support.htm
836c0063
SS
16 * This may be useful to anyone wanting to work on this driver, however do not
17 * trust them too much since the code tends to become less and less meaningful
18 * as the time passes... :-/
b39b01ff 19 *
1da177e4
LT
20 * Note that final HPT370 support was done by force extraction of GPL.
21 *
22 * - add function for getting/setting power status of drive
23 * - the HPT370's state machine can get confused. reset it before each dma
24 * xfer to prevent that from happening.
25 * - reset state engine whenever we get an error.
26 * - check for busmaster state at end of dma.
27 * - use new highpoint timings.
28 * - detect bus speed using highpoint register.
29 * - use pll if we don't have a clock table. added a 66MHz table that's
30 * just 2x the 33MHz table.
31 * - removed turnaround. NOTE: we never want to switch between pll and
32 * pci clocks as the chip can glitch in those cases. the highpoint
33 * approved workaround slows everything down too much to be useful. in
34 * addition, we would have to serialize access to each chip.
35 * Adrian Sun <a.sun@sun.com>
36 *
37 * add drive timings for 66MHz PCI bus,
38 * fix ATA Cable signal detection, fix incorrect /proc info
39 * add /proc display for per-drive PIO/DMA/UDMA mode and
40 * per-channel ATA-33/66 Cable detect.
41 * Duncan Laurie <void@sun.com>
42 *
43 * fixup /proc output for multiple controllers
44 * Tim Hockin <thockin@sun.com>
45 *
46 * On hpt366:
47 * Reset the hpt366 on error, reset on dma
48 * Fix disabling Fast Interrupt hpt366.
49 * Mike Waychison <crlf@sun.com>
50 *
51 * Added support for 372N clocking and clock switching. The 372N needs
52 * different clocks on read/write. This requires overloading rw_disk and
53 * other deeply crazy things. Thanks to <http://www.hoerstreich.de> for
54 * keeping me sane.
ccd32e22 55 * Alan Cox <alan@lxorguk.ukuu.org.uk>
1da177e4 56 *
836c0063
SS
57 * - fix the clock turnaround code: it was writing to the wrong ports when
58 * called for the secondary channel, caching the current clock mode per-
59 * channel caused the cached register value to get out of sync with the
60 * actual one, the channels weren't serialized, the turnaround shouldn't
61 * be done on 66 MHz PCI bus
7b73ee05
SS
62 * - disable UltraATA/100 for HPT370 by default as the 33 MHz clock being used
63 * does not allow for this speed anyway
64 * - avoid touching disabled channels (e.g. HPT371/N are single channel chips,
65 * their primary channel is kind of virtual, it isn't tied to any pins)
471a0bda
SS
66 * - fix/remove bad/unused timing tables and use one set of tables for the whole
67 * HPT37x chip family; save space by introducing the separate transfer mode
68 * table in which the mode lookup is done
26c068da 69 * - use f_CNT value saved by the HighPoint BIOS as reading it directly gives
72931368
SS
70 * the wrong PCI frequency since DPLL has already been calibrated by BIOS;
71 * read it only from the function 0 of HPT374 chips
33b18a60
SS
72 * - fix the hotswap code: it caused RESET- to glitch when tristating the bus,
73 * and for HPT36x the obsolete HDIO_TRISTATE_HWIF handler was called instead
73d1dd93
SS
74 * - pass to init_chipset() handlers a copy of the IDE PCI device structure as
75 * they tamper with its fields
7b73ee05
SS
76 * - pass to the init_setup handlers a copy of the ide_pci_device_t structure
77 * since they may tamper with its fields
90778574
SS
78 * - prefix the driver startup messages with the real chip name
79 * - claim the extra 240 bytes of I/O space for all chips
2648e5d9 80 * - optimize the UltraDMA filtering and the drive list lookup code
b4586715 81 * - use pci_get_slot() to get to the function 1 of HPT36x/374
7b73ee05
SS
82 * - cache offset of the channel's misc. control registers (MCRs) being used
83 * throughout the driver
84 * - only touch the relevant MCR when detecting the cable type on HPT374's
85 * function 1
abc4ad4c 86 * - rename all the register related variables consistently
7b73ee05
SS
87 * - move all the interrupt twiddling code from the speedproc handlers into
88 * init_hwif_hpt366(), also grouping all the DMA related code together there
866664d7 89 * - merge HPT36x/HPT37x speedproc handlers, fix PIO timing register mask and
7b73ee05
SS
90 * separate the UltraDMA and MWDMA masks there to avoid changing PIO timings
91 * when setting an UltraDMA mode
92 * - fix hpt3xx_tune_drive() to set the PIO mode requested, not always select
93 * the best possible one
4bf63de2 94 * - clean up DMA timeout handling for HPT370
7b73ee05
SS
95 * - switch to using the enumeration type to differ between the numerous chip
96 * variants, matching PCI device/revision ID with the chip type early, at the
97 * init_setup stage
98 * - extend the hpt_info structure to hold the DPLL and PCI clock frequencies,
99 * stop duplicating it for each channel by storing the pointer in the pci_dev
100 * structure: first, at the init_setup stage, point it to a static "template"
101 * with only the chip type and its specific base DPLL frequency, the highest
2648e5d9
SS
102 * UltraDMA mode, and the chip settings table pointer filled, then, at the
103 * init_chipset stage, allocate per-chip instance and fill it with the rest
104 * of the necessary information
7b73ee05
SS
105 * - get rid of the constant thresholds in the HPT37x PCI clock detection code,
106 * switch to calculating PCI clock frequency based on the chip's base DPLL
107 * frequency
108 * - switch to using the DPLL clock and enable UltraATA/133 mode by default on
278978e9
SS
109 * anything newer than HPT370/A (except HPT374 that is not capable of this
110 * mode according to the manual)
6273d26a
SS
111 * - fold PCI clock detection and DPLL setup code into init_chipset_hpt366(),
112 * also fixing the interchanged 25/40 MHz PCI clock cases for HPT36x chips;
7b73ee05
SS
113 * unify HPT36x/37x timing setup code and the speedproc handlers by joining
114 * the register setting lists into the table indexed by the clock selected
2648e5d9 115 * - set the correct hwif->ultra_mask for each individual chip
b4e44369 116 * - add Ultra and MW DMA mode filtering for the HPT37[24] based SATA cards
c018f1ee
SS
117 * - stop resetting HPT370's state machine before each DMA transfer as that has
118 * caused more harm than good
7b73ee05 119 * Sergei Shtylyov, <sshtylyov@ru.mvista.com> or <source@mvista.com>
1da177e4
LT
120 */
121
1da177e4
LT
122#include <linux/types.h>
123#include <linux/module.h>
124#include <linux/kernel.h>
125#include <linux/delay.h>
1da177e4 126#include <linux/blkdev.h>
1da177e4
LT
127#include <linux/interrupt.h>
128#include <linux/pci.h>
129#include <linux/init.h>
130#include <linux/ide.h>
5a0e3ad6 131#include <linux/slab.h>
1da177e4 132
7c0f6ba6 133#include <linux/uaccess.h>
1da177e4 134#include <asm/io.h>
1da177e4 135
ced3ec8a
BZ
136#define DRV_NAME "hpt366"
137
1da177e4 138/* various tuning parameters */
c018f1ee 139#undef HPT_RESET_STATE_ENGINE
836c0063 140#undef HPT_DELAY_INTERRUPT
1da177e4 141
1da177e4
LT
142static const char *bad_ata100_5[] = {
143 "IBM-DTLA-307075",
144 "IBM-DTLA-307060",
145 "IBM-DTLA-307045",
146 "IBM-DTLA-307030",
147 "IBM-DTLA-307020",
148 "IBM-DTLA-307015",
149 "IBM-DTLA-305040",
150 "IBM-DTLA-305030",
151 "IBM-DTLA-305020",
152 "IC35L010AVER07-0",
153 "IC35L020AVER07-0",
154 "IC35L030AVER07-0",
155 "IC35L040AVER07-0",
156 "IC35L060AVER07-0",
157 "WDC AC310200R",
158 NULL
159};
160
161static const char *bad_ata66_4[] = {
162 "IBM-DTLA-307075",
163 "IBM-DTLA-307060",
164 "IBM-DTLA-307045",
165 "IBM-DTLA-307030",
166 "IBM-DTLA-307020",
167 "IBM-DTLA-307015",
168 "IBM-DTLA-305040",
169 "IBM-DTLA-305030",
170 "IBM-DTLA-305020",
171 "IC35L010AVER07-0",
172 "IC35L020AVER07-0",
173 "IC35L030AVER07-0",
174 "IC35L040AVER07-0",
175 "IC35L060AVER07-0",
176 "WDC AC310200R",
783353b1 177 "MAXTOR STM3320620A",
1da177e4
LT
178 NULL
179};
180
181static const char *bad_ata66_3[] = {
182 "WDC AC310200R",
183 NULL
184};
185
186static const char *bad_ata33[] = {
187 "Maxtor 92720U8", "Maxtor 92040U6", "Maxtor 91360U4", "Maxtor 91020U3", "Maxtor 90845U3", "Maxtor 90650U2",
188 "Maxtor 91360D8", "Maxtor 91190D7", "Maxtor 91020D6", "Maxtor 90845D5", "Maxtor 90680D4", "Maxtor 90510D3", "Maxtor 90340D2",
189 "Maxtor 91152D8", "Maxtor 91008D7", "Maxtor 90845D6", "Maxtor 90840D6", "Maxtor 90720D5", "Maxtor 90648D5", "Maxtor 90576D4",
190 "Maxtor 90510D4",
191 "Maxtor 90432D3", "Maxtor 90288D2", "Maxtor 90256D2",
192 "Maxtor 91000D8", "Maxtor 90910D8", "Maxtor 90875D7", "Maxtor 90840D7", "Maxtor 90750D6", "Maxtor 90625D5", "Maxtor 90500D4",
193 "Maxtor 91728D8", "Maxtor 91512D7", "Maxtor 91303D6", "Maxtor 91080D5", "Maxtor 90845D4", "Maxtor 90680D4", "Maxtor 90648D3", "Maxtor 90432D2",
194 NULL
195};
196
471a0bda
SS
197static u8 xfer_speeds[] = {
198 XFER_UDMA_6,
199 XFER_UDMA_5,
200 XFER_UDMA_4,
201 XFER_UDMA_3,
202 XFER_UDMA_2,
203 XFER_UDMA_1,
204 XFER_UDMA_0,
205
206 XFER_MW_DMA_2,
207 XFER_MW_DMA_1,
208 XFER_MW_DMA_0,
209
210 XFER_PIO_4,
211 XFER_PIO_3,
212 XFER_PIO_2,
213 XFER_PIO_1,
214 XFER_PIO_0
1da177e4
LT
215};
216
471a0bda
SS
217/* Key for bus clock timings
218 * 36x 37x
219 * bits bits
220 * 0:3 0:3 data_high_time. Inactive time of DIOW_/DIOR_ for PIO and MW DMA.
221 * cycles = value + 1
222 * 4:7 4:8 data_low_time. Active time of DIOW_/DIOR_ for PIO and MW DMA.
223 * cycles = value + 1
224 * 8:11 9:12 cmd_high_time. Inactive time of DIOW_/DIOR_ during task file
225 * register access.
226 * 12:15 13:17 cmd_low_time. Active time of DIOW_/DIOR_ during task file
227 * register access.
228 * 16:18 18:20 udma_cycle_time. Clock cycles for UDMA xfer.
229 * - 21 CLK frequency: 0=ATA clock, 1=dual ATA clock.
230 * 19:21 22:24 pre_high_time. Time to initialize the 1st cycle for PIO and
231 * MW DMA xfer.
232 * 22:24 25:27 cmd_pre_high_time. Time to initialize the 1st PIO cycle for
233 * task file register access.
234 * 28 28 UDMA enable.
235 * 29 29 DMA enable.
236 * 30 30 PIO MST enable. If set, the chip is in bus master mode during
237 * PIO xfer.
238 * 31 31 FIFO enable.
1da177e4 239 */
1da177e4 240
471a0bda
SS
241static u32 forty_base_hpt36x[] = {
242 /* XFER_UDMA_6 */ 0x900fd943,
243 /* XFER_UDMA_5 */ 0x900fd943,
244 /* XFER_UDMA_4 */ 0x900fd943,
245 /* XFER_UDMA_3 */ 0x900ad943,
246 /* XFER_UDMA_2 */ 0x900bd943,
247 /* XFER_UDMA_1 */ 0x9008d943,
248 /* XFER_UDMA_0 */ 0x9008d943,
249
250 /* XFER_MW_DMA_2 */ 0xa008d943,
251 /* XFER_MW_DMA_1 */ 0xa010d955,
252 /* XFER_MW_DMA_0 */ 0xa010d9fc,
253
254 /* XFER_PIO_4 */ 0xc008d963,
255 /* XFER_PIO_3 */ 0xc010d974,
256 /* XFER_PIO_2 */ 0xc010d997,
257 /* XFER_PIO_1 */ 0xc010d9c7,
258 /* XFER_PIO_0 */ 0xc018d9d9
1da177e4
LT
259};
260
471a0bda
SS
261static u32 thirty_three_base_hpt36x[] = {
262 /* XFER_UDMA_6 */ 0x90c9a731,
263 /* XFER_UDMA_5 */ 0x90c9a731,
264 /* XFER_UDMA_4 */ 0x90c9a731,
265 /* XFER_UDMA_3 */ 0x90cfa731,
266 /* XFER_UDMA_2 */ 0x90caa731,
267 /* XFER_UDMA_1 */ 0x90cba731,
268 /* XFER_UDMA_0 */ 0x90c8a731,
269
270 /* XFER_MW_DMA_2 */ 0xa0c8a731,
271 /* XFER_MW_DMA_1 */ 0xa0c8a732, /* 0xa0c8a733 */
272 /* XFER_MW_DMA_0 */ 0xa0c8a797,
273
274 /* XFER_PIO_4 */ 0xc0c8a731,
275 /* XFER_PIO_3 */ 0xc0c8a742,
276 /* XFER_PIO_2 */ 0xc0d0a753,
277 /* XFER_PIO_1 */ 0xc0d0a7a3, /* 0xc0d0a793 */
278 /* XFER_PIO_0 */ 0xc0d0a7aa /* 0xc0d0a7a7 */
1da177e4
LT
279};
280
471a0bda
SS
281static u32 twenty_five_base_hpt36x[] = {
282 /* XFER_UDMA_6 */ 0x90c98521,
283 /* XFER_UDMA_5 */ 0x90c98521,
284 /* XFER_UDMA_4 */ 0x90c98521,
285 /* XFER_UDMA_3 */ 0x90cf8521,
286 /* XFER_UDMA_2 */ 0x90cf8521,
287 /* XFER_UDMA_1 */ 0x90cb8521,
288 /* XFER_UDMA_0 */ 0x90cb8521,
289
290 /* XFER_MW_DMA_2 */ 0xa0ca8521,
291 /* XFER_MW_DMA_1 */ 0xa0ca8532,
292 /* XFER_MW_DMA_0 */ 0xa0ca8575,
293
294 /* XFER_PIO_4 */ 0xc0ca8521,
295 /* XFER_PIO_3 */ 0xc0ca8532,
296 /* XFER_PIO_2 */ 0xc0ca8542,
297 /* XFER_PIO_1 */ 0xc0d08572,
298 /* XFER_PIO_0 */ 0xc0d08585
1da177e4
LT
299};
300
809b53c4
SS
301/*
302 * The following are the new timing tables with PIO mode data/taskfile transfer
303 * overclocking fixed...
304 */
305
306/* This table is taken from the HPT370 data manual rev. 1.02 */
307static u32 thirty_three_base_hpt37x[] = {
308 /* XFER_UDMA_6 */ 0x16455031, /* 0x16655031 ?? */
309 /* XFER_UDMA_5 */ 0x16455031,
310 /* XFER_UDMA_4 */ 0x16455031,
311 /* XFER_UDMA_3 */ 0x166d5031,
312 /* XFER_UDMA_2 */ 0x16495031,
313 /* XFER_UDMA_1 */ 0x164d5033,
314 /* XFER_UDMA_0 */ 0x16515097,
315
316 /* XFER_MW_DMA_2 */ 0x26515031,
317 /* XFER_MW_DMA_1 */ 0x26515033,
318 /* XFER_MW_DMA_0 */ 0x26515097,
319
320 /* XFER_PIO_4 */ 0x06515021,
321 /* XFER_PIO_3 */ 0x06515022,
322 /* XFER_PIO_2 */ 0x06515033,
323 /* XFER_PIO_1 */ 0x06915065,
324 /* XFER_PIO_0 */ 0x06d1508a
325};
326
327static u32 fifty_base_hpt37x[] = {
328 /* XFER_UDMA_6 */ 0x1a861842,
329 /* XFER_UDMA_5 */ 0x1a861842,
330 /* XFER_UDMA_4 */ 0x1aae1842,
331 /* XFER_UDMA_3 */ 0x1a8e1842,
332 /* XFER_UDMA_2 */ 0x1a0e1842,
333 /* XFER_UDMA_1 */ 0x1a161854,
334 /* XFER_UDMA_0 */ 0x1a1a18ea,
335
336 /* XFER_MW_DMA_2 */ 0x2a821842,
337 /* XFER_MW_DMA_1 */ 0x2a821854,
338 /* XFER_MW_DMA_0 */ 0x2a8218ea,
339
340 /* XFER_PIO_4 */ 0x0a821842,
341 /* XFER_PIO_3 */ 0x0a821843,
342 /* XFER_PIO_2 */ 0x0a821855,
343 /* XFER_PIO_1 */ 0x0ac218a8,
344 /* XFER_PIO_0 */ 0x0b02190c
345};
346
347static u32 sixty_six_base_hpt37x[] = {
348 /* XFER_UDMA_6 */ 0x1c86fe62,
349 /* XFER_UDMA_5 */ 0x1caefe62, /* 0x1c8afe62 */
350 /* XFER_UDMA_4 */ 0x1c8afe62,
351 /* XFER_UDMA_3 */ 0x1c8efe62,
352 /* XFER_UDMA_2 */ 0x1c92fe62,
353 /* XFER_UDMA_1 */ 0x1c9afe62,
354 /* XFER_UDMA_0 */ 0x1c82fe62,
355
356 /* XFER_MW_DMA_2 */ 0x2c82fe62,
357 /* XFER_MW_DMA_1 */ 0x2c82fe66,
358 /* XFER_MW_DMA_0 */ 0x2c82ff2e,
359
360 /* XFER_PIO_4 */ 0x0c82fe62,
361 /* XFER_PIO_3 */ 0x0c82fe84,
362 /* XFER_PIO_2 */ 0x0c82fea6,
363 /* XFER_PIO_1 */ 0x0d02ff26,
364 /* XFER_PIO_0 */ 0x0d42ff7f
365};
1da177e4 366
7b73ee05
SS
367#define HPT371_ALLOW_ATA133_6 1
368#define HPT302_ALLOW_ATA133_6 1
369#define HPT372_ALLOW_ATA133_6 1
e139b0b0 370#define HPT370_ALLOW_ATA100_5 0
1da177e4
LT
371#define HPT366_ALLOW_ATA66_4 1
372#define HPT366_ALLOW_ATA66_3 1
1da177e4 373
7b73ee05
SS
374/* Supported ATA clock frequencies */
375enum ata_clock {
376 ATA_CLOCK_25MHZ,
377 ATA_CLOCK_33MHZ,
378 ATA_CLOCK_40MHZ,
379 ATA_CLOCK_50MHZ,
380 ATA_CLOCK_66MHZ,
381 NUM_ATA_CLOCKS
382};
1da177e4 383
866664d7
SS
384struct hpt_timings {
385 u32 pio_mask;
386 u32 dma_mask;
387 u32 ultra_mask;
388 u32 *clock_table[NUM_ATA_CLOCKS];
389};
390
b39b01ff 391/*
7b73ee05 392 * Hold all the HighPoint chip information in one place.
b39b01ff 393 */
1da177e4 394
7b73ee05 395struct hpt_info {
fbf47840 396 char *chip_name; /* Chip name */
7b73ee05 397 u8 chip_type; /* Chip type */
fbf47840 398 u8 udma_mask; /* Allowed UltraDMA modes mask. */
7b73ee05
SS
399 u8 dpll_clk; /* DPLL clock in MHz */
400 u8 pci_clk; /* PCI clock in MHz */
866664d7
SS
401 struct hpt_timings *timings; /* Chipset timing data */
402 u8 clock; /* ATA clock selected */
b39b01ff
AC
403};
404
7b73ee05
SS
405/* Supported HighPoint chips */
406enum {
407 HPT36x,
408 HPT370,
409 HPT370A,
410 HPT374,
411 HPT372,
412 HPT372A,
413 HPT302,
414 HPT371,
415 HPT372N,
416 HPT302N,
417 HPT371N
418};
b39b01ff 419
866664d7
SS
420static struct hpt_timings hpt36x_timings = {
421 .pio_mask = 0xc1f8ffff,
422 .dma_mask = 0x303800ff,
423 .ultra_mask = 0x30070000,
424 .clock_table = {
425 [ATA_CLOCK_25MHZ] = twenty_five_base_hpt36x,
426 [ATA_CLOCK_33MHZ] = thirty_three_base_hpt36x,
427 [ATA_CLOCK_40MHZ] = forty_base_hpt36x,
428 [ATA_CLOCK_50MHZ] = NULL,
429 [ATA_CLOCK_66MHZ] = NULL
430 }
7b73ee05 431};
e139b0b0 432
866664d7
SS
433static struct hpt_timings hpt37x_timings = {
434 .pio_mask = 0xcfc3ffff,
435 .dma_mask = 0x31c001ff,
436 .ultra_mask = 0x303c0000,
437 .clock_table = {
438 [ATA_CLOCK_25MHZ] = NULL,
439 [ATA_CLOCK_33MHZ] = thirty_three_base_hpt37x,
440 [ATA_CLOCK_40MHZ] = NULL,
441 [ATA_CLOCK_50MHZ] = fifty_base_hpt37x,
442 [ATA_CLOCK_66MHZ] = sixty_six_base_hpt37x
443 }
7b73ee05 444};
1da177e4 445
fe31edc8 446static const struct hpt_info hpt36x = {
fbf47840 447 .chip_name = "HPT36x",
7b73ee05 448 .chip_type = HPT36x,
fbf47840 449 .udma_mask = HPT366_ALLOW_ATA66_3 ? (HPT366_ALLOW_ATA66_4 ? ATA_UDMA4 : ATA_UDMA3) : ATA_UDMA2,
7b73ee05 450 .dpll_clk = 0, /* no DPLL */
866664d7 451 .timings = &hpt36x_timings
7b73ee05
SS
452};
453
fe31edc8 454static const struct hpt_info hpt370 = {
fbf47840 455 .chip_name = "HPT370",
7b73ee05 456 .chip_type = HPT370,
fbf47840 457 .udma_mask = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4,
7b73ee05 458 .dpll_clk = 48,
866664d7 459 .timings = &hpt37x_timings
7b73ee05
SS
460};
461
fe31edc8 462static const struct hpt_info hpt370a = {
fbf47840 463 .chip_name = "HPT370A",
7b73ee05 464 .chip_type = HPT370A,
fbf47840 465 .udma_mask = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4,
7b73ee05 466 .dpll_clk = 48,
866664d7 467 .timings = &hpt37x_timings
7b73ee05
SS
468};
469
fe31edc8 470static const struct hpt_info hpt374 = {
fbf47840 471 .chip_name = "HPT374",
7b73ee05 472 .chip_type = HPT374,
fbf47840 473 .udma_mask = ATA_UDMA5,
7b73ee05 474 .dpll_clk = 48,
866664d7 475 .timings = &hpt37x_timings
7b73ee05
SS
476};
477
fe31edc8 478static const struct hpt_info hpt372 = {
fbf47840 479 .chip_name = "HPT372",
7b73ee05 480 .chip_type = HPT372,
fbf47840 481 .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 482 .dpll_clk = 55,
866664d7 483 .timings = &hpt37x_timings
7b73ee05
SS
484};
485
fe31edc8 486static const struct hpt_info hpt372a = {
fbf47840 487 .chip_name = "HPT372A",
7b73ee05 488 .chip_type = HPT372A,
fbf47840 489 .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 490 .dpll_clk = 66,
866664d7 491 .timings = &hpt37x_timings
7b73ee05
SS
492};
493
fe31edc8 494static const struct hpt_info hpt302 = {
fbf47840 495 .chip_name = "HPT302",
7b73ee05 496 .chip_type = HPT302,
fbf47840 497 .udma_mask = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 498 .dpll_clk = 66,
866664d7 499 .timings = &hpt37x_timings
7b73ee05
SS
500};
501
fe31edc8 502static const struct hpt_info hpt371 = {
fbf47840 503 .chip_name = "HPT371",
7b73ee05 504 .chip_type = HPT371,
fbf47840 505 .udma_mask = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 506 .dpll_clk = 66,
866664d7 507 .timings = &hpt37x_timings
7b73ee05
SS
508};
509
fe31edc8 510static const struct hpt_info hpt372n = {
fbf47840 511 .chip_name = "HPT372N",
7b73ee05 512 .chip_type = HPT372N,
fbf47840 513 .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 514 .dpll_clk = 77,
866664d7 515 .timings = &hpt37x_timings
7b73ee05
SS
516};
517
fe31edc8 518static const struct hpt_info hpt302n = {
fbf47840 519 .chip_name = "HPT302N",
7b73ee05 520 .chip_type = HPT302N,
fbf47840 521 .udma_mask = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 522 .dpll_clk = 77,
866664d7 523 .timings = &hpt37x_timings
7b73ee05
SS
524};
525
fe31edc8 526static const struct hpt_info hpt371n = {
fbf47840 527 .chip_name = "HPT371N",
7b73ee05 528 .chip_type = HPT371N,
fbf47840 529 .udma_mask = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5,
7b73ee05 530 .dpll_clk = 77,
866664d7 531 .timings = &hpt37x_timings
7b73ee05 532};
1da177e4 533
9adb9254 534static bool check_in_drive_list(ide_drive_t *drive, const char **list)
e139b0b0 535{
9adb9254 536 return match_string(list, -1, (char *)&drive->id[ATA_ID_PROD]) >= 0;
e139b0b0 537}
1da177e4 538
62ff2ecf
MS
539static struct hpt_info *hpt3xx_get_info(struct device *dev)
540{
541 struct ide_host *host = dev_get_drvdata(dev);
542 struct hpt_info *info = (struct hpt_info *)host->host_priv;
543
544 return dev == host->dev[1] ? info + 1 : info;
545}
546
1da177e4 547/*
2808b0a9
SS
548 * The Marvell bridge chips used on the HighPoint SATA cards do not seem
549 * to support the UltraDMA modes 1, 2, and 3 as well as any MWDMA modes...
1da177e4 550 */
2d5eaa6d
BZ
551
552static u8 hpt3xx_udma_filter(ide_drive_t *drive)
1da177e4 553{
898ec223 554 ide_hwif_t *hwif = drive->hwif;
62ff2ecf 555 struct hpt_info *info = hpt3xx_get_info(hwif->dev);
2808b0a9 556 u8 mask = hwif->ultra_mask;
1da177e4 557
2648e5d9 558 switch (info->chip_type) {
2648e5d9
SS
559 case HPT36x:
560 if (!HPT366_ALLOW_ATA66_4 ||
561 check_in_drive_list(drive, bad_ata66_4))
2808b0a9 562 mask = ATA_UDMA3;
7b73ee05 563
2648e5d9
SS
564 if (!HPT366_ALLOW_ATA66_3 ||
565 check_in_drive_list(drive, bad_ata66_3))
2808b0a9 566 mask = ATA_UDMA2;
2648e5d9 567 break;
2808b0a9
SS
568 case HPT370:
569 if (!HPT370_ALLOW_ATA100_5 ||
570 check_in_drive_list(drive, bad_ata100_5))
571 mask = ATA_UDMA4;
572 break;
573 case HPT370A:
574 if (!HPT370_ALLOW_ATA100_5 ||
575 check_in_drive_list(drive, bad_ata100_5))
576 return ATA_UDMA4;
a2eed33d 577 /* else: fall through */
2808b0a9
SS
578 case HPT372 :
579 case HPT372A:
580 case HPT372N:
581 case HPT374 :
367d7e78 582 if (ata_id_is_sata(drive->id))
2808b0a9 583 mask &= ~0x0e;
a2eed33d 584 /* fall through */
2648e5d9 585 default:
2808b0a9 586 return mask;
1da177e4 587 }
2648e5d9
SS
588
589 return check_in_drive_list(drive, bad_ata33) ? 0x00 : mask;
1da177e4
LT
590}
591
b4e44369
SS
592static u8 hpt3xx_mdma_filter(ide_drive_t *drive)
593{
898ec223 594 ide_hwif_t *hwif = drive->hwif;
62ff2ecf 595 struct hpt_info *info = hpt3xx_get_info(hwif->dev);
b4e44369
SS
596
597 switch (info->chip_type) {
598 case HPT372 :
599 case HPT372A:
600 case HPT372N:
601 case HPT374 :
367d7e78 602 if (ata_id_is_sata(drive->id))
b4e44369 603 return 0x00;
a2eed33d 604 /* else: fall through */
b4e44369
SS
605 default:
606 return 0x07;
607 }
608}
609
7b73ee05 610static u32 get_speed_setting(u8 speed, struct hpt_info *info)
1da177e4 611{
471a0bda
SS
612 int i;
613
614 /*
615 * Lookup the transfer mode table to get the index into
616 * the timing table.
617 *
618 * NOTE: For XFER_PIO_SLOW, PIO mode 0 timings will be used.
619 */
620 for (i = 0; i < ARRAY_SIZE(xfer_speeds) - 1; i++)
621 if (xfer_speeds[i] == speed)
622 break;
866664d7
SS
623
624 return info->timings->clock_table[info->clock][i];
1da177e4
LT
625}
626
8776168c 627static void hpt3xx_set_mode(ide_hwif_t *hwif, ide_drive_t *drive)
1da177e4 628{
74811f35 629 struct pci_dev *dev = to_pci_dev(hwif->dev);
62ff2ecf 630 struct hpt_info *info = hpt3xx_get_info(hwif->dev);
866664d7
SS
631 struct hpt_timings *t = info->timings;
632 u8 itr_addr = 0x40 + (drive->dn * 4);
26ccb802 633 u32 old_itr = 0;
8776168c 634 const u8 speed = drive->dma_mode;
ceb1b2c5 635 u32 new_itr = get_speed_setting(speed, info);
866664d7
SS
636 u32 itr_mask = speed < XFER_MW_DMA_0 ? t->pio_mask :
637 (speed < XFER_UDMA_0 ? t->dma_mask :
638 t->ultra_mask);
b39b01ff 639
ceb1b2c5
SS
640 pci_read_config_dword(dev, itr_addr, &old_itr);
641 new_itr = (old_itr & ~itr_mask) | (new_itr & itr_mask);
1da177e4 642 /*
abc4ad4c
SS
643 * Disable on-chip PIO FIFO/buffer (and PIO MST mode as well)
644 * to avoid problems handling I/O errors later
1da177e4 645 */
abc4ad4c 646 new_itr &= ~0xc0000000;
1da177e4 647
abc4ad4c 648 pci_write_config_dword(dev, itr_addr, new_itr);
1da177e4
LT
649}
650
e085b3ca 651static void hpt3xx_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
1da177e4 652{
8776168c
BZ
653 drive->dma_mode = drive->pio_mode;
654 hpt3xx_set_mode(hwif, drive);
1da177e4
LT
655}
656
26ccb802 657static void hpt3xx_maskproc(ide_drive_t *drive, int mask)
1da177e4 658{
898ec223 659 ide_hwif_t *hwif = drive->hwif;
36501650 660 struct pci_dev *dev = to_pci_dev(hwif->dev);
62ff2ecf 661 struct hpt_info *info = hpt3xx_get_info(hwif->dev);
1da177e4 662
734affdc 663 if ((drive->dev_flags & IDE_DFLAG_NIEN_QUIRK) == 0)
ea2ac5a3
SS
664 return;
665
666 if (info->chip_type >= HPT370) {
667 u8 scr1 = 0;
668
669 pci_read_config_byte(dev, 0x5a, &scr1);
670 if (((scr1 & 0x10) >> 4) != mask) {
abc4ad4c 671 if (mask)
ea2ac5a3 672 scr1 |= 0x10;
abc4ad4c 673 else
ea2ac5a3
SS
674 scr1 &= ~0x10;
675 pci_write_config_byte(dev, 0x5a, scr1);
1da177e4 676 }
ea2ac5a3
SS
677 } else if (mask)
678 disable_irq(hwif->irq);
679 else
680 enable_irq(hwif->irq);
1da177e4
LT
681}
682
1da177e4 683/*
abc4ad4c 684 * This is specific to the HPT366 UDMA chipset
1da177e4
LT
685 * by HighPoint|Triones Technologies, Inc.
686 */
841d2a9b 687static void hpt366_dma_lost_irq(ide_drive_t *drive)
1da177e4 688{
36501650 689 struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
abc4ad4c
SS
690 u8 mcr1 = 0, mcr3 = 0, scr1 = 0;
691
692 pci_read_config_byte(dev, 0x50, &mcr1);
693 pci_read_config_byte(dev, 0x52, &mcr3);
694 pci_read_config_byte(dev, 0x5a, &scr1);
695 printk("%s: (%s) mcr1=0x%02x, mcr3=0x%02x, scr1=0x%02x\n",
eb63963a 696 drive->name, __func__, mcr1, mcr3, scr1);
abc4ad4c
SS
697 if (scr1 & 0x10)
698 pci_write_config_byte(dev, 0x5a, scr1 & ~0x10);
841d2a9b 699 ide_dma_lost_irq(drive);
1da177e4
LT
700}
701
4bf63de2 702static void hpt370_clear_engine(ide_drive_t *drive)
1da177e4 703{
898ec223 704 ide_hwif_t *hwif = drive->hwif;
36501650 705 struct pci_dev *dev = to_pci_dev(hwif->dev);
abc4ad4c 706
36501650 707 pci_write_config_byte(dev, hwif->select_data, 0x37);
1da177e4
LT
708 udelay(10);
709}
710
4bf63de2
SS
711static void hpt370_irq_timeout(ide_drive_t *drive)
712{
898ec223 713 ide_hwif_t *hwif = drive->hwif;
36501650 714 struct pci_dev *dev = to_pci_dev(hwif->dev);
4bf63de2
SS
715 u16 bfifo = 0;
716 u8 dma_cmd;
717
36501650 718 pci_read_config_word(dev, hwif->select_data + 2, &bfifo);
4bf63de2
SS
719 printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo & 0x1ff);
720
721 /* get DMA command mode */
cab7f8ed 722 dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
4bf63de2 723 /* stop DMA */
59c8d04f 724 outb(dma_cmd & ~ATA_DMA_START, hwif->dma_base + ATA_DMA_CMD);
4bf63de2
SS
725 hpt370_clear_engine(drive);
726}
727
5e37bdc0 728static void hpt370_dma_start(ide_drive_t *drive)
1da177e4
LT
729{
730#ifdef HPT_RESET_STATE_ENGINE
731 hpt370_clear_engine(drive);
732#endif
733 ide_dma_start(drive);
734}
735
5e37bdc0 736static int hpt370_dma_end(ide_drive_t *drive)
1da177e4 737{
898ec223 738 ide_hwif_t *hwif = drive->hwif;
cab7f8ed 739 u8 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
1da177e4 740
59c8d04f 741 if (dma_stat & ATA_DMA_ACTIVE) {
1da177e4
LT
742 /* wait a little */
743 udelay(20);
cab7f8ed 744 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
59c8d04f 745 if (dma_stat & ATA_DMA_ACTIVE)
4bf63de2 746 hpt370_irq_timeout(drive);
1da177e4 747 }
653bcf52 748 return ide_dma_end(drive);
1da177e4
LT
749}
750
1da177e4 751/* returns 1 if DMA IRQ issued, 0 otherwise */
5e37bdc0 752static int hpt374_dma_test_irq(ide_drive_t *drive)
1da177e4 753{
898ec223 754 ide_hwif_t *hwif = drive->hwif;
36501650 755 struct pci_dev *dev = to_pci_dev(hwif->dev);
1da177e4 756 u16 bfifo = 0;
abc4ad4c 757 u8 dma_stat;
1da177e4 758
36501650 759 pci_read_config_word(dev, hwif->select_data + 2, &bfifo);
1da177e4
LT
760 if (bfifo & 0x1FF) {
761// printk("%s: %d bytes in FIFO\n", drive->name, bfifo);
762 return 0;
763 }
764
cab7f8ed 765 dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
1da177e4 766 /* return 1 if INTR asserted */
59c8d04f 767 if (dma_stat & ATA_DMA_INTR)
1da177e4
LT
768 return 1;
769
1da177e4
LT
770 return 0;
771}
772
5e37bdc0 773static int hpt374_dma_end(ide_drive_t *drive)
1da177e4 774{
898ec223 775 ide_hwif_t *hwif = drive->hwif;
36501650 776 struct pci_dev *dev = to_pci_dev(hwif->dev);
abc4ad4c
SS
777 u8 mcr = 0, mcr_addr = hwif->select_data;
778 u8 bwsr = 0, mask = hwif->channel ? 0x02 : 0x01;
779
780 pci_read_config_byte(dev, 0x6a, &bwsr);
781 pci_read_config_byte(dev, mcr_addr, &mcr);
782 if (bwsr & mask)
783 pci_write_config_byte(dev, mcr_addr, mcr | 0x30);
653bcf52 784 return ide_dma_end(drive);
1da177e4
LT
785}
786
787/**
836c0063
SS
788 * hpt3xxn_set_clock - perform clock switching dance
789 * @hwif: hwif to switch
790 * @mode: clocking mode (0x21 for write, 0x23 otherwise)
1da177e4 791 *
836c0063 792 * Switch the DPLL clock on the HPT3xxN devices. This is a right mess.
1da177e4 793 */
836c0063
SS
794
795static void hpt3xxn_set_clock(ide_hwif_t *hwif, u8 mode)
1da177e4 796{
1c029fd6
BZ
797 unsigned long base = hwif->extra_base;
798 u8 scr2 = inb(base + 0x6b);
836c0063
SS
799
800 if ((scr2 & 0x7f) == mode)
801 return;
802
1da177e4 803 /* Tristate the bus */
1c029fd6
BZ
804 outb(0x80, base + 0x63);
805 outb(0x80, base + 0x67);
836c0063 806
1da177e4 807 /* Switch clock and reset channels */
1c029fd6
BZ
808 outb(mode, base + 0x6b);
809 outb(0xc0, base + 0x69);
836c0063 810
7b73ee05
SS
811 /*
812 * Reset the state machines.
813 * NOTE: avoid accidentally enabling the disabled channels.
814 */
1c029fd6
BZ
815 outb(inb(base + 0x60) | 0x32, base + 0x60);
816 outb(inb(base + 0x64) | 0x32, base + 0x64);
836c0063 817
1da177e4 818 /* Complete reset */
1c029fd6 819 outb(0x00, base + 0x69);
836c0063 820
1da177e4 821 /* Reconnect channels to bus */
1c029fd6
BZ
822 outb(0x00, base + 0x63);
823 outb(0x00, base + 0x67);
1da177e4
LT
824}
825
826/**
836c0063 827 * hpt3xxn_rw_disk - prepare for I/O
1da177e4
LT
828 * @drive: drive for command
829 * @rq: block request structure
830 *
836c0063 831 * This is called when a disk I/O is issued to HPT3xxN.
1da177e4
LT
832 * We need it because of the clock switching.
833 */
834
836c0063 835static void hpt3xxn_rw_disk(ide_drive_t *drive, struct request *rq)
1da177e4 836{
bbe54d78 837 hpt3xxn_set_clock(drive->hwif, rq_data_dir(rq) ? 0x21 : 0x23);
1da177e4
LT
838}
839
7b73ee05
SS
840/**
841 * hpt37x_calibrate_dpll - calibrate the DPLL
842 * @dev: PCI device
843 *
844 * Perform a calibration cycle on the DPLL.
845 * Returns 1 if this succeeds
846 */
feb22b7f 847static int hpt37x_calibrate_dpll(struct pci_dev *dev, u16 f_low, u16 f_high)
1da177e4 848{
7b73ee05
SS
849 u32 dpll = (f_high << 16) | f_low | 0x100;
850 u8 scr2;
851 int i;
b39b01ff 852
7b73ee05 853 pci_write_config_dword(dev, 0x5c, dpll);
b39b01ff 854
7b73ee05
SS
855 /* Wait for oscillator ready */
856 for(i = 0; i < 0x5000; ++i) {
857 udelay(50);
858 pci_read_config_byte(dev, 0x5b, &scr2);
859 if (scr2 & 0x80)
b39b01ff
AC
860 break;
861 }
7b73ee05
SS
862 /* See if it stays ready (we'll just bail out if it's not yet) */
863 for(i = 0; i < 0x1000; ++i) {
864 pci_read_config_byte(dev, 0x5b, &scr2);
865 /* DPLL destabilized? */
866 if(!(scr2 & 0x80))
867 return 0;
868 }
869 /* Turn off tuning, we have the DPLL set */
870 pci_read_config_dword (dev, 0x5c, &dpll);
871 pci_write_config_dword(dev, 0x5c, (dpll & ~0x100));
872 return 1;
b39b01ff
AC
873}
874
feb22b7f 875static void hpt3xx_disable_fast_irq(struct pci_dev *dev, u8 mcr_addr)
1785192b
BZ
876{
877 struct ide_host *host = pci_get_drvdata(dev);
878 struct hpt_info *info = host->host_priv + (&dev->dev == host->dev[1]);
879 u8 chip_type = info->chip_type;
880 u8 new_mcr, old_mcr = 0;
881
882 /*
883 * Disable the "fast interrupt" prediction. Don't hold off
884 * on interrupts. (== 0x01 despite what the docs say)
885 */
886 pci_read_config_byte(dev, mcr_addr + 1, &old_mcr);
887
888 if (chip_type >= HPT374)
889 new_mcr = old_mcr & ~0x07;
890 else if (chip_type >= HPT370) {
891 new_mcr = old_mcr;
892 new_mcr &= ~0x02;
893#ifdef HPT_DELAY_INTERRUPT
894 new_mcr &= ~0x01;
895#else
896 new_mcr |= 0x01;
897#endif
898 } else /* HPT366 and HPT368 */
899 new_mcr = old_mcr & ~0x80;
900
901 if (new_mcr != old_mcr)
902 pci_write_config_byte(dev, mcr_addr + 1, new_mcr);
903}
904
2ed0ef54 905static int init_chipset_hpt366(struct pci_dev *dev)
b39b01ff 906{
7b73ee05 907 unsigned long io_base = pci_resource_start(dev, 4);
62ff2ecf 908 struct hpt_info *info = hpt3xx_get_info(&dev->dev);
a326b02b 909 const char *name = DRV_NAME;
7b73ee05 910 u8 pci_clk, dpll_clk = 0; /* PCI and DPLL clock in MHz */
72931368 911 u8 chip_type;
7b73ee05
SS
912 enum ata_clock clock;
913
72931368 914 chip_type = info->chip_type;
1da177e4 915
7b73ee05
SS
916 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4));
917 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78);
918 pci_write_config_byte(dev, PCI_MIN_GNT, 0x08);
919 pci_write_config_byte(dev, PCI_MAX_LAT, 0x08);
26c068da 920
1da177e4 921 /*
7b73ee05 922 * First, try to estimate the PCI clock frequency...
1da177e4 923 */
72931368 924 if (chip_type >= HPT370) {
7b73ee05
SS
925 u8 scr1 = 0;
926 u16 f_cnt = 0;
927 u32 temp = 0;
928
929 /* Interrupt force enable. */
930 pci_read_config_byte(dev, 0x5a, &scr1);
931 if (scr1 & 0x10)
932 pci_write_config_byte(dev, 0x5a, scr1 & ~0x10);
933
934 /*
935 * HighPoint does this for HPT372A.
936 * NOTE: This register is only writeable via I/O space.
937 */
72931368 938 if (chip_type == HPT372A)
7b73ee05
SS
939 outb(0x0e, io_base + 0x9c);
940
941 /*
942 * Default to PCI clock. Make sure MA15/16 are set to output
943 * to prevent drives having problems with 40-pin cables.
944 */
945 pci_write_config_byte(dev, 0x5b, 0x23);
836c0063 946
7b73ee05
SS
947 /*
948 * We'll have to read f_CNT value in order to determine
949 * the PCI clock frequency according to the following ratio:
950 *
951 * f_CNT = Fpci * 192 / Fdpll
952 *
953 * First try reading the register in which the HighPoint BIOS
954 * saves f_CNT value before reprogramming the DPLL from its
955 * default setting (which differs for the various chips).
7b73ee05 956 *
72931368
SS
957 * NOTE: This register is only accessible via I/O space;
958 * HPT374 BIOS only saves it for the function 0, so we have to
959 * always read it from there -- no need to check the result of
960 * pci_get_slot() for the function 0 as the whole device has
961 * been already "pinned" (via function 1) in init_setup_hpt374()
962 */
963 if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
964 struct pci_dev *dev1 = pci_get_slot(dev->bus,
965 dev->devfn - 1);
966 unsigned long io_base = pci_resource_start(dev1, 4);
967
968 temp = inl(io_base + 0x90);
969 pci_dev_put(dev1);
970 } else
971 temp = inl(io_base + 0x90);
972
973 /*
974 * In case the signature check fails, we'll have to
975 * resort to reading the f_CNT register itself in hopes
976 * that nobody has touched the DPLL yet...
7b73ee05 977 */
7b73ee05
SS
978 if ((temp & 0xFFFFF000) != 0xABCDE000) {
979 int i;
980
28cfd8af
BZ
981 printk(KERN_WARNING "%s %s: no clock data saved by "
982 "BIOS\n", name, pci_name(dev));
7b73ee05
SS
983
984 /* Calculate the average value of f_CNT. */
985 for (temp = i = 0; i < 128; i++) {
986 pci_read_config_word(dev, 0x78, &f_cnt);
987 temp += f_cnt & 0x1ff;
988 mdelay(1);
989 }
990 f_cnt = temp / 128;
991 } else
992 f_cnt = temp & 0x1ff;
993
994 dpll_clk = info->dpll_clk;
995 pci_clk = (f_cnt * dpll_clk) / 192;
996
997 /* Clamp PCI clock to bands. */
998 if (pci_clk < 40)
999 pci_clk = 33;
1000 else if(pci_clk < 45)
1001 pci_clk = 40;
1002 else if(pci_clk < 55)
1003 pci_clk = 50;
1da177e4 1004 else
7b73ee05 1005 pci_clk = 66;
836c0063 1006
28cfd8af
BZ
1007 printk(KERN_INFO "%s %s: DPLL base: %d MHz, f_CNT: %d, "
1008 "assuming %d MHz PCI\n", name, pci_name(dev),
1009 dpll_clk, f_cnt, pci_clk);
90778574 1010 } else {
7b73ee05
SS
1011 u32 itr1 = 0;
1012
1013 pci_read_config_dword(dev, 0x40, &itr1);
1014
1015 /* Detect PCI clock by looking at cmd_high_time. */
45969e16 1016 switch ((itr1 >> 8) & 0x0f) {
7b73ee05
SS
1017 case 0x09:
1018 pci_clk = 40;
6273d26a 1019 break;
7b73ee05
SS
1020 case 0x05:
1021 pci_clk = 25;
6273d26a 1022 break;
7b73ee05
SS
1023 case 0x07:
1024 default:
1025 pci_clk = 33;
6273d26a 1026 break;
1da177e4
LT
1027 }
1028 }
836c0063 1029
7b73ee05
SS
1030 /* Let's assume we'll use PCI clock for the ATA clock... */
1031 switch (pci_clk) {
1032 case 25:
1033 clock = ATA_CLOCK_25MHZ;
1034 break;
1035 case 33:
1036 default:
1037 clock = ATA_CLOCK_33MHZ;
1038 break;
1039 case 40:
1040 clock = ATA_CLOCK_40MHZ;
1041 break;
1042 case 50:
1043 clock = ATA_CLOCK_50MHZ;
1044 break;
1045 case 66:
1046 clock = ATA_CLOCK_66MHZ;
1047 break;
1048 }
836c0063 1049
1da177e4 1050 /*
7b73ee05
SS
1051 * Only try the DPLL if we don't have a table for the PCI clock that
1052 * we are running at for HPT370/A, always use it for anything newer...
b39b01ff 1053 *
7b73ee05
SS
1054 * NOTE: Using the internal DPLL results in slow reads on 33 MHz PCI.
1055 * We also don't like using the DPLL because this causes glitches
1056 * on PRST-/SRST- when the state engine gets reset...
1da177e4 1057 */
866664d7 1058 if (chip_type >= HPT374 || info->timings->clock_table[clock] == NULL) {
7b73ee05
SS
1059 u16 f_low, delta = pci_clk < 50 ? 2 : 4;
1060 int adjust;
1061
1062 /*
1063 * Select 66 MHz DPLL clock only if UltraATA/133 mode is
1064 * supported/enabled, use 50 MHz DPLL clock otherwise...
1065 */
fbf47840 1066 if (info->udma_mask == ATA_UDMA6) {
7b73ee05
SS
1067 dpll_clk = 66;
1068 clock = ATA_CLOCK_66MHZ;
1069 } else if (dpll_clk) { /* HPT36x chips don't have DPLL */
1070 dpll_clk = 50;
1071 clock = ATA_CLOCK_50MHZ;
1072 }
b39b01ff 1073
866664d7 1074 if (info->timings->clock_table[clock] == NULL) {
28cfd8af
BZ
1075 printk(KERN_ERR "%s %s: unknown bus timing!\n",
1076 name, pci_name(dev));
7b73ee05 1077 return -EIO;
1da177e4 1078 }
1da177e4 1079
7b73ee05
SS
1080 /* Select the DPLL clock. */
1081 pci_write_config_byte(dev, 0x5b, 0x21);
1082
1083 /*
1084 * Adjust the DPLL based upon PCI clock, enable it,
1085 * and wait for stabilization...
1086 */
1087 f_low = (pci_clk * 48) / dpll_clk;
1088
1089 for (adjust = 0; adjust < 8; adjust++) {
1090 if(hpt37x_calibrate_dpll(dev, f_low, f_low + delta))
1091 break;
1092
1093 /*
1094 * See if it'll settle at a fractionally different clock
1095 */
1096 if (adjust & 1)
1097 f_low -= adjust >> 1;
1098 else
1099 f_low += adjust >> 1;
1100 }
1101 if (adjust == 8) {
28cfd8af
BZ
1102 printk(KERN_ERR "%s %s: DPLL did not stabilize!\n",
1103 name, pci_name(dev));
7b73ee05
SS
1104 return -EIO;
1105 }
1106
28cfd8af
BZ
1107 printk(KERN_INFO "%s %s: using %d MHz DPLL clock\n",
1108 name, pci_name(dev), dpll_clk);
7b73ee05
SS
1109 } else {
1110 /* Mark the fact that we're not using the DPLL. */
1111 dpll_clk = 0;
1112
28cfd8af
BZ
1113 printk(KERN_INFO "%s %s: using %d MHz PCI clock\n",
1114 name, pci_name(dev), pci_clk);
7b73ee05 1115 }
b39b01ff 1116
7b73ee05
SS
1117 /* Store the clock frequencies. */
1118 info->dpll_clk = dpll_clk;
1119 info->pci_clk = pci_clk;
866664d7 1120 info->clock = clock;
1da177e4 1121
72931368 1122 if (chip_type >= HPT370) {
7b73ee05
SS
1123 u8 mcr1, mcr4;
1124
1125 /*
1126 * Reset the state engines.
1127 * NOTE: Avoid accidentally enabling the disabled channels.
1128 */
1129 pci_read_config_byte (dev, 0x50, &mcr1);
1130 pci_read_config_byte (dev, 0x54, &mcr4);
1131 pci_write_config_byte(dev, 0x50, (mcr1 | 0x32));
1132 pci_write_config_byte(dev, 0x54, (mcr4 | 0x32));
1133 udelay(100);
26ccb802 1134 }
1da177e4 1135
7b73ee05
SS
1136 /*
1137 * On HPT371N, if ATA clock is 66 MHz we must set bit 2 in
1138 * the MISC. register to stretch the UltraDMA Tss timing.
1139 * NOTE: This register is only writeable via I/O space.
1140 */
72931368 1141 if (chip_type == HPT371N && clock == ATA_CLOCK_66MHZ)
7b73ee05
SS
1142 outb(inb(io_base + 0x9c) | 0x04, io_base + 0x9c);
1143
1785192b
BZ
1144 hpt3xx_disable_fast_irq(dev, 0x50);
1145 hpt3xx_disable_fast_irq(dev, 0x54);
1146
2ed0ef54 1147 return 0;
1da177e4
LT
1148}
1149
f454cbe8 1150static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
bfa14b42
BZ
1151{
1152 struct pci_dev *dev = to_pci_dev(hwif->dev);
62ff2ecf 1153 struct hpt_info *info = hpt3xx_get_info(hwif->dev);
bfa14b42
BZ
1154 u8 chip_type = info->chip_type;
1155 u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02;
1156
1157 /*
1158 * The HPT37x uses the CBLID pins as outputs for MA15/MA16
1159 * address lines to access an external EEPROM. To read valid
1160 * cable detect state the pins must be enabled as inputs.
1161 */
1162 if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) {
1163 /*
1164 * HPT374 PCI function 1
1165 * - set bit 15 of reg 0x52 to enable TCBLID as input
1166 * - set bit 15 of reg 0x56 to enable FCBLID as input
1167 */
1168 u8 mcr_addr = hwif->select_data + 2;
1169 u16 mcr;
1170
1171 pci_read_config_word(dev, mcr_addr, &mcr);
5d3f1a49
SS
1172 pci_write_config_word(dev, mcr_addr, mcr | 0x8000);
1173 /* Debounce, then read cable ID register */
1174 udelay(10);
bfa14b42
BZ
1175 pci_read_config_byte(dev, 0x5a, &scr1);
1176 pci_write_config_word(dev, mcr_addr, mcr);
1177 } else if (chip_type >= HPT370) {
1178 /*
1179 * HPT370/372 and 374 pcifn 0
1180 * - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs
1181 */
1182 u8 scr2 = 0;
1183
1184 pci_read_config_byte(dev, 0x5b, &scr2);
5d3f1a49
SS
1185 pci_write_config_byte(dev, 0x5b, scr2 & ~1);
1186 /* Debounce, then read cable ID register */
1187 udelay(10);
bfa14b42 1188 pci_read_config_byte(dev, 0x5a, &scr1);
5d3f1a49 1189 pci_write_config_byte(dev, 0x5b, scr2);
bfa14b42
BZ
1190 } else
1191 pci_read_config_byte(dev, 0x5a, &scr1);
1192
1193 return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
1194}
1195
fe31edc8 1196static void init_hwif_hpt366(ide_hwif_t *hwif)
1da177e4 1197{
62ff2ecf 1198 struct hpt_info *info = hpt3xx_get_info(hwif->dev);
2808b0a9 1199 u8 chip_type = info->chip_type;
abc4ad4c
SS
1200
1201 /* Cache the channel's MISC. control registers' offset */
2808b0a9 1202 hwif->select_data = hwif->channel ? 0x54 : 0x50;
abc4ad4c 1203
836c0063
SS
1204 /*
1205 * HPT3xxN chips have some complications:
1206 *
1207 * - on 33 MHz PCI we must clock switch
1208 * - on 66 MHz PCI we must NOT use the PCI clock
1209 */
7b73ee05 1210 if (chip_type >= HPT372N && info->dpll_clk && info->pci_clk < 66) {
836c0063
SS
1211 /*
1212 * Clock is shared between the channels,
1213 * so we'll have to serialize them... :-(
1214 */
702c026b 1215 hwif->host->host_flags |= IDE_HFLAG_SERIALIZE;
836c0063
SS
1216 hwif->rw_disk = &hpt3xxn_rw_disk;
1217 }
1da177e4
LT
1218}
1219
fe31edc8 1220static int init_dma_hpt366(ide_hwif_t *hwif,
b123f56e 1221 const struct ide_port_info *d)
1da177e4 1222{
36501650 1223 struct pci_dev *dev = to_pci_dev(hwif->dev);
b123f56e
BZ
1224 unsigned long flags, base = ide_pci_dma_base(hwif, d);
1225 u8 dma_old, dma_new, masterdma = 0, slavedma = 0;
1da177e4 1226
ebb00fb5
BZ
1227 if (base == 0)
1228 return -1;
1229
1230 hwif->dma_base = base;
1231
1232 if (ide_pci_check_simplex(hwif, d) < 0)
1233 return -1;
1234
1235 if (ide_pci_set_master(dev, d->name) < 0)
b123f56e
BZ
1236 return -1;
1237
1238 dma_old = inb(base + 2);
1da177e4
LT
1239
1240 local_irq_save(flags);
1241
1242 dma_new = dma_old;
abc4ad4c
SS
1243 pci_read_config_byte(dev, hwif->channel ? 0x4b : 0x43, &masterdma);
1244 pci_read_config_byte(dev, hwif->channel ? 0x4f : 0x47, &slavedma);
1da177e4
LT
1245
1246 if (masterdma & 0x30) dma_new |= 0x20;
abc4ad4c 1247 if ( slavedma & 0x30) dma_new |= 0x40;
1da177e4 1248 if (dma_new != dma_old)
b123f56e 1249 outb(dma_new, base + 2);
1da177e4
LT
1250
1251 local_irq_restore(flags);
b123f56e
BZ
1252
1253 printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx\n",
1254 hwif->name, base, base + 7);
1255
1256 hwif->extra_base = base + (hwif->channel ? 8 : 16);
1257
1258 if (ide_allocate_dma_engine(hwif))
1259 return -1;
1260
b123f56e 1261 return 0;
1da177e4
LT
1262}
1263
fe31edc8 1264static void hpt374_init(struct pci_dev *dev, struct pci_dev *dev2)
1da177e4 1265{
fbf47840
BZ
1266 if (dev2->irq != dev->irq) {
1267 /* FIXME: we need a core pci_set_interrupt() */
1268 dev2->irq = dev->irq;
ced3ec8a 1269 printk(KERN_INFO DRV_NAME " %s: PCI config space interrupt "
28cfd8af 1270 "fixed\n", pci_name(dev2));
1da177e4 1271 }
1da177e4
LT
1272}
1273
fe31edc8 1274static void hpt371_init(struct pci_dev *dev)
836c0063 1275{
44c10138 1276 u8 mcr1 = 0;
90778574 1277
836c0063
SS
1278 /*
1279 * HPT371 chips physically have only one channel, the secondary one,
1280 * but the primary channel registers do exist! Go figure...
1281 * So, we manually disable the non-existing channel here
1282 * (if the BIOS hasn't done this already).
1283 */
1284 pci_read_config_byte(dev, 0x50, &mcr1);
1285 if (mcr1 & 0x04)
90778574 1286 pci_write_config_byte(dev, 0x50, mcr1 & ~0x04);
90778574
SS
1287}
1288
fe31edc8 1289static int hpt36x_init(struct pci_dev *dev, struct pci_dev *dev2)
90778574 1290{
fbf47840 1291 u8 mcr1 = 0, pin1 = 0, pin2 = 0;
7b73ee05 1292
fbf47840
BZ
1293 /*
1294 * Now we'll have to force both channels enabled if
1295 * at least one of them has been enabled by BIOS...
1296 */
1297 pci_read_config_byte(dev, 0x50, &mcr1);
1298 if (mcr1 & 0x30)
1299 pci_write_config_byte(dev, 0x50, mcr1 | 0x30);
836c0063 1300
fbf47840
BZ
1301 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin1);
1302 pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin2);
1da177e4 1303
fbf47840 1304 if (pin1 != pin2 && dev->irq == dev2->irq) {
ced3ec8a 1305 printk(KERN_INFO DRV_NAME " %s: onboard version of chipset, "
28cfd8af 1306 "pin1=%d pin2=%d\n", pci_name(dev), pin1, pin2);
fbf47840 1307 return 1;
2648e5d9
SS
1308 }
1309
fbf47840 1310 return 0;
1da177e4
LT
1311}
1312
4db90a14
BZ
1313#define IDE_HFLAGS_HPT3XX \
1314 (IDE_HFLAG_NO_ATAPI_DMA | \
4db90a14
BZ
1315 IDE_HFLAG_OFF_BOARD)
1316
ac95beed
BZ
1317static const struct ide_port_ops hpt3xx_port_ops = {
1318 .set_pio_mode = hpt3xx_set_pio_mode,
1319 .set_dma_mode = hpt3xx_set_mode,
ac95beed
BZ
1320 .maskproc = hpt3xx_maskproc,
1321 .mdma_filter = hpt3xx_mdma_filter,
1322 .udma_filter = hpt3xx_udma_filter,
1323 .cable_detect = hpt3xx_cable_detect,
1324};
1325
f37afdac
BZ
1326static const struct ide_dma_ops hpt37x_dma_ops = {
1327 .dma_host_set = ide_dma_host_set,
1328 .dma_setup = ide_dma_setup,
f37afdac 1329 .dma_start = ide_dma_start,
5e37bdc0
BZ
1330 .dma_end = hpt374_dma_end,
1331 .dma_test_irq = hpt374_dma_test_irq,
f37afdac 1332 .dma_lost_irq = ide_dma_lost_irq,
22117d6e 1333 .dma_timer_expiry = ide_dma_sff_timer_expiry,
592b5315 1334 .dma_sff_read_status = ide_dma_sff_read_status,
5e37bdc0
BZ
1335};
1336
f37afdac
BZ
1337static const struct ide_dma_ops hpt370_dma_ops = {
1338 .dma_host_set = ide_dma_host_set,
1339 .dma_setup = ide_dma_setup,
5e37bdc0
BZ
1340 .dma_start = hpt370_dma_start,
1341 .dma_end = hpt370_dma_end,
f37afdac
BZ
1342 .dma_test_irq = ide_dma_test_irq,
1343 .dma_lost_irq = ide_dma_lost_irq,
22117d6e 1344 .dma_timer_expiry = ide_dma_sff_timer_expiry,
35c9b4da 1345 .dma_clear = hpt370_irq_timeout,
592b5315 1346 .dma_sff_read_status = ide_dma_sff_read_status,
5e37bdc0
BZ
1347};
1348
f37afdac
BZ
1349static const struct ide_dma_ops hpt36x_dma_ops = {
1350 .dma_host_set = ide_dma_host_set,
1351 .dma_setup = ide_dma_setup,
f37afdac 1352 .dma_start = ide_dma_start,
653bcf52 1353 .dma_end = ide_dma_end,
f37afdac 1354 .dma_test_irq = ide_dma_test_irq,
5e37bdc0 1355 .dma_lost_irq = hpt366_dma_lost_irq,
22117d6e 1356 .dma_timer_expiry = ide_dma_sff_timer_expiry,
592b5315 1357 .dma_sff_read_status = ide_dma_sff_read_status,
5e37bdc0
BZ
1358};
1359
fe31edc8 1360static const struct ide_port_info hpt366_chipsets[] = {
ced3ec8a
BZ
1361 { /* 0: HPT36x */
1362 .name = DRV_NAME,
1da177e4
LT
1363 .init_chipset = init_chipset_hpt366,
1364 .init_hwif = init_hwif_hpt366,
1365 .init_dma = init_dma_hpt366,
fbf47840
BZ
1366 /*
1367 * HPT36x chips have one channel per function and have
1368 * both channel enable bits located differently and visible
1369 * to both functions -- really stupid design decision... :-(
1370 * Bit 4 is for the primary channel, bit 5 for the secondary.
1371 */
1372 .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}},
ac95beed 1373 .port_ops = &hpt3xx_port_ops,
5e37bdc0 1374 .dma_ops = &hpt36x_dma_ops,
4db90a14 1375 .host_flags = IDE_HFLAGS_HPT3XX | IDE_HFLAG_SINGLE,
4099d143 1376 .pio_mask = ATA_PIO4,
5f8b6c34 1377 .mwdma_mask = ATA_MWDMA2,
ced3ec8a
BZ
1378 },
1379 { /* 1: HPT3xx */
1380 .name = DRV_NAME,
1da177e4
LT
1381 .init_chipset = init_chipset_hpt366,
1382 .init_hwif = init_hwif_hpt366,
1383 .init_dma = init_dma_hpt366,
7b73ee05 1384 .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}},
ac95beed 1385 .port_ops = &hpt3xx_port_ops,
5e37bdc0 1386 .dma_ops = &hpt37x_dma_ops,
4db90a14 1387 .host_flags = IDE_HFLAGS_HPT3XX,
4099d143 1388 .pio_mask = ATA_PIO4,
5f8b6c34 1389 .mwdma_mask = ATA_MWDMA2,
1da177e4
LT
1390 }
1391};
1392
1393/**
1394 * hpt366_init_one - called when an HPT366 is found
1395 * @dev: the hpt366 device
1396 * @id: the matching pci id
1397 *
1398 * Called when the PCI registration layer (or the IDE initialization)
1399 * finds a device matching our IDE device tables.
1400 */
fe31edc8 1401static int hpt366_init_one(struct pci_dev *dev, const struct pci_device_id *id)
1da177e4 1402{
282037f1 1403 const struct hpt_info *info = NULL;
74811f35 1404 struct hpt_info *dyn_info;
fbf47840 1405 struct pci_dev *dev2 = NULL;
039788e1 1406 struct ide_port_info d;
fbf47840
BZ
1407 u8 idx = id->driver_data;
1408 u8 rev = dev->revision;
74811f35 1409 int ret;
fbf47840
BZ
1410
1411 if ((idx == 0 || idx == 4) && (PCI_FUNC(dev->devfn) & 1))
1412 return -ENODEV;
1413
1414 switch (idx) {
1415 case 0:
1416 if (rev < 3)
1417 info = &hpt36x;
1418 else {
b66cae76
SR
1419 switch (min_t(u8, rev, 6)) {
1420 case 3: info = &hpt370; break;
1421 case 4: info = &hpt370a; break;
1422 case 5: info = &hpt372; break;
1423 case 6: info = &hpt372n; break;
1424 }
fbf47840
BZ
1425 idx++;
1426 }
1427 break;
1428 case 1:
1429 info = (rev > 1) ? &hpt372n : &hpt372a;
1430 break;
1431 case 2:
1432 info = (rev > 1) ? &hpt302n : &hpt302;
1433 break;
1434 case 3:
1435 hpt371_init(dev);
1436 info = (rev > 1) ? &hpt371n : &hpt371;
1437 break;
1438 case 4:
1439 info = &hpt374;
1440 break;
1441 case 5:
1442 info = &hpt372n;
1443 break;
1444 }
1445
ced3ec8a
BZ
1446 printk(KERN_INFO DRV_NAME ": %s chipset detected\n", info->chip_name);
1447
1448 d = hpt366_chipsets[min_t(u8, idx, 1)];
fbf47840 1449
fbf47840
BZ
1450 d.udma_mask = info->udma_mask;
1451
5e37bdc0
BZ
1452 /* fixup ->dma_ops for HPT370/HPT370A */
1453 if (info == &hpt370 || info == &hpt370a)
1454 d.dma_ops = &hpt370_dma_ops;
1455
fbf47840
BZ
1456 if (info == &hpt36x || info == &hpt374)
1457 dev2 = pci_get_slot(dev->bus, dev->devfn + 1);
1458
6396bb22 1459 dyn_info = kcalloc(dev2 ? 2 : 1, sizeof(*dyn_info), GFP_KERNEL);
74811f35 1460 if (dyn_info == NULL) {
28cfd8af
BZ
1461 printk(KERN_ERR "%s %s: out of memory!\n",
1462 d.name, pci_name(dev));
74811f35
BZ
1463 pci_dev_put(dev2);
1464 return -ENOMEM;
1465 }
1466
1467 /*
1468 * Copy everything from a static "template" structure
1469 * to just allocated per-chip hpt_info structure.
1470 */
1471 memcpy(dyn_info, info, sizeof(*dyn_info));
fbf47840 1472
74811f35
BZ
1473 if (dev2) {
1474 memcpy(dyn_info + 1, info, sizeof(*dyn_info));
fbf47840
BZ
1475
1476 if (info == &hpt374)
1477 hpt374_init(dev, dev2);
1478 else {
1479 if (hpt36x_init(dev, dev2))
5e71d9c5 1480 d.host_flags &= ~IDE_HFLAG_NON_BOOTABLE;
fbf47840
BZ
1481 }
1482
74811f35
BZ
1483 ret = ide_pci_init_two(dev, dev2, &d, dyn_info);
1484 if (ret < 0) {
fbf47840 1485 pci_dev_put(dev2);
74811f35
BZ
1486 kfree(dyn_info);
1487 }
fbf47840
BZ
1488 return ret;
1489 }
1da177e4 1490
74811f35
BZ
1491 ret = ide_pci_init_one(dev, &d, dyn_info);
1492 if (ret < 0)
1493 kfree(dyn_info);
1494
1495 return ret;
1da177e4
LT
1496}
1497
fe31edc8 1498static void hpt366_remove(struct pci_dev *dev)
a6c43a2b
BZ
1499{
1500 struct ide_host *host = pci_get_drvdata(dev);
1501 struct ide_info *info = host->host_priv;
1502 struct pci_dev *dev2 = host->dev[1] ? to_pci_dev(host->dev[1]) : NULL;
1503
1504 ide_pci_remove(dev);
1505 pci_dev_put(dev2);
1506 kfree(info);
1507}
1508
fe31edc8 1509static const struct pci_device_id hpt366_pci_tbl[] = {
9cbcc5e3
BZ
1510 { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366), 0 },
1511 { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT372), 1 },
1512 { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT302), 2 },
1513 { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT371), 3 },
1514 { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT374), 4 },
1515 { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT372N), 5 },
1da177e4
LT
1516 { 0, },
1517};
1518MODULE_DEVICE_TABLE(pci, hpt366_pci_tbl);
1519
a9ab09e2 1520static struct pci_driver hpt366_pci_driver = {
1da177e4
LT
1521 .name = "HPT366_IDE",
1522 .id_table = hpt366_pci_tbl,
1523 .probe = hpt366_init_one,
fe31edc8 1524 .remove = hpt366_remove,
feb22b7f
BZ
1525 .suspend = ide_pci_suspend,
1526 .resume = ide_pci_resume,
1da177e4
LT
1527};
1528
82ab1eec 1529static int __init hpt366_ide_init(void)
1da177e4 1530{
a9ab09e2 1531 return ide_pci_register_driver(&hpt366_pci_driver);
1da177e4
LT
1532}
1533
a6c43a2b
BZ
1534static void __exit hpt366_ide_exit(void)
1535{
a9ab09e2 1536 pci_unregister_driver(&hpt366_pci_driver);
a6c43a2b
BZ
1537}
1538
1da177e4 1539module_init(hpt366_ide_init);
a6c43a2b 1540module_exit(hpt366_ide_exit);
1da177e4
LT
1541
1542MODULE_AUTHOR("Andre Hedrick");
1543MODULE_DESCRIPTION("PCI driver module for Highpoint HPT366 IDE");
1544MODULE_LICENSE("GPL");