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

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


Jeff Kirsher says:

====================
Intel Wired LAN Driver Updates

This series contains updates to i40e and i40evf.

Greg provides two patches for i40e, the first adds the netdev ops to support
the addition of static FDB entries in the physical function (PF) MAC/VLAN
filter table so that the virtual functions (VFs) can communicate with
bridged virtual Ethernet ports such as those provided by the virtio
driver.  The second is to fix an issue where the assignment of a port
VLAN after it is already up and running requires the VF driver to be
reloaded, so print a message warning the host administrator about the
need to reload the VF driver.  In addition, knock the VF offline so that
it does not continue to receive traffic not on the port VLAN assigned to
it.

Jesse provides a patch for i40e and i40evf to unhide and enable the
PREFENA field in the receive host memory cache (RX-HMC) for best
performance.

Mitch provides a i40e patch to implement the net device op for Tx
bandwidth setting.

Catherine removes a firmware workaround that is no longer needed with
the latest firmware for i40e.  She also provides some minor cleanups
as well bumps the driver versions.

Anjali provides a fix for i40e displaying IPv4 flow director filters
which needed additional information to be communicated up above in
order for it to be displayed correctly.

Shannon adds tracking of the NVM busy state so that the driver won't
allow a new NVM update command until a completion event is received
from the current update.  Updates the admin queue API to reflect
recent changes in the firmware.  Also rearranges the "if netdev" logic
to prepare for handling non-netdev VSIs.  Lastly rework the fdir
setup and tear down to use the newly created i40e_vsi_open() and
i40e_vsi_close(), which also fixes a memory leak of the FDIR queue
buffer info structs across a reset.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a29b694a b98d1df2
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -32,6 +32,16 @@

static void i40e_resume_aq(struct i40e_hw *hw);

/**
 * i40e_is_nvm_update_op - return true if this is an NVM update operation
 * @desc: API request descriptor
 **/
static inline bool i40e_is_nvm_update_op(struct i40e_aq_desc *desc)
{
	return (desc->opcode == i40e_aqc_opc_nvm_erase) ||
	       (desc->opcode == i40e_aqc_opc_nvm_update);
}

/**
 *  i40e_adminq_init_regs - Initialize AdminQ registers
 *  @hw: pointer to the hardware structure
@@ -585,6 +595,7 @@ i40e_status i40e_init_adminq(struct i40e_hw *hw)

	/* pre-emptive resource lock release */
	i40e_aq_release_resource(hw, I40E_NVM_RESOURCE_ID, 0, NULL);
	hw->aq.nvm_busy = false;

	ret_code = i40e_aq_set_hmc_resource_profile(hw,
						    I40E_HMC_PROFILE_DEFAULT,
@@ -708,6 +719,12 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
		goto asq_send_command_exit;
	}

	if (i40e_is_nvm_update_op(desc) && hw->aq.nvm_busy) {
		i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: NVM busy.\n");
		status = I40E_ERR_NVM;
		goto asq_send_command_exit;
	}

	details = I40E_ADMINQ_DETAILS(hw->aq.asq, hw->aq.asq.next_to_use);
	if (cmd_details) {
		*details = *cmd_details;
@@ -835,6 +852,9 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
		hw->aq.asq_last_status = (enum i40e_admin_queue_err)retval;
	}

	if (i40e_is_nvm_update_op(desc))
		hw->aq.nvm_busy = true;

	/* update the error if time out occurred */
	if ((!cmd_completed) &&
	    (!details->async && !details->postpone)) {
@@ -929,6 +949,9 @@ i40e_status i40e_clean_arq_element(struct i40e_hw *hw,
			       e->msg_size);
	}

	if (i40e_is_nvm_update_op(&e->desc))
		hw->aq.nvm_busy = false;

	/* Restore the original datalen and buffer address in the desc,
	 * FW updates datalen to indicate the event message
	 * size
+1 −0
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ struct i40e_adminq_info {
	u16 fw_min_ver;                 /* firmware minor version */
	u16 api_maj_ver;                /* api major version */
	u16 api_min_ver;                /* api minor version */
	bool nvm_busy;

	struct mutex asq_mutex; /* Send queue lock */
	struct mutex arq_mutex; /* Receive queue lock */
