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:
avg 2019-03-22 10:38:22 +00:00
parent f359ad5c3a
commit 75ee4f08d3

View File

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