intpm: change translation of HBA error status to smbus(4) errors
PIIX4_SMBHSTSTAT_ERR can be set for several reasons that, unfortunately, cannot be distinguished, but the most typical case is a missing or hung slave (SMB_ENOACK). PIIX4_SMBHSTSTAT_FAIL means failed or killed / aborted transaction, so it's previous mapping to SMB_ENOACK was not ideal. After this change an smb(4) access to a missing slave results in ENXIO rather than EIO. To me, that seems to be more appropriate. MFC after: 3 weeks
This commit is contained in:
parent
f359ad5c3a
commit
75ee4f08d3
@ -525,12 +525,19 @@ intsmb_error(device_t dev, int status)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
/*
|
||||
* PIIX4_SMBHSTSTAT_ERR can mean either of
|
||||
* - SMB_ENOACK ("Unclaimed cycle"),
|
||||
* - SMB_ETIMEOUT ("Host device time-out"),
|
||||
* - SMB_EINVAL ("Illegal command field").
|
||||
* SMB_ENOACK seems to be most typical.
|
||||
*/
|
||||
if (status & PIIX4_SMBHSTSTAT_ERR)
|
||||
error |= SMB_EBUSERR;
|
||||
error |= SMB_ENOACK;
|
||||
if (status & PIIX4_SMBHSTSTAT_BUSC)
|
||||
error |= SMB_ECOLLI;
|
||||
if (status & PIIX4_SMBHSTSTAT_FAIL)
|
||||
error |= SMB_ENOACK;
|
||||
error |= SMB_EABORT;
|
||||
|
||||
if (error != 0 && bootverbose)
|
||||
device_printf(dev, "error = %d, status = %#x\n", error, status);
|
||||
|
Loading…
Reference in New Issue
Block a user