Skip to content

Commit

Permalink
[PATCH] libata-eh: Remove layering violation and duplication when han…
Browse files Browse the repository at this point in the history
…dling absent ports

This removes the layering violation where drivers have to fiddle
directly with EH flags. Instead we now recognize -ENOENT means "no port"
and do the handling in the core code.

This also removes an instance of a call to disable the port, and an
identical printk from each driver doing this. Even better - future rule
changes will be in one place only.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Alan Cox authored and Jeff Garzik committed Sep 26, 2006
1 parent 4735ebe commit c961922
Show file tree
Hide file tree
Showing 17 changed files with 67 additions and 108 deletions.
8 changes: 3 additions & 5 deletions drivers/ata/ata_piix.c
Original file line number Diff line number Diff line change
Expand Up @@ -643,11 +643,9 @@ static int piix_pata_prereset(struct ata_port *ap)
{
struct pci_dev *pdev = to_pci_dev(ap->host->dev);

if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no])) {
ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n");
ap->eh_context.i.action &= ~ATA_EH_RESET_MASK;
return 0;
}
if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no]))
return -ENOENT;

ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
6 changes: 5 additions & 1 deletion drivers/ata/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -1515,7 +1515,11 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
if (prereset) {
rc = prereset(ap);
if (rc) {
ata_port_printk(ap, KERN_ERR,
if (rc == -ENOENT) {
ata_port_printk(ap, KERN_DEBUG, "port disabled. ignoring.\n");
ap->eh_context.i.action &= ~ATA_EH_RESET_MASK;
} else
ata_port_printk(ap, KERN_ERR,
"prereset failed (errno=%d)\n", rc);
return rc;
}
Expand Down
25 changes: 8 additions & 17 deletions drivers/ata/pata_amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_amd"
#define DRV_VERSION "0.2.3"
#define DRV_VERSION "0.2.4"

/**
* timing_setup - shared timing computation and load
Expand Down Expand Up @@ -137,11 +137,8 @@ static int amd_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u8 ata66;

if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
return -ENOENT;

pci_read_config_byte(pdev, 0x42, &ata66);
if (ata66 & bitmask[ap->port_no])
Expand All @@ -167,11 +164,9 @@ static int amd_early_pre_reset(struct ata_port *ap)
{ 0x40, 1, 0x01, 0x01 }
};

if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
return -ENOENT;

/* No host side cable detection */
ap->cbl = ATA_CBL_PATA80;
return ata_std_prereset(ap);
Expand Down Expand Up @@ -262,12 +257,8 @@ static int nv_pre_reset(struct ata_port *ap) {
u8 ata66;
u16 udma;

if (!pci_test_config_bits(pdev, &nv_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}

if (!pci_test_config_bits(pdev, &nv_enable_bits[ap->port_no]))
return -ENOENT;

pci_read_config_byte(pdev, 0x52, &ata66);
if (ata66 & bitmask[ap->port_no])
Expand Down
18 changes: 7 additions & 11 deletions drivers/ata/pata_artop.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#include <linux/ata.h>

#define DRV_NAME "pata_artop"
#define DRV_VERSION "0.4.1"
#define DRV_VERSION "0.4.2"

/*
* The ARTOP has 33 Mhz and "over clocked" timing tables. Until we
Expand All @@ -47,11 +47,9 @@ static int artop6210_pre_reset(struct ata_port *ap)
{ 0x4AU, 1U, 0x04UL, 0x04UL }, /* port 1 */
};

if (!pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no]))
return -ENOENT;

ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down Expand Up @@ -90,11 +88,9 @@ static int artop6260_pre_reset(struct ata_port *ap)
u8 tmp;

/* Odd numbered device ids are the units with enable bits (the -R cards) */
if (pdev->device % 1 && !pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (pdev->device % 1 && !pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no]))
return -ENOENT;

pci_read_config_byte(pdev, 0x49, &tmp);
if (tmp & (1 >> ap->port_no))
ap->cbl = ATA_CBL_PATA40;
Expand Down
10 changes: 4 additions & 6 deletions drivers/ata/pata_atiixp.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_atiixp"
#define DRV_VERSION "0.4.2"
#define DRV_VERSION "0.4.3"

enum {
ATIIXP_IDE_PIO_TIMING = 0x40,
Expand All @@ -41,11 +41,9 @@ static int atiixp_pre_reset(struct ata_port *ap)
{ 0x48, 1, 0x08, 0x00 }
};

if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &atiixp_enable_bits[ap->port_no]))
return -ENOENT;

ap->cbl = ATA_CBL_PATA80;
return ata_std_prereset(ap);
}
Expand Down
10 changes: 4 additions & 6 deletions drivers/ata/pata_efar.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#include <linux/ata.h>

#define DRV_NAME "pata_efar"
#define DRV_VERSION "0.4.1"
#define DRV_VERSION "0.4.2"

/**
* efar_pre_reset - check for 40/80 pin
Expand All @@ -42,11 +42,9 @@ static int efar_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u8 tmp;

if (!pci_test_config_bits(pdev, &efar_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &efar_enable_bits[ap->port_no]))
return -ENOENT;

pci_read_config_byte(pdev, 0x47, &tmp);
if (tmp & (2 >> ap->port_no))
ap->cbl = ATA_CBL_PATA40;
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_jmicron.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ static int jmicron_pre_reset(struct ata_port *ap)
/* Check if our port is enabled */
pci_read_config_dword(pdev, 0x40, &control);
if ((control & port_mask) == 0)
return 0;
return -ENOENT;

