Commit c7cbfb02 authored by Jesse Brandeburg's avatar Jesse Brandeburg Committed by Tony Nguyen

igb: handle vlan types with checker enabled

The sparse build (C=2) finds some issues with how the driver
dealt with the (very difficult) hardware that in some generations
uses little-endian, and in others uses big endian, for the VLAN
field. The code as written picks __le16 as a type and for some
hardware revisions we override it to __be16 as done in this
patch. This impacted the VF driver as well so fix it there too.

Also change the vlan_tci assignment to override the sparse
warning without changing functionality.
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: default avatarDave Switzer <david.switzer@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 88c228b2
...@@ -2643,7 +2643,8 @@ static int igb_parse_cls_flower(struct igb_adapter *adapter, ...@@ -2643,7 +2643,8 @@ static int igb_parse_cls_flower(struct igb_adapter *adapter,
} }
input->filter.match_flags |= IGB_FILTER_FLAG_VLAN_TCI; input->filter.match_flags |= IGB_FILTER_FLAG_VLAN_TCI;
input->filter.vlan_tci = match.key->vlan_priority; input->filter.vlan_tci =
(__force __be16)match.key->vlan_priority;
} }
} }
...@@ -8597,7 +8598,7 @@ static void igb_process_skb_fields(struct igb_ring *rx_ring, ...@@ -8597,7 +8598,7 @@ static void igb_process_skb_fields(struct igb_ring *rx_ring,
if (igb_test_staterr(rx_desc, E1000_RXDEXT_STATERR_LB) && if (igb_test_staterr(rx_desc, E1000_RXDEXT_STATERR_LB) &&
test_bit(IGB_RING_FLAG_RX_LB_VLAN_BSWAP, &rx_ring->flags)) test_bit(IGB_RING_FLAG_RX_LB_VLAN_BSWAP, &rx_ring->flags))
vid = be16_to_cpu(rx_desc->wb.upper.vlan); vid = be16_to_cpu((__force __be16)rx_desc->wb.upper.vlan);
else else
vid = le16_to_cpu(rx_desc->wb.upper.vlan); vid = le16_to_cpu(rx_desc->wb.upper.vlan);
......
...@@ -83,14 +83,14 @@ static int igbvf_desc_unused(struct igbvf_ring *ring) ...@@ -83,14 +83,14 @@ static int igbvf_desc_unused(struct igbvf_ring *ring)
static void igbvf_receive_skb(struct igbvf_adapter *adapter, static void igbvf_receive_skb(struct igbvf_adapter *adapter,
struct net_device *netdev, struct net_device *netdev,
struct sk_buff *skb, struct sk_buff *skb,
u32 status, u16 vlan) u32 status, __le16 vlan)
{ {
u16 vid; u16 vid;
if (status & E1000_RXD_STAT_VP) { if (status & E1000_RXD_STAT_VP) {
if ((adapter->flags & IGBVF_FLAG_RX_LB_VLAN_BSWAP) && if ((adapter->flags & IGBVF_FLAG_RX_LB_VLAN_BSWAP) &&
(status & E1000_RXDEXT_STATERR_LB)) (status & E1000_RXDEXT_STATERR_LB))
vid = be16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK; vid = be16_to_cpu((__force __be16)vlan) & E1000_RXD_SPC_VLAN_MASK;
else else
vid = le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK; vid = le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK;
if (test_bit(vid, adapter->active_vlans)) if (test_bit(vid, adapter->active_vlans))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment