net: ethernet: Convert phydev advertize and supported from u32 to link mode
There are a few MAC/PHYs combinations which now support > 1Gbps. These may need to make use of link modes with bits > 31. Thus their supported PHY features or advertised features cannot be implemented using the current bitmap in a u32. Convert to using a linkmode bitmap, which can support all the currently devices link modes, and is future proof as more modes are added. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

vanhempi
899a3cbbf7
commit
3c1bcc8614
@@ -857,6 +857,7 @@ static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
|
||||
|
||||
static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
|
||||
struct xgbe_phy_data *phy_data = pdata->phy_data;
|
||||
unsigned int phy_id = phy_data->phydev->phy_id;
|
||||
|
||||
@@ -878,9 +879,15 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
|
||||
phy_write(phy_data->phydev, 0x04, 0x0d01);
|
||||
phy_write(phy_data->phydev, 0x00, 0x9140);
|
||||
|
||||
phy_data->phydev->supported = PHY_10BT_FEATURES |
|
||||
PHY_100BT_FEATURES |
|
||||
PHY_1000BT_FEATURES;
|
||||
linkmode_set_bit_array(phy_10_100_features_array,
|
||||
ARRAY_SIZE(phy_10_100_features_array),
|
||||
supported);
|
||||
linkmode_set_bit_array(phy_gbit_features_array,
|
||||
ARRAY_SIZE(phy_gbit_features_array),
|
||||
supported);
|
||||
|
||||
linkmode_copy(phy_data->phydev->supported, supported);
|
||||
|
||||
phy_support_asym_pause(phy_data->phydev);
|
||||
|
||||
netif_dbg(pdata, drv, pdata->netdev,
|
||||
@@ -891,6 +898,7 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
|
||||
|
||||
static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
|
||||
struct xgbe_phy_data *phy_data = pdata->phy_data;
|
||||
struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
|
||||
unsigned int phy_id = phy_data->phydev->phy_id;
|
||||
@@ -951,9 +959,13 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
|
||||
reg = phy_read(phy_data->phydev, 0x00);
|
||||
phy_write(phy_data->phydev, 0x00, reg & ~0x00800);
|
||||
|
||||
phy_data->phydev->supported = (PHY_10BT_FEATURES |
|
||||
PHY_100BT_FEATURES |
|
||||
PHY_1000BT_FEATURES);
|
||||
linkmode_set_bit_array(phy_10_100_features_array,
|
||||
ARRAY_SIZE(phy_10_100_features_array),
|
||||
supported);
|
||||
linkmode_set_bit_array(phy_gbit_features_array,
|
||||
ARRAY_SIZE(phy_gbit_features_array),
|
||||
supported);
|
||||
linkmode_copy(phy_data->phydev->supported, supported);
|
||||
phy_support_asym_pause(phy_data->phydev);
|
||||
|
||||
netif_dbg(pdata, drv, pdata->netdev,
|
||||
@@ -976,7 +988,6 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
|
||||
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
|
||||
struct xgbe_phy_data *phy_data = pdata->phy_data;
|
||||
struct phy_device *phydev;
|
||||
u32 advertising;
|
||||
int ret;
|
||||
|
||||
/* If we already have a PHY, just return */
|
||||
@@ -1036,9 +1047,8 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
|
||||
|
||||
xgbe_phy_external_phy_quirks(pdata);
|
||||
|
||||
ethtool_convert_link_mode_to_legacy_u32(&advertising,
|
||||
lks->link_modes.advertising);
|
||||
phydev->advertising &= advertising;
|
||||
linkmode_and(phydev->advertising, phydev->advertising,
|
||||
lks->link_modes.advertising);
|
||||
|
||||
phy_start_aneg(phy_data->phydev);
|
||||
|
||||
@@ -1497,7 +1507,7 @@ static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata)
|
||||
if (!phy_data->phydev)
|
||||
return;
|
||||
|
||||
lcl_adv = ethtool_adv_to_lcl_adv_t(phy_data->phydev->advertising);
|
||||
lcl_adv = linkmode_adv_to_lcl_adv_t(phy_data->phydev->advertising);
|
||||
|
||||
if (phy_data->phydev->pause) {
|
||||
XGBE_SET_LP_ADV(lks, Pause);
|
||||
@@ -1815,7 +1825,6 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
struct ethtool_link_ksettings *lks = &pdata->phy.lks;
|
||||
struct xgbe_phy_data *phy_data = pdata->phy_data;
|
||||
u32 advertising;
|
||||
int ret;
|
||||
|
||||
ret = xgbe_phy_find_phy_device(pdata);
|
||||
@@ -1825,12 +1834,10 @@ static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
|
||||
if (!phy_data->phydev)
|
||||
return 0;
|
||||
|
||||
ethtool_convert_link_mode_to_legacy_u32(&advertising,
|
||||
lks->link_modes.advertising);
|
||||
|
||||
phy_data->phydev->autoneg = pdata->phy.autoneg;
|
||||
phy_data->phydev->advertising = phy_data->phydev->supported &
|
||||
advertising;
|
||||
linkmode_and(phy_data->phydev->advertising,
|
||||
phy_data->phydev->supported,
|
||||
lks->link_modes.advertising);
|
||||
|
||||
if (pdata->phy.autoneg != AUTONEG_ENABLE) {
|
||||
phy_data->phydev->speed = pdata->phy.speed;
|
||||
|
Viittaa uudesa ongelmassa
Block a user