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

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


Jeff Kirsher says:

====================
40GbE Intel Wired LAN Driver Updates 2016-05-14

This series contains updates to i40e and i40evf.

Kevin adds support to disable link on all ports and changes bits set
for telling firmware the PHY needs to be modified by the driver.

Anjali adds a feature to enable/disable all multicast for a trusted
VF.  Added priv-flag knob to configure global true promiscuous
support.

Shannon adds the support code for calling the admin queue API call
aq_set_switch_config().

Mitch modifies the VF, to log a message if an untrusted VF attempts to
configure promiscuous mode, but lies to it and returns everything is ok
instead of returning an error.  Corrects the logic for reporting the
receive packet hash.  Fixed the adding of a broadcast filter for VFs,
since that all VSIs are configured to receive broadcasts as default,
so do not need to add a filter.

Catherine refactors the ethtool get_settings to report the possible
supported link modes from what we know about the current PHY type and
that with the firmware supported PHY types.

Jacob changes the driver to use WARN_ONCE in order to highlight the
issue, but do not display a warning every time when receive hang
message is received.

Akeem corrects receive ptype payload layer for non_tunneled IPv6, when
it should be layer 4 for UDP, instead of layer 3.

Dan Carpenter fixes an uninitialized variable bug.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents bf14e9ec 1c306f7f
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -97,11 +97,12 @@
#define I40E_INT_NAME_STR_LEN        (IFNAMSIZ + 16)

/* Ethtool Private Flags */
#define I40E_PRIV_FLAGS_NPAR_FLAG	BIT(0)
#define	I40E_PRIV_FLAGS_MFP_FLAG		BIT(0)
#define	I40E_PRIV_FLAGS_LINKPOLL_FLAG		BIT(1)
#define I40E_PRIV_FLAGS_FD_ATR			BIT(2)
#define I40E_PRIV_FLAGS_VEB_STATS		BIT(3)
#define I40E_PRIV_FLAGS_HW_ATR_EVICT	BIT(5)
#define I40E_PRIV_FLAGS_HW_ATR_EVICT		BIT(4)
#define I40E_PRIV_FLAGS_TRUE_PROMISC_SUPPORT	BIT(5)

#define I40E_NVM_VERSION_LO_SHIFT  0
#define I40E_NVM_VERSION_LO_MASK   (0xff << I40E_NVM_VERSION_LO_SHIFT)
@@ -111,7 +112,9 @@
#define I40E_OEM_VER_PATCH_MASK    0xff
#define I40E_OEM_VER_BUILD_SHIFT   8
#define I40E_OEM_VER_SHIFT         24
#define I40E_PHY_DEBUG_PORT        BIT(4)
#define I40E_PHY_DEBUG_ALL \
	(I40E_AQ_PHY_DEBUG_DISABLE_LINK_FW | \
	I40E_AQ_PHY_DEBUG_DISABLE_ALL_LINK_FW)

/* The values in here are decimal coded as hex as is the case in the NVM map*/
#define I40E_CURRENT_NVM_VERSION_HI 0x2
@@ -356,6 +359,7 @@ struct i40e_pf {
#define I40E_FLAG_STOP_FW_LLDP			BIT_ULL(47)
#define I40E_FLAG_HAVE_10GBASET_PHY		BIT_ULL(48)
#define I40E_FLAG_PF_MAC			BIT_ULL(50)
#define I40E_FLAG_TRUE_PROMISC_SUPPORT		BIT_ULL(51)

	/* tracks features that get auto disabled by errors */
	u64 auto_disable_flags;
+3 −0
Original line number Diff line number Diff line
@@ -1833,7 +1833,10 @@ struct i40e_aqc_set_phy_debug {
#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_NONE	0x00
#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_HARD	0x01
#define I40E_AQ_PHY_DEBUG_RESET_EXTERNAL_SOFT	0x02
/* Disable link manageability on a single port */
#define I40E_AQ_PHY_DEBUG_DISABLE_LINK_FW	0x10
/* Disable link manageability on all ports */
#define I40E_AQ_PHY_DEBUG_DISABLE_ALL_LINK_FW	0x20
	u8	reserved[15];
};

+36 −4
Original line number Diff line number Diff line
@@ -696,7 +696,7 @@ struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
	/* Non Tunneled IPv6 */
	I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
	I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
	I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY3),
	I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY4),
	I40E_PTT_UNUSED_ENTRY(91),
	I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP,  PAY4),
	I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
