|
@@ -1539,7 +1539,10 @@ struct mwl8k_cmd_mac_multicast_adr {
|
|
__u8 addr[0][ETH_ALEN];
|
|
__u8 addr[0][ETH_ALEN];
|
|
};
|
|
};
|
|
|
|
|
|
-#define MWL8K_ENABLE_RX_MULTICAST 0x000F
|
|
|
|
|
|
+#define MWL8K_ENABLE_RX_DIRECTED 0x0001
|
|
|
|
+#define MWL8K_ENABLE_RX_MULTICAST 0x0002
|
|
|
|
+#define MWL8K_ENABLE_RX_ALL_MULTICAST 0x0004
|
|
|
|
+#define MWL8K_ENABLE_RX_BROADCAST 0x0008
|
|
|
|
|
|
static struct mwl8k_cmd_pkt *
|
|
static struct mwl8k_cmd_pkt *
|
|
__mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
|
|
__mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
|
|
@@ -1547,11 +1550,14 @@ __mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
|
|
{
|
|
{
|
|
struct mwl8k_priv *priv = hw->priv;
|
|
struct mwl8k_priv *priv = hw->priv;
|
|
struct mwl8k_cmd_mac_multicast_adr *cmd;
|
|
struct mwl8k_cmd_mac_multicast_adr *cmd;
|
|
|
|
+ int allmulti;
|
|
int size;
|
|
int size;
|
|
- int i;
|
|
|
|
|
|
|
|
- if (mc_count > priv->num_mcaddrs)
|
|
|
|
- mc_count = priv->num_mcaddrs;
|
|
|
|
|
|
+ allmulti = 0;
|
|
|
|
+ if (mc_count > priv->num_mcaddrs) {
|
|
|
|
+ allmulti = 1;
|
|
|
|
+ mc_count = 0;
|
|
|
|
+ }
|
|
|
|
|
|
size = sizeof(*cmd) + mc_count * ETH_ALEN;
|
|
size = sizeof(*cmd) + mc_count * ETH_ALEN;
|
|
|
|
|
|
@@ -1561,16 +1567,24 @@ __mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
|
|
|
|
|
|
cmd->header.code = cpu_to_le16(MWL8K_CMD_MAC_MULTICAST_ADR);
|
|
cmd->header.code = cpu_to_le16(MWL8K_CMD_MAC_MULTICAST_ADR);
|
|
cmd->header.length = cpu_to_le16(size);
|
|
cmd->header.length = cpu_to_le16(size);
|
|
- cmd->action = cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
|
|
|
|
- cmd->numaddr = cpu_to_le16(mc_count);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < mc_count && mclist; i++) {
|
|
|
|
- if (mclist->da_addrlen != ETH_ALEN) {
|
|
|
|
- kfree(cmd);
|
|
|
|
- return NULL;
|
|
|
|
|
|
+ cmd->action = cpu_to_le16(MWL8K_ENABLE_RX_DIRECTED |
|
|
|
|
+ MWL8K_ENABLE_RX_BROADCAST);
|
|
|
|
+
|
|
|
|
+ if (allmulti) {
|
|
|
|
+ cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_ALL_MULTICAST);
|
|
|
|
+ } else if (mc_count) {
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
|
|
|
|
+ cmd->numaddr = cpu_to_le16(mc_count);
|
|
|
|
+ for (i = 0; i < mc_count && mclist; i++) {
|
|
|
|
+ if (mclist->da_addrlen != ETH_ALEN) {
|
|
|
|
+ kfree(cmd);
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
+ memcpy(cmd->addr[i], mclist->da_addr, ETH_ALEN);
|
|
|
|
+ mclist = mclist->next;
|
|
}
|
|
}
|
|
- memcpy(cmd->addr[i], mclist->da_addr, ETH_ALEN);
|
|
|
|
- mclist = mclist->next;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return &cmd->header;
|
|
return &cmd->header;
|