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
					
				
			
		
					 2 changed files with 4 additions and 4 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue