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

Commit 373e6978 authored by Akeem G. Abodunrin's avatar Akeem G. Abodunrin Committed by Jeff Kirsher
Browse files

igb: SerDes flow control setting



This path allows users to get appropriate flow control setting on SerDes
devices, based on original implementation for Copper devices.
Also, since 100baseFX does not support setting flow control, so exclude
it from the setting mechanism.

Signed-off-by: default avatarAkeem G. Abodunrin <akeem.g.abodunrin@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 641ac5c0
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
@@ -164,21 +164,6 @@ static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
			ecmd->advertising |= hw->phy.autoneg_advertised;
		}

		if (hw->mac.autoneg != 1)
			ecmd->advertising &= ~(ADVERTISED_Pause |
					       ADVERTISED_Asym_Pause);

		if (hw->fc.requested_mode == e1000_fc_full)
			ecmd->advertising |= ADVERTISED_Pause;
		else if (hw->fc.requested_mode == e1000_fc_rx_pause)
			ecmd->advertising |= (ADVERTISED_Pause |
					      ADVERTISED_Asym_Pause);
		else if (hw->fc.requested_mode == e1000_fc_tx_pause)
			ecmd->advertising |=  ADVERTISED_Asym_Pause;
		else
			ecmd->advertising &= ~(ADVERTISED_Pause |
					       ADVERTISED_Asym_Pause);

		ecmd->port = PORT_TP;
		ecmd->phy_address = hw->phy.addr;
		ecmd->transceiver = XCVR_INTERNAL;
@@ -206,6 +191,21 @@ static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
		ecmd->transceiver = XCVR_EXTERNAL;
	}

	if (hw->mac.autoneg != 1)
		ecmd->advertising &= ~(ADVERTISED_Pause |
				       ADVERTISED_Asym_Pause);

	if (hw->fc.requested_mode == e1000_fc_full)
		ecmd->advertising |= ADVERTISED_Pause;
	else if (hw->fc.requested_mode == e1000_fc_rx_pause)
		ecmd->advertising |= (ADVERTISED_Pause |
				      ADVERTISED_Asym_Pause);
	else if (hw->fc.requested_mode == e1000_fc_tx_pause)
		ecmd->advertising |=  ADVERTISED_Asym_Pause;
	else
		ecmd->advertising &= ~(ADVERTISED_Pause |
				       ADVERTISED_Asym_Pause);

	status = rd32(E1000_STATUS);

	if (status & E1000_STATUS_LU) {
@@ -386,6 +386,10 @@ static int igb_set_pauseparam(struct net_device *netdev,
	struct e1000_hw *hw = &adapter->hw;
	int retval = 0;

	/* 100basefx does not support setting link flow control */
	if (hw->dev_spec._82575.eth_flags.e100_base_fx)
		return -EINVAL;

	adapter->fc_autoneg = pause->autoneg;

	while (test_and_set_bit(__IGB_RESETTING, &adapter->state))