diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k/base.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/base.c | 23 | 
1 files changed, 14 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index f54dff44ed5..c3119a6caac 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -1735,6 +1735,8 @@ ath5k_beacon_setup(struct ath5k_hw *ah, struct ath5k_buf *bf)  	if (dma_mapping_error(ah->dev, bf->skbaddr)) {  		ATH5K_ERR(ah, "beacon DMA mapping failed\n"); +		dev_kfree_skb_any(skb); +		bf->skb = NULL;  		return -EIO;  	} @@ -1819,8 +1821,6 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif)  	ath5k_txbuf_free_skb(ah, avf->bbuf);  	avf->bbuf->skb = skb;  	ret = ath5k_beacon_setup(ah, avf->bbuf); -	if (ret) -		avf->bbuf->skb = NULL;  out:  	return ret;  } @@ -1840,6 +1840,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)  	struct ath5k_vif *avf;  	struct ath5k_buf *bf;  	struct sk_buff *skb; +	int err;  	ATH5K_DBG_UNLIMIT(ah, ATH5K_DEBUG_BEACON, "in beacon_send\n"); @@ -1888,11 +1889,6 @@ ath5k_beacon_send(struct ath5k_hw *ah)  	avf = (void *)vif->drv_priv;  	bf = avf->bbuf; -	if (unlikely(bf->skb == NULL || ah->opmode == NL80211_IFTYPE_STATION || -		     ah->opmode == NL80211_IFTYPE_MONITOR)) { -		ATH5K_WARN(ah, "bf=%p bf_skb=%p\n", bf, bf ? bf->skb : NULL); -		return; -	}  	/*  	 * Stop any current dma and put the new frame on the queue. @@ -1906,8 +1902,17 @@ ath5k_beacon_send(struct ath5k_hw *ah)  	/* refresh the beacon for AP or MESH mode */  	if (ah->opmode == NL80211_IFTYPE_AP || -	    ah->opmode == NL80211_IFTYPE_MESH_POINT) -		ath5k_beacon_update(ah->hw, vif); +	    ah->opmode == NL80211_IFTYPE_MESH_POINT) { +		err = ath5k_beacon_update(ah->hw, vif); +		if (err) +			return; +	} + +	if (unlikely(bf->skb == NULL || ah->opmode == NL80211_IFTYPE_STATION || +		     ah->opmode == NL80211_IFTYPE_MONITOR)) { +		ATH5K_WARN(ah, "bf=%p bf_skb=%p\n", bf, bf->skb); +		return; +	}  	trace_ath5k_tx(ah, bf->skb, &ah->txqs[ah->bhalq]);  |