@@ -1972,10 +1972,12 @@ i40e_status i40e_aq_add_vsi(struct i40e_hw *hw,
 * @seid: vsi number
 * @set: set unicast promiscuous enable/disable
 * @cmd_details: pointer to command details structure or NULL
 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
 **/
i40e_status i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
				u16 seid, bool set,
				struct i40e_asq_cmd_details *cmd_details)
				struct i40e_asq_cmd_details *cmd_details,
				bool rx_only_promisc)
{
	struct i40e_aq_desc desc;
	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
@@ -1988,8 +1990,9 @@ i40e_status i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,

	if (set) {
		flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
		if (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
		    (hw->aq.api_maj_ver > 1))
		if (rx_only_promisc &&
		    (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
		     (hw->aq.api_maj_ver > 1)))
			flags |= I40E_AQC_SET_VSI_PROMISC_TX;
	}

@@ -2282,6 +2285,35 @@ i40e_status i40e_aq_get_switch_config(struct i40e_hw *hw,
	return status;
}

/**
 * i40e_aq_set_switch_config
 * @hw: pointer to the hardware structure
 * @flags: bit flag values to set
 * @valid_flags: which bit flags to set
 * @cmd_details: pointer to command details structure or NULL
 *
 * Set switch configuration bits
 **/
enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
						u16 flags,
						u16 valid_flags,
				struct i40e_asq_cmd_details *cmd_details)
{
	struct i40e_aq_desc desc;
	struct i40e_aqc_set_switch_config *scfg =
		(struct i40e_aqc_set_switch_config *)&desc.params.raw;
	enum i40e_status_code status;

	i40e_fill_default_direct_cmd_desc(&desc,
					  i40e_aqc_opc_set_switch_config);
	scfg->flags = cpu_to_le16(flags);
	scfg->valid_flags = cpu_to_le16(valid_flags);

	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);

	return status;
}

/**
 * i40e_aq_get_firmware_version
 * @hw: pointer to the hw struct
+201 −131
Original line number Diff line number Diff line
@@ -230,6 +230,17 @@ static const char i40e_gstrings_test[][ETH_GSTRING_LEN] = {

#define I40E_TEST_LEN (sizeof(i40e_gstrings_test) / ETH_GSTRING_LEN)

static const char i40e_priv_flags_strings_gl[][ETH_GSTRING_LEN] = {
	"MFP",
	"LinkPolling",
	"flow-director-atr",
	"veb-stats",
	"hw-atr-eviction",
	"vf-true-promisc-support",
};

#define I40E_PRIV_FLAGS_GL_STR_LEN ARRAY_SIZE(i40e_priv_flags_strings_gl)

static const char i40e_priv_flags_strings[][ETH_GSTRING_LEN] = {
	"NPAR",
	"LinkPolling",
@@ -250,6 +261,110 @@ static void i40e_partition_setting_complaint(struct i40e_pf *pf)
		 "The link settings are allowed to be changed only from the first partition of a given port. Please switch to the first partition in order to change the setting.\n");
}

/**
 * i40e_phy_type_to_ethtool - convert the phy_types to ethtool link modes
 * @phy_types: PHY types to convert
 * @supported: pointer to the ethtool supported variable to fill in
 * @advertising: pointer to the ethtool advertising variable to fill in
 *
 **/
