diff options
author | Vasanthy Kolluri <vkolluri@cisco.com> | 2010-06-24 10:49:51 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-25 20:45:22 -0700 |
commit | f8cac14acff870203ea7f61f1a92c5486d1774fa (patch) | |
tree | 4caa5145dca79a98bb5a19b9fd2658fe8fe3933c /drivers/net/enic/enic_main.c | |
parent | 88132f55d74fdd97a7d459007b2bbb59e850f8c0 (diff) | |
download | op-kernel-dev-f8cac14acff870203ea7f61f1a92c5486d1774fa.zip op-kernel-dev-f8cac14acff870203ea7f61f1a92c5486d1774fa.tar.gz |
enic: Bug Fix: Change hardware ingress vlan rewrite mode
The current ingress vlan rewrite mode setting lets the hardware strip off
the tag control information of a packet received on native vlan. As a
result, the priority bits are also lost. The fix is to change the ingress
vlan rewrite mode setting such that the complete tag control information is
retained for packets that belong to native vlan.
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
Signed-off-by: Vasanthy Kolluri <vkolluri@cisco.com>
Signed-off-by: Roopa Prabhu <roprabhu@cisco.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/enic/enic_main.c')
-rw-r--r-- | drivers/net/enic/enic_main.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index c2b848f..7f98af1 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c @@ -1300,7 +1300,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, u8 tcp_udp_csum_ok, udp, tcp, ipv4_csum_ok; u8 ipv6, ipv4, ipv4_fragment, fcs_ok, rss_type, csum_not_calc; u8 packet_error; - u16 q_number, completed_index, bytes_written, vlan, checksum; + u16 q_number, completed_index, bytes_written, vlan_tci, checksum; u32 rss_hash; if (skipped) @@ -1315,7 +1315,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, &type, &color, &q_number, &completed_index, &ingress_port, &fcoe, &eop, &sop, &rss_type, &csum_not_calc, &rss_hash, &bytes_written, - &packet_error, &vlan_stripped, &vlan, &checksum, + &packet_error, &vlan_stripped, &vlan_tci, &checksum, &fcoe_sof, &fcoe_fc_crc_ok, &fcoe_enc_error, &fcoe_eof, &tcp_udp_csum_ok, &udp, &tcp, &ipv4_csum_ok, &ipv6, &ipv4, &ipv4_fragment, @@ -1350,14 +1350,15 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, skb->dev = netdev; - if (enic->vlan_group && vlan_stripped) { + if (enic->vlan_group && vlan_stripped && + (vlan_tci & CQ_ENET_RQ_DESC_VLAN_TCI_VLAN_MASK)) { if (netdev->features & NETIF_F_GRO) vlan_gro_receive(&enic->napi, enic->vlan_group, - vlan, skb); + vlan_tci, skb); else vlan_hwaccel_receive_skb(skb, - enic->vlan_group, vlan); + enic->vlan_group, vlan_tci); } else { @@ -1879,6 +1880,18 @@ static int enic_set_niccfg(struct enic *enic) ig_vlan_strip_en); } +int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic) +{ + int err; + + spin_lock(&enic->devcmd_lock); + err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev, + IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN); + spin_unlock(&enic->devcmd_lock); + + return err; +} + static void enic_reset(struct work_struct *work) { struct enic *enic = container_of(work, struct enic, reset); @@ -1898,6 +1911,7 @@ static void enic_reset(struct work_struct *work) enic_reset_mcaddrs(enic); enic_init_vnic_resources(enic); enic_set_niccfg(enic); + enic_dev_set_ig_vlan_rewrite_mode(enic); enic_open(enic->netdev); rtnl_unlock(); @@ -2110,6 +2124,13 @@ int enic_dev_init(struct enic *enic) goto err_out_free_vnic_resources; } + err = enic_dev_set_ig_vlan_rewrite_mode(enic); + if (err) { + printk(KERN_ERR PFX + "Failed to set ingress vlan rewrite mode, aborting.\n"); + goto err_out_free_vnic_resources; + } + switch (vnic_dev_get_intr_mode(enic->vdev)) { default: netif_napi_add(netdev, &enic->napi, enic_poll, 64); |