static int efx_check_lm87(struct efx_nic *efx, unsigned mask) { struct i2c_client *client = falcon_board(efx)->hwmon_client; s32 alarms1, alarms2; /* If link is up then do not monitor temperature */ if (EFX_WORKAROUND_7884(efx) && efx->link_state.up) return 0; alarms1 = i2c_smbus_read_byte_data(client, LM87_REG_ALARMS1); alarms2 = i2c_smbus_read_byte_data(client, LM87_REG_ALARMS2); if (alarms1 < 0) return alarms1; if (alarms2 < 0) return alarms2; alarms1 &= mask; alarms2 &= mask >> 8; if (alarms1 || alarms2) { EFX_ERR(efx, "LM87 detected a hardware failure (status %02x:%02x)" "%s%s\n", alarms1, alarms2, (alarms1 & LM87_ALARM_TEMP_INT) ? " INTERNAL" : "", (alarms1 & LM87_ALARM_TEMP_EXT1) ? " EXTERNAL" : ""); return -ERANGE; } return 0; }
static int sfe4001_check_hw(struct efx_nic *efx) { s32 status; /* If XAUI link is up then do not monitor */ if (EFX_WORKAROUND_7884(efx) && !efx->xmac_poll_required) return 0; /* Check the powered status of the PHY. Lack of power implies that * the MAX6647 has shut down power to it, probably due to a temp. * alarm. Reading the power status rather than the MAX6647 status * directly because the later is read-to-clear and would thus * start to power up the PHY again when polled, causing us to blip * the power undesirably. * We know we can read from the IO expander because we did * it during power-on. Assume failure now is bad news. */ status = i2c_smbus_read_byte_data(falcon_board(efx)->ioexp_client, P1_IN); if (status >= 0 && (status & ((1 << P1_AFE_PWD_LBN) | (1 << P1_DSP_PWD25_LBN))) != 0) return 0; /* Use board power control, not PHY power control */ sfe4001_poweroff(efx); efx->phy_mode = PHY_MODE_OFF; return (status < 0) ? -EIO : -ERANGE; }
static int efx_check_lm87(struct efx_nic *efx, unsigned mask) { struct i2c_client *client = falcon_board(efx)->hwmon_client; s32 alarms1, alarms2; /* If link is up then do not monitor temperature */ if (EFX_WORKAROUND_7884(efx) && efx->link_state.up) return 0; alarms1 = i2c_smbus_read_byte_data(client, LM87_REG_ALARMS1); alarms2 = i2c_smbus_read_byte_data(client, LM87_REG_ALARMS2); if (alarms1 < 0) return alarms1; if (alarms2 < 0) return alarms2; alarms1 &= mask; alarms2 &= mask >> 8; if (alarms1 || alarms2) { netif_err(efx, hw, efx->net_dev, "LM87 detected a hardware failure (status %02x:%02x)" "%s%s%s\n", alarms1, alarms2, (alarms1 & LM87_ALARM_TEMP_INT) ? "; board is overheating" : "", (alarms1 & LM87_ALARM_TEMP_EXT1) ? "; controller is overheating" : "", (alarms1 & ~(LM87_ALARM_TEMP_INT | LM87_ALARM_TEMP_EXT1) || alarms2) ? "; electrical fault" : ""); return -ERANGE; } return 0; }
static int sfn4111t_check_hw(struct efx_nic *efx) { s32 status; /* If XAUI link is up then do not monitor */ if (EFX_WORKAROUND_7884(efx) && !efx->xmac_poll_required) return 0; /* Test LHIGH, RHIGH, FAULT, EOT and IOT alarms */ status = i2c_smbus_read_byte_data(falcon_board(efx)->hwmon_client, MAX664X_REG_RSL); if (status < 0) return -EIO; if (status & 0x57) return -ERANGE; return 0; }