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:
parent
0a402ad2e6
commit
346483b1f1
@ -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",
|
||||
|
@ -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);
|
||||
|
@ -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},
|
||||
|
Loading…
Reference in New Issue
Block a user