orinoco: Add hardware function to set multicast mode
authorDavid Kilroy <kilroyd@googlemail.com>
Wed, 4 Feb 2009 23:05:54 +0000 (23:05 +0000)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 13 Feb 2009 18:44:29 +0000 (13:44 -0500)
No functional change.

Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/orinoco/main.c

index c5aad88..3e20df7 100644 (file)
@@ -2347,25 +2347,12 @@ static int __orinoco_program_rids(struct net_device *dev)
        return 0;
 }
 
-/* FIXME: return int? */
-static void
-__orinoco_set_multicast_list(struct net_device *dev)
+static int __orinoco_hw_set_multicast_list(struct orinoco_private *priv,
+                                          struct dev_addr_list *mc_list,
+                                          int mc_count, int promisc)
 {
-       struct orinoco_private *priv = netdev_priv(dev);
        hermes_t *hw = &priv->hw;
        int err = 0;
-       int promisc, mc_count;
-
-       /* The Hermes doesn't seem to have an allmulti mode, so we go
-        * into promiscuous mode and let the upper levels deal. */
-       if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) ||
-            (dev->mc_count > MAX_MULTICAST(priv))) {
-               promisc = 1;
-               mc_count = 0;
-       } else {
-               promisc = 0;
-               mc_count = dev->mc_count;
-       }
 
        if (promisc != priv->promiscuous) {
                err = hermes_write_wordrec(hw, USER_BAP,
@@ -2373,7 +2360,7 @@ __orinoco_set_multicast_list(struct net_device *dev)
                                           promisc);
                if (err) {
                        printk(KERN_ERR "%s: Error %d setting PROMISCUOUSMODE to 1.\n",
-                              dev->name, err);
+                              priv->ndev->name, err);
                } else
                        priv->promiscuous = promisc;
        }
@@ -2382,7 +2369,7 @@ __orinoco_set_multicast_list(struct net_device *dev)
         * group address if either we want to multicast, or if we were
         * multicasting and want to stop */
        if (!promisc && (mc_count || priv->mc_count)) {
-               struct dev_mc_list *p = dev->mc_list;
+               struct dev_mc_list *p = mc_list;
                struct hermes_multicast mclist;
                int i;
 
@@ -2398,7 +2385,7 @@ __orinoco_set_multicast_list(struct net_device *dev)
 
                if (p)
                        printk(KERN_WARNING "%s: Multicast list is "
-                              "longer than mc_count\n", dev->name);
+                              "longer than mc_count\n", priv->ndev->name);
 
                err = hermes_write_ltv(hw, USER_BAP,
                                   HERMES_RID_CNFGROUPADDRESSES,
@@ -2406,10 +2393,34 @@ __orinoco_set_multicast_list(struct net_device *dev)
                                   &mclist);
                if (err)
                        printk(KERN_ERR "%s: Error %d setting multicast list.\n",
-                              dev->name, err);
+                              priv->ndev->name, err);
                else
                        priv->mc_count = mc_count;
        }
+       return err;
+}
+
+/* FIXME: return int? */
+static void
+__orinoco_set_multicast_list(struct net_device *dev)
+{
+       struct orinoco_private *priv = netdev_priv(dev);
+       int err = 0;
+       int promisc, mc_count;
+
+       /* The Hermes doesn't seem to have an allmulti mode, so we go
+        * into promiscuous mode and let the upper levels deal. */
+       if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) ||
+           (dev->mc_count > MAX_MULTICAST(priv))) {
+               promisc = 1;
+               mc_count = 0;
+       } else {
+               promisc = 0;
+               mc_count = dev->mc_count;
+       }
+
+       err = __orinoco_hw_set_multicast_list(priv, dev->mc_list, mc_count,
+                                             promisc);
 }
 
 /* This must be called from user context, without locks held - use