|
@@ -98,7 +98,7 @@ static void falcon_mask_status_intr(struct efx_nic *efx, bool enable)
|
|
|
|
|
|
/* We can only use this interrupt to signal the negative edge of
|
|
|
* xaui_align [we have to poll the positive edge]. */
|
|
|
- if (!efx->mac_up)
|
|
|
+ if (efx->xmac_poll_required)
|
|
|
return;
|
|
|
|
|
|
/* Flush the ISR */
|
|
@@ -243,29 +243,35 @@ static void falcon_reconfigure_xgxs_core(struct efx_nic *efx)
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* 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 void falcon_check_xaui_link_up(struct efx_nic *efx, int tries)
|
|
|
+/* Try to bring up the Falcon side of the Falcon-Phy XAUI link */
|
|
|
+static bool falcon_check_xaui_link_up(struct efx_nic *efx, int tries)
|
|
|
{
|
|
|
- efx->mac_up = falcon_xaui_link_ok(efx);
|
|
|
+ bool mac_up = falcon_xaui_link_ok(efx);
|
|
|
|
|
|
if ((efx->loopback_mode == LOOPBACK_NETWORK) ||
|
|
|
efx_phy_mode_disabled(efx->phy_mode))
|
|
|
/* XAUI link is expected to be down */
|
|
|
- return;
|
|
|
+ return mac_up;
|
|
|
|
|
|
falcon_stop_nic_stats(efx);
|
|
|
|
|
|
- while (!efx->mac_up && tries) {
|
|
|
+ while (!mac_up && tries) {
|
|
|
EFX_LOG(efx, "bashing xaui\n");
|
|
|
falcon_reset_xaui(efx);
|
|
|
udelay(200);
|
|
|
|
|
|
- efx->mac_up = falcon_xaui_link_ok(efx);
|
|
|
+ mac_up = falcon_xaui_link_ok(efx);
|
|
|
--tries;
|
|
|
}
|
|
|
|
|
|
falcon_start_nic_stats(efx);
|
|
|
+
|
|
|
+ return mac_up;
|
|
|
+}
|
|
|
+
|
|
|
+static bool falcon_xmac_check_fault(struct efx_nic *efx)
|
|
|
+{
|
|
|
+ return !falcon_check_xaui_link_up(efx, 5);
|
|
|
}
|
|
|
|
|
|
static void falcon_reconfigure_xmac(struct efx_nic *efx)
|
|
@@ -277,7 +283,7 @@ static void falcon_reconfigure_xmac(struct efx_nic *efx)
|
|
|
|
|
|
falcon_reconfigure_mac_wrapper(efx);
|
|
|
|
|
|
- falcon_check_xaui_link_up(efx, 5);
|
|
|
+ efx->xmac_poll_required = !falcon_check_xaui_link_up(efx, 5);
|
|
|
falcon_mask_status_intr(efx, true);
|
|
|
}
|
|
|
|
|
@@ -341,35 +347,19 @@ static void falcon_update_stats_xmac(struct efx_nic *efx)
|
|
|
mac_stats->rx_control * 64);
|
|
|
}
|
|
|
|
|
|
-static void falcon_xmac_irq(struct efx_nic *efx)
|
|
|
-{
|
|
|
- /* The XGMII link has a transient fault, which indicates either:
|
|
|
- * - there's a transient xgmii fault
|
|
|
- * - falcon's end of the xaui link may need a kick
|
|
|
- * - the wire-side link may have gone down, but the lasi/poll()
|
|
|
- * hasn't noticed yet.
|
|
|
- *
|
|
|
- * We only want to even bother polling XAUI if we're confident it's
|
|
|
- * not (1) or (3). In both cases, the only reliable way to spot this
|
|
|
- * is to wait a bit. We do this here by forcing the mac link state
|
|
|
- * to down, and waiting for the mac poll to come round and check
|
|
|
- */
|
|
|
- efx->mac_up = false;
|
|
|
-}
|
|
|
-
|
|
|
-static void falcon_poll_xmac(struct efx_nic *efx)
|
|
|
+void falcon_poll_xmac(struct efx_nic *efx)
|
|
|
{
|
|
|
- if (!EFX_WORKAROUND_5147(efx) || !efx->link_state.up || efx->mac_up)
|
|
|
+ if (!EFX_WORKAROUND_5147(efx) || !efx->link_state.up ||
|
|
|
+ !efx->xmac_poll_required)
|
|
|
return;
|
|
|
|
|
|
falcon_mask_status_intr(efx, false);
|
|
|
- falcon_check_xaui_link_up(efx, 1);
|
|
|
+ efx->xmac_poll_required = !falcon_check_xaui_link_up(efx, 1);
|
|
|
falcon_mask_status_intr(efx, true);
|
|
|
}
|
|
|
|
|
|
struct efx_mac_operations falcon_xmac_operations = {
|
|
|
.reconfigure = falcon_reconfigure_xmac,
|
|
|
.update_stats = falcon_update_stats_xmac,
|
|
|
- .irq = falcon_xmac_irq,
|
|
|
- .poll = falcon_poll_xmac,
|
|
|
+ .check_fault = falcon_xmac_check_fault,
|
|
|
};
|