|
@@ -131,9 +131,11 @@
|
|
|
#define SMBHSTSTS_INTR 0x02
|
|
|
#define SMBHSTSTS_HOST_BUSY 0x01
|
|
|
|
|
|
-#define STATUS_FLAGS (SMBHSTSTS_BYTE_DONE | SMBHSTSTS_FAILED | \
|
|
|
- SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \
|
|
|
- SMBHSTSTS_INTR)
|
|
|
+#define STATUS_ERROR_FLAGS (SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \
|
|
|
+ SMBHSTSTS_DEV_ERR)
|
|
|
+
|
|
|
+#define STATUS_FLAGS (SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR | \
|
|
|
+ STATUS_ERROR_FLAGS)
|
|
|
|
|
|
/* Older devices have their ID defined in <linux/pci_ids.h> */
|
|
|
#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22
|
|
@@ -384,7 +386,7 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
|
|
|
do {
|
|
|
usleep_range(250, 500);
|
|
|
status = inb_p(SMBHSTSTS(priv));
|
|
|
- } while ((!(status & SMBHSTSTS_BYTE_DONE))
|
|
|
+ } while (!(status & (SMBHSTSTS_BYTE_DONE | STATUS_ERROR_FLAGS))
|
|
|
&& (timeout++ < MAX_RETRIES));
|
|
|
|
|
|
result = i801_check_post(priv, status, timeout > MAX_RETRIES);
|