1 #include <linux/kernel.h>
2 #include <linux/init.h>
3 #include <linux/module.h>
6 #include <linux/device.h>
8 #include <scsi/scsi_host.h>
9 #include <linux/libata.h>
14 #define DRIVER_NAME "pata_rdc" /* sata_rdc for SATA */
15 #define DRIVER_VERSION "2.6.28" /* based on kernel version. */
16 /* because each kernel main version has
17 * its libata, we follow kernel to
18 * determine the last libata version.
22 static const struct pci_device_id rdc_pata_id_table[] = {
23 { PCI_DEVICE(0x17F3, 0x1011), RDC_17F31011},
24 { PCI_DEVICE(0x17F3, 0x1012), RDC_17F31012},
25 { } /* terminate list */
27 MODULE_DEVICE_TABLE(pci, rdc_pata_id_table);
29 /* see ATA Host Adapters Standards. */
30 static struct pci_bits ATA_Decode_Enable_Bits[] = {
31 { 0x41U, 1U, 0x80UL, 0x80UL }, /* port (Channel) 0 */
32 { 0x43U, 1U, 0x80UL, 0x80UL }, /* port (Channel) 1 */
35 static uint PCIDeviceIO_ReadPCIConfiguration(struct pci_dev *pdev, uint Offset, uint Length, void *pBuffer)
45 for (i = 0; i < Length; i++) {
46 pci_read_config_byte(pdev, Offset, pchar);
59 static uint PCIDeviceIO_WritePCIConfiguration(struct pci_dev *pdev, uint Offset, uint Length, void *pBuffer)
69 for (i = 0; i < Length; i++) {
70 pci_write_config_byte(pdev, Offset, *pchar);
83 static uint ATAHostAdapter_SetPrimaryPIO(struct pci_dev *pdev, uint DeviceID,
84 uint PIOTimingMode, uint DMAEnable,
85 uint PrefetchPostingEnable)
89 uint ATATimingRegister;
90 uint Device1TimingRegister;
94 ATATimingRegister = 0;
95 Device1TimingRegister = 0;
97 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
98 ATAConfiguration_ID_PrimaryTiming + ATAConfiguration_PCIOffset,
99 ATAConfiguration_ID_PrimaryTiming_Size,
101 if (result == FALSE) {
106 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
107 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
108 ATAConfiguration_ID_Device1Timing_Size,
109 &Device1TimingRegister);
110 if (result == FALSE) {
115 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1TimingRegisterEnable;
120 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device0FastTimingEnable |
121 ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable |
122 ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable |
123 ATAConfiguration_PrimaryTiming_Device0DMATimingEnable |
124 ATAConfiguration_PrimaryTiming_Device0RecoveryMode |
125 ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode);
127 if (PIOTimingMode > PIO0)
128 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0FastTimingEnable;
130 if (PIOTimingMode >= PIO3)
131 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable;
133 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
134 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable;
136 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
137 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0DMATimingEnable;
139 if (PIOTimingMode <= PIO2)
140 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_0;
141 else if (PIOTimingMode == PIO3)
142 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_1;
143 else if (PIOTimingMode == PIO4)
144 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_3;
146 if (PIOTimingMode <= PIO1)
147 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_0;
148 else if (PIOTimingMode == PIO2)
149 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_1;
150 else if (PIOTimingMode <= PIO4)
151 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_2;
154 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device1FastTimingEnable |
155 ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable |
156 ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable |
157 ATAConfiguration_PrimaryTiming_Device1DMATimingEnable);
159 if (PIOTimingMode > PIO0)
160 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1FastTimingEnable;
162 if (PIOTimingMode >= PIO3)
163 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable;
165 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
166 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable;
168 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
169 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1DMATimingEnable;
171 Device1TimingRegister &= ~(ATAConfiguration_Device1Timing_PrimaryRecoveryMode |
172 ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode);
174 if (PIOTimingMode <= PIO2)
175 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_0;
176 else if (PIOTimingMode == PIO3)
177 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_1;
178 else if (PIOTimingMode == PIO4)
179 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_3;
181 if (PIOTimingMode <= PIO1)
182 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_0;
183 else if (PIOTimingMode == PIO2)
184 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_1;
185 else if (PIOTimingMode <= PIO4)
186 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_2;
194 result = PCIDeviceIO_WritePCIConfiguration(pdev,
195 ATAConfiguration_ID_PrimaryTiming + ATAConfiguration_PCIOffset,
196 ATAConfiguration_ID_PrimaryTiming_Size,
198 if (result == FALSE) {
203 result = PCIDeviceIO_WritePCIConfiguration(pdev,
204 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
205 ATAConfiguration_ID_Device1Timing_Size,
206 &Device1TimingRegister);
207 if (result == FALSE) {
218 static uint ATAHostAdapter_SetSecondaryPIO(struct pci_dev *pdev, uint DeviceID,
219 uint PIOTimingMode, uint DMAEnable,
220 uint PrefetchPostingEnable)
224 uint ATATimingRegister;
225 uint Device1TimingRegister;
229 ATATimingRegister = 0;
230 Device1TimingRegister = 0;
232 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
233 ATAConfiguration_ID_SecondaryTiming + ATAConfiguration_PCIOffset,
234 ATAConfiguration_ID_SecondaryTiming_Size,
236 if (result == FALSE) {
241 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
242 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
243 ATAConfiguration_ID_Device1Timing_Size,
244 &Device1TimingRegister);
245 if (result == FALSE) {
250 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1TimingRegisterEnable;
255 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device0FastTimingEnable |
256 ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable |
257 ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable |
258 ATAConfiguration_PrimaryTiming_Device0DMATimingEnable |
259 ATAConfiguration_PrimaryTiming_Device0RecoveryMode |
260 ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode);
262 if (PIOTimingMode > PIO0)
263 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0FastTimingEnable;
265 if (PIOTimingMode >= PIO3)
266 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable;
268 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
269 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable;
271 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
272 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0DMATimingEnable;
274 if (PIOTimingMode <= PIO2)
275 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_0;
276 else if (PIOTimingMode == PIO3)
277 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_1;
278 else if (PIOTimingMode == PIO4)
279 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_3;
281 if (PIOTimingMode <= PIO1)
282 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_0;
283 else if (PIOTimingMode == PIO2)
284 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_1;
285 else if (PIOTimingMode <= PIO4)
286 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_2;
289 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device1FastTimingEnable |
290 ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable |
291 ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable |
292 ATAConfiguration_PrimaryTiming_Device1DMATimingEnable);
294 if (PIOTimingMode > PIO0)
295 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1FastTimingEnable;
297 if (PIOTimingMode >= PIO3)
298 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable;
300 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
301 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable;
303 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
304 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1DMATimingEnable;
306 Device1TimingRegister &= ~(ATAConfiguration_Device1Timing_SecondaryRecoveryMode |
307 ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode);
309 if (PIOTimingMode <= PIO2)
310 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_0;
311 else if (PIOTimingMode == PIO3)
312 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_1;
313 else if (PIOTimingMode == PIO4)
314 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_3;
316 if (PIOTimingMode <= PIO1)
317 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_0;
318 else if (PIOTimingMode == PIO2)
319 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_1;
320 else if (PIOTimingMode <= PIO4)
321 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_2;
329 result = PCIDeviceIO_WritePCIConfiguration(pdev,
330 ATAConfiguration_ID_SecondaryTiming + ATAConfiguration_PCIOffset,
331 ATAConfiguration_ID_SecondaryTiming_Size,
333 if (result == FALSE) {
338 result = PCIDeviceIO_WritePCIConfiguration(pdev,
339 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
340 ATAConfiguration_ID_Device1Timing_Size,
341 &Device1TimingRegister);
342 if (result == FALSE) {
352 static uint ATAHostAdapter_SetPrimaryUDMA(struct pci_dev *pdev, uint DeviceID,
353 uint UDMAEnable, uint UDMATimingMode)
357 uint UDMAControlRegister;
358 uint UDMATimingRegister;
359 ulong IDEIOConfigurationRegister;
362 UDMAControlRegister = 0;
363 UDMATimingRegister = 0;
364 IDEIOConfigurationRegister = 0;
366 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
367 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
368 ATAConfiguration_ID_UDMAControl_Size,
369 &UDMAControlRegister);
370 if (result == FALSE) {
375 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
376 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
377 ATAConfiguration_ID_UDMATiming_Size,
378 &UDMATimingRegister);
379 if (result == FALSE) {
384 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
385 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
386 ATAConfiguration_ID_IDEIOConfiguration_Size,
387 &IDEIOConfigurationRegister);
388 if (result == FALSE) {
393 /*Rom Code will determine the device cable type and ATA 100.*/
394 /*IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_DeviceCable80Report;*/
395 /*IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_ATA100IsSupported;*/
399 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_PrimaryDevice0UDMAModeEnable);
400 if (UDMAEnable == TRUE)
401 UDMAControlRegister |= ATAConfiguration_UDMAControl_PrimaryDevice0UDMAModeEnable;
403 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_PrimaryDevice066MhzEnable |
404 ATAConfiguration_IDEIOConfiguration_PrimaryDevice0100MhzEnable);
406 if (UDMATimingMode >= UDMA5)
407 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice0100MhzEnable;
408 else if (UDMATimingMode >= UDMA3)
409 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice066MhzEnable;
411 /* if 80 cable report */
412 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime);
414 if (UDMATimingMode == UDMA0) {
415 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_0;
416 } else if (UDMATimingMode == UDMA1 ||
417 UDMATimingMode == UDMA3 ||
418 UDMATimingMode == UDMA5) {
419 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_1;
420 } else if (UDMATimingMode == UDMA2 ||
421 UDMATimingMode == UDMA4) {
422 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_2;
426 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_PrimaryDevice1UDMAModeEnable);
427 if (UDMAEnable == TRUE)
428 UDMAControlRegister |= ATAConfiguration_UDMAControl_PrimaryDevice1UDMAModeEnable;
430 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_PrimaryDevice166MhzEnable |
431 ATAConfiguration_IDEIOConfiguration_PrimaryDevice1100MhzEnable);
433 if (UDMATimingMode >= UDMA5)
434 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice1100MhzEnable;
435 else if (UDMATimingMode >= UDMA3)
436 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice166MhzEnable;
438 /* if 80 cable report */
439 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime);
441 if (UDMATimingMode == UDMA0) {
442 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_0;
443 } else if (UDMATimingMode == UDMA1 ||
444 UDMATimingMode == UDMA3 ||
445 UDMATimingMode == UDMA5) {
446 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_1;
447 } else if (UDMATimingMode == UDMA2 ||
448 UDMATimingMode == UDMA4) {
449 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_2;
458 result = PCIDeviceIO_WritePCIConfiguration(pdev,
459 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
460 ATAConfiguration_ID_UDMAControl_Size,
461 &UDMAControlRegister);
462 if (result == FALSE) {
467 result = PCIDeviceIO_WritePCIConfiguration(pdev,
468 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
469 ATAConfiguration_ID_UDMATiming_Size,
470 &UDMATimingRegister);
471 if (result == FALSE) {
476 result = PCIDeviceIO_WritePCIConfiguration(pdev,
477 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
478 ATAConfiguration_ID_IDEIOConfiguration_Size,
479 &IDEIOConfigurationRegister);
480 if (result == FALSE) {
490 static uint ATAHostAdapter_SetSecondaryUDMA(struct pci_dev *pdev, uint DeviceID,
491 uint UDMAEnable, uint UDMATimingMode)
495 uint UDMAControlRegister;
496 uint UDMATimingRegister;
497 ulong IDEIOConfigurationRegister;
501 UDMAControlRegister = 0;
502 UDMATimingRegister = 0;
503 IDEIOConfigurationRegister = 0;
505 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
506 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
507 ATAConfiguration_ID_UDMAControl_Size,
508 &UDMAControlRegister);
509 if (result == FALSE) {
514 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
515 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
516 ATAConfiguration_ID_UDMATiming_Size,
517 &UDMATimingRegister);
518 if (result == FALSE) {
523 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
524 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
525 ATAConfiguration_ID_IDEIOConfiguration_Size,
526 &IDEIOConfigurationRegister);
527 if (result == FALSE) {
532 /* Rom Code will determine the device cable type and ATA 100. */
533 /* IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_DeviceCable80Report; */
534 /* IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_ATA100IsSupported; */
538 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_SecondaryDevice0UDMAModeEnable);
539 if (UDMAEnable == TRUE)
540 UDMAControlRegister |= ATAConfiguration_UDMAControl_SecondaryDevice0UDMAModeEnable;
542 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_SecondaryDevice066MhzEnable |
543 ATAConfiguration_IDEIOConfiguration_SecondaryDevice0100MhzEnable);
545 if (UDMATimingMode >= UDMA5)
546 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice0100MhzEnable;
547 else if (UDMATimingMode >= UDMA3)
548 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice066MhzEnable;
550 /* if 80 cable report */
551 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime);
553 if (UDMATimingMode == UDMA0) {
554 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_0;
555 } else if (UDMATimingMode == UDMA1 ||
556 UDMATimingMode == UDMA3 ||
557 UDMATimingMode == UDMA5) {
558 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_1;
559 } else if (UDMATimingMode == UDMA2 ||
560 UDMATimingMode == UDMA4) {
561 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_2;
565 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_SecondaryDevice1UDMAModeEnable);
566 if (UDMAEnable == TRUE)
567 UDMAControlRegister |= ATAConfiguration_UDMAControl_SecondaryDevice1UDMAModeEnable;
569 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_SecondaryDevice166MhzEnable |
570 ATAConfiguration_IDEIOConfiguration_SecondaryDevice1100MhzEnable);
572 if (UDMATimingMode >= UDMA5)
573 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice1100MhzEnable;
574 else if (UDMATimingMode >= UDMA3)
575 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice166MhzEnable;
577 /* if 80 cable report */
578 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime);
580 if (UDMATimingMode == UDMA0) {
581 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_0;
582 } else if (UDMATimingMode == UDMA1 ||
583 UDMATimingMode == UDMA3 ||
584 UDMATimingMode == UDMA5) {
585 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_1;
586 } else if (UDMATimingMode == UDMA2 ||
587 UDMATimingMode == UDMA4) {
588 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_2;
597 result = PCIDeviceIO_WritePCIConfiguration(pdev,
598 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
599 ATAConfiguration_ID_UDMAControl_Size,
600 &UDMAControlRegister);
601 if (result == FALSE) {
606 result = PCIDeviceIO_WritePCIConfiguration(pdev,
607 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
608 ATAConfiguration_ID_UDMATiming_Size,
609 &UDMATimingRegister);
610 if (result == FALSE) {
615 result = PCIDeviceIO_WritePCIConfiguration(pdev,
616 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
617 ATAConfiguration_ID_IDEIOConfiguration_Size,
618 &IDEIOConfigurationRegister);
619 if (result == FALSE) {
630 * Set port up for dma.
631 * @ap: Port to initialize
633 * Called just after data structures for each port are
634 * initialized. Allocates space for PRD table if the device
635 * is DMA capable SFF.
637 Some drivers also use this entry point as a chance to allocate driverprivate
638 memory for ap->private_data.
641 * May be used as the port_start() entry in ata_port_operations.
644 * Inherited from caller.
646 static int rdc_pata_port_start(struct ata_port *ap)
650 Channel = ap->port_no;
651 dev_dbg(ap->dev, "%s: Channel: %u\n", __func__, Channel);
652 if (ap->ioaddr.bmdma_addr) {
653 return ata_port_start(ap);
655 dev_dbg(ap->dev, "%s: return 0!!!\n", __func__);
660 static void rdc_pata_port_stop(struct ata_port *ap)
664 Channel = ap->port_no;
666 dev_dbg(ap->dev, "%s Channel: %u\n", __func__, Channel);
670 * prereset for PATA host controller
672 * @deadline: deadline jiffies for the operation
675 * None (inherited from caller).
677 static int rdc_pata_prereset(struct ata_link *link, unsigned long deadline)
679 struct pci_dev *pdev;
683 dev_dbg(link->ap->dev, "%s\n", __func__);
686 pdev = to_pci_dev(ap->host->dev);
688 Channel = ap->port_no;
690 /* test ATA Decode Enable Bits, should be enable. */
691 if (!pci_test_config_bits(pdev, &ATA_Decode_Enable_Bits[Channel])) {
692 dev_dbg(link->ap->dev, "%s: Channel: %u, Decode Disable\n",
696 dev_dbg(link->ap->dev, "%s: Channel: %u, Decode Enable\n",
698 return ata_std_prereset(link, deadline);
703 * Probe host controller cable detect info
704 * @ap: Port for which cable detect info is desired
706 * Read cable indicator from ATA PCI device's PCI config
707 * register. This register is normally set by firmware (BIOS).
710 * None (inherited from caller).
712 static int rdc_pata_cable_detect(struct ata_port *ap)
714 struct pci_dev *pdev;
719 dev_dbg(ap->dev, "%s\n", __func__);
721 pdev = to_pci_dev(ap->host->dev);
723 Channel = ap->port_no;
726 Mask = ATAConfiguration_IDEIOConfiguration_PrimaryDeviceCable80Report;
728 Mask = ATAConfiguration_IDEIOConfiguration_SecondaryDeviceCable80Report;
730 /* check BIOS cable detect results */
731 pci_read_config_dword(pdev, ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset, &u32Value);
733 if ((u32Value & Mask) == 0) {
734 dev_dbg(ap->dev, "%s: Channel: %u, PATA40 \n",
736 return ATA_CBL_PATA40;
738 dev_dbg(ap->dev, "%s: Channel: %u, PATA80 \n",
740 return ATA_CBL_PATA80;
745 * Initialize host controller PATA PIO timings
746 * @ap: Port whose timings we are configuring
749 * Set PIO mode for device, in host controller PCI config space.
752 * None (inherited from caller).
754 static void rdc_pata_set_piomode(struct ata_port *ap, struct ata_device *adev)
756 struct pci_dev *pdev;
760 uint PrefetchPostingEnable;
762 dev_dbg(ap->dev, "%s\n", __func__);
764 pdev = to_pci_dev(ap->host->dev);
766 Channel = ap->port_no;
767 DeviceID = adev->devno;
769 * piomode = 0, 1, 2, 3... ; adev->pio_mode = XFER_PIO_0, XFER_PIO_1,
770 * XFER_PIO_2, XFER_PIO_3...
772 PIOTimingMode = adev->pio_mode - XFER_PIO_0;
774 if (adev->class == ATA_DEV_ATA) {
775 PrefetchPostingEnable = TRUE;
777 /* ATAPI, CD DVD Rom */
778 PrefetchPostingEnable = FALSE;
781 /* PIO configuration clears DTE unconditionally. It will be
782 * programmed in set_dmamode which is guaranteed to be called
783 * after set_piomode if any DMA mode is available.
786 /* Ensure the UDMA bit is off - it will be turned back on if UDMA is
790 ATAHostAdapter_SetPrimaryPIO(
794 TRUE,/* DMAEnable, */
795 PrefetchPostingEnable
798 ATAHostAdapter_SetPrimaryUDMA(
801 FALSE,/* UDMAEnable, */
805 ATAHostAdapter_SetSecondaryPIO(
809 TRUE,/* DMAEnable, */
810 PrefetchPostingEnable
813 ATAHostAdapter_SetSecondaryUDMA(
816 FALSE,/* UDMAEnable, */
820 dev_dbg(ap->dev, "%s: Channel: %u, DeviceID: %u, PIO: %d\n",
821 __func__, Channel, DeviceID, PIOTimingMode);
825 * Initialize host controller PATA DMA timings
826 * @ap: Port whose timings we are configuring
829 * Set MW/UDMA mode for device, in host controller PCI config space.
832 * None (inherited from caller).
834 static void rdc_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev)
836 struct pci_dev *pdev;
840 uint PrefetchPostingEnable;
844 dev_dbg(ap->dev, "%s\n", __func__);
846 pdev = to_pci_dev(ap->host->dev);
848 Channel = ap->port_no;
849 DeviceID = adev->devno;
850 PIOTimingMode = adev->pio_mode - XFER_PIO_0; /* piomode = 0, 1, 2, 3... ; adev->pio_mode = XFER_PIO_0, XFER_PIO_1, XFER_PIO_2, XFER_PIO_3... */
851 DMATimingMode = adev->dma_mode; /* UDMA or MDMA */
853 if (adev->class == ATA_DEV_ATA) {
854 PrefetchPostingEnable = TRUE;
856 /* ATAPI, CD DVD Rom */
857 PrefetchPostingEnable = FALSE;
860 if (ap->udma_mask == 0) {
861 /* ata_port dont support udma. depend on hardware spec. */
867 /*if (ap->mdma_mask == 0) {
871 if (DMATimingMode >= XFER_UDMA_0) {
873 ATAHostAdapter_SetPrimaryPIO(pdev,
877 PrefetchPostingEnable);
879 ATAHostAdapter_SetPrimaryUDMA(pdev,
882 DMATimingMode - XFER_UDMA_0);
884 "%s: Channel: %u, DeviceID: %u, UDMA: %u\n",
885 __func__, Channel, DeviceID,
886 (uint)(DMATimingMode - XFER_UDMA_0));
889 ATAHostAdapter_SetPrimaryPIO(pdev,
891 (DMATimingMode - XFER_MW_DMA_0) + PIO2, /* MDMA0 = PIO2 */
893 PrefetchPostingEnable);
895 ATAHostAdapter_SetPrimaryUDMA(pdev,
897 FALSE,/*UDMAEnable,*/
900 "%s: Channel: %u, DeviceID: %u, MDMA: %u\n",
901 __func__, Channel, DeviceID,
902 (uint)(DMATimingMode - XFER_MW_DMA_0));
905 if (DMATimingMode >= XFER_UDMA_0) {
907 ATAHostAdapter_SetSecondaryPIO(pdev,
911 PrefetchPostingEnable);
913 ATAHostAdapter_SetSecondaryUDMA(pdev,
916 DMATimingMode - XFER_UDMA_0);
918 "%s: Channel: %u, DeviceID: %u, UDMA: %u\n",
919 __func__, Channel, DeviceID,
920 (uint)(DMATimingMode - XFER_UDMA_0));
923 ATAHostAdapter_SetSecondaryPIO(pdev,
925 (DMATimingMode - XFER_MW_DMA_0) + PIO2, /* MDMA0 = PIO2 */
927 PrefetchPostingEnable);
929 ATAHostAdapter_SetSecondaryUDMA(pdev,
931 FALSE,/*UDMAEnable,*/
934 "%s: Channel: %u, DeviceID: %u, MDMA: %u \n",
935 __func__, Channel, DeviceID,
936 (uint)(DMATimingMode - XFER_MW_DMA_0));
941 /* pata host template */
942 static struct scsi_host_template rdc_pata_sht = {
943 ATA_BMDMA_SHT(DRIVER_NAME),
946 static struct ata_port_operations rdc_pata_ops = {
947 .inherits = &ata_bmdma_port_ops,
949 .port_start = rdc_pata_port_start,
950 .port_stop = rdc_pata_port_stop,
951 .prereset = rdc_pata_prereset,
952 .cable_detect = rdc_pata_cable_detect,
953 .set_piomode = rdc_pata_set_piomode,
954 .set_dmamode = rdc_pata_set_dmamode,
957 static struct ata_port_info rdc_pata_port_info[] = {
959 .flags = ATA_FLAG_SLAVE_POSS,
960 .pio_mask = 0x1f, /* pio0-4 */
961 .mwdma_mask = 0x07, /* mwdma0-2 */
962 .udma_mask = ATA_UDMA5, /* udma0-5 */
963 .port_ops = &rdc_pata_ops,
967 .flags = ATA_FLAG_SLAVE_POSS,
968 .pio_mask = 0x1f, /* pio0-4 */
969 .mwdma_mask = 0x07, /* mwdma0-2 */
970 .udma_mask = ATA_UDMA5, /* udma0-5 */
971 .port_ops = &rdc_pata_ops,
975 static int __devinit rdc_init_one(struct pci_dev *pdev,
976 const struct pci_device_id *ent)
978 struct ata_port_info port_info[2];
979 const struct ata_port_info *ppinfo[] = { &port_info[0], &port_info[1] };
983 dev_dbg(&pdev->dev, "%s\n", __func__);
985 port_info[0] = rdc_pata_port_info[ent->driver_data];
986 port_info[1] = rdc_pata_port_info[ent->driver_data];
988 /* enable device and prepare host */
989 rc = pci_enable_device(pdev);
991 dev_dbg(&pdev->dev, "%s pci_enable_device failed\n", __func__);
995 /* enable interrupt */
998 return ata_pci_sff_init_one(pdev, ppinfo, &rdc_pata_sht, NULL);
1002 static struct pci_driver rdc_pata_driver = {
1003 .name = DRIVER_NAME,
1004 .id_table = rdc_pata_id_table,
1005 .probe = rdc_init_one,
1006 .remove = ata_pci_remove_one,
1008 .suspend = ata_pci_device_suspend,
1009 .resume = ata_pci_device_resume,
1013 static int __init pata_rdc_init(void)
1015 return pci_register_driver(&rdc_pata_driver);
1018 static void __exit pata_rdc_exit(void)
1020 pci_unregister_driver(&rdc_pata_driver);
1023 module_init(pata_rdc_init);
1024 module_exit(pata_rdc_exit);
1026 MODULE_LICENSE("GPL");
1027 MODULE_DESCRIPTION("RDC PCI IDE Driver");
1028 MODULE_VERSION(DRIVER_VERSION);