diff options
Diffstat (limited to 'drivers/net/wireless/iwlegacy/iwl-4965-tx.c')
| -rw-r--r-- | drivers/net/wireless/iwlegacy/iwl-4965-tx.c | 28 | 
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c index 5c40502f869..79ac081832f 100644 --- a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c +++ b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c @@ -316,12 +316,18 @@ int iwl4965_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	hdr_len = ieee80211_hdrlen(fc); -	/* Find index into station table for destination station */ -	sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); -	if (sta_id == IWL_INVALID_STATION) { -		IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", -			       hdr->addr1); -		goto drop_unlock; +	/* For management frames use broadcast id to do not break aggregation */ +	if (!ieee80211_is_data(fc)) +		sta_id = ctx->bcast_sta_id; +	else { +		/* Find index into station table for destination station */ +		sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); + +		if (sta_id == IWL_INVALID_STATION) { +			IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", +				       hdr->addr1); +			goto drop_unlock; +		}  	}  	IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); @@ -1127,12 +1133,16 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)  	     q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) {  		tx_info = &txq->txb[txq->q.read_ptr]; -		iwl4965_tx_status(priv, tx_info, -				 txq_id >= IWL4965_FIRST_AMPDU_QUEUE); + +		if (WARN_ON_ONCE(tx_info->skb == NULL)) +			continue;  		hdr = (struct ieee80211_hdr *)tx_info->skb->data; -		if (hdr && ieee80211_is_data_qos(hdr->frame_control)) +		if (ieee80211_is_data_qos(hdr->frame_control))  			nfreed++; + +		iwl4965_tx_status(priv, tx_info, +				 txq_id >= IWL4965_FIRST_AMPDU_QUEUE);  		tx_info->skb = NULL;  		priv->cfg->ops->lib->txq_free_tfd(priv, txq);  |