+12 −29
Original line number Diff line number Diff line
@@ -182,9 +182,6 @@ enum i40e_admin_queue_opc {
	i40e_aqc_opc_add_mirror_rule    = 0x0260,
	i40e_aqc_opc_delete_mirror_rule = 0x0261,

	i40e_aqc_opc_set_storm_control_config = 0x0280,
	i40e_aqc_opc_get_storm_control_config = 0x0281,

	/* DCB commands */
	i40e_aqc_opc_dcb_ignore_pfc = 0x0301,
	i40e_aqc_opc_dcb_updated    = 0x0302,
@@ -207,6 +204,7 @@ enum i40e_admin_queue_opc {
	i40e_aqc_opc_query_switching_comp_bw_config        = 0x041A,
	i40e_aqc_opc_suspend_port_tx                       = 0x041B,
	i40e_aqc_opc_resume_port_tx                        = 0x041C,
	i40e_aqc_opc_configure_partition_bw                = 0x041D,

	/* hmc */
	i40e_aqc_opc_query_hmc_resource_profile = 0x0500,
@@ -1289,27 +1287,6 @@ struct i40e_aqc_add_delete_mirror_rule_completion {

I40E_CHECK_CMD_LENGTH(i40e_aqc_add_delete_mirror_rule_completion);

/* Set Storm Control Configuration (direct 0x0280)
 * Get Storm Control Configuration (direct 0x0281)
 *    the command and response use the same descriptor structure
 */
struct i40e_aqc_set_get_storm_control_config {
	__le32 broadcast_threshold;
	__le32 multicast_threshold;
	__le32 control_flags;
#define I40E_AQC_STORM_CONTROL_MDIPW            0x01
#define I40E_AQC_STORM_CONTROL_MDICW            0x02
#define I40E_AQC_STORM_CONTROL_BDIPW            0x04
#define I40E_AQC_STORM_CONTROL_BDICW            0x08
#define I40E_AQC_STORM_CONTROL_BIDU             0x10
#define I40E_AQC_STORM_CONTROL_INTERVAL_SHIFT   8
#define I40E_AQC_STORM_CONTROL_INTERVAL_MASK    (0x3FF << \
					I40E_AQC_STORM_CONTROL_INTERVAL_SHIFT)
	u8     reserved[4];
};

I40E_CHECK_CMD_LENGTH(i40e_aqc_set_get_storm_control_config);

/* DCB 0x03xx*/

/* PFC Ignore (direct 0x0301)
@@ -1499,6 +1476,15 @@ struct i40e_aqc_query_switching_comp_bw_config_resp {
 * (direct 0x041B and 0x041C) uses the generic SEID struct
 */

/* Configure partition BW
 * (indirect 0x041D)
 */
struct i40e_aqc_configure_partition_bw_data {
	__le16 pf_valid_bits;
	u8     min_bw[16];      /* guaranteed bandwidth */
	u8     max_bw[16];      /* bandwidth limit */
};

/* Get and set the active HMC resource profile and status.
 * (direct 0x0500) and (direct 0x0501)
 */
@@ -1583,11 +1569,8 @@ struct i40e_aq_get_phy_abilities_resp {
#define I40E_AQ_PHY_FLAG_PAUSE_TX         0x01
#define I40E_AQ_PHY_FLAG_PAUSE_RX         0x02
#define I40E_AQ_PHY_FLAG_LOW_POWER        0x04
#define I40E_AQ_PHY_FLAG_AN_SHIFT         3
#define I40E_AQ_PHY_FLAG_AN_MASK          (0x3 << I40E_AQ_PHY_FLAG_AN_SHIFT)
#define I40E_AQ_PHY_FLAG_AN_OFF           0x00 /* link forced on */
#define I40E_AQ_PHY_FLAG_AN_OFF_LINK_DOWN 0x01
#define I40E_AQ_PHY_FLAG_AN_ON            0x02
#define I40E_AQ_PHY_LINK_ENABLED		  0x08
#define I40E_AQ_PHY_AN_ENABLED			  0x10
#define I40E_AQ_PHY_FLAG_MODULE_QUAL      0x20
	__le16 eee_capability;
#define I40E_AQ_EEE_100BASE_TX       0x0002
+29 −0
Original line number Diff line number Diff line
@@ -2252,6 +2252,35 @@ static i40e_status i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
	return status;
}

/**
 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
 * @hw: pointer to the hw struct
 * @seid: VSI seid
 * @credit: BW limit credits (0 = disabled)
 * @max_credit: Max BW limit credits
 * @cmd_details: pointer to command details structure or NULL
 **/
i40e_status i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
				u16 seid, u16 credit, u8 max_credit,
				struct i40e_asq_cmd_details *cmd_details)
{
	struct i40e_aq_desc desc;
	struct i40e_aqc_configure_vsi_bw_limit *cmd =
		(struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
	i40e_status status;

	i40e_fill_default_direct_cmd_desc(&desc,
					  i40e_aqc_opc_configure_vsi_bw_limit);

	cmd->vsi_seid = cpu_to_le16(seid);
	cmd->credit = cpu_to_le16(credit);
	cmd->max_credit = max_credit;

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

	return status;
}

/**
 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
 * @hw: pointer to the hw struct
+11 −3
Original line number Diff line number Diff line
@@ -649,7 +649,7 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
			sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
	}
	rcu_read_lock();
	for (j = 0; j < vsi->num_queue_pairs; j++, i += 4) {
	for (j = 0; j < vsi->num_queue_pairs; j++) {
		struct i40e_ring *tx_ring = ACCESS_ONCE(vsi->tx_rings[j]);
		struct i40e_ring *rx_ring;

@@ -662,14 +662,16 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
			data[i] = tx_ring->stats.packets;
			data[i + 1] = tx_ring->stats.bytes;
		} while (u64_stats_fetch_retry_irq(&tx_ring->syncp, start));
		i += 2;

		/* Rx ring is the 2nd half of the queue pair */
		rx_ring = &tx_ring[1];
		do {
			start = u64_stats_fetch_begin_irq(&rx_ring->syncp);
			data[i + 2] = rx_ring->stats.packets;
			data[i + 3] = rx_ring->stats.bytes;
			data[i] = rx_ring->stats.packets;
			data[i + 1] = rx_ring->stats.bytes;
		} while (u64_stats_fetch_retry_irq(&rx_ring->syncp, start));
		i += 2;
	}
	rcu_read_unlock();
	if (vsi == pf->vsi[pf->lan_vsi]) {
@@ -1189,6 +1191,12 @@ static int i40e_get_ethtool_fdir_entry(struct i40e_pf *pf,
		return -EINVAL;

	fsp->flow_type = rule->flow_type;
	if (fsp->flow_type == IP_USER_FLOW) {
		fsp->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4;
		fsp->h_u.usr_ip4_spec.proto = 0;
		fsp->m_u.usr_ip4_spec.proto = 0;
	}

	fsp->h_u.tcp_ip4_spec.psrc = rule->src_port;
	fsp->h_u.tcp_ip4_spec.pdst = rule->dst_port;
	fsp->h_u.tcp_ip4_spec.ip4src = rule->src_ip[0];
Loading