Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Feb 2023 23:44:52 GMT
From:      Mariusz Zaborski <oshogbo@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 65bab39e140f - stable/13 - ahci: increase timout
Message-ID:  <202302132344.31DNiqEU086304@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by oshogbo:

URL: https://cgit.FreeBSD.org/src/commit/?id=65bab39e140f97cace92a2923e50c6b654b02e22

commit 65bab39e140f97cace92a2923e50c6b654b02e22
Author:     Mariusz Zaborski <oshogbo@FreeBSD.org>
AuthorDate: 2023-02-10 15:56:04 +0000
Commit:     Mariusz Zaborski <oshogbo@FreeBSD.org>
CommitDate: 2023-02-13 23:45:01 +0000

    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>
    
    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)
---
 sys/dev/ahci/ahci.c     | 12 ++++++++----
 sys/dev/ahci/ahci.h     |  4 +++-
 sys/dev/ahci/ahci_pci.c |  2 +-
 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},



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202302132344.31DNiqEU086304>