/* Try and bring the Falcon side of the Falcon-Phy XAUI link fails * to come back up. Bash it until it comes back up */ static bool falcon_check_xaui_link_up(struct efx_nic *efx) { int max_tries, tries; tries = EFX_WORKAROUND_5147(efx) ? 5 : 1; max_tries = tries; if ((efx->loopback_mode == LOOPBACK_NETWORK) || (efx->phy_type == PHY_TYPE_NONE) || efx_phy_mode_disabled(efx->phy_mode)) return false; while (tries) { if (falcon_xaui_link_ok(efx)) return true; EFX_LOG(efx, "%s Clobbering XAUI (%d tries left).\n", __func__, tries); falcon_reset_xaui(efx); udelay(200); tries--; } EFX_LOG(efx, "Failed to bring XAUI link back up in %d tries!\n", max_tries); return false; }
static void falcon_check_xaui_link_up(struct efx_nic *efx, int tries) { efx->mac_up = falcon_xaui_link_ok(efx); if ((efx->loopback_mode == LOOPBACK_NETWORK) || efx_phy_mode_disabled(efx->phy_mode)) return; while (!efx->mac_up && tries) { EFX_LOG(efx, "bashing xaui\n"); falcon_reset_xaui(efx); udelay(200); efx->mac_up = falcon_xaui_link_ok(efx); --tries; } }
int falcon_check_xmac(struct efx_nic *efx) { bool xaui_link_ok; int rc; if ((efx->loopback_mode == LOOPBACK_NETWORK) || efx_phy_mode_disabled(efx->phy_mode)) return 0; falcon_mask_status_intr(efx, false); xaui_link_ok = falcon_xaui_link_ok(efx); if (EFX_WORKAROUND_5147(efx) && !xaui_link_ok) falcon_reset_xaui(efx); /* Call the PHY check_hw routine */ rc = efx->phy_op->check_hw(efx); /* Unmask interrupt if everything was (and still is) ok */ if (xaui_link_ok && efx->link_up) falcon_mask_status_intr(efx, true); return rc; }