diff mbox

pata_isapnp: Don't use invalid I/O ports

Message ID 1379019689-21467-1-git-send-email-linux@rainbow-software.org
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

Ondrej Zary Sept. 12, 2013, 9:01 p.m. UTC
The test for 2nd I/O port validity is broken (reversed):
On devices with no control port, the driver attempts to use invalid port 0,
resulting in logs full of bad_io_access errors.
On devices with control port, the driver does not use it.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
 drivers/ata/pata_isapnp.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Comments

Ondrej Zary Sept. 13, 2013, 6:54 p.m. UTC | #1
On Thursday 12 September 2013 23:01:29 Ondrej Zary wrote:
> The test for 2nd I/O port validity is broken (reversed):
> On devices with no control port, the driver attempts to use invalid port 0,
> resulting in logs full of bad_io_access errors.
> On devices with control port, the driver does not use it.
>
> Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
> ---
>  drivers/ata/pata_isapnp.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c
> index 4bceb88..b33d1f9 100644
> --- a/drivers/ata/pata_isapnp.c
> +++ b/drivers/ata/pata_isapnp.c
> @@ -78,7 +78,7 @@ static int isapnp_init_one(struct pnp_dev *idev, const
> struct pnp_device_id *dev
>
>  	ap->ioaddr.cmd_addr = cmd_addr;
>
> -	if (pnp_port_valid(idev, 1) == 0) {
> +	if (pnp_port_valid(idev, 1)) {
>  		ctl_addr = devm_ioport_map(&idev->dev,
>  					   pnp_port_start(idev, 1), 1);
>  		ap->ioaddr.altstatus_addr = ctl_addr;

With this patch, the ATA port works fine if there is a device connected to it. 
However, it takes ages to boot if there are no devices connected. Looks like 
the driver retries IDENTIFY command for both slave and master drives in a 
hope that the devices are there.

log:

[    7.692344] pata_isapnp 01:01.02: [io  0x01e8-0x01ef]
[    7.692474] pata_isapnp 01:01.02: [io  0x0168-0x016f]
[    7.692644] pata_isapnp 01:01.02: [irq 10]
[    7.695012] pata_isapnp 01:01.02: activated
[    7.751153] scsi2 : pata_isapnp
[    7.751781] ata3: PATA max PIO0 cmd 0x168 ctl 0x0 irq 10
[   12.751446] ata3.01: qc timeout (cmd 0xec)
[   12.751571] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5)
[   22.752270] ata3.01: qc timeout (cmd 0xec)
[   22.752396] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5)
[   52.754737] ata3.01: qc timeout (cmd 0xec)
[   52.754861] ata3.01: failed to IDENTIFY (I/O error, err_mask=0x5)
[   57.755149] ata3.00: qc timeout (cmd 0xec)
[   57.755275] ata3.00: failed to IDENTIFY (I/O error, err_mask=0x5)
[   67.755974] ata3.00: qc timeout (cmd 0xec)
[   67.756099] ata3.00: failed to IDENTIFY (I/O error, err_mask=0x5)
Tejun Heo Sept. 22, 2013, 9:42 p.m. UTC | #2
On Thu, Sep 12, 2013 at 11:01:29PM +0200, Ondrej Zary wrote:
> The test for 2nd I/O port validity is broken (reversed):
> On devices with no control port, the driver attempts to use invalid port 0,
> resulting in logs full of bad_io_access errors.
> On devices with control port, the driver does not use it.
> 
> Signed-off-by: Ondrej Zary <linux@rainbow-software.org>

Applied to libata/for-3.13.

Thanks.
Sergei Shtylyov Sept. 23, 2013, 12:51 p.m. UTC | #3
Hello.

On 23-09-2013 1:42, Tejun Heo wrote:

>> The test for 2nd I/O port validity is broken (reversed):
>> On devices with no control port, the driver attempts to use invalid port 0,
>> resulting in logs full of bad_io_access errors.
>> On devices with control port, the driver does not use it.

>> Signed-off-by: Ondrej Zary <linux@rainbow-software.org>

> Applied to libata/for-3.13.

    Why only 3.13? Isn't it a simple fix?

> Thanks.

WBR, Sergei

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tejun Heo Sept. 23, 2013, 1 p.m. UTC | #4
On Mon, Sep 23, 2013 at 04:51:16PM +0400, Sergei Shtylyov wrote:
> >Applied to libata/for-3.13.
> 
>    Why only 3.13? Isn't it a simple fix?

Hmmm, maybe, the driver is such low impact, I don't think it matters
either way; otherwise, it should be marked -stable too.  It's a driver
which shouldn't be enabled by default by distros and I didn't think
it'd be worthwhile to create any traffic for it.  That said, if
there's a reason this matters, I'd be happy to add -stable and push it
through ASAP.

Thanks.
Ondrej Zary Sept. 23, 2013, 5:12 p.m. UTC | #5
On Monday 23 September 2013 15:00:42 Tejun Heo wrote:
> On Mon, Sep 23, 2013 at 04:51:16PM +0400, Sergei Shtylyov wrote:
> > >Applied to libata/for-3.13.
> >
> >    Why only 3.13? Isn't it a simple fix?
>
> Hmmm, maybe, the driver is such low impact, I don't think it matters
> either way; otherwise, it should be marked -stable too.  It's a driver
> which shouldn't be enabled by default by distros and I didn't think
> it'd be worthwhile to create any traffic for it.  That said, if
> there's a reason this matters, I'd be happy to add -stable and push it
> through ASAP.
>
> Thanks.

At least Debian ships pata_isapnp.ko. Some distros probably stopped building 
the driver because it was broken.
diff mbox

Patch

diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c
index 4bceb88..b33d1f9 100644
--- a/drivers/ata/pata_isapnp.c
+++ b/drivers/ata/pata_isapnp.c
@@ -78,7 +78,7 @@  static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
 
 	ap->ioaddr.cmd_addr = cmd_addr;
 
-	if (pnp_port_valid(idev, 1) == 0) {
+	if (pnp_port_valid(idev, 1)) {
 		ctl_addr = devm_ioport_map(&idev->dev,
 					   pnp_port_start(idev, 1), 1);
 		ap->ioaddr.altstatus_addr = ctl_addr;