/* There are two basic mappings. One has the two SATA ports merged
as master/slave and the secondary as PATA, the other has only the
Expand Down
11 changes: 4 additions & 7 deletions drivers/ata/pata_mpiix.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* The driver conciously keeps this logic internally to avoid pushing quirky
* PATA history into the clean libata layer.
*
* Thinkpad specific note: If you boot an MPIIX using thinkpad with a PCMCIA
* Thinkpad specific note: If you boot an MPIIX using a thinkpad with a PCMCIA
* hard disk present this driver will not detect it. This is not a bug. In this
* configuration the secondary port of the MPIIX is disabled and the addresses
* are decoded by the PCMCIA bridge and therefore are for a generic IDE driver
Expand All @@ -35,7 +35,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_mpiix"
#define DRV_VERSION "0.7.1"
#define DRV_VERSION "0.7.2"

enum {
IDETIM = 0x6C, /* IDE control register */
Expand All @@ -54,11 +54,8 @@ static int mpiix_pre_reset(struct ata_port *ap)
{ 0x6F, 1, 0x80, 0x80 }
};

if (!pci_test_config_bits(pdev, &mpiix_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &mpiix_enable_bits[ap->port_no]))
return -ENOENT;
ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
7 changes: 2 additions & 5 deletions drivers/ata/pata_ns87410.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,8 @@ static int ns87410_pre_reset(struct ata_port *ap)
{ 0x47, 1, 0x08, 0x08 }
};

if (!pci_test_config_bits(pdev, &ns87410_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &ns87410_enable_bits[ap->port_no]))
return -ENOENT;
ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
9 changes: 3 additions & 6 deletions drivers/ata/pata_oldpiix.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include <linux/ata.h>

#define DRV_NAME "pata_oldpiix"
#define DRV_VERSION "0.5.1"
#define DRV_VERSION "0.5.2"

/**
* oldpiix_pre_reset - probe begin
Expand All @@ -42,11 +42,8 @@ static int oldpiix_pre_reset(struct ata_port *ap)
{ 0x43U, 1U, 0x80UL, 0x80UL }, /* port 1 */
};

if (!pci_test_config_bits(pdev, &oldpiix_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &oldpiix_enable_bits[ap->port_no]))
return -ENOENT;
ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
10 changes: 4 additions & 6 deletions drivers/ata/pata_opti.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_opti"
#define DRV_VERSION "0.2.4"
#define DRV_VERSION "0.2.5"

enum {
READ_REG = 0, /* index of Read cycle timing register */
Expand All @@ -59,11 +59,9 @@ static int opti_pre_reset(struct ata_port *ap)
{ 0x40, 1, 0x08, 0x00 }
};

if (!pci_test_config_bits(pdev, &opti_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &opti_enable_bits[ap->port_no]))
return -ENOENT;

ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
10 changes: 4 additions & 6 deletions drivers/ata/pata_optidma.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_optidma"
#define DRV_VERSION "0.2.1"
#define DRV_VERSION "0.2.2"

enum {
READ_REG = 0, /* index of Read cycle timing register */
Expand All @@ -59,11 +59,9 @@ static int optidma_pre_reset(struct ata_port *ap)
0x40, 1, 0x08, 0x00
};

if (ap->port_no && !pci_test_config_bits(pdev, &optidma_enable_bits)) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (ap->port_no && !pci_test_config_bits(pdev, &optidma_enable_bits))
return -ENOENT;

ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
8 changes: 3 additions & 5 deletions drivers/ata/pata_pdc2027x.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
#include <asm/io.h>

#define DRV_NAME "pata_pdc2027x"
#define DRV_VERSION "0.74-ac3"
#define DRV_VERSION "0.74-ac5"
#undef PDC_DEBUG

#ifdef PDC_DEBUG
Expand Down Expand Up @@ -311,10 +311,8 @@ static inline int pdc2027x_port_enabled(struct ata_port *ap)
static int pdc2027x_prereset(struct ata_port *ap)
{
/* Check whether port enabled */
if (!pdc2027x_port_enabled(ap)) {
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pdc2027x_port_enabled(ap))
return -ENOENT;
pdc2027x_cbl_detect(ap);
return ata_std_prereset(ap);
}
Expand Down
10 changes: 4 additions & 6 deletions drivers/ata/pata_sis.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#include <linux/ata.h>

#define DRV_NAME "pata_sis"
#define DRV_VERSION "0.4.3"
#define DRV_VERSION "0.4.4"

struct sis_chipset {
u16 device; /* PCI host ID */
Expand Down Expand Up @@ -74,11 +74,9 @@ static int sis_133_pre_reset(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
u16 tmp;

if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no])) {
ata_port_disable(ap);
printk(KERN_INFO "ata%u: port disabled. ignoring.\n", ap->id);
return 0;
}
if (!pci_test_config_bits(pdev, &sis_enable_bits[ap->port_no]))
return -ENOENT;

/* The top bit of this register is the cable detect bit */
pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp);
if (tmp & 0x8000)
Expand Down
9 changes: 3 additions & 6 deletions drivers/ata/pata_sl82c105.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_sl82c105"
#define DRV_VERSION "0.2.2"
#define DRV_VERSION "0.2.3"

enum {
/*
Expand Down Expand Up @@ -49,11 +49,8 @@ static int sl82c105_pre_reset(struct ata_port *ap)
};
struct pci_dev *pdev = to_pci_dev(ap->host->dev);

if (ap->port_no && !pci_test_config_bits(pdev, &sl82c105_enable_bits[ap->port_no])) {
ata_port_disable(ap);
dev_printk(KERN_INFO, &pdev->dev, "port disabled. ignoring.\n");
return 0;
}
if (ap->port_no && !pci_test_config_bits(pdev, &sl82c105_enable_bits[ap->port_no]))
return -ENOENT;
ap->cbl = ATA_CBL_PATA40;
return ata_std_prereset(ap);
}
Expand Down
Loading

0 comments on commit c961922

Please sign in to comment.