iwlwifi: map A-MPDU HW queue to mac80211 A-MPDU SW queue
This patch maps A-MPDU HW queue to mac80211 SW queue scheme (as introduced in patch "mac80211: QoS related cleanups"), when trying to perform ieee80211_wake_queue. Signed-off-by: Ron Rindjunsky <ron.rindjunsky@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
07346f81e8
commit
0d0b2c1c49
|
@ -3547,13 +3547,16 @@ static void iwl4965_rx_reply_compressed_ba(struct iwl_priv *priv,
|
||||||
* block-ack window (we assume that they've been successfully
|
* block-ack window (we assume that they've been successfully
|
||||||
* transmitted ... if not, it's too late anyway). */
|
* transmitted ... if not, it's too late anyway). */
|
||||||
if (txq->q.read_ptr != (ba_resp_scd_ssn & 0xff)) {
|
if (txq->q.read_ptr != (ba_resp_scd_ssn & 0xff)) {
|
||||||
|
/* calculate mac80211 ampdu sw queue to wake */
|
||||||
|
int ampdu_q =
|
||||||
|
scd_flow - IWL_BACK_QUEUE_FIRST_ID + priv->hw->queues;
|
||||||
int freed = iwl4965_tx_queue_reclaim(priv, scd_flow, index);
|
int freed = iwl4965_tx_queue_reclaim(priv, scd_flow, index);
|
||||||
priv->stations[ba_resp->sta_id].
|
priv->stations[ba_resp->sta_id].
|
||||||
tid[ba_resp->tid].tfds_in_queue -= freed;
|
tid[ba_resp->tid].tfds_in_queue -= freed;
|
||||||
if (iwl4965_queue_space(&txq->q) > txq->q.low_mark &&
|
if (iwl4965_queue_space(&txq->q) > txq->q.low_mark &&
|
||||||
priv->mac80211_registered &&
|
priv->mac80211_registered &&
|
||||||
agg->state != IWL_EMPTYING_HW_QUEUE_DELBA)
|
agg->state != IWL_EMPTYING_HW_QUEUE_DELBA)
|
||||||
ieee80211_wake_queue(priv->hw, scd_flow);
|
ieee80211_wake_queue(priv->hw, ampdu_q);
|
||||||
iwl4965_check_empty_hw_queue(priv, ba_resp->sta_id,
|
iwl4965_check_empty_hw_queue(priv, ba_resp->sta_id,
|
||||||
ba_resp->tid, scd_flow);
|
ba_resp->tid, scd_flow);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2568,12 +2568,6 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index)
|
||||||
nfreed++;
|
nfreed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (iwl4965_queue_space(q) > q->low_mark && (txq_id >= 0) &&
|
|
||||||
(txq_id != IWL_CMD_QUEUE_NUM) &&
|
|
||||||
priv->mac80211_registered)
|
|
||||||
ieee80211_wake_queue(priv->hw, txq_id); */
|
|
||||||
|
|
||||||
|
|
||||||
return nfreed;
|
return nfreed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2797,7 +2791,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (txq->q.read_ptr != (scd_ssn & 0xff)) {
|
if (txq->q.read_ptr != (scd_ssn & 0xff)) {
|
||||||
int freed;
|
int freed, ampdu_q;
|
||||||
index = iwl_queue_dec_wrap(scd_ssn & 0xff, txq->q.n_bd);
|
index = iwl_queue_dec_wrap(scd_ssn & 0xff, txq->q.n_bd);
|
||||||
IWL_DEBUG_TX_REPLY("Retry scheduler reclaim scd_ssn "
|
IWL_DEBUG_TX_REPLY("Retry scheduler reclaim scd_ssn "
|
||||||
"%d index %d\n", scd_ssn , index);
|
"%d index %d\n", scd_ssn , index);
|
||||||
|
@ -2806,9 +2800,15 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
||||||
|
|
||||||
if (iwl4965_queue_space(&txq->q) > txq->q.low_mark &&
|
if (iwl4965_queue_space(&txq->q) > txq->q.low_mark &&
|
||||||
txq_id >= 0 && priv->mac80211_registered &&
|
txq_id >= 0 && priv->mac80211_registered &&
|
||||||
agg->state != IWL_EMPTYING_HW_QUEUE_DELBA)
|
agg->state != IWL_EMPTYING_HW_QUEUE_DELBA) {
|
||||||
ieee80211_wake_queue(priv->hw, txq_id);
|
/* calculate mac80211 ampdu sw queue to wake */
|
||||||
|
ampdu_q = txq_id - IWL_BACK_QUEUE_FIRST_ID +
|
||||||
|
priv->hw->queues;
|
||||||
|
if (agg->state == IWL_AGG_OFF)
|
||||||
|
ieee80211_wake_queue(priv->hw, txq_id);
|
||||||
|
else
|
||||||
|
ieee80211_wake_queue(priv->hw, ampdu_q);
|
||||||
|
}
|
||||||
iwl4965_check_empty_hw_queue(priv, sta_id, tid, txq_id);
|
iwl4965_check_empty_hw_queue(priv, sta_id, tid, txq_id);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -2833,8 +2833,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
||||||
if (tid != MAX_TID_COUNT)
|
if (tid != MAX_TID_COUNT)
|
||||||
priv->stations[sta_id].tid[tid].tfds_in_queue -= freed;
|
priv->stations[sta_id].tid[tid].tfds_in_queue -= freed;
|
||||||
if (iwl4965_queue_space(&txq->q) > txq->q.low_mark &&
|
if (iwl4965_queue_space(&txq->q) > txq->q.low_mark &&
|
||||||
(txq_id >= 0) &&
|
(txq_id >= 0) && priv->mac80211_registered)
|
||||||
priv->mac80211_registered)
|
|
||||||
ieee80211_wake_queue(priv->hw, txq_id);
|
ieee80211_wake_queue(priv->hw, txq_id);
|
||||||
if (tid != MAX_TID_COUNT)
|
if (tid != MAX_TID_COUNT)
|
||||||
iwl4965_check_empty_hw_queue(priv, sta_id, tid, txq_id);
|
iwl4965_check_empty_hw_queue(priv, sta_id, tid, txq_id);
|
||||||
|
|
Loading…
Reference in New Issue