sfc: Simplify XMAC link polling
From: Steve Hodgson <shodgson@solarflare.com> Only the XMAC on Falcon needs help from the driver to poll and reset the MAC-PHY link (XAUI); GMII is a simple parallel bus and on later NICs firmware takes care of the XAUI link. Also, an XMAC interrupt currently schedules a work item which simply clears a flag (efx_nic::mac_up) to be checked by the regular monitor (or the next link reconfiguration, if that is sooner). Rename the flag to xmac_poll_required, changing its sense. Remove the needless indirection and just set the flag immediately. Call falcon_xmac_poll() directly where required. Add a new generic operation mac_op::check_fault to check the link outside of regular monitoring, as required during self-tests. (Note that this leaves us with an unused work item, but we will immediately have another use for it.) Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
fe75820b99
commit
9007b9fa36
@@ -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)
|
||||
void falcon_poll_xmac(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)
|
||||
{
|
||||
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,
|
||||
};
|
||||
|
Reference in New Issue
Block a user