orinoco: Add hardware function to set multicast mode

No functional change.

Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/orinoco/main.c b/drivers/net/wireless/orinoco/main.c
index c5aad88..3e20df7 100644
--- a/drivers/net/wireless/orinoco/main.c
+++ b/drivers/net/wireless/orinoco/main.c
@@ -2347,25 +2347,12 @@
 	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 @@
 					   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 @@
 	 * 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 @@
 
 		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 @@
 				   &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