Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5865d015 authored by David Kilroy's avatar David Kilroy Committed by John W. Linville
Browse files

orinoco: Add hardware function to set multicast mode



No functional change.

Signed-off-by: default avatarDavid Kilroy <kilroyd@googlemail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent cfeb1db6
Loading
Loading
Loading
Loading
+31 −20
Original line number Diff line number Diff line
@@ -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