fm10k: remove err_no reference in fm10k_mbx.c
[cascardo/linux.git] / drivers / net / ethernet / intel / fm10k / fm10k_netdev.c
index d5b303d..99228bf 100644 (file)
@@ -1,5 +1,5 @@
 /* Intel Ethernet Switch Host Interface Driver
- * Copyright(c) 2013 - 2014 Intel Corporation.
+ * Copyright(c) 2013 - 2015 Intel Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -770,15 +770,15 @@ static int fm10k_update_vid(struct net_device *netdev, u16 vid, bool set)
        if (hw->mac.vlan_override)
                return -EACCES;
 
-       /* if default VLAN is already present do nothing */
-       if (vid == hw->mac.default_vid)
-               return -EBUSY;
-
        /* update active_vlans bitmask */
        set_bit(vid, interface->active_vlans);
        if (!set)
                clear_bit(vid, interface->active_vlans);
 
+       /* if default VLAN is already present do nothing */
+       if (vid == hw->mac.default_vid)
+               return 0;
+
        fm10k_mbx_lock(interface);
 
        /* only need to update the VLAN if not in promiscuous mode */
@@ -923,18 +923,12 @@ static int __fm10k_mc_sync(struct net_device *dev,
        struct fm10k_intfc *interface = netdev_priv(dev);
        struct fm10k_hw *hw = &interface->hw;
        u16 vid, glort = interface->glort;
-       s32 err;
-
-       if (!is_multicast_ether_addr(addr))
-               return -EADDRNOTAVAIL;
 
        /* update table with current entries */
        for (vid = hw->mac.default_vid ? fm10k_find_next_vlan(interface, 0) : 0;
             vid < VLAN_N_VID;
             vid = fm10k_find_next_vlan(interface, vid)) {
-               err = hw->mac.ops.update_mc_addr(hw, glort, addr, vid, sync);
-               if (err)
-                       return err;
+               hw->mac.ops.update_mc_addr(hw, glort, addr, vid, sync);
        }
 
        return 0;
@@ -970,14 +964,7 @@ static void fm10k_set_rx_mode(struct net_device *dev)
 
        fm10k_mbx_lock(interface);
 
-       /* synchronize all of the addresses */
-       if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
-               __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync);
-               if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
-                       __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync);
-       }
-
-       /* if we aren't changing modes there is nothing to do */
+       /* update xcast mode first, but only if it changed */
        if (interface->xcast_mode != xcast_mode) {
                /* update VLAN table */
                if (xcast_mode == FM10K_XCAST_MODE_PROMISC)
@@ -992,6 +979,13 @@ static void fm10k_set_rx_mode(struct net_device *dev)
                interface->xcast_mode = xcast_mode;
        }
 
+       /* synchronize all of the addresses */
+       if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
+               __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync);
+               if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI)
+                       __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync);
+       }
+
        fm10k_mbx_unlock(interface);
 }
 
@@ -1051,6 +1045,9 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
                                           vid, true, 0);
        }
 
+       /* update xcast mode before syncronizing addresses */
+       hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode);
+
        /* synchronize all of the addresses */
        if (xcast_mode != FM10K_XCAST_MODE_PROMISC) {
                __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync);
@@ -1058,9 +1055,6 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface)
                        __dev_mc_sync(netdev, fm10k_mc_sync, fm10k_mc_unsync);
        }
 
-       /* update xcast mode */
-       hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode);
-
        fm10k_mbx_unlock(interface);
 
        /* record updated xcast mode state */
@@ -1126,7 +1120,7 @@ static struct rtnl_link_stats64 *fm10k_get_stats64(struct net_device *netdev,
        }
 
        for (i = 0; i < interface->num_tx_queues; i++) {
-               ring = ACCESS_ONCE(interface->rx_ring[i]);
+               ring = ACCESS_ONCE(interface->tx_ring[i]);
 
                if (!ring)
                        continue;
@@ -1339,8 +1333,7 @@ static void fm10k_dfwd_del_station(struct net_device *dev, void *priv)
        dglort.rss_l = fls(interface->ring_feature[RING_F_RSS].mask);
        dglort.pc_l = fls(interface->ring_feature[RING_F_QOS].mask);
        dglort.glort = interface->glort;
-       if (l2_accel)
-               dglort.shared_l = fls(l2_accel->size);
+       dglort.shared_l = fls(l2_accel->size);
        hw->mac.ops.configure_dglort_map(hw, &dglort);
 
        /* If table is empty remove it */
@@ -1382,6 +1375,9 @@ static const struct net_device_ops fm10k_netdev_ops = {
        .ndo_do_ioctl           = fm10k_ioctl,
        .ndo_dfwd_add_station   = fm10k_dfwd_add_station,
        .ndo_dfwd_del_station   = fm10k_dfwd_del_station,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = fm10k_netpoll,
+#endif
        .ndo_features_check     = fm10k_features_check,
 };