static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
				     u32 *advertising)
{
	enum i40e_aq_capabilities_phy_type phy_types = pf->hw.phy.phy_types;

	*supported = 0x0;
	*advertising = 0x0;

	if (phy_types & I40E_CAP_PHY_TYPE_SGMII) {
		*supported |= SUPPORTED_Autoneg |
			      SUPPORTED_1000baseT_Full;
		*advertising |= ADVERTISED_Autoneg |
				ADVERTISED_1000baseT_Full;
		if (pf->flags & I40E_FLAG_100M_SGMII_CAPABLE) {
			*supported |= SUPPORTED_100baseT_Full;
			*advertising |= ADVERTISED_100baseT_Full;
		}
	}
	if (phy_types & I40E_CAP_PHY_TYPE_XAUI ||
	    phy_types & I40E_CAP_PHY_TYPE_XFI ||
	    phy_types & I40E_CAP_PHY_TYPE_SFI ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_SFPP_CU ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_AOC)
		*supported |= SUPPORTED_10000baseT_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
		*supported |= SUPPORTED_Autoneg |
			      SUPPORTED_10000baseT_Full;
		*advertising |= ADVERTISED_Autoneg |
				ADVERTISED_10000baseT_Full;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_XLAUI ||
	    phy_types & I40E_CAP_PHY_TYPE_XLPPI ||
	    phy_types & I40E_CAP_PHY_TYPE_40GBASE_AOC)
		*supported |= SUPPORTED_40000baseCR4_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU ||
	    phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4) {
		*supported |= SUPPORTED_Autoneg |
			      SUPPORTED_40000baseCR4_Full;
		*advertising |= ADVERTISED_Autoneg |
				ADVERTISED_40000baseCR4_Full;
	}
	if ((phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) &&
	    !(phy_types & I40E_CAP_PHY_TYPE_1000BASE_T)) {
		*supported |= SUPPORTED_Autoneg |
			      SUPPORTED_100baseT_Full;
		*advertising |= ADVERTISED_Autoneg |
				ADVERTISED_100baseT_Full;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
	    phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
	    phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
	    phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
		*supported |= SUPPORTED_Autoneg |
			      SUPPORTED_1000baseT_Full;
		*advertising |= ADVERTISED_Autoneg |
				ADVERTISED_1000baseT_Full;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_SR4)
		*supported |= SUPPORTED_40000baseSR4_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_LR4)
		*supported |= SUPPORTED_40000baseLR4_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_KR4) {
		*supported |= SUPPORTED_40000baseKR4_Full |
			      SUPPORTED_Autoneg;
		*advertising |= ADVERTISED_40000baseKR4_Full |
				ADVERTISED_Autoneg;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2) {
		*supported |= SUPPORTED_20000baseKR2_Full |
			      SUPPORTED_Autoneg;
		*advertising |= ADVERTISED_20000baseKR2_Full |
				ADVERTISED_Autoneg;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR) {
		*supported |= SUPPORTED_10000baseKR_Full |
			      SUPPORTED_Autoneg;
		*advertising |= ADVERTISED_10000baseKR_Full |
				ADVERTISED_Autoneg;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4) {
		*supported |= SUPPORTED_10000baseKX4_Full |
			      SUPPORTED_Autoneg;
		*advertising |= ADVERTISED_10000baseKX4_Full |
				ADVERTISED_Autoneg;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX) {
		*supported |= SUPPORTED_1000baseKX_Full |
			      SUPPORTED_Autoneg;
		*advertising |= ADVERTISED_1000baseKX_Full |
				ADVERTISED_Autoneg;
	}
}

