diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmsmac/main.c')
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmsmac/main.c | 92 | 
1 files changed, 35 insertions, 57 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c index 0985925cd3f..8ef02dca8f8 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c @@ -1025,7 +1025,6 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)  static bool  brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)  { -	bool morepending = false;  	struct bcma_device *core;  	struct tx_status txstatus, *txs;  	u32 s1, s2; @@ -1039,23 +1038,20 @@ brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)  	txs = &txstatus;  	core = wlc_hw->d11core;  	*fatal = false; -	s1 = bcma_read32(core, D11REGOFFS(frmtxstatus)); -	while (!(*fatal) -	       && (s1 & TXS_V)) { -		/* !give others some time to run! */ -		if (n >= max_tx_num) { -			morepending = true; -			break; -		} +	while (n < max_tx_num) { +		s1 = bcma_read32(core, D11REGOFFS(frmtxstatus));  		if (s1 == 0xffffffff) {  			brcms_err(core, "wl%d: %s: dead chip\n", wlc_hw->unit,  				  __func__);  			*fatal = true;  			return false;  		} -		s2 = bcma_read32(core, D11REGOFFS(frmtxstatus2)); +		/* only process when valid */ +		if (!(s1 & TXS_V)) +			break; +		s2 = bcma_read32(core, D11REGOFFS(frmtxstatus2));  		txs->status = s1 & TXS_STATUS_MASK;  		txs->frameid = (s1 & TXS_FID_MASK) >> TXS_FID_SHIFT;  		txs->sequence = s2 & TXS_SEQ_MASK; @@ -1063,15 +1059,12 @@ brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)  		txs->lasttxtime = 0;  		*fatal = brcms_c_dotxstatus(wlc_hw->wlc, txs); - -		s1 = bcma_read32(core, D11REGOFFS(frmtxstatus)); +		if (*fatal == true) +			return false;  		n++;  	} -	if (*fatal) -		return false; - -	return morepending; +	return n >= max_tx_num;  }  static void brcms_c_tbtt(struct brcms_c_info *wlc) @@ -3145,8 +3138,7 @@ void brcms_c_reset(struct brcms_c_info *wlc)  	brcms_c_statsupd(wlc);  	/* reset our snapshot of macstat counters */ -	memset((char *)wlc->core->macstat_snapshot, 0, -		sizeof(struct macstat)); +	memset(wlc->core->macstat_snapshot, 0, sizeof(struct macstat));  	brcms_b_reset(wlc->hw);  } @@ -4059,7 +4051,7 @@ void brcms_c_wme_setparams(struct brcms_c_info *wlc, u16 aci,  		return;  	} -	memset((char *)&acp_shm, 0, sizeof(struct shm_acparams)); +	memset(&acp_shm, 0, sizeof(struct shm_acparams));  	/* fill in shm ac params struct */  	acp_shm.txop = params->txop;  	/* convert from units of 32us to us for ucode */ @@ -4775,7 +4767,7 @@ static void brcms_c_bss_default_init(struct brcms_c_info *wlc)  	struct brcms_bss_info *bi = wlc->default_bss;  	/* init default and target BSS with some sane initial values */ -	memset((char *)(bi), 0, sizeof(struct brcms_bss_info)); +	memset(bi, 0, sizeof(*bi));  	bi->beacon_period = BEACON_INTERVAL_DEFAULT;  	/* fill the default channel as the first valid channel @@ -5304,7 +5296,7 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config)  		brcms_c_protection_upd(wlc, BRCMS_PROT_G_USER, gmode);  	/* Clear rateset override */ -	memset(&rs, 0, sizeof(struct brcms_c_rateset)); +	memset(&rs, 0, sizeof(rs));  	switch (gmode) {  	case GMODE_LEGACY_B: @@ -5527,7 +5519,7 @@ int brcms_c_set_rateset(struct brcms_c_info *wlc, struct brcm_rateset *rs)  	if (rs->count > BRCMS_NUMRATES)  		return -ENOBUFS; -	memset(&internal_rs, 0, sizeof(struct brcms_c_rateset)); +	memset(&internal_rs, 0, sizeof(internal_rs));  	/* Copy only legacy rateset section */  	internal_rs.count = rs->count; @@ -5630,7 +5622,7 @@ int brcms_c_module_unregister(struct brcms_pub *pub, const char *name,  	for (i = 0; i < BRCMS_MAXMODULES; i++) {  		if (!strcmp(wlc->modulecb[i].name, name) &&  		    (wlc->modulecb[i].hdl == hdl)) { -			memset(&wlc->modulecb[i], 0, sizeof(struct modulecb)); +			memset(&wlc->modulecb[i], 0, sizeof(wlc->modulecb[i]));  			return 0;  		}  	} @@ -6450,10 +6442,9 @@ brcms_c_d11hdrs_mac80211(struct brcms_c_info *wlc, struct ieee80211_hw *hw,  			if ((txrate[k]->flags & IEEE80211_TX_RC_MCS)  			    && (!is_mcs_rate(rspec[k]))) { -				brcms_err(wlc->hw->d11core, -					  "wl%d: %s: IEEE80211_TX_" -					  "RC_MCS != is_mcs_rate(rspec)\n", -					  wlc->pub->unit, __func__); +				brcms_warn(wlc->hw->d11core, +					   "wl%d: %s: IEEE80211_TX_RC_MCS != is_mcs_rate(rspec)\n", +					   wlc->pub->unit, __func__);  			}  			if (is_mcs_rate(rspec[k])) { @@ -6686,11 +6677,9 @@ brcms_c_d11hdrs_mac80211(struct brcms_c_info *wlc, struct ieee80211_hw *hw,  					(struct ofdm_phy_hdr *) rts_plcp) :  				rts_plcp[0]) << 8;  	} else { -		memset((char *)txh->RTSPhyHeader, 0, D11_PHY_HDR_LEN); -		memset((char *)&txh->rts_frame, 0, -			sizeof(struct ieee80211_rts)); -		memset((char *)txh->RTSPLCPFallback, 0, -		      sizeof(txh->RTSPLCPFallback)); +		memset(txh->RTSPhyHeader, 0, D11_PHY_HDR_LEN); +		memset(&txh->rts_frame, 0, sizeof(struct ieee80211_rts)); +		memset(txh->RTSPLCPFallback, 0, sizeof(txh->RTSPLCPFallback));  		txh->RTSDurFallback = 0;  	} @@ -6845,21 +6834,19 @@ brcms_c_d11hdrs_mac80211(struct brcms_c_info *wlc, struct ieee80211_hw *hw,  					wlc->fragthresh[queue] =  					    (u16) newfragthresh;  			} else { -				brcms_err(wlc->hw->d11core, -					  "wl%d: %s txop invalid " -					  "for rate %d\n", -					  wlc->pub->unit, fifo_names[queue], -					  rspec2rate(rspec[0])); +				brcms_warn(wlc->hw->d11core, +					   "wl%d: %s txop invalid for rate %d\n", +					   wlc->pub->unit, fifo_names[queue], +					   rspec2rate(rspec[0]));  			}  			if (dur > wlc->edcf_txop[ac]) -				brcms_err(wlc->hw->d11core, -					  "wl%d: %s: %s txop " -					  "exceeded phylen %d/%d dur %d/%d\n", -					  wlc->pub->unit, __func__, -					  fifo_names[queue], -					  phylen, wlc->fragthresh[queue], -					  dur, wlc->edcf_txop[ac]); +				brcms_warn(wlc->hw->d11core, +					   "wl%d: %s: %s txop exceeded phylen %d/%d dur %d/%d\n", +					   wlc->pub->unit, __func__, +					   fifo_names[queue], +					   phylen, wlc->fragthresh[queue], +					   dur, wlc->edcf_txop[ac]);  		}  	} @@ -7334,7 +7321,7 @@ brcms_c_bcn_prb_template(struct brcms_c_info *wlc, u16 type,  	*len = hdr_len + body_len;  	/* format PHY and MAC headers */ -	memset((char *)buf, 0, hdr_len); +	memset(buf, 0, hdr_len);  	plcp = (struct cck_phy_hdr *) buf; @@ -7520,25 +7507,16 @@ int brcms_c_get_curband(struct brcms_c_info *wlc)  	return wlc->band->bandunit;  } -void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop) +bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc)  { -	int timeout = 20;  	int i;  	/* Kick DMA to send any pending AMPDU */  	for (i = 0; i < ARRAY_SIZE(wlc->hw->di); i++)  		if (wlc->hw->di[i]) -			dma_txflush(wlc->hw->di[i]); - -	/* wait for queue and DMA fifos to run dry */ -	while (brcms_txpktpendtot(wlc) > 0) { -		brcms_msleep(wlc->wl, 1); - -		if (--timeout == 0) -			break; -	} +			dma_kick_tx(wlc->hw->di[i]); -	WARN_ON_ONCE(timeout == 0); +	return !brcms_txpktpendtot(wlc);  }  void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval)  |