be2net: fix be_vlan_add/rem_vid
authorAjit Khaparde <ajit.khaparde@emulex.com>
Fri, 30 Dec 2011 12:15:12 +0000 (12:15 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 30 Dec 2011 22:19:21 +0000 (17:19 -0500)
1) fix be_vlan_add/rem_vid to return proper status
2) perform appropriate housekeeping if firmware command succeeds.

Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/emulex/benet/be_main.c

index 76f3a98..10f2313 100644 (file)
@@ -817,32 +817,45 @@ static int be_vid_config(struct be_adapter *adapter, bool vf, u32 vf_num)
 static int be_vlan_add_vid(struct net_device *netdev, u16 vid)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
+       int status = 0;
 
-       adapter->vlans_added++;
-       if (!be_physfn(adapter))
-               return 0;
+       if (!be_physfn(adapter)) {
+               status = -EINVAL;
+               goto ret;
+       }
 
        adapter->vlan_tag[vid] = 1;
        if (adapter->vlans_added <= (adapter->max_vlans + 1))
-               be_vid_config(adapter, false, 0);
+               status = be_vid_config(adapter, false, 0);
 
-       return 0;
+       if (!status)
+               adapter->vlans_added++;
+       else
+               adapter->vlan_tag[vid] = 0;
+ret:
+       return status;
 }
 
 static int be_vlan_rem_vid(struct net_device *netdev, u16 vid)
 {
        struct be_adapter *adapter = netdev_priv(netdev);
+       int status = 0;
 
-       adapter->vlans_added--;
-
-       if (!be_physfn(adapter))
-               return 0;
+       if (!be_physfn(adapter)) {
+               status = -EINVAL;
+               goto ret;
+       }
 
        adapter->vlan_tag[vid] = 0;
        if (adapter->vlans_added <= adapter->max_vlans)
-               be_vid_config(adapter, false, 0);
+               status = be_vid_config(adapter, false, 0);
 
-       return 0;
+       if (!status)
+               adapter->vlans_added--;
+       else
+               adapter->vlan_tag[vid] = 1;
+ret:
+       return status;
 }
 
 static void be_set_rx_mode(struct net_device *netdev)