Skip to content

Commit

Permalink
orinoco: Add hardware function to set multicast mode
Browse files Browse the repository at this point in the history
No functional change.

Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
David Kilroy authored and John W. Linville committed Feb 13, 2009
1 parent cfeb1db commit 5865d01
Showing 1 changed file with 31 additions and 20 deletions.
51 changes: 31 additions & 20 deletions drivers/net/wireless/orinoco/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2347,33 +2347,20 @@ 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,
HERMES_RID_CNFPROMISCUOUSMODE,
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;
}
Expand All @@ -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;

Expand All @@ -2398,18 +2385,42 @@ __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,
HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN),
&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
Expand Down

0 comments on commit 5865d01

Please sign in to comment.