diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/11n_aggr.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/11n_aggr.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/net/wireless/mwifiex/11n_aggr.c b/drivers/net/wireless/mwifiex/11n_aggr.c index 9b983b5cebbd..6183e255e62a 100644 --- a/drivers/net/wireless/mwifiex/11n_aggr.c +++ b/drivers/net/wireless/mwifiex/11n_aggr.c | |||
@@ -170,7 +170,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, | |||
170 | struct mwifiex_adapter *adapter = priv->adapter; | 170 | struct mwifiex_adapter *adapter = priv->adapter; |
171 | struct sk_buff *skb_aggr, *skb_src; | 171 | struct sk_buff *skb_aggr, *skb_src; |
172 | struct mwifiex_txinfo *tx_info_aggr, *tx_info_src; | 172 | struct mwifiex_txinfo *tx_info_aggr, *tx_info_src; |
173 | int pad = 0, ret; | 173 | int pad = 0, aggr_num = 0, ret; |
174 | struct mwifiex_tx_param tx_param; | 174 | struct mwifiex_tx_param tx_param; |
175 | struct txpd *ptx_pd = NULL; | 175 | struct txpd *ptx_pd = NULL; |
176 | struct timeval tv; | 176 | struct timeval tv; |
@@ -184,7 +184,8 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, | |||
184 | } | 184 | } |
185 | 185 | ||
186 | tx_info_src = MWIFIEX_SKB_TXCB(skb_src); | 186 | tx_info_src = MWIFIEX_SKB_TXCB(skb_src); |
187 | skb_aggr = dev_alloc_skb(adapter->tx_buf_size); | 187 | skb_aggr = mwifiex_alloc_dma_align_buf(adapter->tx_buf_size, |
188 | GFP_ATOMIC | GFP_DMA); | ||
188 | if (!skb_aggr) { | 189 | if (!skb_aggr) { |
189 | dev_err(adapter->dev, "%s: alloc skb_aggr\n", __func__); | 190 | dev_err(adapter->dev, "%s: alloc skb_aggr\n", __func__); |
190 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, | 191 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, |
@@ -200,6 +201,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, | |||
200 | 201 | ||
201 | if (tx_info_src->flags & MWIFIEX_BUF_FLAG_TDLS_PKT) | 202 | if (tx_info_src->flags & MWIFIEX_BUF_FLAG_TDLS_PKT) |
202 | tx_info_aggr->flags |= MWIFIEX_BUF_FLAG_TDLS_PKT; | 203 | tx_info_aggr->flags |= MWIFIEX_BUF_FLAG_TDLS_PKT; |
204 | tx_info_aggr->flags |= MWIFIEX_BUF_FLAG_AGGR_PKT; | ||
203 | skb_aggr->priority = skb_src->priority; | 205 | skb_aggr->priority = skb_src->priority; |
204 | 206 | ||
205 | do_gettimeofday(&tv); | 207 | do_gettimeofday(&tv); |
@@ -211,11 +213,9 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, | |||
211 | break; | 213 | break; |
212 | 214 | ||
213 | skb_src = skb_dequeue(&pra_list->skb_head); | 215 | skb_src = skb_dequeue(&pra_list->skb_head); |
214 | |||
215 | pra_list->total_pkt_count--; | 216 | pra_list->total_pkt_count--; |
216 | |||
217 | atomic_dec(&priv->wmm.tx_pkts_queued); | 217 | atomic_dec(&priv->wmm.tx_pkts_queued); |
218 | 218 | aggr_num++; | |
219 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, | 219 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, |
220 | ra_list_flags); | 220 | ra_list_flags); |
221 | mwifiex_11n_form_amsdu_pkt(skb_aggr, skb_src, &pad); | 221 | mwifiex_11n_form_amsdu_pkt(skb_aggr, skb_src, &pad); |
@@ -251,6 +251,12 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv, | |||
251 | ptx_pd = (struct txpd *)skb_aggr->data; | 251 | ptx_pd = (struct txpd *)skb_aggr->data; |
252 | 252 | ||
253 | skb_push(skb_aggr, headroom); | 253 | skb_push(skb_aggr, headroom); |
254 | tx_info_aggr->aggr_num = aggr_num * 2; | ||
255 | if (adapter->data_sent || adapter->tx_lock_flag) { | ||
256 | atomic_add(aggr_num * 2, &adapter->tx_queued); | ||
257 | skb_queue_tail(&adapter->tx_data_q, skb_aggr); | ||
258 | return 0; | ||
259 | } | ||
254 | 260 | ||
255 | if (adapter->iface_type == MWIFIEX_USB) { | 261 | if (adapter->iface_type == MWIFIEX_USB) { |
256 | adapter->data_sent = true; | 262 | adapter->data_sent = true; |