amd-xgbe: Convert to using the new link mode settings
Convert from using the old u32 supported, advertising, etc. link settings to the new link mode settings that support bit positions / settings greater than 32 bits. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Tento commit je obsažen v:

odevzdal
David S. Miller

rodič
606c07f308
revize
85f9feb64b
@@ -231,20 +231,21 @@ static void xgbe_phy_kr_training_post(struct xgbe_prv_data *pdata)
|
||||
|
||||
static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
|
||||
struct xgbe_phy_data *phy_data = pdata->phy_data;
|
||||
enum xgbe_mode mode;
|
||||
unsigned int ad_reg, lp_reg;
|
||||
|
||||
pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
|
||||
pdata->phy.lp_advertising |= ADVERTISED_Backplane;
|
||||
XGBE_SET_LP_ADV(lks, Autoneg);
|
||||
XGBE_SET_LP_ADV(lks, Backplane);
|
||||
|
||||
/* Compare Advertisement and Link Partner register 1 */
|
||||
ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
|
||||
lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
|
||||
if (lp_reg & 0x400)
|
||||
pdata->phy.lp_advertising |= ADVERTISED_Pause;
|
||||
XGBE_SET_LP_ADV(lks, Pause);
|
||||
if (lp_reg & 0x800)
|
||||
pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
|
||||
XGBE_SET_LP_ADV(lks, Asym_Pause);
|
||||
|
||||
if (pdata->phy.pause_autoneg) {
|
||||
/* Set flow control based on auto-negotiation result */
|
||||
@@ -266,12 +267,12 @@ static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
|
||||
ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
|
||||
lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
|
||||
if (lp_reg & 0x80)
|
||||
pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
|
||||
XGBE_SET_LP_ADV(lks, 10000baseKR_Full);
|
||||
if (lp_reg & 0x20) {
|
||||
if (phy_data->speed_set == XGBE_SPEEDSET_2500_10000)
|
||||
pdata->phy.lp_advertising |= ADVERTISED_2500baseX_Full;
|
||||
XGBE_SET_LP_ADV(lks, 2500baseX_Full);
|
||||
else
|
||||
pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
|
||||
XGBE_SET_LP_ADV(lks, 1000baseKX_Full);
|
||||
}
|
||||
|
||||
ad_reg &= lp_reg;
|
||||
@@ -290,14 +291,17 @@ static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
|
||||
ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
|
||||
lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
|
||||
if (lp_reg & 0xc000)
|
||||
pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
|
||||
XGBE_SET_LP_ADV(lks, 10000baseR_FEC);
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static unsigned int xgbe_phy_an_advertising(struct xgbe_prv_data *pdata)
|
||||
static void xgbe_phy_an_advertising(struct xgbe_prv_data *pdata,
|
||||
struct ethtool_link_ksettings *dlks)
|
||||
{
|
||||
return pdata->phy.advertising;
|
||||
struct ethtool_link_ksettings *slks = &pdata->phy.lks;
|
||||
|
||||
XGBE_LM_COPY(dlks, advertising, slks, advertising);
|
||||
}
|
||||
|
||||
static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
|
||||
@@ -565,11 +569,10 @@ static void xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
|
||||
}
|
||||
|
||||
static bool xgbe_phy_check_mode(struct xgbe_prv_data *pdata,
|
||||
enum xgbe_mode mode, u32 advert)
|
||||
enum xgbe_mode mode, bool advert)
|
||||
{
|
||||
if (pdata->phy.autoneg == AUTONEG_ENABLE) {
|
||||
if (pdata->phy.advertising & advert)
|
||||
return true;
|
||||
return advert;
|
||||
} else {
|
||||
enum xgbe_mode cur_mode;
|
||||
|
||||
@@ -583,16 +586,18 @@ static bool xgbe_phy_check_mode(struct xgbe_prv_data *pdata,
|
||||
|
||||
static bool xgbe_phy_use_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
|
||||
{
|
||||
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
|
||||
|
||||
switch (mode) {
|
||||
case XGBE_MODE_KX_1000:
|
||||
return xgbe_phy_check_mode(pdata, mode,
|
||||
ADVERTISED_1000baseKX_Full);
|
||||
XGBE_ADV(lks, 1000baseKX_Full));
|
||||
case XGBE_MODE_KX_2500:
|
||||
return xgbe_phy_check_mode(pdata, mode,
|
||||
ADVERTISED_2500baseX_Full);
|
||||
XGBE_ADV(lks, 2500baseX_Full));
|
||||
case XGBE_MODE_KR:
|
||||
return xgbe_phy_check_mode(pdata, mode,
|
||||
ADVERTISED_10000baseKR_Full);
|
||||
XGBE_ADV(lks, 10000baseKR_Full));
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -672,6 +677,7 @@ static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
|
||||
|
||||
static int xgbe_phy_init(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
|
||||
struct xgbe_phy_data *phy_data;
|
||||
int ret;
|
||||
|
||||
@@ -790,21 +796,23 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata)
|
||||
}
|
||||
|
||||
/* Initialize supported features */
|
||||
pdata->phy.supported = SUPPORTED_Autoneg;
|
||||
pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
|
||||
pdata->phy.supported |= SUPPORTED_Backplane;
|
||||
pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
|
||||
XGBE_ZERO_SUP(lks);
|
||||
XGBE_SET_SUP(lks, Autoneg);
|
||||
XGBE_SET_SUP(lks, Pause);
|
||||
XGBE_SET_SUP(lks, Asym_Pause);
|
||||
XGBE_SET_SUP(lks, Backplane);
|
||||
XGBE_SET_SUP(lks, 10000baseKR_Full);
|
||||
switch (phy_data->speed_set) {
|
||||
case XGBE_SPEEDSET_1000_10000:
|
||||
pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
|
||||
XGBE_SET_SUP(lks, 1000baseKX_Full);
|
||||
break;
|
||||
case XGBE_SPEEDSET_2500_10000:
|
||||
pdata->phy.supported |= SUPPORTED_2500baseX_Full;
|
||||
XGBE_SET_SUP(lks, 2500baseX_Full);
|
||||
break;
|
||||
}
|
||||
|
||||
if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
|
||||
pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
|
||||
XGBE_SET_SUP(lks, 10000baseR_FEC);
|
||||
|
||||
pdata->phy_data = phy_data;
|
||||
|
||||
|
Odkázat v novém úkolu
Zablokovat Uživatele