Commit f834e49f authored by Alan Cox's avatar Alan Cox Committed by Jeff Garzik

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: default avatarAlan Cox <alan@redhat.com>
Cc: Jeff Garzik <jeff@garzik.org>
Cc: Tejun Heo <htejun@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 61f216c7
...@@ -89,9 +89,10 @@ static int probe_all; /* Set to check all ISA port ranges */ ...@@ -89,9 +89,10 @@ static int probe_all; /* Set to check all ISA port ranges */
static int ht6560a; /* HT 6560A on primary 1, secondary 2, both 3 */ static int ht6560a; /* HT 6560A on primary 1, secondary 2, both 3 */
static int ht6560b; /* HT 6560A on primary 1, secondary 2, both 3 */ static int ht6560b; /* HT 6560A on primary 1, secondary 2, both 3 */
static int opti82c611a; /* Opti82c611A on primary 1, secondary 2, both 3 */ static int opti82c611a; /* Opti82c611A on primary 1, secondary 2, both 3 */
static int opti82c46x; /* Opti 82c465MV present (pri/sec autodetect) */ static int opti82c46x; /* Opti 82c465MV present (pri/sec autodetect) */
static int autospeed; /* Chip present which snoops speed changes */ static int autospeed; /* Chip present which snoops speed changes */
static int pio_mask = 0x1F; /* PIO range for autospeed devices */ static int pio_mask = 0x1F; /* PIO range for autospeed devices */
static int iordy_mask = 0xFFFFFFFF; /* Use iordy if available */
/** /**
* legacy_set_mode - mode setting * legacy_set_mode - mode setting
...@@ -113,6 +114,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused) ...@@ -113,6 +114,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
for (i = 0; i < ATA_MAX_DEVICES; i++) { for (i = 0; i < ATA_MAX_DEVICES; i++) {
struct ata_device *dev = &ap->device[i]; struct ata_device *dev = &ap->device[i];
if (ata_dev_enabled(dev)) { if (ata_dev_enabled(dev)) {
ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
dev->pio_mode = XFER_PIO_0; dev->pio_mode = XFER_PIO_0;
dev->xfer_mode = XFER_PIO_0; dev->xfer_mode = XFER_PIO_0;
dev->xfer_shift = ATA_SHIFT_PIO; 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,6 +697,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
void __iomem *io_addr, *ctrl_addr; void __iomem *io_addr, *ctrl_addr;
int pio_modes = pio_mask; int pio_modes = pio_mask;
u32 mask = (1 << port); u32 mask = (1 << port);
u32 iordy = (iordy_mask & mask) ? 0: ATA_FLAG_NO_IORDY;
int ret; int ret;
pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0); 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,6 +718,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
if (ht6560a & mask) { if (ht6560a & mask) {
ops = &ht6560a_port_ops; ops = &ht6560a_port_ops;
pio_modes = 0x07; pio_modes = 0x07;
iordy = ATA_FLAG_NO_IORDY;
} }
if (ht6560b & mask) { if (ht6560b & mask) {
ops = &ht6560b_port_ops; ops = &ht6560b_port_ops;
...@@ -750,6 +754,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl ...@@ -750,6 +754,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller detected.\n"); printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller detected.\n");
pio_modes = 0x07; pio_modes = 0x07;
ops = &pdc20230_port_ops; ops = &pdc20230_port_ops;
iordy = ATA_FLAG_NO_IORDY;
udelay(100); udelay(100);
inb(0x1F5); inb(0x1F5);
} else { } else {
...@@ -767,6 +772,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl ...@@ -767,6 +772,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
/* Chip does mode setting by command snooping */ /* Chip does mode setting by command snooping */
if (ops == &legacy_port_ops && (autospeed & mask)) if (ops == &legacy_port_ops && (autospeed & mask))
ops = &simple_port_ops; ops = &simple_port_ops;
memset(&ae, 0, sizeof(struct ata_probe_ent)); memset(&ae, 0, sizeof(struct ata_probe_ent));
INIT_LIST_HEAD(&ae.node); INIT_LIST_HEAD(&ae.node);
ae.dev = &pdev->dev; ae.dev = &pdev->dev;
...@@ -776,7 +782,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl ...@@ -776,7 +782,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
ae.pio_mask = pio_modes; ae.pio_mask = pio_modes;
ae.irq = irq; ae.irq = irq;
ae.irq_flags = 0; ae.irq_flags = 0;
ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST; ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST|iordy;
ae.port[0].cmd_addr = io_addr; ae.port[0].cmd_addr = io_addr;
ae.port[0].altstatus_addr = ctrl_addr; ae.port[0].altstatus_addr = ctrl_addr;
ae.port[0].ctl_addr = ctrl_addr; ae.port[0].ctl_addr = ctrl_addr;
...@@ -945,6 +951,7 @@ module_param(ht6560b, int, 0); ...@@ -945,6 +951,7 @@ module_param(ht6560b, int, 0);
module_param(opti82c611a, int, 0); module_param(opti82c611a, int, 0);
module_param(opti82c46x, int, 0); module_param(opti82c46x, int, 0);
module_param(pio_mask, int, 0); module_param(pio_mask, int, 0);
module_param(iordy_mask, int, 0);
module_init(legacy_init); module_init(legacy_init);
module_exit(legacy_exit); module_exit(legacy_exit);
......
...@@ -264,16 +264,18 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i ...@@ -264,16 +264,18 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
if (type == 6580) { if (type == 6580) {
ae.port_ops = &qdi6580_port_ops; ae.port_ops = &qdi6580_port_ops;
ae.pio_mask = 0x1F; ae.pio_mask = 0x1F;
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
} else { } else {
ae.port_ops = &qdi6500_port_ops; ae.port_ops = &qdi6500_port_ops;
ae.pio_mask = 0x07; /* Actually PIO3 !IORDY is possible */ ae.pio_mask = 0x07; /* Actually PIO3 !IORDY is possible */
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
ATA_FLAG_NO_IORDY;
} }
ae.sht = &qdi_sht; ae.sht = &qdi_sht;
ae.n_ports = 1; ae.n_ports = 1;
ae.irq = irq; ae.irq = irq;
ae.irq_flags = 0; ae.irq_flags = 0;
ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
ae.port[0].cmd_addr = io_addr; ae.port[0].cmd_addr = io_addr;
ae.port[0].altstatus_addr = ctl_addr; ae.port[0].altstatus_addr = ctl_addr;
ae.port[0].ctl_addr = ctl_addr; ae.port[0].ctl_addr = ctl_addr;
......
...@@ -172,6 +172,7 @@ enum { ...@@ -172,6 +172,7 @@ enum {
ATA_FLAG_DEBUGMSG = (1 << 13), ATA_FLAG_DEBUGMSG = (1 << 13),
ATA_FLAG_SETXFER_POLLING= (1 << 14), /* use polling for SETXFER */ ATA_FLAG_SETXFER_POLLING= (1 << 14), /* use polling for SETXFER */
ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */ ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */
ATA_FLAG_NO_IORDY = (1 << 16), /* controller lacks iordy */
/* The following flag belongs to ap->pflags but is kept in /* The following flag belongs to ap->pflags but is kept in
* ap->flags because it's referenced in many LLDs and will be * ap->flags because it's referenced in many LLDs and will be
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment