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>
17 #define dbgprintf(format, arg...) printk(KERN_INFO format, ## arg)
21 #define dbgprintf(...)
27 #define DRIVER_NAME "pata_rdc" // sata_rdc for SATA
28 #define DRIVER_VERSION "2.6.28" // based on kernel version.
29 // because each kernel main version has its libata, we follow kernel to determine the last libata version.
32 static const struct pci_device_id rdc_pata_id_table[] = {
33 { 0x17F3, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RDC_17F31011},
34 { 0x17F3, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RDC_17F31012},
35 { } /* terminate list */
38 MODULE_LICENSE("GPL");
39 MODULE_AUTHOR("this version author is RDC"); // replace "RDC" with the last maintainer.
40 MODULE_DESCRIPTION("RDC PCI IDE Driver");
41 MODULE_DEVICE_TABLE(pci, rdc_pata_id_table);
42 MODULE_VERSION(DRIVER_VERSION);
45 static struct pci_driver rdc_pata_driver = {
47 .id_table = rdc_pata_id_table,
48 .probe = rdc_init_one,
49 .remove = ata_pci_remove_one,
51 .suspend = ata_pci_device_suspend,
52 .resume = ata_pci_device_resume,
56 static unsigned int in_module_init = 1; // hotplugging check???
57 static int __init pata_rdc_init(void)
61 dbgprintf("pata_rdc_init\n");
62 rc = pci_register_driver(&rdc_pata_driver);
65 dbgprintf("pata_rdc_init faile\n");
74 static void __exit pata_rdc_exit(void)
76 dbgprintf("pata_rdc_exit\n");
77 pci_unregister_driver(&rdc_pata_driver);
80 module_init(pata_rdc_init);
81 module_exit(pata_rdc_exit);
85 static struct pci_bits ATA_Decode_Enable_Bits[] = { // see ATA Host Adapters Standards.
86 { 0x41U, 1U, 0x80UL, 0x80UL }, /* port (Channel) 0 */
87 { 0x43U, 1U, 0x80UL, 0x80UL }, /* port (Channel) 1 */
90 static struct scsi_host_template rdc_pata_sht = { // pata host template
91 ATA_BMDMA_SHT(DRIVER_NAME),
94 static const struct ata_port_operations rdc_pata_ops = {
95 .inherits = &ata_bmdma_port_ops,
97 .port_start = rdc_pata_port_start,
98 .port_stop = rdc_pata_port_stop,
99 .prereset = rdc_pata_prereset,
100 .cable_detect = rdc_pata_cable_detect,
101 .set_piomode = rdc_pata_set_piomode,
102 .set_dmamode = rdc_pata_set_dmamode,
106 static struct ata_port_info rdc_pata_port_info[] = {
109 .flags = ATA_FLAG_SLAVE_POSS,
110 .pio_mask = 0x1f, /* pio0-4 */
111 .mwdma_mask = 0x07, /* mwdma0-2 */
112 .udma_mask = ATA_UDMA5, /* udma0-5 */
113 .port_ops = &rdc_pata_ops,
118 .flags = ATA_FLAG_SLAVE_POSS,
119 .pio_mask = 0x1f, /* pio0-4 */
120 .mwdma_mask = 0x07, /* mwdma0-2 */
121 .udma_mask = ATA_UDMA5, /* udma0-5 */
122 .port_ops = &rdc_pata_ops,
131 // callback function for pci_driver
134 * Register ATA PCI device with kernel services
135 * @pdev: PCI device to register
136 * @ent: Entry in sch_pci_tbl matching with @pdev
139 * Inherited from PCI layer (may sleep).
142 * Zero on success, or -ERRNO value.
144 static int __devinit rdc_init_one(
145 struct pci_dev *pdev,
146 const struct pci_device_id *ent
149 //struct device *dev = &pdev->dev;
150 struct ata_port_info port_info[2];
151 const struct ata_port_info *ppinfo[] = { &port_info[0], &port_info[1] };
155 dbgprintf("rdc_init_one\n");
157 /* no hotplugging support (FIXME) */ // why???
160 dbgprintf("rdc_init_one in_module_init == 0 failed \n");
163 port_info[0] = rdc_pata_port_info[ent->driver_data];
164 port_info[1] = rdc_pata_port_info[ent->driver_data];
166 /* enable device and prepare host */
167 rc = pci_enable_device(pdev);
170 dbgprintf("rdc_init_one pci_enable_device failed \n");
173 /* initialize controller */
175 pci_intx(pdev, 1); // enable interrupt
177 return ata_pci_sff_init_one(pdev, ppinfo, &rdc_pata_sht, NULL);
180 // callback function for ata_port
183 * Set port up for dma.
184 * @ap: Port to initialize
186 * Called just after data structures for each port are
187 * initialized. Allocates space for PRD table if the device
188 * is DMA capable SFF.
190 Some drivers also use this entry point as a chance to allocate driverprivate
191 memory for ap->private_data.
194 * May be used as the port_start() entry in ata_port_operations.
197 * Inherited from caller.
199 static int rdc_pata_port_start(
205 Channel = ap->port_no;
206 dbgprintf("rdc_pata_port_start Channel: %u \n", Channel);
207 if (ap->ioaddr.bmdma_addr)
209 return ata_port_start(ap);
213 dbgprintf("rdc_pata_port_start return 0 !!!\n");
218 static void rdc_pata_port_stop(
224 Channel = ap->port_no;
226 dbgprintf("rdc_pata_port_stop Channel: %u \n", Channel);
230 * prereset for PATA host controller
232 * @deadline: deadline jiffies for the operation
235 * None (inherited from caller).
237 static int rdc_pata_prereset(
238 struct ata_link *link,
239 unsigned long deadline
242 struct pci_dev *pdev;
247 dbgprintf("rdc_pata_prereset\n");
250 pdev = to_pci_dev(ap->host->dev);
252 Channel = ap->port_no;
254 // test ATA Decode Enable Bits, should be enable.
255 if (!pci_test_config_bits(pdev, &ATA_Decode_Enable_Bits[Channel]))
257 dbgprintf("rdc_pata_prereset Channel: %u, Decode Disable\n", Channel);
262 dbgprintf("rdc_pata_prereset Channel: %u, Decode Enable\n", Channel);
263 return ata_std_prereset(link, deadline);
268 * Probe host controller cable detect info
269 * @ap: Port for which cable detect info is desired
271 * Read cable indicator from ATA PCI device's PCI config
272 * register. This register is normally set by firmware (BIOS).
275 * None (inherited from caller).
278 static int rdc_pata_cable_detect(
282 struct pci_dev *pdev;
289 dbgprintf("rdc_pata_cable_detect\n");
291 pdev = to_pci_dev(ap->host->dev);
293 Channel = ap->port_no;
297 Mask = ATAConfiguration_IDEIOConfiguration_PrimaryDeviceCable80Report;
301 Mask = ATAConfiguration_IDEIOConfiguration_SecondaryDeviceCable80Report;
304 /* check BIOS cable detect results */
305 pci_read_config_dword(pdev, ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset, &u32Value);
307 if ((u32Value & Mask) == 0)
309 dbgprintf("rdc_pata_cable_detect Channel: %u, PATA40 \n", Channel);
310 return ATA_CBL_PATA40;
314 dbgprintf("rdc_pata_cable_detect Channel: %u, PATA80 \n", Channel);
315 return ATA_CBL_PATA80;
320 * Initialize host controller PATA PIO timings
321 * @ap: Port whose timings we are configuring
324 * Set PIO mode for device, in host controller PCI config space.
327 * None (inherited from caller).
330 static void rdc_pata_set_piomode(
332 struct ata_device *adev
335 struct pci_dev *pdev;
341 uint PrefetchPostingEnable;
343 dbgprintf("rdc_pata_set_piomode\n");
345 pdev = to_pci_dev(ap->host->dev);
347 Channel = ap->port_no;
348 DeviceID = adev->devno;
349 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...
351 if (adev->class == ATA_DEV_ATA)
353 PrefetchPostingEnable = TRUE;
356 { // ATAPI, CD DVD Rom
357 PrefetchPostingEnable = FALSE;
360 /* PIO configuration clears DTE unconditionally. It will be
361 * programmed in set_dmamode which is guaranteed to be called
362 * after set_piomode if any DMA mode is available.
365 /* Ensure the UDMA bit is off - it will be turned back on if
370 ATAHostAdapter_SetPrimaryPIO(
375 PrefetchPostingEnable
378 ATAHostAdapter_SetPrimaryUDMA(
387 ATAHostAdapter_SetSecondaryPIO(
392 PrefetchPostingEnable
395 ATAHostAdapter_SetSecondaryUDMA(
402 dbgprintf("rdc_pata_set_piomode Channel: %u, DeviceID: %u, PIO: %d \n", Channel, DeviceID, PIOTimingMode);
406 * Initialize host controller PATA DMA timings
407 * @ap: Port whose timings we are configuring
410 * Set MW/UDMA mode for device, in host controller PCI config space.
413 * None (inherited from caller).
416 static void rdc_pata_set_dmamode(
418 struct ata_device *adev
421 struct pci_dev *pdev;
427 uint PrefetchPostingEnable;
431 dbgprintf("rdc_pata_set_dmamode\n");
433 pdev = to_pci_dev(ap->host->dev);
435 Channel = ap->port_no;
436 DeviceID = adev->devno;
437 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...
438 DMATimingMode = adev->dma_mode; // UDMA or MDMA
440 if (adev->class == ATA_DEV_ATA)
442 PrefetchPostingEnable = TRUE;
445 { // ATAPI, CD DVD Rom
446 PrefetchPostingEnable = FALSE;
449 if (ap->udma_mask == 0)
450 { // ata_port dont support udma. depend on hardware spec.
458 /*if (ap->mdma_mask == 0)
464 if (DMATimingMode >= XFER_UDMA_0)
466 ATAHostAdapter_SetPrimaryPIO(
471 PrefetchPostingEnable
474 ATAHostAdapter_SetPrimaryUDMA(
478 DMATimingMode - XFER_UDMA_0
480 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, UDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_UDMA_0));
484 ATAHostAdapter_SetPrimaryPIO(
487 (DMATimingMode - XFER_MW_DMA_0) + PIO2, // MDMA0 = PIO2
489 PrefetchPostingEnable
492 ATAHostAdapter_SetPrimaryUDMA(
498 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, MDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_MW_DMA_0));
503 if (DMATimingMode >= XFER_UDMA_0)
505 ATAHostAdapter_SetSecondaryPIO(
510 PrefetchPostingEnable
513 ATAHostAdapter_SetSecondaryUDMA(
517 DMATimingMode - XFER_UDMA_0
519 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, UDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_UDMA_0));
523 ATAHostAdapter_SetSecondaryPIO(
526 (DMATimingMode - XFER_MW_DMA_0) + PIO2, // MDMA0 = PIO2
528 PrefetchPostingEnable
531 ATAHostAdapter_SetSecondaryUDMA(
537 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, MDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_MW_DMA_0));
542 // modified PCIDeviceIO code.
545 PCIDeviceIO_ReadPCIConfiguration(
546 struct pci_dev *pdev,
562 for (i = 0; i < Length; i++)
564 pci_read_config_byte(pdev, Offset, pchar);
578 PCIDeviceIO_WritePCIConfiguration(
579 struct pci_dev *pdev,
595 for (i = 0; i < Length; i++)
597 pci_write_config_byte(pdev, Offset, *pchar);
611 // modified ATAHostAdapter code.
614 ATAHostAdapter_SetPrimaryPIO(
615 struct pci_dev *pdev,
619 uint PrefetchPostingEnable
626 uint ATATimingRegister;
627 uint Device1TimingRegister;
631 ATATimingRegister = 0;
632 Device1TimingRegister = 0;
634 result = PCIDeviceIO_ReadPCIConfiguration(
636 ATAConfiguration_ID_PrimaryTiming + ATAConfiguration_PCIOffset,
637 ATAConfiguration_ID_PrimaryTiming_Size,
646 result = PCIDeviceIO_ReadPCIConfiguration(
648 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
649 ATAConfiguration_ID_Device1Timing_Size,
650 &Device1TimingRegister
658 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1TimingRegisterEnable;
665 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device0FastTimingEnable
666 | ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable
667 | ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable
668 | ATAConfiguration_PrimaryTiming_Device0DMATimingEnable
669 | ATAConfiguration_PrimaryTiming_Device0RecoveryMode
670 | ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode
673 if (PIOTimingMode > PIO0)
675 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0FastTimingEnable;
678 if (PIOTimingMode >= PIO3)
680 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable;
683 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
685 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable;
688 if (DMAEnable == TRUE
689 && PIOTimingMode >= PIO2)
691 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0DMATimingEnable;
694 if (PIOTimingMode <= PIO2)
696 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_0;
698 else if (PIOTimingMode == PIO3)
700 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_1;
702 else if (PIOTimingMode == PIO4)
704 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_3;
707 if (PIOTimingMode <= PIO1)
709 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_0;
711 else if (PIOTimingMode == PIO2)
713 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_1;
715 else if (PIOTimingMode <= PIO4)
717 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_2;
723 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device1FastTimingEnable
724 | ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable
725 | ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable
726 | ATAConfiguration_PrimaryTiming_Device1DMATimingEnable
729 if (PIOTimingMode > PIO0)
731 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1FastTimingEnable;
734 if (PIOTimingMode >= PIO3)
736 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable;
739 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
741 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable;
744 if (DMAEnable == TRUE
745 && PIOTimingMode >= PIO2)
747 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1DMATimingEnable;
750 Device1TimingRegister &= ~(ATAConfiguration_Device1Timing_PrimaryRecoveryMode | ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode);
752 if (PIOTimingMode <= PIO2)
754 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_0;
756 else if (PIOTimingMode == PIO3)
758 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_1;
760 else if (PIOTimingMode == PIO4)
762 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_3;
765 if (PIOTimingMode <= PIO1)
767 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_0;
769 else if (PIOTimingMode == PIO2)
771 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_1;
773 else if (PIOTimingMode <= PIO4)
775 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_2;
787 result = PCIDeviceIO_WritePCIConfiguration(
789 ATAConfiguration_ID_PrimaryTiming + ATAConfiguration_PCIOffset,
790 ATAConfiguration_ID_PrimaryTiming_Size,
799 result = PCIDeviceIO_WritePCIConfiguration(
801 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
802 ATAConfiguration_ID_Device1Timing_Size,
803 &Device1TimingRegister
818 ATAHostAdapter_SetSecondaryPIO(
819 struct pci_dev *pdev,
823 uint PrefetchPostingEnable
830 uint ATATimingRegister;
831 uint Device1TimingRegister;
835 ATATimingRegister = 0;
836 Device1TimingRegister = 0;
838 result = PCIDeviceIO_ReadPCIConfiguration(
840 ATAConfiguration_ID_SecondaryTiming + ATAConfiguration_PCIOffset,
841 ATAConfiguration_ID_SecondaryTiming_Size,
850 result = PCIDeviceIO_ReadPCIConfiguration(
852 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
853 ATAConfiguration_ID_Device1Timing_Size,
854 &Device1TimingRegister
862 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1TimingRegisterEnable;
869 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device0FastTimingEnable
870 | ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable
871 | ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable
872 | ATAConfiguration_PrimaryTiming_Device0DMATimingEnable
873 | ATAConfiguration_PrimaryTiming_Device0RecoveryMode
874 | ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode
877 if (PIOTimingMode > PIO0)
879 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0FastTimingEnable;
882 if (PIOTimingMode >= PIO3)
884 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable;
887 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
889 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable;
892 if (DMAEnable == TRUE
893 && PIOTimingMode >= PIO2)
895 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0DMATimingEnable;
898 if (PIOTimingMode <= PIO2)
900 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_0;
902 else if (PIOTimingMode == PIO3)
904 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_1;
906 else if (PIOTimingMode == PIO4)
908 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_3;
911 if (PIOTimingMode <= PIO1)
913 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_0;
915 else if (PIOTimingMode == PIO2)
917 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_1;
919 else if (PIOTimingMode <= PIO4)
921 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_2;
927 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device1FastTimingEnable
928 | ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable
929 | ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable
930 | ATAConfiguration_PrimaryTiming_Device1DMATimingEnable
933 if (PIOTimingMode > PIO0)
935 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1FastTimingEnable;
938 if (PIOTimingMode >= PIO3)
940 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable;
943 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
945 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable;
948 if (DMAEnable == TRUE
949 && PIOTimingMode >= PIO2)
951 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1DMATimingEnable;
954 Device1TimingRegister &= ~(ATAConfiguration_Device1Timing_SecondaryRecoveryMode | ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode);
956 if (PIOTimingMode <= PIO2)
958 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_0;
960 else if (PIOTimingMode == PIO3)
962 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_1;
964 else if (PIOTimingMode == PIO4)
966 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_3;
969 if (PIOTimingMode <= PIO1)
971 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_0;
973 else if (PIOTimingMode == PIO2)
975 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_1;
977 else if (PIOTimingMode <= PIO4)
979 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_2;
991 result = PCIDeviceIO_WritePCIConfiguration(
993 ATAConfiguration_ID_SecondaryTiming + ATAConfiguration_PCIOffset,
994 ATAConfiguration_ID_SecondaryTiming_Size,
1003 result = PCIDeviceIO_WritePCIConfiguration(
1005 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
1006 ATAConfiguration_ID_Device1Timing_Size,
1007 &Device1TimingRegister
1009 if (result == FALSE)
1022 ATAHostAdapter_SetPrimaryUDMA(
1023 struct pci_dev *pdev,
1033 uint UDMAControlRegister;
1034 uint UDMATimingRegister;
1035 ulong IDEIOConfigurationRegister;
1039 UDMAControlRegister = 0;
1040 UDMATimingRegister = 0;
1041 IDEIOConfigurationRegister = 0;
1043 result = PCIDeviceIO_ReadPCIConfiguration(
1045 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
1046 ATAConfiguration_ID_UDMAControl_Size,
1047 &UDMAControlRegister
1049 if (result == FALSE)
1055 result = PCIDeviceIO_ReadPCIConfiguration(
1057 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
1058 ATAConfiguration_ID_UDMATiming_Size,
1061 if (result == FALSE)
1067 result = PCIDeviceIO_ReadPCIConfiguration(
1069 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
1070 ATAConfiguration_ID_IDEIOConfiguration_Size,
1071 &IDEIOConfigurationRegister
1073 if (result == FALSE)
1079 //Rom Code will determine the device cable type and ATA 100.
1080 //IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_DeviceCable80Report;
1081 //IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_ATA100IsSupported;
1087 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_PrimaryDevice0UDMAModeEnable);
1088 if (UDMAEnable == TRUE)
1090 UDMAControlRegister |= ATAConfiguration_UDMAControl_PrimaryDevice0UDMAModeEnable;
1093 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_PrimaryDevice066MhzEnable
1094 | ATAConfiguration_IDEIOConfiguration_PrimaryDevice0100MhzEnable
1097 if (UDMATimingMode >= UDMA5)
1099 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice0100MhzEnable;
1101 else if (UDMATimingMode >= UDMA3)
1103 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice066MhzEnable;
1106 // if 80 cable report
1108 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime);
1110 if (UDMATimingMode == UDMA0)
1112 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_0;
1114 else if (UDMATimingMode == UDMA1 || UDMATimingMode == UDMA3 || UDMATimingMode == UDMA5)
1116 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_1;
1118 else if (UDMATimingMode == UDMA2 || UDMATimingMode == UDMA4)
1120 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_2;
1126 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_PrimaryDevice1UDMAModeEnable);
1127 if (UDMAEnable == TRUE)
1129 UDMAControlRegister |= ATAConfiguration_UDMAControl_PrimaryDevice1UDMAModeEnable;
1132 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_PrimaryDevice166MhzEnable
1133 | ATAConfiguration_IDEIOConfiguration_PrimaryDevice1100MhzEnable
1136 if (UDMATimingMode >= UDMA5)
1138 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice1100MhzEnable;
1140 else if (UDMATimingMode >= UDMA3)
1142 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice166MhzEnable;
1145 // if 80 cable report
1147 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime);
1149 if (UDMATimingMode == UDMA0)
1151 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_0;
1153 else if (UDMATimingMode == UDMA1 || UDMATimingMode == UDMA3 || UDMATimingMode == UDMA5)
1155 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_1;
1157 else if (UDMATimingMode == UDMA2 || UDMATimingMode == UDMA4)
1159 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_2;
1171 result = PCIDeviceIO_WritePCIConfiguration(
1173 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
1174 ATAConfiguration_ID_UDMAControl_Size,
1175 &UDMAControlRegister
1177 if (result == FALSE)
1183 result = PCIDeviceIO_WritePCIConfiguration(
1185 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
1186 ATAConfiguration_ID_UDMATiming_Size,
1189 if (result == FALSE)
1195 result = PCIDeviceIO_WritePCIConfiguration(
1197 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
1198 ATAConfiguration_ID_IDEIOConfiguration_Size,
1199 &IDEIOConfigurationRegister
1201 if (result == FALSE)
1214 ATAHostAdapter_SetSecondaryUDMA(
1215 struct pci_dev *pdev,
1225 uint UDMAControlRegister;
1226 uint UDMATimingRegister;
1227 ulong IDEIOConfigurationRegister;
1231 UDMAControlRegister = 0;
1232 UDMATimingRegister = 0;
1233 IDEIOConfigurationRegister = 0;
1235 result = PCIDeviceIO_ReadPCIConfiguration(
1237 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
1238 ATAConfiguration_ID_UDMAControl_Size,
1239 &UDMAControlRegister
1241 if (result == FALSE)
1247 result = PCIDeviceIO_ReadPCIConfiguration(
1249 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
1250 ATAConfiguration_ID_UDMATiming_Size,
1253 if (result == FALSE)
1259 result = PCIDeviceIO_ReadPCIConfiguration(
1261 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
1262 ATAConfiguration_ID_IDEIOConfiguration_Size,
1263 &IDEIOConfigurationRegister
1265 if (result == FALSE)
1271 //Rom Code will determine the device cable type and ATA 100.
1272 //IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_DeviceCable80Report;
1273 //IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_ATA100IsSupported;
1279 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_SecondaryDevice0UDMAModeEnable);
1280 if (UDMAEnable == TRUE)
1282 UDMAControlRegister |= ATAConfiguration_UDMAControl_SecondaryDevice0UDMAModeEnable;
1285 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_SecondaryDevice066MhzEnable
1286 | ATAConfiguration_IDEIOConfiguration_SecondaryDevice0100MhzEnable
1289 if (UDMATimingMode >= UDMA5)
1291 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice0100MhzEnable;
1293 else if (UDMATimingMode >= UDMA3)
1295 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice066MhzEnable;
1298 // if 80 cable report
1300 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime);
1302 if (UDMATimingMode == UDMA0)
1304 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_0;
1306 else if (UDMATimingMode == UDMA1 || UDMATimingMode == UDMA3 || UDMATimingMode == UDMA5)
1308 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_1;
1310 else if (UDMATimingMode == UDMA2 || UDMATimingMode == UDMA4)
1312 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_2;
1318 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_SecondaryDevice1UDMAModeEnable);
1319 if (UDMAEnable == TRUE)
1321 UDMAControlRegister |= ATAConfiguration_UDMAControl_SecondaryDevice1UDMAModeEnable;
1324 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_SecondaryDevice166MhzEnable
1325 | ATAConfiguration_IDEIOConfiguration_SecondaryDevice1100MhzEnable
1328 if (UDMATimingMode >= UDMA5)
1330 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice1100MhzEnable;
1332 else if (UDMATimingMode >= UDMA3)
1334 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice166MhzEnable;
1337 // if 80 cable report
1339 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime);
1341 if (UDMATimingMode == UDMA0)
1343 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_0;
1345 else if (UDMATimingMode == UDMA1 || UDMATimingMode == UDMA3 || UDMATimingMode == UDMA5)
1347 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_1;
1349 else if (UDMATimingMode == UDMA2 || UDMATimingMode == UDMA4)
1351 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_2;
1363 result = PCIDeviceIO_WritePCIConfiguration(
1365 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
1366 ATAConfiguration_ID_UDMAControl_Size,
1367 &UDMAControlRegister
1369 if (result == FALSE)
1375 result = PCIDeviceIO_WritePCIConfiguration(
1377 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
1378 ATAConfiguration_ID_UDMATiming_Size,
1381 if (result == FALSE)
1387 result = PCIDeviceIO_WritePCIConfiguration(
1389 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
1390 ATAConfiguration_ID_IDEIOConfiguration_Size,
1391 &IDEIOConfigurationRegister
1393 if (result == FALSE)