aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/mwl8k.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index ba7b8efea778..0b4fa14aa176 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -1539,7 +1539,10 @@ struct mwl8k_cmd_mac_multicast_adr {
1539 __u8 addr[0][ETH_ALEN]; 1539 __u8 addr[0][ETH_ALEN];
1540}; 1540};
1541 1541
1542#define MWL8K_ENABLE_RX_MULTICAST 0x000F 1542#define MWL8K_ENABLE_RX_DIRECTED 0x0001
1543#define MWL8K_ENABLE_RX_MULTICAST 0x0002
1544#define MWL8K_ENABLE_RX_ALL_MULTICAST 0x0004
1545#define MWL8K_ENABLE_RX_BROADCAST 0x0008
1543 1546
1544static struct mwl8k_cmd_pkt * 1547static struct mwl8k_cmd_pkt *
1545__mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw, 1548__mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
@@ -1547,11 +1550,14 @@ __mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
1547{ 1550{
1548 struct mwl8k_priv *priv = hw->priv; 1551 struct mwl8k_priv *priv = hw->priv;
1549 struct mwl8k_cmd_mac_multicast_adr *cmd; 1552 struct mwl8k_cmd_mac_multicast_adr *cmd;
1553 int allmulti;
1550 int size; 1554 int size;
1551 int i;
1552 1555
1553 if (mc_count > priv->num_mcaddrs) 1556 allmulti = 0;
1554 mc_count = priv->num_mcaddrs; 1557 if (mc_count > priv->num_mcaddrs) {
1558 allmulti = 1;
1559 mc_count = 0;
1560 }
1555 1561
1556 size = sizeof(*cmd) + mc_count * ETH_ALEN; 1562 size = sizeof(*cmd) + mc_count * ETH_ALEN;
1557 1563
@@ -1561,16 +1567,24 @@ __mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
1561 1567
1562 cmd->header.code = cpu_to_le16(MWL8K_CMD_MAC_MULTICAST_ADR); 1568 cmd->header.code = cpu_to_le16(MWL8K_CMD_MAC_MULTICAST_ADR);
1563 cmd->header.length = cpu_to_le16(size); 1569 cmd->header.length = cpu_to_le16(size);
1564 cmd->action = cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST); 1570 cmd->action = cpu_to_le16(MWL8K_ENABLE_RX_DIRECTED |
1565 cmd->numaddr = cpu_to_le16(mc_count); 1571 MWL8K_ENABLE_RX_BROADCAST);
1566 1572
1567 for (i = 0; i < mc_count && mclist; i++) { 1573 if (allmulti) {
1568 if (mclist->da_addrlen != ETH_ALEN) { 1574 cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_ALL_MULTICAST);
1569 kfree(cmd); 1575 } else if (mc_count) {
1570 return NULL; 1576 int i;
1577
1578 cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
1579 cmd->numaddr = cpu_to_le16(mc_count);
1580 for (i = 0; i < mc_count && mclist; i++) {
1581 if (mclist->da_addrlen != ETH_ALEN) {
1582 kfree(cmd);
1583 return NULL;
1584 }
1585 memcpy(cmd->addr[i], mclist->da_addr, ETH_ALEN);
1586 mclist = mclist->next;
1571 } 1587 }
1572 memcpy(cmd->addr[i], mclist->da_addr, ETH_ALEN);
1573 mclist = mclist->next;
1574 } 1588 }
1575 1589
1576 return &cmd->header; 1590 return &cmd->header;