aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_legacy.c
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2007-02-07 16:46:00 -0500
committerJeff Garzik <jeff@garzik.org>2007-02-15 18:04:01 -0500
commitf834e49f1a09414e9618ff0c9cd83c2114032bb6 (patch)
tree9b661b6dc12f3d7487a23ef43545322814562567 /drivers/ata/pata_legacy.c
parent61f216c7196e15e56d97c5a75af01e6684f17fa3 (diff)
libata: Add a host flag to indicate lack of IORDY capability
This is the first preparation to doing the !IORDY cases properly. Further diffs will then add the needed logic to do it right. Signed-off-by: Alan Cox <alan@redhat.com> Cc: Jeff Garzik <jeff@garzik.org> Cc: Tejun Heo <htejun@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/pata_legacy.c')
-rw-r--r--drivers/ata/pata_legacy.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
index 4223e10de6a0..98c1fee4b305 100644
--- a/drivers/ata/pata_legacy.c
+++ b/drivers/ata/pata_legacy.c
@@ -89,9 +89,10 @@ static int probe_all; /* Set to check all ISA port ranges */
89static int ht6560a; /* HT 6560A on primary 1, secondary 2, both 3 */ 89static int ht6560a; /* HT 6560A on primary 1, secondary 2, both 3 */
90static int ht6560b; /* HT 6560A on primary 1, secondary 2, both 3 */ 90static int ht6560b; /* HT 6560A on primary 1, secondary 2, both 3 */
91static int opti82c611a; /* Opti82c611A on primary 1, secondary 2, both 3 */ 91static int opti82c611a; /* Opti82c611A on primary 1, secondary 2, both 3 */
92static int opti82c46x; /* Opti 82c465MV present (pri/sec autodetect) */ 92static int opti82c46x; /* Opti 82c465MV present (pri/sec autodetect) */
93static int autospeed; /* Chip present which snoops speed changes */ 93static int autospeed; /* Chip present which snoops speed changes */
94static int pio_mask = 0x1F; /* PIO range for autospeed devices */ 94static int pio_mask = 0x1F; /* PIO range for autospeed devices */
95static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */
95 96
96/** 97/**
97 * legacy_set_mode - mode setting 98 * legacy_set_mode - mode setting
@@ -113,6 +114,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
113 for (i = 0; i < ATA_MAX_DEVICES; i++) { 114 for (i = 0; i < ATA_MAX_DEVICES; i++) {
114 struct ata_device *dev = &ap->device[i]; 115 struct ata_device *dev = &ap->device[i];
115 if (ata_dev_enabled(dev)) { 116 if (ata_dev_enabled(dev)) {
117 ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
116 dev->pio_mode = XFER_PIO_0; 118 dev->pio_mode = XFER_PIO_0;
117 dev->xfer_mode = XFER_PIO_0; 119 dev->xfer_mode = XFER_PIO_0;
118 dev->xfer_shift = ATA_SHIFT_PIO; 120 dev->xfer_shift = ATA_SHIFT_PIO;
@@ -695,6 +697,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
695 void __iomem *io_addr, *ctrl_addr; 697 void __iomem *io_addr, *ctrl_addr;
696 int pio_modes = pio_mask; 698 int pio_modes = pio_mask;
697 u32 mask = (1 << port); 699 u32 mask = (1 << port);
700 u32 iordy = (iordy_mask & mask) ? 0: ATA_FLAG_NO_IORDY;
698 int ret; 701 int ret;
699 702
700 pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0); 703 pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0);
@@ -715,6 +718,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
715 if (ht6560a & mask) { 718 if (ht6560a & mask) {
716 ops = &ht6560a_port_ops; 719 ops = &ht6560a_port_ops;
717 pio_modes = 0x07; 720 pio_modes = 0x07;
721 iordy = ATA_FLAG_NO_IORDY;
718 } 722 }
719 if (ht6560b & mask) { 723 if (ht6560b & mask) {
720 ops = &ht6560b_port_ops; 724 ops = &ht6560b_port_ops;
@@ -750,6 +754,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
750 printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller detected.\n"); 754 printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller detected.\n");
751 pio_modes = 0x07; 755 pio_modes = 0x07;
752 ops = &pdc20230_port_ops; 756 ops = &pdc20230_port_ops;
757 iordy = ATA_FLAG_NO_IORDY;
753 udelay(100); 758 udelay(100);
754 inb(0x1F5); 759 inb(0x1F5);
755 } else { 760 } else {
@@ -767,6 +772,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
767 /* Chip does mode setting by command snooping */ 772 /* Chip does mode setting by command snooping */
768 if (ops == &legacy_port_ops && (autospeed & mask)) 773 if (ops == &legacy_port_ops && (autospeed & mask))
769 ops = &simple_port_ops; 774 ops = &simple_port_ops;
775
770 memset(&ae, 0, sizeof(struct ata_probe_ent)); 776 memset(&ae, 0, sizeof(struct ata_probe_ent));
771 INIT_LIST_HEAD(&ae.node); 777 INIT_LIST_HEAD(&ae.node);
772 ae.dev = &pdev->dev; 778 ae.dev = &pdev->dev;
@@ -776,7 +782,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
776 ae.pio_mask = pio_modes; 782 ae.pio_mask = pio_modes;
777 ae.irq = irq; 783 ae.irq = irq;
778 ae.irq_flags = 0; 784 ae.irq_flags = 0;
779 ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST; 785 ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST|iordy;
780 ae.port[0].cmd_addr = io_addr; 786 ae.port[0].cmd_addr = io_addr;
781 ae.port[0].altstatus_addr = ctrl_addr; 787 ae.port[0].altstatus_addr = ctrl_addr;
782 ae.port[0].ctl_addr = ctrl_addr; 788 ae.port[0].ctl_addr = ctrl_addr;
@@ -945,6 +951,7 @@ module_param(ht6560b, int, 0);
945module_param(opti82c611a, int, 0); 951module_param(opti82c611a, int, 0);
946module_param(opti82c46x, int, 0); 952module_param(opti82c46x, int, 0);
947module_param(pio_mask, int, 0); 953module_param(pio_mask, int, 0);
954module_param(iordy_mask, int, 0);
948 955
949module_init(legacy_init); 956module_init(legacy_init);
950module_exit(legacy_exit); 957module_exit(legacy_exit);