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
......@@ -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
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment