aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/enic/enic_main.c
diff options
context:
space:
mode:
authorVasanthy Kolluri <vkolluri@cisco.com>2010-06-24 06:49:51 -0400
committerDavid S. Miller <davem@davemloft.net>2010-06-25 23:45:22 -0400
commitf8cac14acff870203ea7f61f1a92c5486d1774fa (patch)
tree4caa5145dca79a98bb5a19b9fd2658fe8fe3933c /drivers/net/enic/enic_main.c
parent88132f55d74fdd97a7d459007b2bbb59e850f8c0 (diff)
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.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index c2b848f58c29..7f98af1eb1ea 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,
1300 u8 tcp_udp_csum_ok, udp, tcp, ipv4_csum_ok; 1300 u8 tcp_udp_csum_ok, udp, tcp, ipv4_csum_ok;
1301 u8 ipv6, ipv4, ipv4_fragment, fcs_ok, rss_type, csum_not_calc; 1301 u8 ipv6, ipv4, ipv4_fragment, fcs_ok, rss_type, csum_not_calc;
1302 u8 packet_error; 1302 u8 packet_error;
1303 u16 q_number, completed_index, bytes_written, vlan, checksum; 1303 u16 q_number, completed_index, bytes_written, vlan_tci, checksum;
1304 u32 rss_hash; 1304 u32 rss_hash;
1305 1305
1306 if (skipped) 1306 if (skipped)
@@ -1315,7 +1315,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
1315 &type, &color, &q_number, &completed_index, 1315 &type, &color, &q_number, &completed_index,
1316 &ingress_port, &fcoe, &eop, &sop, &rss_type, 1316 &ingress_port, &fcoe, &eop, &sop, &rss_type,
1317 &csum_not_calc, &rss_hash, &bytes_written, 1317 &csum_not_calc, &rss_hash, &bytes_written,
1318 &packet_error, &vlan_stripped, &vlan, &checksum, 1318 &packet_error, &vlan_stripped, &vlan_tci, &checksum,
1319 &fcoe_sof, &fcoe_fc_crc_ok, &fcoe_enc_error, 1319 &fcoe_sof, &fcoe_fc_crc_ok, &fcoe_enc_error,
1320 &fcoe_eof, &tcp_udp_csum_ok, &udp, &tcp, 1320 &fcoe_eof, &tcp_udp_csum_ok, &udp, &tcp,
1321 &ipv4_csum_ok, &ipv6, &ipv4, &ipv4_fragment, 1321 &ipv4_csum_ok, &ipv6, &ipv4, &ipv4_fragment,
@@ -1350,14 +1350,15 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
1350 1350
1351 skb->dev = netdev; 1351 skb->dev = netdev;
1352 1352
1353 if (enic->vlan_group && vlan_stripped) { 1353 if (enic->vlan_group && vlan_stripped &&
1354 (vlan_tci & CQ_ENET_RQ_DESC_VLAN_TCI_VLAN_MASK)) {
1354 1355
1355 if (netdev->features & NETIF_F_GRO) 1356 if (netdev->features & NETIF_F_GRO)
1356 vlan_gro_receive(&enic->napi, enic->vlan_group, 1357 vlan_gro_receive(&enic->napi, enic->vlan_group,
1357 vlan, skb); 1358 vlan_tci, skb);
1358 else 1359 else
1359 vlan_hwaccel_receive_skb(skb, 1360 vlan_hwaccel_receive_skb(skb,
1360 enic->vlan_group, vlan); 1361 enic->vlan_group, vlan_tci);
1361 1362
1362 } else { 1363 } else {
1363 1364
@@ -1879,6 +1880,18 @@ static int enic_set_niccfg(struct enic *enic)
1879 ig_vlan_strip_en); 1880 ig_vlan_strip_en);
1880} 1881}
1881 1882
1883int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic)
1884{
1885 int err;
1886
1887 spin_lock(&enic->devcmd_lock);
1888 err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev,
1889 IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN);
1890 spin_unlock(&enic->devcmd_lock);
1891
1892 return err;
1893}
1894
1882static void enic_reset(struct work_struct *work) 1895static void enic_reset(struct work_struct *work)
1883{ 1896{
1884 struct enic *enic = container_of(work, struct enic, reset); 1897 struct enic *enic = container_of(work, struct enic, reset);
@@ -1898,6 +1911,7 @@ static void enic_reset(struct work_struct *work)
1898 enic_reset_mcaddrs(enic); 1911 enic_reset_mcaddrs(enic);
1899 enic_init_vnic_resources(enic); 1912 enic_init_vnic_resources(enic);
1900 enic_set_niccfg(enic); 1913 enic_set_niccfg(enic);
1914 enic_dev_set_ig_vlan_rewrite_mode(enic);
1901 enic_open(enic->netdev); 1915 enic_open(enic->netdev);
1902 1916
1903 rtnl_unlock(); 1917 rtnl_unlock();
@@ -2110,6 +2124,13 @@ int enic_dev_init(struct enic *enic)
2110 goto err_out_free_vnic_resources; 2124 goto err_out_free_vnic_resources;
2111 } 2125 }
2112 2126
2127 err = enic_dev_set_ig_vlan_rewrite_mode(enic);
2128 if (err) {
2129 printk(KERN_ERR PFX
2130 "Failed to set ingress vlan rewrite mode, aborting.\n");
2131 goto err_out_free_vnic_resources;
2132 }
2133
2113 switch (vnic_dev_get_intr_mode(enic->vdev)) { 2134 switch (vnic_dev_get_intr_mode(enic->vdev)) {
2114 default: 2135 default:
2115 netif_napi_add(netdev, &enic->napi, enic_poll, 64); 2136 netif_napi_add(netdev, &enic->napi, enic_poll, 64);