]> err.no Git - linux-2.6/blobdiff - net/core/dev_mcast.c
[NET]: Fix gen_estimator timer removal race
[linux-2.6] / net / core / dev_mcast.c
index 702907434a47efe3493eba2a373c9d5cdc8fc55e..aa38100601fb31d2c6d73e83ddb30f62d884c45a 100644 (file)
  *     We block accesses to device mc filters with netif_tx_lock.
  */
 
-/*
- *     Update the multicast list into the physical NIC controller.
- */
-
-static void __dev_mc_upload(struct net_device *dev)
-{
-       /* Don't do anything till we up the interface
-        * [dev_open will call this function so the list will
-        * stay sane]
-        */
-
-       if (!(dev->flags&IFF_UP))
-               return;
-
-       /*
-        *      Devices with no set multicast or which have been
-        *      detached don't get set.
-        */
-
-       if (dev->set_multicast_list == NULL ||
-           !netif_device_present(dev))
-               return;
-
-       dev->set_multicast_list(dev);
-}
-
-void dev_mc_upload(struct net_device *dev)
-{
-       netif_tx_lock_bh(dev);
-       __dev_mc_upload(dev);
-       netif_tx_unlock_bh(dev);
-}
-
 /*
  *     Delete a device level multicast
  */
@@ -105,16 +72,15 @@ int dev_mc_delete(struct net_device *dev, void *addr, int alen, int glbl)
        int err;
 
        netif_tx_lock_bh(dev);
-       err = __dev_addr_delete(&dev->mc_list, addr, alen, glbl);
+       err = __dev_addr_delete(&dev->mc_list, &dev->mc_count,
+                               addr, alen, glbl);
        if (!err) {
-               dev->mc_count--;
-
                /*
                 *      We have altered the list, so the card
                 *      loaded filter is now wrong. Fix it
                 */
 
-               __dev_mc_upload(dev);
+               __dev_set_rx_mode(dev);
        }
        netif_tx_unlock_bh(dev);
        return err;
@@ -129,11 +95,9 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl)
        int err;
 
        netif_tx_lock_bh(dev);
-       err = __dev_addr_add(&dev->mc_list, addr, alen, glbl);
-       if (!err) {
-               dev->mc_count++;
-               __dev_mc_upload(dev);
-       }
+       err = __dev_addr_add(&dev->mc_list, &dev->mc_count, addr, alen, glbl);
+       if (!err)
+               __dev_set_rx_mode(dev);
        netif_tx_unlock_bh(dev);
        return err;
 }