/**
 * i40e_get_settings_link_up - Get the Link settings for when link is up
 * @hw: hw structure
@@ -264,6 +379,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
{
	struct i40e_link_status *hw_link_info = &hw->phy.link_info;
	u32 link_speed = hw_link_info->link_speed;
	u32 e_advertising = 0x0;
	u32 e_supported = 0x0;

	/* Initialize supported and advertised settings based on phy settings */
	switch (hw_link_info->phy_type) {
@@ -304,21 +421,18 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
		break;
	case I40E_PHY_TYPE_10GBASE_T:
	case I40E_PHY_TYPE_1000BASE_T:
	case I40E_PHY_TYPE_100BASE_TX:
		ecmd->supported = SUPPORTED_Autoneg |
				  SUPPORTED_10000baseT_Full |
				  SUPPORTED_1000baseT_Full;
				  SUPPORTED_1000baseT_Full |
				  SUPPORTED_100baseT_Full;
		ecmd->advertising = ADVERTISED_Autoneg;
		if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
			ecmd->advertising |= ADVERTISED_10000baseT_Full;
		if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
			ecmd->advertising |= ADVERTISED_1000baseT_Full;
		/* adding 100baseT support for 10GBASET_PHY */
		if (pf->flags & I40E_FLAG_HAVE_10GBASET_PHY) {
			ecmd->supported |= SUPPORTED_100baseT_Full;
			ecmd->advertising |= ADVERTISED_100baseT_Full |
					     ADVERTISED_1000baseT_Full |
					     ADVERTISED_10000baseT_Full;
		}
		if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
			ecmd->advertising |= ADVERTISED_100baseT_Full;
		break;
	case I40E_PHY_TYPE_1000BASE_T_OPTICAL:
		ecmd->supported = SUPPORTED_Autoneg |
@@ -326,21 +440,6 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
		ecmd->advertising = ADVERTISED_Autoneg |
				    ADVERTISED_1000baseT_Full;
		break;
	case I40E_PHY_TYPE_100BASE_TX:
		ecmd->supported = SUPPORTED_Autoneg |
				  SUPPORTED_100baseT_Full;
		if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
			ecmd->advertising |= ADVERTISED_100baseT_Full;
		/* firmware detects 10G phy as 100M phy at 100M speed */
		if (pf->flags & I40E_FLAG_HAVE_10GBASET_PHY) {
			ecmd->supported |= SUPPORTED_10000baseT_Full |
					   SUPPORTED_1000baseT_Full;
			ecmd->advertising |= ADVERTISED_Autoneg |
					     ADVERTISED_100baseT_Full |
					     ADVERTISED_1000baseT_Full |
					     ADVERTISED_10000baseT_Full;
		}
		break;
	case I40E_PHY_TYPE_10GBASE_CR1_CU:
	case I40E_PHY_TYPE_10GBASE_CR1:
		ecmd->supported = SUPPORTED_Autoneg |
@@ -367,14 +466,23 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
				ecmd->advertising |= ADVERTISED_100baseT_Full;
		}
		break;
	/* Backplane is set based on supported phy types in get_settings
	 * so don't set anything here but don't warn either
	 */
	case I40E_PHY_TYPE_40GBASE_KR4:
	case I40E_PHY_TYPE_20GBASE_KR2:
	case I40E_PHY_TYPE_10GBASE_KR:
	case I40E_PHY_TYPE_10GBASE_KX4:
	case I40E_PHY_TYPE_1000BASE_KX:
		ecmd->supported |= SUPPORTED_40000baseKR4_Full |
				   SUPPORTED_20000baseKR2_Full |
				   SUPPORTED_10000baseKR_Full |
				   SUPPORTED_10000baseKX4_Full |
				   SUPPORTED_1000baseKX_Full |
				   SUPPORTED_Autoneg;
		ecmd->advertising |= ADVERTISED_40000baseKR4_Full |
				     ADVERTISED_20000baseKR2_Full |
				     ADVERTISED_10000baseKR_Full |
				     ADVERTISED_10000baseKX4_Full |
				     ADVERTISED_1000baseKX_Full |
				     ADVERTISED_Autoneg;
		break;
	default:
		/* if we got here and link is up something bad is afoot */
