summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-07-10 15:36:27 +0000
committermav <mav@FreeBSD.org>2010-07-10 15:36:27 +0000
commit4895e1982dab6f0e5df6b297363fe7dcfb922dbd (patch)
tree0bbfb763aff8cb85b464369c13b5b5ebffa87f95 /sys/dev/ata
parente4e2e8edd34de4dc993090a450bec0770bc1b0f3 (diff)
downloadFreeBSD-src-4895e1982dab6f0e5df6b297363fe7dcfb922dbd.zip
FreeBSD-src-4895e1982dab6f0e5df6b297363fe7dcfb922dbd.tar.gz
If ata_sata_phy_reset() failed and ata_generic_reset() is not called, mark
channel as having no devices connected. This improves hot-unplug operation on legacy-emulating SATA controllers.
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/chipsets/ata-intel.c4
-rw-r--r--sys/dev/ata/chipsets/ata-marvell.c2
-rw-r--r--sys/dev/ata/chipsets/ata-nvidia.c4
-rw-r--r--sys/dev/ata/chipsets/ata-promise.c2
-rw-r--r--sys/dev/ata/chipsets/ata-siliconimage.c4
-rw-r--r--sys/dev/ata/chipsets/ata-sis.c4
-rw-r--r--sys/dev/ata/chipsets/ata-via.c5
7 files changed, 24 insertions, 1 deletions
diff --git a/sys/dev/ata/chipsets/ata-intel.c b/sys/dev/ata/chipsets/ata-intel.c
index 02cd6e0..0638b39 100644
--- a/sys/dev/ata/chipsets/ata-intel.c
+++ b/sys/dev/ata/chipsets/ata-intel.c
@@ -554,8 +554,12 @@ ata_intel_31244_tf_write(struct ata_request *request)
static void
ata_intel_31244_reset(device_t dev)
{
+ struct ata_channel *ch = device_get_softc(dev);
+
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
}
ATA_DECLARE_DRIVER(ata_intel);
diff --git a/sys/dev/ata/chipsets/ata-marvell.c b/sys/dev/ata/chipsets/ata-marvell.c
index 725f971..371d951 100644
--- a/sys/dev/ata/chipsets/ata-marvell.c
+++ b/sys/dev/ata/chipsets/ata-marvell.c
@@ -579,6 +579,8 @@ ata_marvell_edma_reset(device_t dev)
/* enable channel and test for devices */
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
/* enable EDMA machinery */
ATA_OUTL(ctlr->r_res1, 0x02028 + ATA_MV_EDMA_BASE(ch), 0x00000001);
diff --git a/sys/dev/ata/chipsets/ata-nvidia.c b/sys/dev/ata/chipsets/ata-nvidia.c
index 79064f8..344e5a4 100644
--- a/sys/dev/ata/chipsets/ata-nvidia.c
+++ b/sys/dev/ata/chipsets/ata-nvidia.c
@@ -296,8 +296,12 @@ ata_nvidia_status(device_t dev)
static void
ata_nvidia_reset(device_t dev)
{
+ struct ata_channel *ch = device_get_softc(dev);
+
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
}
static int
diff --git a/sys/dev/ata/chipsets/ata-promise.c b/sys/dev/ata/chipsets/ata-promise.c
index 73dc46e..8a7bceb 100644
--- a/sys/dev/ata/chipsets/ata-promise.c
+++ b/sys/dev/ata/chipsets/ata-promise.c
@@ -744,6 +744,8 @@ ata_promise_mio_reset(device_t dev)
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
/* reset and enable plug/unplug intr */
ATA_OUTL(ctlr->r_res2, 0x06c, (0x00000011 << ch->unit));
diff --git a/sys/dev/ata/chipsets/ata-siliconimage.c b/sys/dev/ata/chipsets/ata-siliconimage.c
index 48c9565..31d1878 100644
--- a/sys/dev/ata/chipsets/ata-siliconimage.c
+++ b/sys/dev/ata/chipsets/ata-siliconimage.c
@@ -364,8 +364,12 @@ ata_sii_status(device_t dev)
static void
ata_sii_reset(device_t dev)
{
+ struct ata_channel *ch = device_get_softc(dev);
+
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
}
static int
diff --git a/sys/dev/ata/chipsets/ata-sis.c b/sys/dev/ata/chipsets/ata-sis.c
index b89e9e0..939f77d 100644
--- a/sys/dev/ata/chipsets/ata-sis.c
+++ b/sys/dev/ata/chipsets/ata-sis.c
@@ -228,8 +228,12 @@ ata_sis_ch_attach(device_t dev)
static void
ata_sis_reset(device_t dev)
{
+ struct ata_channel *ch = device_get_softc(dev);
+
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
}
static int
diff --git a/sys/dev/ata/chipsets/ata-via.c b/sys/dev/ata/chipsets/ata-via.c
index ec22020..8a65b6a 100644
--- a/sys/dev/ata/chipsets/ata-via.c
+++ b/sys/dev/ata/chipsets/ata-via.c
@@ -290,9 +290,12 @@ ata_via_reset(device_t dev)
if ((ctlr->chip->cfg2 & VIABAR) && (ch->unit > 1))
ata_generic_reset(dev);
- else
+ else {
if (ata_sata_phy_reset(dev, -1, 1))
ata_generic_reset(dev);
+ else
+ ch->devices = 0;
+ }
}
static int
OpenPOWER on IntegriCloud