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

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
Loading
Loading
Loading
Loading
+13 −11
Original line number Original line Diff line number Diff line
@@ -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) {
+4 −4
Original line number Original line Diff line number Diff line
@@ -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)
+3 −3
Original line number Original line Diff line number Diff line
@@ -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) |	\
+4 −4
Original line number Original line Diff line number Diff line
@@ -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;