Commit 27dd2cac authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller

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: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f31a45d2
...@@ -121,16 +121,18 @@ int mdio_clause45_wait_reset_mmds(struct efx_nic *efx, ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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;
......
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