]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/enic/enic_main.c
enic: Bug Fix: Change hardware ingress vlan rewrite mode
[net-next-2.6.git] / drivers / net / enic / enic_main.c
index c2b848f58c2962db333e6d11f838671abd05f2b6..7f98af1eb1ea94d1816401088daef853f23d0d18 100644 (file)
@@ -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);