diff options
Diffstat (limited to 'drivers/net/wireless/p54/fwio.c')
-rw-r--r-- | drivers/net/wireless/p54/fwio.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c index 2fab7d20ffc2..b6a061cbbdec 100644 --- a/drivers/net/wireless/p54/fwio.c +++ b/drivers/net/wireless/p54/fwio.c | |||
@@ -727,3 +727,34 @@ int p54_fetch_statistics(struct p54_common *priv) | |||
727 | p54_tx(priv, skb); | 727 | p54_tx(priv, skb); |
728 | return 0; | 728 | return 0; |
729 | } | 729 | } |
730 | |||
731 | int p54_set_groupfilter(struct p54_common *priv) | ||
732 | { | ||
733 | struct p54_group_address_table *grp; | ||
734 | struct sk_buff *skb; | ||
735 | bool on = false; | ||
736 | |||
737 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*grp), | ||
738 | P54_CONTROL_TYPE_GROUP_ADDRESS_TABLE, GFP_KERNEL); | ||
739 | if (!skb) | ||
740 | return -ENOMEM; | ||
741 | |||
742 | grp = (struct p54_group_address_table *)skb_put(skb, sizeof(*grp)); | ||
743 | |||
744 | on = !(priv->filter_flags & FIF_ALLMULTI) && | ||
745 | (priv->mc_maclist_num > 0 && | ||
746 | priv->mc_maclist_num <= MC_FILTER_ADDRESS_NUM); | ||
747 | |||
748 | if (on) { | ||
749 | grp->filter_enable = cpu_to_le16(1); | ||
750 | grp->num_address = cpu_to_le16(priv->mc_maclist_num); | ||
751 | memcpy(grp->mac_list, priv->mc_maclist, sizeof(grp->mac_list)); | ||
752 | } else { | ||
753 | grp->filter_enable = cpu_to_le16(0); | ||
754 | grp->num_address = cpu_to_le16(0); | ||
755 | memset(grp->mac_list, 0, sizeof(grp->mac_list)); | ||
756 | } | ||
757 | |||
758 | p54_tx(priv, skb); | ||
759 | return 0; | ||
760 | } | ||