Skip to content

Commit

Permalink
be2net: Fixed bugs related to PVID.
Browse files Browse the repository at this point in the history
Fixed bug to make sure 'pvid' retrieval will work on big endian hosts.
Fixed incorrect comparison between the Rx Completion's 16-bit VLAN TCI
and the PVID. Now comparing only the relevant 12 bits corresponding to
the VID.
Renamed 'vid' field under Rx Completion to 'vlan_tag' to reflect
accurate description.

Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Somnath Kotur authored and davem330 committed May 9, 2011
1 parent dcbe14b commit 6709d95
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 8 deletions.
2 changes: 1 addition & 1 deletion drivers/net/benet/be.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ struct be_rx_stats {

struct be_rx_compl_info {
u32 rss_hash;
u16 vid;
u16 vlan_tag;
u16 pkt_size;
u16 rxq_idx;
u16 mac_id;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
struct be_async_event_grp5_pvid_state *evt)
{
if (evt->enabled)
adapter->pvid = evt->tag;
adapter->pvid = le16_to_cpu(evt->tag);
else
adapter->pvid = 0;
}
Expand Down
18 changes: 12 additions & 6 deletions drivers/net/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1018,7 +1018,8 @@ static void be_rx_compl_process(struct be_adapter *adapter,
kfree_skb(skb);
return;
}
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, rxcp->vid);
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp,
rxcp->vlan_tag);
} else {
netif_receive_skb(skb);
}
Expand Down Expand Up @@ -1076,7 +1077,8 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
if (likely(!rxcp->vlanf))
napi_gro_frags(&eq_obj->napi);
else
vlan_gro_frags(&eq_obj->napi, adapter->vlan_grp, rxcp->vid);
vlan_gro_frags(&eq_obj->napi, adapter->vlan_grp,
rxcp->vlan_tag);
}

static void be_parse_rx_compl_v1(struct be_adapter *adapter,
Expand All @@ -1102,7 +1104,8 @@ static void be_parse_rx_compl_v1(struct be_adapter *adapter,
rxcp->pkt_type =
AMAP_GET_BITS(struct amap_eth_rx_compl_v1, cast_enc, compl);
rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm, compl);
rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag, compl);
rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag,
compl);
}

static void be_parse_rx_compl_v0(struct be_adapter *adapter,
Expand All @@ -1128,7 +1131,8 @@ static void be_parse_rx_compl_v0(struct be_adapter *adapter,
rxcp->pkt_type =
AMAP_GET_BITS(struct amap_eth_rx_compl_v0, cast_enc, compl);
rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm, compl);
rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag, compl);
rxcp->vlan_tag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag,
compl);
}

static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
Expand All @@ -1155,9 +1159,11 @@ static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
rxcp->vlanf = 0;

if (!lancer_chip(adapter))
rxcp->vid = swab16(rxcp->vid);
rxcp->vlan_tag = swab16(rxcp->vlan_tag);

if ((adapter->pvid == rxcp->vid) && !adapter->vlan_tag[rxcp->vid])
if (((adapter->pvid & VLAN_VID_MASK) ==
(rxcp->vlan_tag & VLAN_VID_MASK)) &&
!adapter->vlan_tag[rxcp->vlan_tag])
rxcp->vlanf = 0;

/* As the compl has been parsed, reset it; we wont touch it again */
Expand Down

0 comments on commit 6709d95

Please sign in to comment.