diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-tx.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index dff60fb70214..1f117a49c569 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -174,7 +174,7 @@ EXPORT_SYMBOL(iwl_tx_queue_free); | |||
174 | * Free all buffers. | 174 | * Free all buffers. |
175 | * 0-fill, but do not free "txq" descriptor structure. | 175 | * 0-fill, but do not free "txq" descriptor structure. |
176 | */ | 176 | */ |
177 | static void iwl_cmd_queue_free(struct iwl_priv *priv) | 177 | void iwl_cmd_queue_free(struct iwl_priv *priv) |
178 | { | 178 | { |
179 | struct iwl_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; | 179 | struct iwl_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; |
180 | struct iwl_queue *q = &txq->q; | 180 | struct iwl_queue *q = &txq->q; |
@@ -193,12 +193,14 @@ static void iwl_cmd_queue_free(struct iwl_priv *priv) | |||
193 | 193 | ||
194 | /* De-alloc circular buffer of TFDs */ | 194 | /* De-alloc circular buffer of TFDs */ |
195 | if (txq->q.n_bd) | 195 | if (txq->q.n_bd) |
196 | pci_free_consistent(dev, sizeof(struct iwl_tfd) * | 196 | pci_free_consistent(dev, priv->hw_params.tfd_size * |
197 | txq->q.n_bd, txq->tfds, txq->q.dma_addr); | 197 | txq->q.n_bd, txq->tfds, txq->q.dma_addr); |
198 | 198 | ||
199 | /* 0-fill queue descriptor structure */ | 199 | /* 0-fill queue descriptor structure */ |
200 | memset(txq, 0, sizeof(*txq)); | 200 | memset(txq, 0, sizeof(*txq)); |
201 | } | 201 | } |
202 | EXPORT_SYMBOL(iwl_cmd_queue_free); | ||
203 | |||
202 | /*************** DMA-QUEUE-GENERAL-FUNCTIONS ***** | 204 | /*************** DMA-QUEUE-GENERAL-FUNCTIONS ***** |
203 | * DMA services | 205 | * DMA services |
204 | * | 206 | * |
@@ -761,8 +763,10 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
761 | hdr->seq_ctrl |= cpu_to_le16(seq_number); | 763 | hdr->seq_ctrl |= cpu_to_le16(seq_number); |
762 | seq_number += 0x10; | 764 | seq_number += 0x10; |
763 | /* aggregation is on for this <sta,tid> */ | 765 | /* aggregation is on for this <sta,tid> */ |
764 | if (info->flags & IEEE80211_TX_CTL_AMPDU) | 766 | if (info->flags & IEEE80211_TX_CTL_AMPDU) { |
765 | txq_id = priv->stations[sta_id].tid[tid].agg.txq_id; | 767 | txq_id = priv->stations[sta_id].tid[tid].agg.txq_id; |
768 | swq_id = iwl_virtual_agg_queue_num(swq_id, txq_id); | ||
769 | } | ||
766 | priv->stations[sta_id].tid[tid].tfds_in_queue++; | 770 | priv->stations[sta_id].tid[tid].tfds_in_queue++; |
767 | } | 771 | } |
768 | 772 | ||
@@ -893,7 +897,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
893 | iwl_txq_update_write_ptr(priv, txq); | 897 | iwl_txq_update_write_ptr(priv, txq); |
894 | spin_unlock_irqrestore(&priv->lock, flags); | 898 | spin_unlock_irqrestore(&priv->lock, flags); |
895 | } else { | 899 | } else { |
896 | ieee80211_stop_queue(priv->hw, txq->swq_id); | 900 | iwl_stop_queue(priv, txq->swq_id); |
897 | } | 901 | } |
898 | } | 902 | } |
899 | 903 | ||
@@ -1221,8 +1225,10 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid) | |||
1221 | 1225 | ||
1222 | sta_id = iwl_find_station(priv, ra); | 1226 | sta_id = iwl_find_station(priv, ra); |
1223 | 1227 | ||
1224 | if (sta_id == IWL_INVALID_STATION) | 1228 | if (sta_id == IWL_INVALID_STATION) { |
1229 | IWL_ERR(priv, "Invalid station for AGG tid %d\n", tid); | ||
1225 | return -ENXIO; | 1230 | return -ENXIO; |
1231 | } | ||
1226 | 1232 | ||
1227 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON) | 1233 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON) |
1228 | IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n"); | 1234 | IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n"); |
@@ -1429,7 +1435,7 @@ void iwl_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
1429 | if ((iwl_queue_space(&txq->q) > txq->q.low_mark) && | 1435 | if ((iwl_queue_space(&txq->q) > txq->q.low_mark) && |
1430 | priv->mac80211_registered && | 1436 | priv->mac80211_registered && |
1431 | (agg->state != IWL_EMPTYING_HW_QUEUE_DELBA)) | 1437 | (agg->state != IWL_EMPTYING_HW_QUEUE_DELBA)) |
1432 | ieee80211_wake_queue(priv->hw, txq->swq_id); | 1438 | iwl_wake_queue(priv, txq->swq_id); |
1433 | 1439 | ||
1434 | iwl_txq_check_empty(priv, sta_id, tid, scd_flow); | 1440 | iwl_txq_check_empty(priv, sta_id, tid, scd_flow); |
1435 | } | 1441 | } |