Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d2681f5 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'net-phy-convert-advertise-and-supported-to-linkmode'



Andrew Lunn says:

====================
net: phy: convert advertise and supported to linkmode

This is the last part in converting phylib to make use of a linux
bitmap, not a u32, to represent links modes. This will allow support
for PHYs > 1Gbps, which need to use link modes represented by a bit >
32.

A number of MAC and PHY drivers need changes to support this. However
the previous two patchesets reduced the number somewhat, the helpers
which were introduced have been modified instead of the actual
drivers.

The follow on patches then make use of the extra bits, adding support
for more link modes.

Given how invasive this change is, i expect the build is broken for
some architectures i did not test. I will fixup the breakage as fast
as i can.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 899a3cbb cb6402fe
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -658,7 +658,8 @@ static void mt7530_adjust_link(struct dsa_switch *ds, int port,
			if (phydev->asym_pause)
				rmt_adv |= LPA_PAUSE_ASYM;

			lcl_adv = ethtool_adv_to_lcl_adv_t(phydev->advertising);
			lcl_adv = linkmode_adv_to_lcl_adv_t(
				phydev->advertising);
			flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);

			if (flowctrl & FLOW_CTRL_TX)
+1 −1
Original line number Diff line number Diff line
@@ -1283,7 +1283,7 @@ static int greth_mdio_probe(struct net_device *dev)
	else
		phy_set_max_speed(phy, SPEED_100);

	phy->advertising = phy->supported;
	linkmode_copy(phy->advertising, phy->supported);

	greth->link = 0;
	greth->speed = 0;
+24 −17
Original line number Diff line number Diff line
@@ -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,
	linkmode_and(phydev->advertising, phydev->advertising,
		     lks->link_modes.advertising);
	phydev->advertising &= 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;
+12 −10
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ void xge_mdio_remove(struct net_device *ndev)

int xge_mdio_config(struct net_device *ndev)
{
	__ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, };
	struct xge_pdata *pdata = netdev_priv(ndev);
	struct device *dev = &pdata->pdev->dev;
	struct mii_bus *mdio_bus;
@@ -148,16 +149,17 @@ int xge_mdio_config(struct net_device *ndev)
		goto err;
	}

	phydev->supported &= ~(SUPPORTED_10baseT_Half |
			       SUPPORTED_10baseT_Full |
			       SUPPORTED_100baseT_Half |
			       SUPPORTED_100baseT_Full |
			       SUPPORTED_1000baseT_Half |
			       SUPPORTED_AUI |
			       SUPPORTED_MII |
			       SUPPORTED_FIBRE |
			       SUPPORTED_BNC);
	phydev->advertising = phydev->supported;
	linkmode_set_bit_array(phy_10_100_features_array,
			       ARRAY_SIZE(phy_10_100_features_array),
			       mask);
	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, mask);
	linkmode_set_bit(ETHTOOL_LINK_MODE_AUI_BIT, mask);
	linkmode_set_bit(ETHTOOL_LINK_MODE_MII_BIT, mask);
	linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, mask);
	linkmode_set_bit(ETHTOOL_LINK_MODE_BNC_BIT, mask);

	linkmode_andnot(phydev->supported, phydev->supported, mask);
	linkmode_copy(phydev->advertising, phydev->supported);
	pdata->phy_speed = SPEED_UNKNOWN;

	return 0;
+2 −1
Original line number Diff line number Diff line
@@ -432,7 +432,8 @@ static int arc_emac_open(struct net_device *ndev)
	phy_dev->autoneg = AUTONEG_ENABLE;
	phy_dev->speed = 0;
	phy_dev->duplex = 0;
	phy_dev->advertising &= phy_dev->supported;
	linkmode_and(phy_dev->advertising, phy_dev->advertising,
		     phy_dev->supported);

	priv->last_rx_bd = 0;

Loading