sfc: Add support for MMDs numbered >15
Combine DEVS0 and DEVS1 registers into a 32-bit mask instead of reading just DEVS0. 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
f31a45d2f4
commit
27dd2caca4
@@ -121,16 +121,18 @@ int mdio_clause45_wait_reset_mmds(struct efx_nic *efx,
|
|||||||
int mdio_clause45_check_mmds(struct efx_nic *efx,
|
int mdio_clause45_check_mmds(struct efx_nic *efx,
|
||||||
unsigned int mmd_mask, unsigned int fatal_mask)
|
unsigned int mmd_mask, unsigned int fatal_mask)
|
||||||
{
|
{
|
||||||
int devices, mmd = 0;
|
u32 devices;
|
||||||
int probe_mmd;
|
int mmd = 0, probe_mmd;
|
||||||
|
|
||||||
/* Historically we have probed the PHYXS to find out what devices are
|
/* Historically we have probed the PHYXS to find out what devices are
|
||||||
* present,but that doesn't work so well if the PHYXS isn't expected
|
* present,but that doesn't work so well if the PHYXS isn't expected
|
||||||
* to exist, if so just find the first item in the list supplied. */
|
* to exist, if so just find the first item in the list supplied. */
|
||||||
probe_mmd = (mmd_mask & MDIO_MMDREG_DEVS0_PHYXS) ? MDIO_MMD_PHYXS :
|
probe_mmd = (mmd_mask & MDIO_MMDREG_DEVS_PHYXS) ? MDIO_MMD_PHYXS :
|
||||||
__ffs(mmd_mask);
|
__ffs(mmd_mask);
|
||||||
devices = mdio_clause45_read(efx, efx->mii.phy_id,
|
devices = (mdio_clause45_read(efx, efx->mii.phy_id,
|
||||||
probe_mmd, MDIO_MMDREG_DEVS0);
|
probe_mmd, MDIO_MMDREG_DEVS0) |
|
||||||
|
mdio_clause45_read(efx, efx->mii.phy_id,
|
||||||
|
probe_mmd, MDIO_MMDREG_DEVS1) << 16);
|
||||||
|
|
||||||
/* Check all the expected MMDs are present */
|
/* Check all the expected MMDs are present */
|
||||||
if (devices < 0) {
|
if (devices < 0) {
|
||||||
@@ -175,14 +177,14 @@ bool mdio_clause45_links_ok(struct efx_nic *efx, unsigned int mmd_mask)
|
|||||||
else if (efx_phy_mode_disabled(efx->phy_mode))
|
else if (efx_phy_mode_disabled(efx->phy_mode))
|
||||||
return false;
|
return false;
|
||||||
else if (efx->loopback_mode == LOOPBACK_PHYXS)
|
else if (efx->loopback_mode == LOOPBACK_PHYXS)
|
||||||
mmd_mask &= ~(MDIO_MMDREG_DEVS0_PHYXS |
|
mmd_mask &= ~(MDIO_MMDREG_DEVS_PHYXS |
|
||||||
MDIO_MMDREG_DEVS0_PCS |
|
MDIO_MMDREG_DEVS_PCS |
|
||||||
MDIO_MMDREG_DEVS0_PMAPMD);
|
MDIO_MMDREG_DEVS_PMAPMD);
|
||||||
else if (efx->loopback_mode == LOOPBACK_PCS)
|
else if (efx->loopback_mode == LOOPBACK_PCS)
|
||||||
mmd_mask &= ~(MDIO_MMDREG_DEVS0_PCS |
|
mmd_mask &= ~(MDIO_MMDREG_DEVS_PCS |
|
||||||
MDIO_MMDREG_DEVS0_PMAPMD);
|
MDIO_MMDREG_DEVS_PMAPMD);
|
||||||
else if (efx->loopback_mode == LOOPBACK_PMAPMD)
|
else if (efx->loopback_mode == LOOPBACK_PMAPMD)
|
||||||
mmd_mask &= ~MDIO_MMDREG_DEVS0_PMAPMD;
|
mmd_mask &= ~MDIO_MMDREG_DEVS_PMAPMD;
|
||||||
|
|
||||||
while (mmd_mask) {
|
while (mmd_mask) {
|
||||||
if (mmd_mask & 1) {
|
if (mmd_mask & 1) {
|
||||||
|
@@ -73,14 +73,14 @@
|
|||||||
#define MDIO_ID_MODEL(_id32) ((_id32 >> 4) & 0x3f)
|
#define MDIO_ID_MODEL(_id32) ((_id32 >> 4) & 0x3f)
|
||||||
#define MDIO_ID_OUI(_id32) (_id32 >> 10)
|
#define MDIO_ID_OUI(_id32) (_id32 >> 10)
|
||||||
|
|
||||||
/* Bits in MMDREG_DEVS0. Someone thoughtfully layed things out
|
/* Bits in MMDREG_DEVS0/1. Someone thoughtfully layed things out
|
||||||
* so the 'bit present' bit number of an MMD is the number of
|
* so the 'bit present' bit number of an MMD is the number of
|
||||||
* that MMD */
|
* that MMD */
|
||||||
#define DEV_PRESENT_BIT(_b) (1 << _b)
|
#define DEV_PRESENT_BIT(_b) (1 << _b)
|
||||||
|
|
||||||
#define MDIO_MMDREG_DEVS0_PHYXS DEV_PRESENT_BIT(MDIO_MMD_PHYXS)
|
#define MDIO_MMDREG_DEVS_PHYXS DEV_PRESENT_BIT(MDIO_MMD_PHYXS)
|
||||||
#define MDIO_MMDREG_DEVS0_PCS DEV_PRESENT_BIT(MDIO_MMD_PCS)
|
#define MDIO_MMDREG_DEVS_PCS DEV_PRESENT_BIT(MDIO_MMD_PCS)
|
||||||
#define MDIO_MMDREG_DEVS0_PMAPMD DEV_PRESENT_BIT(MDIO_MMD_PMAPMD)
|
#define MDIO_MMDREG_DEVS_PMAPMD DEV_PRESENT_BIT(MDIO_MMD_PMAPMD)
|
||||||
|
|
||||||
/* Bits in MMDREG_STAT2 */
|
/* Bits in MMDREG_STAT2 */
|
||||||
#define MDIO_MMDREG_STAT2_PRESENT_VAL (2)
|
#define MDIO_MMDREG_STAT2_PRESENT_VAL (2)
|
||||||
|
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
/* We expect these MMDs to be in the package */
|
/* We expect these MMDs to be in the package */
|
||||||
/* AN not here as mdio_check_mmds() requires STAT2 support */
|
/* AN not here as mdio_check_mmds() requires STAT2 support */
|
||||||
#define TENXPRESS_REQUIRED_DEVS (MDIO_MMDREG_DEVS0_PMAPMD | \
|
#define TENXPRESS_REQUIRED_DEVS (MDIO_MMDREG_DEVS_PMAPMD | \
|
||||||
MDIO_MMDREG_DEVS0_PCS | \
|
MDIO_MMDREG_DEVS_PCS | \
|
||||||
MDIO_MMDREG_DEVS0_PHYXS)
|
MDIO_MMDREG_DEVS_PHYXS)
|
||||||
|
|
||||||
#define TENXPRESS_LOOPBACKS ((1 << LOOPBACK_PHYXS) | \
|
#define TENXPRESS_LOOPBACKS ((1 << LOOPBACK_PHYXS) | \
|
||||||
(1 << LOOPBACK_PCS) | \
|
(1 << LOOPBACK_PCS) | \
|
||||||
|
@@ -19,9 +19,9 @@
|
|||||||
#include "phy.h"
|
#include "phy.h"
|
||||||
#include "mac.h"
|
#include "mac.h"
|
||||||
|
|
||||||
#define XFP_REQUIRED_DEVS (MDIO_MMDREG_DEVS0_PCS | \
|
#define XFP_REQUIRED_DEVS (MDIO_MMDREG_DEVS_PCS | \
|
||||||
MDIO_MMDREG_DEVS0_PMAPMD | \
|
MDIO_MMDREG_DEVS_PMAPMD | \
|
||||||
MDIO_MMDREG_DEVS0_PHYXS)
|
MDIO_MMDREG_DEVS_PHYXS)
|
||||||
|
|
||||||
#define XFP_LOOPBACKS ((1 << LOOPBACK_PCS) | \
|
#define XFP_LOOPBACKS ((1 << LOOPBACK_PCS) | \
|
||||||
(1 << LOOPBACK_PMAPMD) | \
|
(1 << LOOPBACK_PMAPMD) | \
|
||||||
@@ -64,7 +64,7 @@ static int xfp_reset_phy(struct efx_nic *efx)
|
|||||||
/* Check that all the MMDs we expect are present and responding. We
|
/* Check that all the MMDs we expect are present and responding. We
|
||||||
* expect faults on some if the link is down, but not on the PHY XS */
|
* expect faults on some if the link is down, but not on the PHY XS */
|
||||||
rc = mdio_clause45_check_mmds(efx, XFP_REQUIRED_DEVS,
|
rc = mdio_clause45_check_mmds(efx, XFP_REQUIRED_DEVS,
|
||||||
MDIO_MMDREG_DEVS0_PHYXS);
|
MDIO_MMDREG_DEVS_PHYXS);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user