Commit c8fcc49c authored by Ben Hutchings's avatar Ben Hutchings Committed by Jeff Garzik

sfc: Serialise tenxpress_special_reset() with statistics fetches

On some boards 10Xpress feeds a 156 MHz clock to the Falcon XMAC.  MAC
statistics DMA can fail while this clock is stopped during a PHY reset.

From: Steve Hodgson <shodgson@solarflare.com>
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent ef08af03
...@@ -214,7 +214,10 @@ static int tenxpress_special_reset(struct efx_nic *efx) ...@@ -214,7 +214,10 @@ static int tenxpress_special_reset(struct efx_nic *efx)
{ {
int rc, reg; int rc, reg;
EFX_TRACE(efx, "%s\n", __func__); /* The XGMAC clock is driven from the SFC7101/SFT9001 312MHz clock, so
* a special software reset can glitch the XGMAC sufficiently for stats
* requests to fail. Since we don't ofen special_reset, just lock. */
spin_lock(&efx->stats_lock);
/* Initiate reset */ /* Initiate reset */
reg = mdio_clause45_read(efx, efx->mii.phy_id, reg = mdio_clause45_read(efx, efx->mii.phy_id,
...@@ -223,20 +226,22 @@ static int tenxpress_special_reset(struct efx_nic *efx) ...@@ -223,20 +226,22 @@ static int tenxpress_special_reset(struct efx_nic *efx)
mdio_clause45_write(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD, mdio_clause45_write(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
PMA_PMD_EXT_CTRL_REG, reg); PMA_PMD_EXT_CTRL_REG, reg);
msleep(200); mdelay(200);
/* Wait for the blocks to come out of reset */ /* Wait for the blocks to come out of reset */
rc = mdio_clause45_wait_reset_mmds(efx, rc = mdio_clause45_wait_reset_mmds(efx,
TENXPRESS_REQUIRED_DEVS); TENXPRESS_REQUIRED_DEVS);
if (rc < 0) if (rc < 0)
return rc; goto unlock;
/* Try and reconfigure the device */ /* Try and reconfigure the device */
rc = tenxpress_init(efx); rc = tenxpress_init(efx);
if (rc < 0) if (rc < 0)
return rc; goto unlock;
return 0; unlock:
spin_unlock(&efx->stats_lock);
return rc;
} }
static void tenxpress_set_bad_lp(struct efx_nic *efx, bool bad_lp) static void tenxpress_set_bad_lp(struct efx_nic *efx, bool bad_lp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment