Skip to content

Commit

Permalink
brcmfmac: set wiphy's addresses to provide valid MACs
Browse files Browse the repository at this point in the history
Broadcom's firmware requires every BSS to use MAC address with unique
last few bits. The amount of bits may depend on a particular firmware,
it was verified to be 2 for BCM43602 one.
If this condition won't be fulfilled firmware will reject such MAC:
brcmfmac: _brcmf_set_mac_address: Setting cur_etheraddr failed, -52

We don't want to simply set addr_mask as it would also disallow using
locally administrated bit. Instead let's build a list of addresses
manually enabling 0x2 bit for extra interfaces.

Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
  • Loading branch information
Rafa? Mi?ecki authored and Kalle Valo committed Jul 21, 2015
1 parent 92cd403 commit e3faa86
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
14 changes: 14 additions & 0 deletions drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -5785,6 +5785,7 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy)

static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
{
struct brcmf_pub *drvr = ifp->drvr;
struct ieee80211_supported_band *band;
__le32 bandlist[3];
u32 n_bands;
Expand All @@ -5798,6 +5799,19 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
if (err)
return err;

for (i = 0; i < wiphy->iface_combinations->max_interfaces &&
i < ARRAY_SIZE(drvr->addresses); i++) {
u8 *addr = drvr->addresses[i].addr;

memcpy(addr, drvr->mac, ETH_ALEN);
if (i) {
addr[0] |= BIT(1);
addr[ETH_ALEN - 1] ^= i;
}
}
wiphy->addresses = drvr->addresses;
wiphy->n_addresses = i;

wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
wiphy->cipher_suites = __wl_cipher_suites;
wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites);
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/brcm80211/brcmfmac/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#ifndef BRCMFMAC_CORE_H
#define BRCMFMAC_CORE_H

#include <net/cfg80211.h>
#include "fweh.h"

#define TOE_TX_CSUM_OL 0x00000001
Expand Down Expand Up @@ -118,6 +119,8 @@ struct brcmf_pub {
/* Multicast data packets sent to dongle */
unsigned long tx_multicast;

struct mac_address addresses[BRCMF_MAX_IFS];

struct brcmf_if *iflist[BRCMF_MAX_IFS];

struct mutex proto_block;
Expand Down

0 comments on commit e3faa86

Please sign in to comment.