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
This commit is contained in:
Mariusz Zaborski 2023-02-10 16:56:04 +01:00
parent 0a402ad2e6
commit 346483b1f1
3 changed files with 12 additions and 6 deletions

View File

@ -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",

View File

@ -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);

View File

@ -293,7 +293,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},