@@ -382,6 +490,16 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
			    hw_link_info->phy_type);
	}

	/* Now that we've worked out everything that could be supported by the
	 * current PHY type, get what is supported by the NVM and them to
	 * get what is truly supported
	 */
	i40e_phy_type_to_ethtool(pf, &e_supported,
				 &e_advertising);

	ecmd->supported = ecmd->supported & e_supported;
	ecmd->advertising = ecmd->advertising & e_advertising;

	/* Set speed and duplex */
	switch (link_speed) {
	case I40E_LINK_SPEED_40GB:
@@ -416,74 +534,11 @@ static void i40e_get_settings_link_down(struct i40e_hw *hw,
					struct ethtool_cmd *ecmd,
					struct i40e_pf *pf)
{
	enum i40e_aq_capabilities_phy_type phy_types = hw->phy.phy_types;

	/* link is down and the driver needs to fall back on
	 * supported phy types to figure out what info to display
	 */
	ecmd->supported = 0x0;
	ecmd->advertising = 0x0;
	if (phy_types & I40E_CAP_PHY_TYPE_SGMII) {
		ecmd->supported |= SUPPORTED_Autoneg |
				   SUPPORTED_1000baseT_Full;
		ecmd->advertising |= ADVERTISED_Autoneg |
				     ADVERTISED_1000baseT_Full;
		if (pf->hw.mac.type == I40E_MAC_X722) {
			ecmd->supported |= SUPPORTED_100baseT_Full;
			ecmd->advertising |= ADVERTISED_100baseT_Full;
			if (pf->flags & I40E_FLAG_100M_SGMII_CAPABLE) {
				ecmd->supported |= SUPPORTED_100baseT_Full;
				ecmd->advertising |= ADVERTISED_100baseT_Full;
			}
		}
	}
	if (phy_types & I40E_CAP_PHY_TYPE_XAUI ||
	    phy_types & I40E_CAP_PHY_TYPE_XFI ||
	    phy_types & I40E_CAP_PHY_TYPE_SFI ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_SFPP_CU ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_AOC)
		ecmd->supported |= SUPPORTED_10000baseT_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
	    phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
		ecmd->supported |= SUPPORTED_Autoneg |
				   SUPPORTED_10000baseT_Full;
		ecmd->advertising |= ADVERTISED_Autoneg |
				     ADVERTISED_10000baseT_Full;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_XLAUI ||
	    phy_types & I40E_CAP_PHY_TYPE_XLPPI ||
	    phy_types & I40E_CAP_PHY_TYPE_40GBASE_AOC)
		ecmd->supported |= SUPPORTED_40000baseCR4_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU ||
	    phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4) {
		ecmd->supported |= SUPPORTED_Autoneg |
				  SUPPORTED_40000baseCR4_Full;
		ecmd->advertising |= ADVERTISED_Autoneg |
				    ADVERTISED_40000baseCR4_Full;
	}
	if ((phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) &&
	    !(phy_types & I40E_CAP_PHY_TYPE_1000BASE_T)) {
		ecmd->supported |= SUPPORTED_Autoneg |
				   SUPPORTED_100baseT_Full;
		ecmd->advertising |= ADVERTISED_Autoneg |
				     ADVERTISED_100baseT_Full;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
	    phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
	    phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
	    phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
		ecmd->supported |= SUPPORTED_Autoneg |
				   SUPPORTED_1000baseT_Full;
		ecmd->advertising |= ADVERTISED_Autoneg |
				     ADVERTISED_1000baseT_Full;
	}
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_SR4)
		ecmd->supported |= SUPPORTED_40000baseSR4_Full;
	if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_LR4)
		ecmd->supported |= SUPPORTED_40000baseLR4_Full;
	i40e_phy_type_to_ethtool(pf, &ecmd->supported,
				 &ecmd->advertising);

	/* With no link speed and duplex are unknown */
	ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
