diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2009-11-25 11:12:01 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-26 18:59:43 -0500 |
commit | 9007b9fa368b172e6b9a985899080fbebb7d3204 (patch) | |
tree | 3d725a55e193fe9763fcd514a6b4246eae8da957 /drivers/net/sfc/falcon.c | |
parent | fe75820b99ff2de713de23252432f0f9d0ca1d35 (diff) |
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>
Diffstat (limited to 'drivers/net/sfc/falcon.c')
-rw-r--r-- | drivers/net/sfc/falcon.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index c43c5e6f077b..fac534a274c8 100644 --- a/drivers/net/sfc/falcon.c +++ b/drivers/net/sfc/falcon.c | |||
@@ -900,7 +900,7 @@ static void falcon_handle_global_event(struct efx_channel *channel, | |||
900 | 900 | ||
901 | if ((falcon_rev(efx) >= FALCON_REV_B0) && | 901 | if ((falcon_rev(efx) >= FALCON_REV_B0) && |
902 | EFX_QWORD_FIELD(*event, FSF_BB_GLB_EV_XG_MGT_INTR)) { | 902 | EFX_QWORD_FIELD(*event, FSF_BB_GLB_EV_XG_MGT_INTR)) { |
903 | queue_work(efx->workqueue, &efx->mac_work); | 903 | efx->xmac_poll_required = true; |
904 | handled = true; | 904 | handled = true; |
905 | } | 905 | } |
906 | 906 | ||
@@ -2251,7 +2251,7 @@ int falcon_switch_mac(struct efx_nic *efx) | |||
2251 | 2251 | ||
2252 | EFX_LOG(efx, "selected %cMAC\n", EFX_IS10G(efx) ? 'X' : 'G'); | 2252 | EFX_LOG(efx, "selected %cMAC\n", EFX_IS10G(efx) ? 'X' : 'G'); |
2253 | /* Not all macs support a mac-level link state */ | 2253 | /* Not all macs support a mac-level link state */ |
2254 | efx->mac_up = true; | 2254 | efx->xmac_poll_required = false; |
2255 | 2255 | ||
2256 | rc = falcon_reset_macs(efx); | 2256 | rc = falcon_reset_macs(efx); |
2257 | out: | 2257 | out: |
@@ -2624,7 +2624,8 @@ void falcon_monitor(struct efx_nic *efx) | |||
2624 | falcon_sim_phy_event(efx); | 2624 | falcon_sim_phy_event(efx); |
2625 | } | 2625 | } |
2626 | efx->phy_op->poll(efx); | 2626 | efx->phy_op->poll(efx); |
2627 | efx->mac_op->poll(efx); | 2627 | if (EFX_IS10G(efx)) |
2628 | falcon_poll_xmac(efx); | ||
2628 | } | 2629 | } |
2629 | 2630 | ||
2630 | /* Zeroes out the SRAM contents. This routine must be called in | 2631 | /* Zeroes out the SRAM contents. This routine must be called in |