| From 6d8ca28fa688a9354bc9fbc935bdaeb3651b6677 Mon Sep 17 00:00:00 2001 |
| From: Ondrej Zary <linux@rainbow-software.org> |
| Date: Sat, 27 Sep 2014 00:04:46 +0200 |
| Subject: libata-sff: Fix controllers with no ctl port |
| |
| From: Ondrej Zary <linux@rainbow-software.org> |
| |
| commit 6d8ca28fa688a9354bc9fbc935bdaeb3651b6677 upstream. |
| |
| Currently, ata_sff_softreset is skipped for controllers with no ctl port. |
| But that also skips ata_sff_dev_classify required for device detection. |
| This means that libata is currently broken on controllers with no ctl port. |
| |
| No device connected: |
| [ 1.872480] pata_isapnp 01:01.02: activated |
| [ 1.889823] scsi2 : pata_isapnp |
| [ 1.890109] ata3: PATA max PIO0 cmd 0x1e8 ctl 0x0 irq 11 |
| [ 6.888110] ata3.01: qc timeout (cmd 0xec) |
| [ 6.888179] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 16.888085] ata3.01: qc timeout (cmd 0xec) |
| [ 16.888147] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 46.888086] ata3.01: qc timeout (cmd 0xec) |
| [ 46.888148] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 51.888100] ata3.00: qc timeout (cmd 0xec) |
| [ 51.888160] ata3.00: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 61.888079] ata3.00: qc timeout (cmd 0xec) |
| [ 61.888141] ata3.00: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 91.888089] ata3.00: qc timeout (cmd 0xec) |
| [ 91.888152] ata3.00: failed to IDENTIFY (I/O error, err_mask=0x5) |
| |
| ATAPI device connected: |
| [ 1.882061] pata_isapnp 01:01.02: activated |
| [ 1.893430] scsi2 : pata_isapnp |
| [ 1.893719] ata3: PATA max PIO0 cmd 0x1e8 ctl 0x0 irq 11 |
| [ 6.892107] ata3.01: qc timeout (cmd 0xec) |
| [ 6.892171] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 16.892079] ata3.01: qc timeout (cmd 0xec) |
| [ 16.892138] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 46.892079] ata3.01: qc timeout (cmd 0xec) |
| [ 46.892138] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5) |
| [ 46.908586] ata3.00: ATAPI: ACER CD-767E/O, V1.5X, max PIO2, CDB intr |
| [ 46.924570] ata3.00: configured for PIO0 (device error ignored) |
| [ 46.926295] scsi 2:0:0:0: CD-ROM ACER CD-767E/O 1.5X PQ: 0 ANSI: 5 |
| [ 46.984519] sr0: scsi3-mmc drive: 6x/6x xa/form2 tray |
| [ 46.984592] cdrom: Uniform CD-ROM driver Revision: 3.20 |
| |
| So don't skip ata_sff_softreset, just skip the reset part of ata_bus_softreset |
| if the ctl port is not available. |
| |
| This makes IDE port on ES968 behave correctly: |
| |
| No device connected: |
| [ 4.670888] pata_isapnp 01:01.02: activated |
| [ 4.673207] scsi host2: pata_isapnp |
| [ 4.673675] ata3: PATA max PIO0 cmd 0x1e8 ctl 0x0 irq 11 |
| [ 7.081840] Adding 2541652k swap on /dev/sda2. Priority:-1 extents:1 across:2541652k |
| |
| ATAPI device connected: |
| [ 4.704362] pata_isapnp 01:01.02: activated |
| [ 4.706620] scsi host2: pata_isapnp |
| [ 4.706877] ata3: PATA max PIO0 cmd 0x1e8 ctl 0x0 irq 11 |
| [ 4.872782] ata3.00: ATAPI: ACER CD-767E/O, V1.5X, max PIO2, CDB intr |
| [ 4.888673] ata3.00: configured for PIO0 (device error ignored) |
| [ 4.893984] scsi 2:0:0:0: CD-ROM ACER CD-767E/O 1.5X PQ: 0 ANSI: 5 |
| [ 7.015578] Adding 2541652k swap on /dev/sda2. Priority:-1 extents:1 across:2541652k |
| |
| Signed-off-by: Ondrej Zary <linux@rainbow-software.org> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/ata/libata-sff.c | 20 +++++++++----------- |
| 1 file changed, 9 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/ata/libata-sff.c |
| +++ b/drivers/ata/libata-sff.c |
| @@ -2008,13 +2008,15 @@ static int ata_bus_softreset(struct ata_ |
| |
| DPRINTK("ata%u: bus reset via SRST\n", ap->print_id); |
| |
| - /* software reset. causes dev0 to be selected */ |
| - iowrite8(ap->ctl, ioaddr->ctl_addr); |
| - udelay(20); /* FIXME: flush */ |
| - iowrite8(ap->ctl | ATA_SRST, ioaddr->ctl_addr); |
| - udelay(20); /* FIXME: flush */ |
| - iowrite8(ap->ctl, ioaddr->ctl_addr); |
| - ap->last_ctl = ap->ctl; |
| + if (ap->ioaddr.ctl_addr) { |
| + /* software reset. causes dev0 to be selected */ |
| + iowrite8(ap->ctl, ioaddr->ctl_addr); |
| + udelay(20); /* FIXME: flush */ |
| + iowrite8(ap->ctl | ATA_SRST, ioaddr->ctl_addr); |
| + udelay(20); /* FIXME: flush */ |
| + iowrite8(ap->ctl, ioaddr->ctl_addr); |
| + ap->last_ctl = ap->ctl; |
| + } |
| |
| /* wait the port to become ready */ |
| return ata_sff_wait_after_reset(&ap->link, devmask, deadline); |
| @@ -2215,10 +2217,6 @@ void ata_sff_error_handler(struct ata_po |
| |
| spin_unlock_irqrestore(ap->lock, flags); |
| |
| - /* ignore ata_sff_softreset if ctl isn't accessible */ |
| - if (softreset == ata_sff_softreset && !ap->ioaddr.ctl_addr) |
| - softreset = NULL; |
| - |
| /* ignore built-in hardresets if SCR access is not available */ |
| if ((hardreset == sata_std_hardreset || |
| hardreset == sata_sff_hardreset) && !sata_scr_valid(&ap->link)) |