@@ -512,38 +567,6 @@ static int i40e_get_settings(struct net_device *netdev,
		i40e_get_settings_link_down(hw, ecmd, pf);

	/* Now set the settings that don't rely on link being up/down */

	/* For backplane, supported and advertised are only reliant on the
	 * phy types the NVM specifies are supported.
	 */
	if (hw->device_id == I40E_DEV_ID_KX_B ||
	    hw->device_id == I40E_DEV_ID_KX_C ||
	    hw->device_id == I40E_DEV_ID_20G_KR2 ||
	    hw->device_id ==  I40E_DEV_ID_20G_KR2_A) {
		ecmd->supported = SUPPORTED_Autoneg;
		ecmd->advertising = ADVERTISED_Autoneg;
		if (hw->phy.phy_types & I40E_CAP_PHY_TYPE_40GBASE_KR4) {
			ecmd->supported |= SUPPORTED_40000baseKR4_Full;
			ecmd->advertising |= ADVERTISED_40000baseKR4_Full;
		}
		if (hw->phy.phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2) {
			ecmd->supported |= SUPPORTED_20000baseKR2_Full;
			ecmd->advertising |= ADVERTISED_20000baseKR2_Full;
		}
		if (hw->phy.phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR) {
			ecmd->supported |= SUPPORTED_10000baseKR_Full;
			ecmd->advertising |= ADVERTISED_10000baseKR_Full;
		}
		if (hw->phy.phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4) {
			ecmd->supported |= SUPPORTED_10000baseKX4_Full;
			ecmd->advertising |= ADVERTISED_10000baseKX4_Full;
		}
		if (hw->phy.phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX) {
			ecmd->supported |= SUPPORTED_1000baseKX_Full;
			ecmd->advertising |= ADVERTISED_1000baseKX_Full;
		}
	}

	/* Set autoneg settings */
	ecmd->autoneg = ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ?
			  AUTONEG_ENABLE : AUTONEG_DISABLE);
@@ -1158,6 +1181,10 @@ static void i40e_get_drvinfo(struct net_device *netdev,
		sizeof(drvinfo->fw_version));
	strlcpy(drvinfo->bus_info, pci_name(pf->pdev),
		sizeof(drvinfo->bus_info));
	if (pf->hw.pf_id == 0)
		drvinfo->n_priv_flags = I40E_PRIV_FLAGS_GL_STR_LEN;
	else
		drvinfo->n_priv_flags = I40E_PRIV_FLAGS_STR_LEN;
}

static void i40e_get_ringparam(struct net_device *netdev,
@@ -1385,6 +1412,9 @@ static int i40e_get_sset_count(struct net_device *netdev, int sset)
			return I40E_VSI_STATS_LEN(netdev);
		}
	case ETH_SS_PRIV_FLAGS:
		if (pf->hw.pf_id == 0)
			return I40E_PRIV_FLAGS_GL_STR_LEN;
		else
			return I40E_PRIV_FLAGS_STR_LEN;
	default:
		return -EOPNOTSUPP;
