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>
13 /* #define DBGPRINTF */
17 #define dbgprintf(format, arg...) printk(KERN_INFO format, ## arg)
21 #define dbgprintf(...)
26 #define DRIVER_NAME "pata_rdc" /* sata_rdc for SATA */
27 #define DRIVER_VERSION "2.6.28" /* based on kernel version. */
28 /* because each kernel main version has
29 * its libata, we follow kernel to
30 * determine the last libata version.
34 static const struct pci_device_id rdc_pata_id_table[] = {
35 { 0x17F3, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RDC_17F31011},
36 { 0x17F3, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RDC_17F31012},
37 { } /* terminate list */
40 MODULE_LICENSE("GPL");
41 MODULE_AUTHOR("this version author is RDC"); /* replace "RDC" with the last maintainer. */
42 MODULE_DESCRIPTION("RDC PCI IDE Driver");
43 MODULE_DEVICE_TABLE(pci, rdc_pata_id_table);
44 MODULE_VERSION(DRIVER_VERSION);
47 static struct pci_driver rdc_pata_driver = {
49 .id_table = rdc_pata_id_table,
50 .probe = rdc_init_one,
51 .remove = ata_pci_remove_one,
53 .suspend = ata_pci_device_suspend,
54 .resume = ata_pci_device_resume,
58 static unsigned int in_module_init = 1; /* hotplugging check??? */
59 static int __init pata_rdc_init(void)
63 dbgprintf("pata_rdc_init\n");
64 rc = pci_register_driver(&rdc_pata_driver);
66 dbgprintf("pata_rdc_init faile\n");
75 static void __exit pata_rdc_exit(void)
77 dbgprintf("pata_rdc_exit\n");
78 pci_unregister_driver(&rdc_pata_driver);
81 module_init(pata_rdc_init);
82 module_exit(pata_rdc_exit);
86 /* see ATA Host Adapters Standards. */
87 static struct pci_bits ATA_Decode_Enable_Bits[] = {
88 { 0x41U, 1U, 0x80UL, 0x80UL }, /* port (Channel) 0 */
89 { 0x43U, 1U, 0x80UL, 0x80UL }, /* port (Channel) 1 */
92 /* pata host template */
93 static struct scsi_host_template rdc_pata_sht = {
94 ATA_BMDMA_SHT(DRIVER_NAME),
97 static const struct ata_port_operations rdc_pata_ops = {
98 .inherits = &ata_bmdma_port_ops,
100 .port_start = rdc_pata_port_start,
101 .port_stop = rdc_pata_port_stop,
102 .prereset = rdc_pata_prereset,
103 .cable_detect = rdc_pata_cable_detect,
104 .set_piomode = rdc_pata_set_piomode,
105 .set_dmamode = rdc_pata_set_dmamode,
108 static struct ata_port_info rdc_pata_port_info[] = {
110 .flags = ATA_FLAG_SLAVE_POSS,
111 .pio_mask = 0x1f, /* pio0-4 */
112 .mwdma_mask = 0x07, /* mwdma0-2 */
113 .udma_mask = ATA_UDMA5, /* udma0-5 */
114 .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,
129 /* callback function for pci_driver */
132 * Register ATA PCI device with kernel services
133 * @pdev: PCI device to register
134 * @ent: Entry in sch_pci_tbl matching with @pdev
137 * Inherited from PCI layer (may sleep).
140 * Zero on success, or -ERRNO value.
142 static int __devinit rdc_init_one(struct pci_dev *pdev,
143 const struct pci_device_id *ent)
145 /*struct device *dev = &pdev->dev; */
146 struct ata_port_info port_info[2];
147 const struct ata_port_info *ppinfo[] = { &port_info[0], &port_info[1] };
151 dbgprintf("rdc_init_one\n");
153 /* no hotplugging support (FIXME) */ /* why??? */
154 if (!in_module_init) {
155 dbgprintf("rdc_init_one in_module_init == 0 failed \n");
158 port_info[0] = rdc_pata_port_info[ent->driver_data];
159 port_info[1] = rdc_pata_port_info[ent->driver_data];
161 /* enable device and prepare host */
162 rc = pci_enable_device(pdev);
164 dbgprintf("rdc_init_one pci_enable_device failed \n");
167 /* initialize controller */
169 pci_intx(pdev, 1); /* enable interrupt */
171 return ata_pci_sff_init_one(pdev, ppinfo, &rdc_pata_sht, NULL);
174 /* callback function for ata_port */
177 * Set port up for dma.
178 * @ap: Port to initialize
180 * Called just after data structures for each port are
181 * initialized. Allocates space for PRD table if the device
182 * is DMA capable SFF.
184 Some drivers also use this entry point as a chance to allocate driverprivate
185 memory for ap->private_data.
188 * May be used as the port_start() entry in ata_port_operations.
191 * Inherited from caller.
193 static int rdc_pata_port_start(struct ata_port *ap)
197 Channel = ap->port_no;
198 dbgprintf("rdc_pata_port_start Channel: %u \n", Channel);
199 if (ap->ioaddr.bmdma_addr) {
200 return ata_port_start(ap);
202 dbgprintf("rdc_pata_port_start return 0 !!!\n");
207 static void rdc_pata_port_stop(struct ata_port *ap)
211 Channel = ap->port_no;
213 dbgprintf("rdc_pata_port_stop Channel: %u \n", Channel);
217 * prereset for PATA host controller
219 * @deadline: deadline jiffies for the operation
222 * None (inherited from caller).
224 static int rdc_pata_prereset(struct ata_link *link, unsigned long deadline)
226 struct pci_dev *pdev;
230 dbgprintf("rdc_pata_prereset\n");
233 pdev = to_pci_dev(ap->host->dev);
235 Channel = ap->port_no;
237 /* test ATA Decode Enable Bits, should be enable. */
238 if (!pci_test_config_bits(pdev, &ATA_Decode_Enable_Bits[Channel])) {
239 dbgprintf("rdc_pata_prereset Channel: %u, Decode Disable\n", Channel);
242 dbgprintf("rdc_pata_prereset Channel: %u, Decode Enable\n", Channel);
243 return ata_std_prereset(link, deadline);
248 * Probe host controller cable detect info
249 * @ap: Port for which cable detect info is desired
251 * Read cable indicator from ATA PCI device's PCI config
252 * register. This register is normally set by firmware (BIOS).
255 * None (inherited from caller).
257 static int rdc_pata_cable_detect(struct ata_port *ap)
259 struct pci_dev *pdev;
264 dbgprintf("rdc_pata_cable_detect\n");
266 pdev = to_pci_dev(ap->host->dev);
268 Channel = ap->port_no;
271 Mask = ATAConfiguration_IDEIOConfiguration_PrimaryDeviceCable80Report;
273 Mask = ATAConfiguration_IDEIOConfiguration_SecondaryDeviceCable80Report;
275 /* check BIOS cable detect results */
276 pci_read_config_dword(pdev, ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset, &u32Value);
278 if ((u32Value & Mask) == 0) {
279 dbgprintf("rdc_pata_cable_detect Channel: %u, PATA40 \n", Channel);
280 return ATA_CBL_PATA40;
282 dbgprintf("rdc_pata_cable_detect Channel: %u, PATA80 \n", Channel);
283 return ATA_CBL_PATA80;
288 * Initialize host controller PATA PIO timings
289 * @ap: Port whose timings we are configuring
292 * Set PIO mode for device, in host controller PCI config space.
295 * None (inherited from caller).
297 static void rdc_pata_set_piomode(struct ata_port *ap, struct ata_device *adev)
299 struct pci_dev *pdev;
303 uint PrefetchPostingEnable;
305 dbgprintf("rdc_pata_set_piomode\n");
307 pdev = to_pci_dev(ap->host->dev);
309 Channel = ap->port_no;
310 DeviceID = adev->devno;
312 * piomode = 0, 1, 2, 3... ; adev->pio_mode = XFER_PIO_0, XFER_PIO_1,
313 * XFER_PIO_2, XFER_PIO_3...
315 PIOTimingMode = adev->pio_mode - XFER_PIO_0;
317 if (adev->class == ATA_DEV_ATA) {
318 PrefetchPostingEnable = TRUE;
320 /* ATAPI, CD DVD Rom */
321 PrefetchPostingEnable = FALSE;
324 /* PIO configuration clears DTE unconditionally. It will be
325 * programmed in set_dmamode which is guaranteed to be called
326 * after set_piomode if any DMA mode is available.
329 /* Ensure the UDMA bit is off - it will be turned back on if UDMA is
333 ATAHostAdapter_SetPrimaryPIO(
337 TRUE,/* DMAEnable, */
338 PrefetchPostingEnable
341 ATAHostAdapter_SetPrimaryUDMA(
344 FALSE,/* UDMAEnable, */
348 ATAHostAdapter_SetSecondaryPIO(
352 TRUE,/* DMAEnable, */
353 PrefetchPostingEnable
356 ATAHostAdapter_SetSecondaryUDMA(
359 FALSE,/* UDMAEnable, */
363 dbgprintf("rdc_pata_set_piomode Channel: %u, DeviceID: %u, PIO: %d \n", Channel, DeviceID, PIOTimingMode);
367 * Initialize host controller PATA DMA timings
368 * @ap: Port whose timings we are configuring
371 * Set MW/UDMA mode for device, in host controller PCI config space.
374 * None (inherited from caller).
376 static void rdc_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev)
378 struct pci_dev *pdev;
382 uint PrefetchPostingEnable;
386 dbgprintf("rdc_pata_set_dmamode\n");
388 pdev = to_pci_dev(ap->host->dev);
390 Channel = ap->port_no;
391 DeviceID = adev->devno;
392 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... */
393 DMATimingMode = adev->dma_mode; /* UDMA or MDMA */
395 if (adev->class == ATA_DEV_ATA) {
396 PrefetchPostingEnable = TRUE;
398 /* ATAPI, CD DVD Rom */
399 PrefetchPostingEnable = FALSE;
402 if (ap->udma_mask == 0) {
403 /* ata_port dont support udma. depend on hardware spec. */
409 /*if (ap->mdma_mask == 0) {
413 if (DMATimingMode >= XFER_UDMA_0) {
415 ATAHostAdapter_SetPrimaryPIO(pdev,
419 PrefetchPostingEnable);
421 ATAHostAdapter_SetPrimaryUDMA(pdev,
424 DMATimingMode - XFER_UDMA_0);
425 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, UDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_UDMA_0));
428 ATAHostAdapter_SetPrimaryPIO(pdev,
430 (DMATimingMode - XFER_MW_DMA_0) + PIO2, /* MDMA0 = PIO2 */
432 PrefetchPostingEnable);
434 ATAHostAdapter_SetPrimaryUDMA(pdev,
436 FALSE,/*UDMAEnable,*/
438 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, MDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_MW_DMA_0));
441 if (DMATimingMode >= XFER_UDMA_0) {
443 ATAHostAdapter_SetSecondaryPIO(pdev,
447 PrefetchPostingEnable);
449 ATAHostAdapter_SetSecondaryUDMA(pdev,
452 DMATimingMode - XFER_UDMA_0);
453 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, UDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_UDMA_0));
456 ATAHostAdapter_SetSecondaryPIO(pdev,
458 (DMATimingMode - XFER_MW_DMA_0) + PIO2, /* MDMA0 = PIO2 */
460 PrefetchPostingEnable);
462 ATAHostAdapter_SetSecondaryUDMA(pdev,
464 FALSE,/*UDMAEnable,*/
466 dbgprintf("rdc_pata_set_dmamode Channel: %u, DeviceID: %u, MDMA: %u \n", Channel, DeviceID, (uint)(DMATimingMode - XFER_MW_DMA_0));
471 /* modified PCIDeviceIO code. */
473 static uint PCIDeviceIO_ReadPCIConfiguration(struct pci_dev *pdev, uint Offset, uint Length, void *pBuffer)
483 for (i = 0; i < Length; i++) {
484 pci_read_config_byte(pdev, Offset, pchar);
497 static uint PCIDeviceIO_WritePCIConfiguration(struct pci_dev *pdev, uint Offset, uint Length, void *pBuffer)
507 for (i = 0; i < Length; i++) {
508 pci_write_config_byte(pdev, Offset, *pchar);
521 /* modified ATAHostAdapter code. */
522 static uint ATAHostAdapter_SetPrimaryPIO(struct pci_dev *pdev, uint DeviceID,
523 uint PIOTimingMode, uint DMAEnable,
524 uint PrefetchPostingEnable)
528 uint ATATimingRegister;
529 uint Device1TimingRegister;
533 ATATimingRegister = 0;
534 Device1TimingRegister = 0;
536 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
537 ATAConfiguration_ID_PrimaryTiming + ATAConfiguration_PCIOffset,
538 ATAConfiguration_ID_PrimaryTiming_Size,
540 if (result == FALSE) {
545 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
546 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
547 ATAConfiguration_ID_Device1Timing_Size,
548 &Device1TimingRegister);
549 if (result == FALSE) {
554 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1TimingRegisterEnable;
559 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device0FastTimingEnable |
560 ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable |
561 ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable |
562 ATAConfiguration_PrimaryTiming_Device0DMATimingEnable |
563 ATAConfiguration_PrimaryTiming_Device0RecoveryMode |
564 ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode);
566 if (PIOTimingMode > PIO0)
567 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0FastTimingEnable;
569 if (PIOTimingMode >= PIO3)
570 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable;
572 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
573 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable;
575 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
576 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0DMATimingEnable;
578 if (PIOTimingMode <= PIO2)
579 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_0;
580 else if (PIOTimingMode == PIO3)
581 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_1;
582 else if (PIOTimingMode == PIO4)
583 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_3;
585 if (PIOTimingMode <= PIO1)
586 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_0;
587 else if (PIOTimingMode == PIO2)
588 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_1;
589 else if (PIOTimingMode <= PIO4)
590 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_2;
593 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device1FastTimingEnable |
594 ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable |
595 ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable |
596 ATAConfiguration_PrimaryTiming_Device1DMATimingEnable);
598 if (PIOTimingMode > PIO0)
599 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1FastTimingEnable;
601 if (PIOTimingMode >= PIO3)
602 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable;
604 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
605 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable;
607 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
608 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1DMATimingEnable;
610 Device1TimingRegister &= ~(ATAConfiguration_Device1Timing_PrimaryRecoveryMode |
611 ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode);
613 if (PIOTimingMode <= PIO2)
614 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_0;
615 else if (PIOTimingMode == PIO3)
616 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_1;
617 else if (PIOTimingMode == PIO4)
618 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryRecoveryMode_3;
620 if (PIOTimingMode <= PIO1)
621 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_0;
622 else if (PIOTimingMode == PIO2)
623 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_1;
624 else if (PIOTimingMode <= PIO4)
625 Device1TimingRegister |= ATAConfiguration_Device1Timing_PrimaryIORDYSampleMode_2;
633 result = PCIDeviceIO_WritePCIConfiguration(pdev,
634 ATAConfiguration_ID_PrimaryTiming + ATAConfiguration_PCIOffset,
635 ATAConfiguration_ID_PrimaryTiming_Size,
637 if (result == FALSE) {
642 result = PCIDeviceIO_WritePCIConfiguration(pdev,
643 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
644 ATAConfiguration_ID_Device1Timing_Size,
645 &Device1TimingRegister);
646 if (result == FALSE) {
657 static uint ATAHostAdapter_SetSecondaryPIO(struct pci_dev *pdev, uint DeviceID,
658 uint PIOTimingMode, uint DMAEnable,
659 uint PrefetchPostingEnable)
663 uint ATATimingRegister;
664 uint Device1TimingRegister;
668 ATATimingRegister = 0;
669 Device1TimingRegister = 0;
671 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
672 ATAConfiguration_ID_SecondaryTiming + ATAConfiguration_PCIOffset,
673 ATAConfiguration_ID_SecondaryTiming_Size,
675 if (result == FALSE) {
680 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
681 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
682 ATAConfiguration_ID_Device1Timing_Size,
683 &Device1TimingRegister);
684 if (result == FALSE) {
689 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1TimingRegisterEnable;
694 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device0FastTimingEnable |
695 ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable |
696 ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable |
697 ATAConfiguration_PrimaryTiming_Device0DMATimingEnable |
698 ATAConfiguration_PrimaryTiming_Device0RecoveryMode |
699 ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode);
701 if (PIOTimingMode > PIO0)
702 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0FastTimingEnable;
704 if (PIOTimingMode >= PIO3)
705 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleModeEnable;
707 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
708 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0PrefetchandPostingEnable;
710 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
711 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0DMATimingEnable;
713 if (PIOTimingMode <= PIO2)
714 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_0;
715 else if (PIOTimingMode == PIO3)
716 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_1;
717 else if (PIOTimingMode == PIO4)
718 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0RecoveryMode_3;
720 if (PIOTimingMode <= PIO1)
721 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_0;
722 else if (PIOTimingMode == PIO2)
723 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_1;
724 else if (PIOTimingMode <= PIO4)
725 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device0IORDYSampleMode_2;
728 ATATimingRegister &= ~(ATAConfiguration_PrimaryTiming_Device1FastTimingEnable |
729 ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable |
730 ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable |
731 ATAConfiguration_PrimaryTiming_Device1DMATimingEnable);
733 if (PIOTimingMode > PIO0)
734 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1FastTimingEnable;
736 if (PIOTimingMode >= PIO3)
737 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1IORDYSampleModeEnable;
739 if (PIOTimingMode >= PIO2 && PrefetchPostingEnable == TRUE)
740 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1PrefetchandPostingEnable;
742 if (DMAEnable == TRUE && PIOTimingMode >= PIO2)
743 ATATimingRegister |= ATAConfiguration_PrimaryTiming_Device1DMATimingEnable;
745 Device1TimingRegister &= ~(ATAConfiguration_Device1Timing_SecondaryRecoveryMode |
746 ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode);
748 if (PIOTimingMode <= PIO2)
749 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_0;
750 else if (PIOTimingMode == PIO3)
751 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_1;
752 else if (PIOTimingMode == PIO4)
753 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryRecoveryMode_3;
755 if (PIOTimingMode <= PIO1)
756 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_0;
757 else if (PIOTimingMode == PIO2)
758 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_1;
759 else if (PIOTimingMode <= PIO4)
760 Device1TimingRegister |= ATAConfiguration_Device1Timing_SecondaryIORDYSampleMode_2;
768 result = PCIDeviceIO_WritePCIConfiguration(pdev,
769 ATAConfiguration_ID_SecondaryTiming + ATAConfiguration_PCIOffset,
770 ATAConfiguration_ID_SecondaryTiming_Size,
772 if (result == FALSE) {
777 result = PCIDeviceIO_WritePCIConfiguration(pdev,
778 ATAConfiguration_ID_Device1Timing + ATAConfiguration_PCIOffset,
779 ATAConfiguration_ID_Device1Timing_Size,
780 &Device1TimingRegister);
781 if (result == FALSE) {
791 static uint ATAHostAdapter_SetPrimaryUDMA(struct pci_dev *pdev, uint DeviceID,
792 uint UDMAEnable, uint UDMATimingMode)
796 uint UDMAControlRegister;
797 uint UDMATimingRegister;
798 ulong IDEIOConfigurationRegister;
801 UDMAControlRegister = 0;
802 UDMATimingRegister = 0;
803 IDEIOConfigurationRegister = 0;
805 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
806 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
807 ATAConfiguration_ID_UDMAControl_Size,
808 &UDMAControlRegister);
809 if (result == FALSE) {
814 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
815 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
816 ATAConfiguration_ID_UDMATiming_Size,
817 &UDMATimingRegister);
818 if (result == FALSE) {
823 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
824 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
825 ATAConfiguration_ID_IDEIOConfiguration_Size,
826 &IDEIOConfigurationRegister);
827 if (result == FALSE) {
832 /*Rom Code will determine the device cable type and ATA 100.*/
833 /*IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_DeviceCable80Report;*/
834 /*IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_ATA100IsSupported;*/
838 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_PrimaryDevice0UDMAModeEnable);
839 if (UDMAEnable == TRUE)
840 UDMAControlRegister |= ATAConfiguration_UDMAControl_PrimaryDevice0UDMAModeEnable;
842 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_PrimaryDevice066MhzEnable |
843 ATAConfiguration_IDEIOConfiguration_PrimaryDevice0100MhzEnable);
845 if (UDMATimingMode >= UDMA5)
846 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice0100MhzEnable;
847 else if (UDMATimingMode >= UDMA3)
848 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice066MhzEnable;
850 /* if 80 cable report */
851 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime);
853 if (UDMATimingMode == UDMA0) {
854 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_0;
855 } else if (UDMATimingMode == UDMA1 ||
856 UDMATimingMode == UDMA3 ||
857 UDMATimingMode == UDMA5) {
858 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_1;
859 } else if (UDMATimingMode == UDMA2 ||
860 UDMATimingMode == UDMA4) {
861 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice0CycleTime_2;
865 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_PrimaryDevice1UDMAModeEnable);
866 if (UDMAEnable == TRUE)
867 UDMAControlRegister |= ATAConfiguration_UDMAControl_PrimaryDevice1UDMAModeEnable;
869 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_PrimaryDevice166MhzEnable |
870 ATAConfiguration_IDEIOConfiguration_PrimaryDevice1100MhzEnable);
872 if (UDMATimingMode >= UDMA5)
873 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice1100MhzEnable;
874 else if (UDMATimingMode >= UDMA3)
875 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_PrimaryDevice166MhzEnable;
877 /* if 80 cable report */
878 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime);
880 if (UDMATimingMode == UDMA0) {
881 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_0;
882 } else if (UDMATimingMode == UDMA1 ||
883 UDMATimingMode == UDMA3 ||
884 UDMATimingMode == UDMA5) {
885 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_1;
886 } else if (UDMATimingMode == UDMA2 ||
887 UDMATimingMode == UDMA4) {
888 UDMATimingRegister |= ATAConfiguration_UDMATiming_PrimaryDevice1CycleTime_2;
897 result = PCIDeviceIO_WritePCIConfiguration(pdev,
898 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
899 ATAConfiguration_ID_UDMAControl_Size,
900 &UDMAControlRegister);
901 if (result == FALSE) {
906 result = PCIDeviceIO_WritePCIConfiguration(pdev,
907 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
908 ATAConfiguration_ID_UDMATiming_Size,
909 &UDMATimingRegister);
910 if (result == FALSE) {
915 result = PCIDeviceIO_WritePCIConfiguration(pdev,
916 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
917 ATAConfiguration_ID_IDEIOConfiguration_Size,
918 &IDEIOConfigurationRegister);
919 if (result == FALSE) {
929 static uint ATAHostAdapter_SetSecondaryUDMA(struct pci_dev *pdev, uint DeviceID,
930 uint UDMAEnable, uint UDMATimingMode)
934 uint UDMAControlRegister;
935 uint UDMATimingRegister;
936 ulong IDEIOConfigurationRegister;
940 UDMAControlRegister = 0;
941 UDMATimingRegister = 0;
942 IDEIOConfigurationRegister = 0;
944 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
945 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
946 ATAConfiguration_ID_UDMAControl_Size,
947 &UDMAControlRegister);
948 if (result == FALSE) {
953 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
954 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
955 ATAConfiguration_ID_UDMATiming_Size,
956 &UDMATimingRegister);
957 if (result == FALSE) {
962 result = PCIDeviceIO_ReadPCIConfiguration(pdev,
963 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
964 ATAConfiguration_ID_IDEIOConfiguration_Size,
965 &IDEIOConfigurationRegister);
966 if (result == FALSE) {
971 /* Rom Code will determine the device cable type and ATA 100. */
972 /* IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_DeviceCable80Report; */
973 /* IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_ATA100IsSupported; */
977 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_SecondaryDevice0UDMAModeEnable);
978 if (UDMAEnable == TRUE)
979 UDMAControlRegister |= ATAConfiguration_UDMAControl_SecondaryDevice0UDMAModeEnable;
981 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_SecondaryDevice066MhzEnable |
982 ATAConfiguration_IDEIOConfiguration_SecondaryDevice0100MhzEnable);
984 if (UDMATimingMode >= UDMA5)
985 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice0100MhzEnable;
986 else if (UDMATimingMode >= UDMA3)
987 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice066MhzEnable;
989 /* if 80 cable report */
990 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime);
992 if (UDMATimingMode == UDMA0) {
993 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_0;
994 } else if (UDMATimingMode == UDMA1 ||
995 UDMATimingMode == UDMA3 ||
996 UDMATimingMode == UDMA5) {
997 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_1;
998 } else if (UDMATimingMode == UDMA2 ||
999 UDMATimingMode == UDMA4) {
1000 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice0CycleTime_2;
1004 UDMAControlRegister &= ~(ATAConfiguration_UDMAControl_SecondaryDevice1UDMAModeEnable);
1005 if (UDMAEnable == TRUE)
1006 UDMAControlRegister |= ATAConfiguration_UDMAControl_SecondaryDevice1UDMAModeEnable;
1008 IDEIOConfigurationRegister &= ~(ATAConfiguration_IDEIOConfiguration_SecondaryDevice166MhzEnable |
1009 ATAConfiguration_IDEIOConfiguration_SecondaryDevice1100MhzEnable);
1011 if (UDMATimingMode >= UDMA5)
1012 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice1100MhzEnable;
1013 else if (UDMATimingMode >= UDMA3)
1014 IDEIOConfigurationRegister |= ATAConfiguration_IDEIOConfiguration_SecondaryDevice166MhzEnable;
1016 /* if 80 cable report */
1017 UDMATimingRegister &= ~(ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime);
1019 if (UDMATimingMode == UDMA0) {
1020 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_0;
1021 } else if (UDMATimingMode == UDMA1 ||
1022 UDMATimingMode == UDMA3 ||
1023 UDMATimingMode == UDMA5) {
1024 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_1;
1025 } else if (UDMATimingMode == UDMA2 ||
1026 UDMATimingMode == UDMA4) {
1027 UDMATimingRegister |= ATAConfiguration_UDMATiming_SecondaryDevice1CycleTime_2;
1036 result = PCIDeviceIO_WritePCIConfiguration(pdev,
1037 ATAConfiguration_ID_UDMAControl + ATAConfiguration_PCIOffset,
1038 ATAConfiguration_ID_UDMAControl_Size,
1039 &UDMAControlRegister);
1040 if (result == FALSE) {
1045 result = PCIDeviceIO_WritePCIConfiguration(pdev,
1046 ATAConfiguration_ID_UDMATiming + ATAConfiguration_PCIOffset,
1047 ATAConfiguration_ID_UDMATiming_Size,
1048 &UDMATimingRegister);
1049 if (result == FALSE) {
1054 result = PCIDeviceIO_WritePCIConfiguration(pdev,
1055 ATAConfiguration_ID_IDEIOConfiguration + ATAConfiguration_PCIOffset,
1056 ATAConfiguration_ID_IDEIOConfiguration_Size,
1057 &IDEIOConfigurationRegister);
1058 if (result == FALSE) {