forked from Minki/linux
brcmsmac: allow user-space setting of interface address
The interface address of the wireless device is determined by the permanent address stored in the device. This patch allows it to be overridden from user-space. Reported-by: Maximilian Engelhardt <maxi@daemonizer.de> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Piotr Haber <phaber@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
66578c0a8c
commit
b180b10056
@ -363,6 +363,7 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_bh(&wl->lock);
|
spin_lock_bh(&wl->lock);
|
||||||
|
memcpy(wl->pub->cur_etheraddr, vif->addr, sizeof(vif->addr));
|
||||||
wl->mute_tx = false;
|
wl->mute_tx = false;
|
||||||
brcms_c_mute(wl->wlc, false);
|
brcms_c_mute(wl->wlc, false);
|
||||||
spin_unlock_bh(&wl->lock);
|
spin_unlock_bh(&wl->lock);
|
||||||
|
@ -2473,6 +2473,7 @@ static void brcms_b_tx_fifo_resume(struct brcms_hardware *wlc_hw,
|
|||||||
static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
|
static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
|
||||||
{
|
{
|
||||||
static const u8 null_ether_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
|
static const u8 null_ether_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
|
||||||
|
u8 *ethaddr = wlc_hw->wlc->pub->cur_etheraddr;
|
||||||
|
|
||||||
if (mute_tx) {
|
if (mute_tx) {
|
||||||
/* suspend tx fifos */
|
/* suspend tx fifos */
|
||||||
@ -2482,8 +2483,7 @@ static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
|
|||||||
brcms_b_tx_fifo_suspend(wlc_hw, TX_AC_VI_FIFO);
|
brcms_b_tx_fifo_suspend(wlc_hw, TX_AC_VI_FIFO);
|
||||||
|
|
||||||
/* zero the address match register so we do not send ACKs */
|
/* zero the address match register so we do not send ACKs */
|
||||||
brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET,
|
brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, null_ether_addr);
|
||||||
null_ether_addr);
|
|
||||||
} else {
|
} else {
|
||||||
/* resume tx fifos */
|
/* resume tx fifos */
|
||||||
brcms_b_tx_fifo_resume(wlc_hw, TX_DATA_FIFO);
|
brcms_b_tx_fifo_resume(wlc_hw, TX_DATA_FIFO);
|
||||||
@ -2492,8 +2492,7 @@ static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
|
|||||||
brcms_b_tx_fifo_resume(wlc_hw, TX_AC_VI_FIFO);
|
brcms_b_tx_fifo_resume(wlc_hw, TX_AC_VI_FIFO);
|
||||||
|
|
||||||
/* Restore address */
|
/* Restore address */
|
||||||
brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET,
|
brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, ethaddr);
|
||||||
wlc_hw->etheraddr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wlc_phy_mute_upd(wlc_hw->band->pi, mute_tx, 0);
|
wlc_phy_mute_upd(wlc_hw->band->pi, mute_tx, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user