Skip to content

Commit

Permalink
sfc: SFT9001: Fix speed reporting in 1G PHY loopback
Browse files Browse the repository at this point in the history
Instead of disabling AN in loopback, just prevent restarting AN and
override the speed in sft9001_get_settings().

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Steve Hodgson authored and David S. Miller committed Jan 30, 2009
1 parent 2d18835 commit 8b9dc8d
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 18 deletions.
4 changes: 4 additions & 0 deletions drivers/net/sfc/mdio_10g.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "net_driver.h"
#include "mdio_10g.h"
#include "boards.h"
#include "workarounds.h"

int mdio_clause45_reset_mmd(struct efx_nic *port, int mmd,
int spins, int spintime)
Expand Down Expand Up @@ -517,6 +518,9 @@ int mdio_clause45_set_settings(struct efx_nic *efx,
reg |= BMCR_ANENABLE | BMCR_ANRESTART;
else
reg &= ~BMCR_ANENABLE;
if (EFX_WORKAROUND_15195(efx)
&& LOOPBACK_MASK(efx) & efx->phy_op->loopbacks)
reg &= ~BMCR_ANRESTART;
if (xnp)
reg |= 1 << MDIO_AN_CTRL_XNP_LBN;
else
Expand Down
27 changes: 9 additions & 18 deletions drivers/net/sfc/tenxpress.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ static void tenxpress_phy_reconfigure(struct efx_nic *efx)
{
struct tenxpress_phy_data *phy_data = efx->phy_data;
struct ethtool_cmd ecmd;
bool phy_mode_change, loop_reset, loop_toggle, loopback;
bool phy_mode_change, loop_reset;

if (efx->phy_mode & (PHY_MODE_OFF | PHY_MODE_SPECIAL)) {
phy_data->phy_mode = efx->phy_mode;
Expand All @@ -522,12 +522,10 @@ static void tenxpress_phy_reconfigure(struct efx_nic *efx)

phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL &&
phy_data->phy_mode != PHY_MODE_NORMAL);
loopback = LOOPBACK_MASK(efx) & efx->phy_op->loopbacks;
loop_toggle = LOOPBACK_CHANGED(phy_data, efx, efx->phy_op->loopbacks);
loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, efx->phy_op->loopbacks) ||
LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY));

if (loop_reset || loop_toggle || loopback || phy_mode_change) {
if (loop_reset || phy_mode_change) {
int rc;

efx->phy_op->get_settings(efx, &ecmd);
Expand All @@ -542,20 +540,6 @@ static void tenxpress_phy_reconfigure(struct efx_nic *efx)
falcon_reset_xaui(efx);
}

if (efx->phy_type != PHY_TYPE_SFX7101) {
/* Only change autoneg once, on coming out or
* going into loopback */
if (loop_toggle)
ecmd.autoneg = !loopback;
if (loopback) {
ecmd.duplex = DUPLEX_FULL;
if (efx->loopback_mode == LOOPBACK_GPHY)
ecmd.speed = SPEED_1000;
else
ecmd.speed = SPEED_10000;
}
}

rc = efx->phy_op->set_settings(efx, &ecmd);
WARN_ON(rc);
}
Expand Down Expand Up @@ -813,6 +797,13 @@ static void sft9001_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
ecmd->duplex = (reg & (1 << GPHY_DUPLEX_LBN) ?
DUPLEX_FULL : DUPLEX_HALF);
}

/* In loopback, the PHY automatically brings up the correct interface,
* but doesn't advertise the correct speed. So override it */
if (efx->loopback_mode == LOOPBACK_GPHY)
ecmd->speed = SPEED_1000;
else if (LOOPBACK_MASK(efx) & SFT9001_LOOPBACKS)
ecmd->speed = SPEED_10000;
}

static int sft9001_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/sfc/workarounds.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#define EFX_WORKAROUND_FALCON_A(efx) (falcon_rev(efx) <= FALCON_REV_A1)
#define EFX_WORKAROUND_10G(efx) EFX_IS10G(efx)
#define EFX_WORKAROUND_SFT9001A(efx) ((efx)->phy_type == PHY_TYPE_SFT9001A)
#define EFX_WORKAROUND_SFT9001(efx) ((efx)->phy_type == PHY_TYPE_SFT9001A || \
(efx)->phy_type == PHY_TYPE_SFT9001B)

/* XAUI resets if link not detected */
#define EFX_WORKAROUND_5147 EFX_WORKAROUND_ALWAYS
Expand Down Expand Up @@ -56,4 +58,7 @@
/* Need to keep AN enabled */
#define EFX_WORKAROUND_13963 EFX_WORKAROUND_SFT9001A

/* Don't restart AN in near-side loopback */
#define EFX_WORKAROUND_15195 EFX_WORKAROUND_SFT9001

#endif /* EFX_WORKAROUNDS_H */

0 comments on commit 8b9dc8d

Please sign in to comment.