Commit 86416468 authored by Xinming Hu's avatar Xinming Hu Committed by Kalle Valo

mwifiex: set different mac address for interfaces with same bss type

Multiple interfaces with same bss type could affect each other if
they are sharing the same mac address. In this patch, different
mac address is assigned to new interface which have same bss type
with exist interfaces.
Signed-off-by: default avatarXinming Hu <huxm@marvell.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent c3b2f7ca
...@@ -943,13 +943,26 @@ int mwifiex_set_mac_address(struct mwifiex_private *priv, ...@@ -943,13 +943,26 @@ int mwifiex_set_mac_address(struct mwifiex_private *priv,
struct net_device *dev) struct net_device *dev)
{ {
int ret; int ret;
u64 mac_addr; u64 mac_addr, old_mac_addr;
if (priv->bss_type != MWIFIEX_BSS_TYPE_P2P) if (priv->bss_type == MWIFIEX_BSS_TYPE_ANY)
goto done; return -ENOTSUPP;
mac_addr = ether_addr_to_u64(priv->curr_addr); mac_addr = ether_addr_to_u64(priv->curr_addr);
old_mac_addr = mac_addr;
if (priv->bss_type == MWIFIEX_BSS_TYPE_P2P)
mac_addr |= BIT_ULL(MWIFIEX_MAC_LOCAL_ADMIN_BIT); mac_addr |= BIT_ULL(MWIFIEX_MAC_LOCAL_ADMIN_BIT);
if (mwifiex_get_intf_num(priv->adapter, priv->bss_type) > 1) {
/* Set mac address based on bss_type/bss_num */
mac_addr ^= BIT_ULL(priv->bss_type + 8);
mac_addr += priv->bss_num;
}
if (mac_addr == old_mac_addr)
goto done;
u64_to_ether_addr(mac_addr, priv->curr_addr); u64_to_ether_addr(mac_addr, priv->curr_addr);
/* Send request to firmware */ /* Send request to firmware */
...@@ -957,13 +970,14 @@ int mwifiex_set_mac_address(struct mwifiex_private *priv, ...@@ -957,13 +970,14 @@ int mwifiex_set_mac_address(struct mwifiex_private *priv,
HostCmd_ACT_GEN_SET, 0, NULL, true); HostCmd_ACT_GEN_SET, 0, NULL, true);
if (ret) { if (ret) {
u64_to_ether_addr(old_mac_addr, priv->curr_addr);
mwifiex_dbg(priv->adapter, ERROR, mwifiex_dbg(priv->adapter, ERROR,
"set mac address failed: ret=%d\n", ret); "set mac address failed: ret=%d\n", ret);
return ret; return ret;
} }
done: done:
memcpy(dev->dev_addr, priv->curr_addr, ETH_ALEN); ether_addr_copy(dev->dev_addr, priv->curr_addr);
return 0; return 0;
} }
......
...@@ -1280,6 +1280,19 @@ mwifiex_copy_rates(u8 *dest, u32 pos, u8 *src, int len) ...@@ -1280,6 +1280,19 @@ mwifiex_copy_rates(u8 *dest, u32 pos, u8 *src, int len)
return pos; return pos;
} }
/* This function return interface number with the same bss_type.
*/
static inline u8
mwifiex_get_intf_num(struct mwifiex_adapter *adapter, u8 bss_type)
{
u8 i, num = 0;
for (i = 0; i < adapter->priv_num; i++)
if (adapter->priv[i] && adapter->priv[i]->bss_type == bss_type)
num++;
return num;
}
/* /*
* This function returns the correct private structure pointer based * This function returns the correct private structure pointer based
* upon the BSS type and BSS number. * upon the BSS type and BSS number.
......
Markdown is supported
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