@@ -1583,11 +1613,19 @@ static void i40e_get_strings(struct net_device *netdev, u32 stringset,
		/* BUG_ON(p - data != I40E_STATS_LEN * ETH_GSTRING_LEN); */
		break;
	case ETH_SS_PRIV_FLAGS:
		if (pf->hw.pf_id == 0) {
			for (i = 0; i < I40E_PRIV_FLAGS_GL_STR_LEN; i++) {
				memcpy(data, i40e_priv_flags_strings_gl[i],
				       ETH_GSTRING_LEN);
				data += ETH_GSTRING_LEN;
			}
		} else {
			for (i = 0; i < I40E_PRIV_FLAGS_STR_LEN; i++) {
				memcpy(data, i40e_priv_flags_strings[i],
				       ETH_GSTRING_LEN);
				data += ETH_GSTRING_LEN;
			}
		}
		break;
	default:
		break;
@@ -1880,7 +1918,7 @@ static int i40e_set_phys_id(struct net_device *netdev,
		if (!(pf->flags & I40E_FLAG_HAVE_10GBASET_PHY)) {
			pf->led_status = i40e_led_get(hw);
		} else {
			i40e_aq_set_phy_debug(hw, I40E_PHY_DEBUG_PORT, NULL);
			i40e_aq_set_phy_debug(hw, I40E_PHY_DEBUG_ALL, NULL);
			ret = i40e_led_get_phy(hw, &temp_status,
					       &pf->phy_led_val);
			pf->led_status = temp_status;
@@ -2848,8 +2886,6 @@ static u32 i40e_get_priv_flags(struct net_device *dev)
	struct i40e_pf *pf = vsi->back;
	u32 ret_flags = 0;

	ret_flags |= pf->hw.func_caps.npar_enable ?
		I40E_PRIV_FLAGS_NPAR_FLAG : 0;
	ret_flags |= pf->flags & I40E_FLAG_LINK_POLLING_ENABLED ?
		I40E_PRIV_FLAGS_LINKPOLL_FLAG : 0;
	ret_flags |= pf->flags & I40E_FLAG_FD_ATR_ENABLED ?
@@ -2858,6 +2894,10 @@ static u32 i40e_get_priv_flags(struct net_device *dev)
		I40E_PRIV_FLAGS_VEB_STATS : 0;
	ret_flags |= pf->auto_disable_flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE ?
		0 : I40E_PRIV_FLAGS_HW_ATR_EVICT;
	if (pf->hw.pf_id == 0) {
		ret_flags |= pf->flags & I40E_FLAG_TRUE_PROMISC_SUPPORT ?
			I40E_PRIV_FLAGS_TRUE_PROMISC_SUPPORT : 0;
	}

	return ret_flags;
}
@@ -2872,7 +2912,10 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
	struct i40e_netdev_priv *np = netdev_priv(dev);
	struct i40e_vsi *vsi = np->vsi;
	struct i40e_pf *pf = vsi->back;
	u16 sw_flags = 0, valid_flags = 0;
	bool reset_required = false;
	bool promisc_change = false;
	int ret;

	/* NOTE: MFP is not settable */

@@ -2902,6 +2945,33 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
		reset_required = true;
	}

	if (pf->hw.pf_id == 0) {
		if ((flags & I40E_PRIV_FLAGS_TRUE_PROMISC_SUPPORT) &&
		    !(pf->flags & I40E_FLAG_TRUE_PROMISC_SUPPORT)) {
			pf->flags |= I40E_FLAG_TRUE_PROMISC_SUPPORT;
			promisc_change = true;
		} else if (!(flags & I40E_PRIV_FLAGS_TRUE_PROMISC_SUPPORT) &&
			   (pf->flags & I40E_FLAG_TRUE_PROMISC_SUPPORT)) {
			pf->flags &= ~I40E_FLAG_TRUE_PROMISC_SUPPORT;
			promisc_change = true;
		}
	}
	if (promisc_change) {
		if (!(pf->flags & I40E_FLAG_TRUE_PROMISC_SUPPORT))
			sw_flags = I40E_AQ_SET_SWITCH_CFG_PROMISC;
		valid_flags = I40E_AQ_SET_SWITCH_CFG_PROMISC;
		ret = i40e_aq_set_switch_config(&pf->hw, sw_flags, valid_flags,
						NULL);
		if (ret && pf->hw.aq.asq_last_status != I40E_AQ_RC_ESRCH) {
			dev_info(&pf->pdev->dev,
				 "couldn't set switch config bits, err %s aq_err %s\n",
				 i40e_stat_str(&pf->hw, ret),
				 i40e_aq_str(&pf->hw,
					     pf->hw.aq.asq_last_status));
			/* not a fatal problem, just keep going */
		}
	}

	if ((flags & I40E_PRIV_FLAGS_HW_ATR_EVICT) &&
	    (pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE))
		pf->auto_disable_flags &= ~I40E_FLAG_HW_ATR_EVICT_CAPABLE;
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ i40e_status i40e_add_sd_table_entry(struct i40e_hw *hw,
	struct i40e_hmc_sd_entry *sd_entry;
	bool dma_mem_alloc_done = false;
	struct i40e_dma_mem mem;
	i40e_status ret_code;
	i40e_status ret_code = I40E_SUCCESS;
	u64 alloc_len;

	if (NULL == hmc_info->sd_table.sd_entry) {
Loading