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

Commit 814a1784 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'sfp-phylink-fixes'



Russell King says:

====================
More SFP/phylink fixes

This series fixes a few more bits with sfp/phylink, particularly
confusion with the right way to test for the RTNL mutex being
held, a change in 2016 to the mdiobus_scan() behaviour that wasn't
noticed, and a fix for reading module EEPROMs.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 75e8e156 8b874514
Loading
Loading
Loading
Loading
+17 −17
Original line number Original line Diff line number Diff line
@@ -807,7 +807,7 @@ void phylink_disconnect_phy(struct phylink *pl)
{
{
	struct phy_device *phy;
	struct phy_device *phy;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	phy = pl->phydev;
	phy = pl->phydev;
	if (phy) {
	if (phy) {
@@ -877,7 +877,7 @@ EXPORT_SYMBOL_GPL(phylink_mac_change);
 */
 */
void phylink_start(struct phylink *pl)
void phylink_start(struct phylink *pl)
{
{
	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	netdev_info(pl->netdev, "configuring for %s/%s link mode\n",
	netdev_info(pl->netdev, "configuring for %s/%s link mode\n",
		    phylink_an_mode_str(pl->link_an_mode),
		    phylink_an_mode_str(pl->link_an_mode),
@@ -917,7 +917,7 @@ EXPORT_SYMBOL_GPL(phylink_start);
 */
 */
void phylink_stop(struct phylink *pl)
void phylink_stop(struct phylink *pl)
{
{
	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev)
	if (pl->phydev)
		phy_stop(pl->phydev);
		phy_stop(pl->phydev);
@@ -941,7 +941,7 @@ EXPORT_SYMBOL_GPL(phylink_stop);
 */
 */
void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
{
{
	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	wol->supported = 0;
	wol->supported = 0;
	wol->wolopts = 0;
	wol->wolopts = 0;
@@ -966,7 +966,7 @@ int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
{
{
	int ret = -EOPNOTSUPP;
	int ret = -EOPNOTSUPP;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev)
	if (pl->phydev)
		ret = phy_ethtool_set_wol(pl->phydev, wol);
		ret = phy_ethtool_set_wol(pl->phydev, wol);
@@ -1011,7 +1011,7 @@ int phylink_ethtool_ksettings_get(struct phylink *pl,
{
{
	struct phylink_link_state link_state;
	struct phylink_link_state link_state;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev) {
	if (pl->phydev) {
		phy_ethtool_ksettings_get(pl->phydev, kset);
		phy_ethtool_ksettings_get(pl->phydev, kset);
@@ -1064,7 +1064,7 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
	struct phylink_link_state config;
	struct phylink_link_state config;
	int ret;
	int ret;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (kset->base.autoneg != AUTONEG_DISABLE &&
	if (kset->base.autoneg != AUTONEG_DISABLE &&
	    kset->base.autoneg != AUTONEG_ENABLE)
	    kset->base.autoneg != AUTONEG_ENABLE)
@@ -1165,7 +1165,7 @@ int phylink_ethtool_nway_reset(struct phylink *pl)
{
{
	int ret = 0;
	int ret = 0;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev)
	if (pl->phydev)
		ret = phy_restart_aneg(pl->phydev);
		ret = phy_restart_aneg(pl->phydev);
@@ -1183,7 +1183,7 @@ EXPORT_SYMBOL_GPL(phylink_ethtool_nway_reset);
void phylink_ethtool_get_pauseparam(struct phylink *pl,
void phylink_ethtool_get_pauseparam(struct phylink *pl,
				    struct ethtool_pauseparam *pause)
				    struct ethtool_pauseparam *pause)
{
{
	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN);
	pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN);
	pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX);
	pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX);
@@ -1201,7 +1201,7 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,
{
{
	struct phylink_link_state *config = &pl->link_config;
	struct phylink_link_state *config = &pl->link_config;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (!phylink_test(pl->supported, Pause) &&
	if (!phylink_test(pl->supported, Pause) &&
	    !phylink_test(pl->supported, Asym_Pause))
	    !phylink_test(pl->supported, Asym_Pause))
@@ -1287,7 +1287,7 @@ int phylink_get_eee_err(struct phylink *pl)
{
{
	int ret = 0;
	int ret = 0;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev)
	if (pl->phydev)
		ret = phy_get_eee_err(pl->phydev);
		ret = phy_get_eee_err(pl->phydev);
@@ -1305,7 +1305,7 @@ int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee)
{
{
	int ret = -EOPNOTSUPP;
	int ret = -EOPNOTSUPP;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev)
	if (pl->phydev)
		ret = phy_ethtool_get_eee(pl->phydev, eee);
		ret = phy_ethtool_get_eee(pl->phydev, eee);
@@ -1323,7 +1323,7 @@ int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee)
{
{
	int ret = -EOPNOTSUPP;
	int ret = -EOPNOTSUPP;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev)
	if (pl->phydev)
		ret = phy_ethtool_set_eee(pl->phydev, eee);
		ret = phy_ethtool_set_eee(pl->phydev, eee);
@@ -1513,7 +1513,7 @@ int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd)
	struct mii_ioctl_data *mii = if_mii(ifr);
	struct mii_ioctl_data *mii = if_mii(ifr);
	int  ret;
	int  ret;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	if (pl->phydev) {
	if (pl->phydev) {
		/* PHYs only exist for MLO_AN_PHY and SGMII */
		/* PHYs only exist for MLO_AN_PHY and SGMII */
@@ -1581,7 +1581,7 @@ static int phylink_sfp_module_insert(void *upstream,
	port = sfp_parse_port(pl->sfp_bus, id, support);
	port = sfp_parse_port(pl->sfp_bus, id, support);
	iface = sfp_parse_interface(pl->sfp_bus, id);
	iface = sfp_parse_interface(pl->sfp_bus, id);


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	switch (iface) {
	switch (iface) {
	case PHY_INTERFACE_MODE_SGMII:
	case PHY_INTERFACE_MODE_SGMII:
@@ -1650,7 +1650,7 @@ static void phylink_sfp_link_down(void *upstream)
{
{
	struct phylink *pl = upstream;
	struct phylink *pl = upstream;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	set_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state);
	set_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state);
	flush_work(&pl->resolve);
	flush_work(&pl->resolve);
@@ -1662,7 +1662,7 @@ static void phylink_sfp_link_up(void *upstream)
{
{
	struct phylink *pl = upstream;
	struct phylink *pl = upstream;


	WARN_ON(!lockdep_rtnl_is_held());
	ASSERT_RTNL();


	clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state);
	clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state);
	phylink_run_resolve(pl);
	phylink_run_resolve(pl);
+7 −8
Original line number Original line Diff line number Diff line
@@ -356,12 +356,12 @@ static void sfp_sm_probe_phy(struct sfp *sfp)
	msleep(T_PHY_RESET_MS);
	msleep(T_PHY_RESET_MS);


	phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR);
	phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR);
	if (IS_ERR(phy)) {
	if (phy == ERR_PTR(-ENODEV)) {
		dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy));
		dev_info(sfp->dev, "no PHY detected\n");
		return;
		return;
	}
	}
	if (!phy) {
	if (IS_ERR(phy)) {
		dev_info(sfp->dev, "no PHY detected\n");
		dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy));
		return;
		return;
	}
	}


@@ -724,20 +724,19 @@ static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee,
		len = min_t(unsigned int, last, ETH_MODULE_SFF_8079_LEN);
		len = min_t(unsigned int, last, ETH_MODULE_SFF_8079_LEN);
		len -= first;
		len -= first;


		ret = sfp->read(sfp, false, first, data, len);
		ret = sfp_read(sfp, false, first, data, len);
		if (ret < 0)
		if (ret < 0)
			return ret;
			return ret;


		first += len;
		first += len;
		data += len;
		data += len;
	}
	}
	if (first >= ETH_MODULE_SFF_8079_LEN &&
	if (first < ETH_MODULE_SFF_8472_LEN && last > ETH_MODULE_SFF_8079_LEN) {
	    first < ETH_MODULE_SFF_8472_LEN) {
		len = min_t(unsigned int, last, ETH_MODULE_SFF_8472_LEN);
		len = min_t(unsigned int, last, ETH_MODULE_SFF_8472_LEN);
		len -= first;
		len -= first;
		first -= ETH_MODULE_SFF_8079_LEN;
		first -= ETH_MODULE_SFF_8079_LEN;


		ret = sfp->read(sfp, true, first, data, len);
		ret = sfp_read(sfp, true, first, data, len);
		if (ret < 0)
		if (ret < 0)
			return ret;
			return ret;
	}
	}