diff options
| author | David S. Miller <[email protected]> | 2018-12-12 21:43:43 -0800 | 
|---|---|---|
| committer | David S. Miller <[email protected]> | 2018-12-12 21:43:43 -0800 | 
| commit | 3b076cfe86be3784dee93cfd83d6913a9ef530ee (patch) | |
| tree | d9c51d587fd7a8f8b6613f2b97af7aa67eef01d3 /drivers/net/ethernet/intel/i40e/i40e_txrx.c | |
| parent | 18330c58e309d88261cf981c04c91f9130402594 (diff) | |
| parent | 96d1a731611f711f0cb82cea93363ae2ea8cb028 (diff) | |
Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue
Jeff Kirsher says:
====================
Intel Wired LAN Driver Fixes 2018-12-12
This series contains fixes to i40e and ixgbe.
Stefan Assmann fixes an issue created by a previous fix, where
ether_addr_copy() was moved to avoid a race but did not take into
account that it alters the MAC address being handed to
i40e_del_mac_filter().
Michał Mirosław provides 2 fixes for i40e, first resolves issues in the
hardware VLAN offload where VLAN.TCI equal to 0 was being dropped and a
race between disabling VLAN receive feature in hardware and processing
the receive queue, where packets could have their VLAN information
dropped.
Ross Lagerwall fixes a racy condition during a ixgbe VF reset, where
writing the register to issue a reset and sending the reset message via
the mailbox API could result of the mailbox memory getting cleared
during the reset before the message gets successfully sent which results
in a VF driver malfunction.
====================
Signed-off-by: David S. Miller <[email protected]>
Diffstat (limited to 'drivers/net/ethernet/intel/i40e/i40e_txrx.c')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.c | 43 | 
1 files changed, 12 insertions, 31 deletions
| diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index aef3c89ee79c..d0a95424ce58 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -1559,24 +1559,6 @@ static bool i40e_alloc_mapped_page(struct i40e_ring *rx_ring,  }  /** - * i40e_receive_skb - Send a completed packet up the stack - * @rx_ring:  rx ring in play - * @skb: packet to send up - * @vlan_tag: vlan tag for packet - **/ -void i40e_receive_skb(struct i40e_ring *rx_ring, -		      struct sk_buff *skb, u16 vlan_tag) -{ -	struct i40e_q_vector *q_vector = rx_ring->q_vector; - -	if ((rx_ring->netdev->features & NETIF_F_HW_VLAN_CTAG_RX) && -	    (vlan_tag & VLAN_VID_MASK)) -		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tag); - -	napi_gro_receive(&q_vector->napi, skb); -} - -/**   * i40e_alloc_rx_buffers - Replace used receive buffers   * @rx_ring: ring to place buffers on   * @cleaned_count: number of buffers to replace @@ -1793,8 +1775,7 @@ static inline void i40e_rx_hash(struct i40e_ring *ring,   * other fields within the skb.   **/  void i40e_process_skb_fields(struct i40e_ring *rx_ring, -			     union i40e_rx_desc *rx_desc, struct sk_buff *skb, -			     u8 rx_ptype) +			     union i40e_rx_desc *rx_desc, struct sk_buff *skb)  {  	u64 qword = le64_to_cpu(rx_desc->wb.qword1.status_error_len);  	u32 rx_status = (qword & I40E_RXD_QW1_STATUS_MASK) >> @@ -1802,6 +1783,8 @@ void i40e_process_skb_fields(struct i40e_ring *rx_ring,  	u32 tsynvalid = rx_status & I40E_RXD_QW1_STATUS_TSYNVALID_MASK;  	u32 tsyn = (rx_status & I40E_RXD_QW1_STATUS_TSYNINDX_MASK) >>  		   I40E_RXD_QW1_STATUS_TSYNINDX_SHIFT; +	u8 rx_ptype = (qword & I40E_RXD_QW1_PTYPE_MASK) >> +		      I40E_RXD_QW1_PTYPE_SHIFT;  	if (unlikely(tsynvalid))  		i40e_ptp_rx_hwtstamp(rx_ring->vsi->back, skb, tsyn); @@ -1812,6 +1795,13 @@ void i40e_process_skb_fields(struct i40e_ring *rx_ring,  	skb_record_rx_queue(skb, rx_ring->queue_index); +	if (qword & BIT(I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) { +		u16 vlan_tag = rx_desc->wb.qword0.lo_dword.l2tag1; + +		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), +				       le16_to_cpu(vlan_tag)); +	} +  	/* modifies the skb - consumes the enet header */  	skb->protocol = eth_type_trans(skb, rx_ring->netdev);  } @@ -2350,8 +2340,6 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)  		struct i40e_rx_buffer *rx_buffer;  		union i40e_rx_desc *rx_desc;  		unsigned int size; -		u16 vlan_tag; -		u8 rx_ptype;  		u64 qword;  		/* return some buffers to hardware, one at a time is too slow */ @@ -2444,18 +2432,11 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)  		/* probably a little skewed due to removing CRC */  		total_rx_bytes += skb->len; -		qword = le64_to_cpu(rx_desc->wb.qword1.status_error_len); -		rx_ptype = (qword & I40E_RXD_QW1_PTYPE_MASK) >> -			   I40E_RXD_QW1_PTYPE_SHIFT; -  		/* populate checksum, VLAN, and protocol */ -		i40e_process_skb_fields(rx_ring, rx_desc, skb, rx_ptype); - -		vlan_tag = (qword & BIT(I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) ? -			   le16_to_cpu(rx_desc->wb.qword0.lo_dword.l2tag1) : 0; +		i40e_process_skb_fields(rx_ring, rx_desc, skb);  		i40e_trace(clean_rx_irq_rx, rx_ring, rx_desc, skb); -		i40e_receive_skb(rx_ring, skb, vlan_tag); +		napi_gro_receive(&rx_ring->q_vector->napi, skb);  		skb = NULL;  		/* update budget accounting */ |