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