aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Zaborski <oshogbo@FreeBSD.org>2023-02-10 15:56:04 +0000
committerMariusz Zaborski <oshogbo@FreeBSD.org>2023-02-14 23:17:57 +0000
commitf09f828a41d8eaf6456d2894a97a2a10f8979ea1 (patch)
tree4e09ffa161bfcf325dcade9de2925fc5d3bbcf9f
parentfad31dffb4057cc606fe59a7ba2e09ca9a8a147c (diff)
downloadsrc-f09f828a41d8eaf6456d2894a97a2a10f8979ea1.tar.gz
src-f09f828a41d8eaf6456d2894a97a2a10f8979ea1.zip
ahci: increase timout
For some devices, like Marvell 88SE9230, it takes more time to connect to the device. This patch introduces a special flag that extends the timeout from around 100ms to around 500ms. This change is based on the work of: Peter Eriksson <pen@lysator.liu.se> Approved by: re (cperciva) PR: 243401 Reviewed by: imp Tested by: dch MFC after: 3 days Sponsored by: Equinix Sponsored by: SkunkWerks, GmbH Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D38413 (cherry picked from commit f08ac4cb14c1c0740346a4363f82e1e1367c2bad) (cherry picked from commit 65bab39e140f97cace92a2923e50c6b654b02e22)
-rw-r--r--sys/dev/ahci/ahci.c12
-rw-r--r--sys/dev/ahci/ahci.h4
-rw-r--r--sys/dev/ahci/ahci_pci.c2
3 files changed, 12 insertions, 6 deletions
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index f5227f5e7147..45171a34cfbf 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -2605,10 +2605,14 @@ static int
ahci_sata_connect(struct ahci_channel *ch)
{
u_int32_t status;
- int timeout, found = 0;
+ int timeout, timeoutslot, found = 0;
- /* Wait up to 100ms for "connect well" */
- for (timeout = 0; timeout < 1000 ; timeout++) {
+ /*
+ * Wait for "connect well", up to 100ms by default and
+ * up to 500ms for devices with the SLOWDEV quirk.
+ */
+ timeoutslot = ((ch->quirks & AHCI_Q_SLOWDEV) ? 5000 : 1000);
+ for (timeout = 0; timeout < timeoutslot; timeout++) {
status = ATA_INL(ch->r_mem, AHCI_P_SSTS);
if ((status & ATA_SS_DET_MASK) != ATA_SS_DET_NO_DEVICE)
found = 1;
@@ -2627,7 +2631,7 @@ ahci_sata_connect(struct ahci_channel *ch)
break;
DELAY(100);
}
- if (timeout >= 1000 || !found) {
+ if (timeout >= timeoutslot || !found) {
if (bootverbose) {
device_printf(ch->dev,
"SATA connect timeout time=%dus status=%08x\n",
diff --git a/sys/dev/ahci/ahci.h b/sys/dev/ahci/ahci.h
index 472f9845117d..e28c02d6678e 100644
--- a/sys/dev/ahci/ahci.h
+++ b/sys/dev/ahci/ahci.h
@@ -621,6 +621,7 @@ enum ahci_err_type {
#define AHCI_Q_NOCCS 0x00400000
#define AHCI_Q_NOAUX 0x00800000
#define AHCI_Q_IOMMU_BUSWIDE 0x01000000
+#define AHCI_Q_SLOWDEV 0x02000000
#define AHCI_Q_BIT_STRING \
"\020" \
@@ -648,7 +649,8 @@ enum ahci_err_type {
"\026MRVL_SR_DEL" \
"\027NOCCS" \
"\030NOAUX" \
- "\031IOMMU_BUSWIDE"
+ "\031IOMMU_BUSWIDE" \
+ "\032SLOWDEV"
int ahci_attach(device_t dev);
int ahci_detach(device_t dev);
diff --git a/sys/dev/ahci/ahci_pci.c b/sys/dev/ahci/ahci_pci.c
index 3671efcb8e22..b5cbc044d9f0 100644
--- a/sys/dev/ahci/ahci_pci.c
+++ b/sys/dev/ahci/ahci_pci.c
@@ -292,7 +292,7 @@ static const struct {
{0x92201b4b, 0x00, "Marvell 88SE9220", AHCI_Q_ALTSIG |
AHCI_Q_IOMMU_BUSWIDE},
{0x92301b4b, 0x00, "Marvell 88SE9230", AHCI_Q_ALTSIG |
- AHCI_Q_IOMMU_BUSWIDE},
+ AHCI_Q_IOMMU_BUSWIDE | AHCI_Q_SLOWDEV},
{0x92351b4b, 0x00, "Marvell 88SE9235", 0},
{0x06201103, 0x00, "HighPoint RocketRAID 620", 0},
{0x06201b4b, 0x00, "HighPoint RocketRAID 620", 0},