diff options
Diffstat (limited to 'drivers/net/sfc/mdio_10g.c')
-rw-r--r-- | drivers/net/sfc/mdio_10g.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/sfc/mdio_10g.c b/drivers/net/sfc/mdio_10g.c index 1574e52f0594..0548fcbbdcd0 100644 --- a/drivers/net/sfc/mdio_10g.c +++ b/drivers/net/sfc/mdio_10g.c | |||
@@ -335,3 +335,27 @@ enum efx_fc_type efx_mdio_get_pause(struct efx_nic *efx) | |||
335 | mii_advertise_flowctrl(efx->wanted_fc), | 335 | mii_advertise_flowctrl(efx->wanted_fc), |
336 | efx_mdio_read(efx, MDIO_MMD_AN, MDIO_AN_LPA)); | 336 | efx_mdio_read(efx, MDIO_MMD_AN, MDIO_AN_LPA)); |
337 | } | 337 | } |
338 | |||
339 | int efx_mdio_test_alive(struct efx_nic *efx) | ||
340 | { | ||
341 | int rc; | ||
342 | int devad = __ffs(efx->mdio.mmds); | ||
343 | u16 physid1, physid2; | ||
344 | |||
345 | mutex_lock(&efx->mac_lock); | ||
346 | |||
347 | physid1 = efx_mdio_read(efx, devad, MDIO_DEVID1); | ||
348 | physid2 = efx_mdio_read(efx, devad, MDIO_DEVID2); | ||
349 | |||
350 | if ((physid1 == 0x0000) || (physid1 == 0xffff) || | ||
351 | (physid2 == 0x0000) || (physid2 == 0xffff)) { | ||
352 | EFX_ERR(efx, "no MDIO PHY present with ID %d\n", | ||
353 | efx->mdio.prtad); | ||
354 | rc = -EINVAL; | ||
355 | } else { | ||
356 | rc = efx_mdio_check_mmds(efx, efx->mdio.mmds, 0); | ||
357 | } | ||
358 | |||
359 | mutex_unlock(&efx->mac_lock); | ||
360 | return rc; | ||
361 | } | ||