GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / net / wireless / ath / ath10k / htt_tx.c
1 /*
2  * Copyright (c) 2005-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #include <linux/etherdevice.h>
19 #include "htt.h"
20 #include "mac.h"
21 #include "hif.h"
22 #include "txrx.h"
23 #include "debug.h"
24
25 static u8 ath10k_htt_tx_txq_calc_size(size_t count)
26 {
27         int exp;
28         int factor;
29
30         exp = 0;
31         factor = count >> 7;
32
33         while (factor >= 64 && exp < 4) {
34                 factor >>= 3;
35                 exp++;
36         }
37
38         if (exp == 4)
39                 return 0xff;
40
41         if (count > 0)
42                 factor = max(1, factor);
43
44         return SM(exp, HTT_TX_Q_STATE_ENTRY_EXP) |
45                SM(factor, HTT_TX_Q_STATE_ENTRY_FACTOR);
46 }
47
48 static void __ath10k_htt_tx_txq_recalc(struct ieee80211_hw *hw,
49                                        struct ieee80211_txq *txq)
50 {
51         struct ath10k *ar = hw->priv;
52         struct ath10k_sta *arsta;
53         struct ath10k_vif *arvif = (void *)txq->vif->drv_priv;
54         unsigned long frame_cnt;
55         unsigned long byte_cnt;
56         int idx;
57         u32 bit;
58         u16 peer_id;
59         u8 tid;
60         u8 count;
61
62         lockdep_assert_held(&ar->htt.tx_lock);
63
64         if (!ar->htt.tx_q_state.enabled)
65                 return;
66
67         if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH_PULL)
68                 return;
69
70         if (txq->sta) {
71                 arsta = (void *)txq->sta->drv_priv;
72                 peer_id = arsta->peer_id;
73         } else {
74                 peer_id = arvif->peer_id;
75         }
76
77         tid = txq->tid;
78         bit = BIT(peer_id % 32);
79         idx = peer_id / 32;
80
81         ieee80211_txq_get_depth(txq, &frame_cnt, &byte_cnt);
82         count = ath10k_htt_tx_txq_calc_size(byte_cnt);
83
84         if (unlikely(peer_id >= ar->htt.tx_q_state.num_peers) ||
85             unlikely(tid >= ar->htt.tx_q_state.num_tids)) {
86                 ath10k_warn(ar, "refusing to update txq for peer_id %hu tid %hhu due to out of bounds\n",
87                             peer_id, tid);
88                 return;
89         }
90
91         ar->htt.tx_q_state.vaddr->count[tid][peer_id] = count;
92         ar->htt.tx_q_state.vaddr->map[tid][idx] &= ~bit;
93         ar->htt.tx_q_state.vaddr->map[tid][idx] |= count ? bit : 0;
94
95         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx txq state update peer_id %hu tid %hhu count %hhu\n",
96                    peer_id, tid, count);
97 }
98
99 static void __ath10k_htt_tx_txq_sync(struct ath10k *ar)
100 {
101         u32 seq;
102         size_t size;
103
104         lockdep_assert_held(&ar->htt.tx_lock);
105
106         if (!ar->htt.tx_q_state.enabled)
107                 return;
108
109         if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH_PULL)
110                 return;
111
112         seq = le32_to_cpu(ar->htt.tx_q_state.vaddr->seq);
113         seq++;
114         ar->htt.tx_q_state.vaddr->seq = cpu_to_le32(seq);
115
116         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx txq state update commit seq %u\n",
117                    seq);
118
119         size = sizeof(*ar->htt.tx_q_state.vaddr);
120         dma_sync_single_for_device(ar->dev,
121                                    ar->htt.tx_q_state.paddr,
122                                    size,
123                                    DMA_TO_DEVICE);
124 }
125
126 void ath10k_htt_tx_txq_recalc(struct ieee80211_hw *hw,
127                               struct ieee80211_txq *txq)
128 {
129         struct ath10k *ar = hw->priv;
130
131         spin_lock_bh(&ar->htt.tx_lock);
132         __ath10k_htt_tx_txq_recalc(hw, txq);
133         spin_unlock_bh(&ar->htt.tx_lock);
134 }
135
136 void ath10k_htt_tx_txq_sync(struct ath10k *ar)
137 {
138         spin_lock_bh(&ar->htt.tx_lock);
139         __ath10k_htt_tx_txq_sync(ar);
140         spin_unlock_bh(&ar->htt.tx_lock);
141 }
142
143 void ath10k_htt_tx_txq_update(struct ieee80211_hw *hw,
144                               struct ieee80211_txq *txq)
145 {
146         struct ath10k *ar = hw->priv;
147
148         spin_lock_bh(&ar->htt.tx_lock);
149         __ath10k_htt_tx_txq_recalc(hw, txq);
150         __ath10k_htt_tx_txq_sync(ar);
151         spin_unlock_bh(&ar->htt.tx_lock);
152 }
153
154 void ath10k_htt_tx_dec_pending(struct ath10k_htt *htt)
155 {
156         lockdep_assert_held(&htt->tx_lock);
157
158         htt->num_pending_tx--;
159         if (htt->num_pending_tx == htt->max_num_pending_tx - 1)
160                 ath10k_mac_tx_unlock(htt->ar, ATH10K_TX_PAUSE_Q_FULL);
161
162         if (htt->num_pending_tx == 0)
163                 wake_up(&htt->empty_tx_wq);
164 }
165
166 int ath10k_htt_tx_inc_pending(struct ath10k_htt *htt)
167 {
168         lockdep_assert_held(&htt->tx_lock);
169
170         if (htt->num_pending_tx >= htt->max_num_pending_tx)
171                 return -EBUSY;
172
173         htt->num_pending_tx++;
174         if (htt->num_pending_tx == htt->max_num_pending_tx)
175                 ath10k_mac_tx_lock(htt->ar, ATH10K_TX_PAUSE_Q_FULL);
176
177         return 0;
178 }
179
180 int ath10k_htt_tx_mgmt_inc_pending(struct ath10k_htt *htt, bool is_mgmt,
181                                    bool is_presp)
182 {
183         struct ath10k *ar = htt->ar;
184
185         lockdep_assert_held(&htt->tx_lock);
186
187         if (!is_mgmt || !ar->hw_params.max_probe_resp_desc_thres)
188                 return 0;
189
190         if (is_presp &&
191             ar->hw_params.max_probe_resp_desc_thres < htt->num_pending_mgmt_tx)
192                 return -EBUSY;
193
194         htt->num_pending_mgmt_tx++;
195
196         return 0;
197 }
198
199 void ath10k_htt_tx_mgmt_dec_pending(struct ath10k_htt *htt)
200 {
201         lockdep_assert_held(&htt->tx_lock);
202
203         if (!htt->ar->hw_params.max_probe_resp_desc_thres)
204                 return;
205
206         htt->num_pending_mgmt_tx--;
207 }
208
209 int ath10k_htt_tx_alloc_msdu_id(struct ath10k_htt *htt, struct sk_buff *skb)
210 {
211         struct ath10k *ar = htt->ar;
212         int ret;
213
214         spin_lock_bh(&htt->tx_lock);
215         ret = idr_alloc(&htt->pending_tx, skb, 0,
216                         htt->max_num_pending_tx, GFP_ATOMIC);
217         spin_unlock_bh(&htt->tx_lock);
218
219         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx alloc msdu_id %d\n", ret);
220
221         return ret;
222 }
223
224 void ath10k_htt_tx_free_msdu_id(struct ath10k_htt *htt, u16 msdu_id)
225 {
226         struct ath10k *ar = htt->ar;
227
228         lockdep_assert_held(&htt->tx_lock);
229
230         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt tx free msdu_id %hu\n", msdu_id);
231
232         idr_remove(&htt->pending_tx, msdu_id);
233 }
234
235 static void ath10k_htt_tx_free_cont_txbuf_32(struct ath10k_htt *htt)
236 {
237         struct ath10k *ar = htt->ar;
238         size_t size;
239
240         if (!htt->txbuf.vaddr_txbuff_32)
241                 return;
242
243         size = htt->txbuf.size;
244         dma_free_coherent(ar->dev, size, htt->txbuf.vaddr_txbuff_32,
245                           htt->txbuf.paddr);
246         htt->txbuf.vaddr_txbuff_32 = NULL;
247 }
248
249 static int ath10k_htt_tx_alloc_cont_txbuf_32(struct ath10k_htt *htt)
250 {
251         struct ath10k *ar = htt->ar;
252         size_t size;
253
254         size = htt->max_num_pending_tx *
255                         sizeof(struct ath10k_htt_txbuf_32);
256
257         htt->txbuf.vaddr_txbuff_32 = dma_alloc_coherent(ar->dev, size,
258                                                         &htt->txbuf.paddr,
259                                                         GFP_KERNEL);
260         if (!htt->txbuf.vaddr_txbuff_32)
261                 return -ENOMEM;
262
263         htt->txbuf.size = size;
264
265         return 0;
266 }
267
268 static void ath10k_htt_tx_free_cont_txbuf_64(struct ath10k_htt *htt)
269 {
270         struct ath10k *ar = htt->ar;
271         size_t size;
272
273         if (!htt->txbuf.vaddr_txbuff_64)
274                 return;
275
276         size = htt->txbuf.size;
277         dma_free_coherent(ar->dev, size, htt->txbuf.vaddr_txbuff_64,
278                           htt->txbuf.paddr);
279         htt->txbuf.vaddr_txbuff_64 = NULL;
280 }
281
282 static int ath10k_htt_tx_alloc_cont_txbuf_64(struct ath10k_htt *htt)
283 {
284         struct ath10k *ar = htt->ar;
285         size_t size;
286
287         size = htt->max_num_pending_tx *
288                         sizeof(struct ath10k_htt_txbuf_64);
289
290         htt->txbuf.vaddr_txbuff_64 = dma_alloc_coherent(ar->dev, size,
291                                                         &htt->txbuf.paddr,
292                                                         GFP_KERNEL);
293         if (!htt->txbuf.vaddr_txbuff_64)
294                 return -ENOMEM;
295
296         htt->txbuf.size = size;
297
298         return 0;
299 }
300
301 static void ath10k_htt_tx_free_cont_frag_desc_32(struct ath10k_htt *htt)
302 {
303         size_t size;
304
305         if (!htt->frag_desc.vaddr_desc_32)
306                 return;
307
308         size = htt->max_num_pending_tx *
309                         sizeof(struct htt_msdu_ext_desc);
310
311         dma_free_coherent(htt->ar->dev,
312                           size,
313                           htt->frag_desc.vaddr_desc_32,
314                           htt->frag_desc.paddr);
315
316         htt->frag_desc.vaddr_desc_32 = NULL;
317 }
318
319 static int ath10k_htt_tx_alloc_cont_frag_desc_32(struct ath10k_htt *htt)
320 {
321         struct ath10k *ar = htt->ar;
322         size_t size;
323
324         if (!ar->hw_params.continuous_frag_desc)
325                 return 0;
326
327         size = htt->max_num_pending_tx *
328                         sizeof(struct htt_msdu_ext_desc);
329         htt->frag_desc.vaddr_desc_32 = dma_alloc_coherent(ar->dev, size,
330                                                           &htt->frag_desc.paddr,
331                                                           GFP_KERNEL);
332         if (!htt->frag_desc.vaddr_desc_32) {
333                 ath10k_err(ar, "failed to alloc fragment desc memory\n");
334                 return -ENOMEM;
335         }
336         htt->frag_desc.size = size;
337
338         return 0;
339 }
340
341 static void ath10k_htt_tx_free_cont_frag_desc_64(struct ath10k_htt *htt)
342 {
343         size_t size;
344
345         if (!htt->frag_desc.vaddr_desc_64)
346                 return;
347
348         size = htt->max_num_pending_tx *
349                         sizeof(struct htt_msdu_ext_desc_64);
350
351         dma_free_coherent(htt->ar->dev,
352                           size,
353                           htt->frag_desc.vaddr_desc_64,
354                           htt->frag_desc.paddr);
355
356         htt->frag_desc.vaddr_desc_64 = NULL;
357 }
358
359 static int ath10k_htt_tx_alloc_cont_frag_desc_64(struct ath10k_htt *htt)
360 {
361         struct ath10k *ar = htt->ar;
362         size_t size;
363
364         if (!ar->hw_params.continuous_frag_desc)
365                 return 0;
366
367         size = htt->max_num_pending_tx *
368                         sizeof(struct htt_msdu_ext_desc_64);
369
370         htt->frag_desc.vaddr_desc_64 = dma_alloc_coherent(ar->dev, size,
371                                                           &htt->frag_desc.paddr,
372                                                           GFP_KERNEL);
373         if (!htt->frag_desc.vaddr_desc_64) {
374                 ath10k_err(ar, "failed to alloc fragment desc memory\n");
375                 return -ENOMEM;
376         }
377         htt->frag_desc.size = size;
378
379         return 0;
380 }
381
382 static void ath10k_htt_tx_free_txq(struct ath10k_htt *htt)
383 {
384         struct ath10k *ar = htt->ar;
385         size_t size;
386
387         if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
388                       ar->running_fw->fw_file.fw_features))
389                 return;
390
391         size = sizeof(*htt->tx_q_state.vaddr);
392
393         dma_unmap_single(ar->dev, htt->tx_q_state.paddr, size, DMA_TO_DEVICE);
394         kfree(htt->tx_q_state.vaddr);
395 }
396
397 static int ath10k_htt_tx_alloc_txq(struct ath10k_htt *htt)
398 {
399         struct ath10k *ar = htt->ar;
400         size_t size;
401         int ret;
402
403         if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
404                       ar->running_fw->fw_file.fw_features))
405                 return 0;
406
407         htt->tx_q_state.num_peers = HTT_TX_Q_STATE_NUM_PEERS;
408         htt->tx_q_state.num_tids = HTT_TX_Q_STATE_NUM_TIDS;
409         htt->tx_q_state.type = HTT_Q_DEPTH_TYPE_BYTES;
410
411         size = sizeof(*htt->tx_q_state.vaddr);
412         htt->tx_q_state.vaddr = kzalloc(size, GFP_KERNEL);
413         if (!htt->tx_q_state.vaddr)
414                 return -ENOMEM;
415
416         htt->tx_q_state.paddr = dma_map_single(ar->dev, htt->tx_q_state.vaddr,
417                                                size, DMA_TO_DEVICE);
418         ret = dma_mapping_error(ar->dev, htt->tx_q_state.paddr);
419         if (ret) {
420                 ath10k_warn(ar, "failed to dma map tx_q_state: %d\n", ret);
421                 kfree(htt->tx_q_state.vaddr);
422                 return -EIO;
423         }
424
425         return 0;
426 }
427
428 static void ath10k_htt_tx_free_txdone_fifo(struct ath10k_htt *htt)
429 {
430         WARN_ON(!kfifo_is_empty(&htt->txdone_fifo));
431         kfifo_free(&htt->txdone_fifo);
432 }
433
434 static int ath10k_htt_tx_alloc_txdone_fifo(struct ath10k_htt *htt)
435 {
436         int ret;
437         size_t size;
438
439         size = roundup_pow_of_two(htt->max_num_pending_tx);
440         ret = kfifo_alloc(&htt->txdone_fifo, size, GFP_KERNEL);
441         return ret;
442 }
443
444 static int ath10k_htt_tx_alloc_buf(struct ath10k_htt *htt)
445 {
446         struct ath10k *ar = htt->ar;
447         int ret;
448
449         ret = ath10k_htt_alloc_txbuff(htt);
450         if (ret) {
451                 ath10k_err(ar, "failed to alloc cont tx buffer: %d\n", ret);
452                 return ret;
453         }
454
455         ret = ath10k_htt_alloc_frag_desc(htt);
456         if (ret) {
457                 ath10k_err(ar, "failed to alloc cont frag desc: %d\n", ret);
458                 goto free_txbuf;
459         }
460
461         ret = ath10k_htt_tx_alloc_txq(htt);
462         if (ret) {
463                 ath10k_err(ar, "failed to alloc txq: %d\n", ret);
464                 goto free_frag_desc;
465         }
466
467         ret = ath10k_htt_tx_alloc_txdone_fifo(htt);
468         if (ret) {
469                 ath10k_err(ar, "failed to alloc txdone fifo: %d\n", ret);
470                 goto free_txq;
471         }
472
473         return 0;
474
475 free_txq:
476         ath10k_htt_tx_free_txq(htt);
477
478 free_frag_desc:
479         ath10k_htt_free_frag_desc(htt);
480
481 free_txbuf:
482         ath10k_htt_free_txbuff(htt);
483
484         return ret;
485 }
486
487 int ath10k_htt_tx_start(struct ath10k_htt *htt)
488 {
489         struct ath10k *ar = htt->ar;
490         int ret;
491
492         ath10k_dbg(ar, ATH10K_DBG_BOOT, "htt tx max num pending tx %d\n",
493                    htt->max_num_pending_tx);
494
495         spin_lock_init(&htt->tx_lock);
496         idr_init(&htt->pending_tx);
497
498         if (htt->tx_mem_allocated)
499                 return 0;
500
501         ret = ath10k_htt_tx_alloc_buf(htt);
502         if (ret)
503                 goto free_idr_pending_tx;
504
505         htt->tx_mem_allocated = true;
506
507         return 0;
508
509 free_idr_pending_tx:
510         idr_destroy(&htt->pending_tx);
511
512         return ret;
513 }
514
515 static int ath10k_htt_tx_clean_up_pending(int msdu_id, void *skb, void *ctx)
516 {
517         struct ath10k *ar = ctx;
518         struct ath10k_htt *htt = &ar->htt;
519         struct htt_tx_done tx_done = {0};
520
521         ath10k_dbg(ar, ATH10K_DBG_HTT, "force cleanup msdu_id %hu\n", msdu_id);
522
523         tx_done.msdu_id = msdu_id;
524         tx_done.status = HTT_TX_COMPL_STATE_DISCARD;
525
526         ath10k_txrx_tx_unref(htt, &tx_done);
527
528         return 0;
529 }
530
531 void ath10k_htt_tx_destroy(struct ath10k_htt *htt)
532 {
533         if (!htt->tx_mem_allocated)
534                 return;
535
536         ath10k_htt_free_txbuff(htt);
537         ath10k_htt_tx_free_txq(htt);
538         ath10k_htt_free_frag_desc(htt);
539         ath10k_htt_tx_free_txdone_fifo(htt);
540         htt->tx_mem_allocated = false;
541 }
542
543 void ath10k_htt_tx_stop(struct ath10k_htt *htt)
544 {
545         idr_for_each(&htt->pending_tx, ath10k_htt_tx_clean_up_pending, htt->ar);
546         idr_destroy(&htt->pending_tx);
547 }
548
549 void ath10k_htt_tx_free(struct ath10k_htt *htt)
550 {
551         ath10k_htt_tx_stop(htt);
552         ath10k_htt_tx_destroy(htt);
553 }
554
555 void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
556 {
557         dev_kfree_skb_any(skb);
558 }
559
560 void ath10k_htt_hif_tx_complete(struct ath10k *ar, struct sk_buff *skb)
561 {
562         dev_kfree_skb_any(skb);
563 }
564 EXPORT_SYMBOL(ath10k_htt_hif_tx_complete);
565
566 int ath10k_htt_h2t_ver_req_msg(struct ath10k_htt *htt)
567 {
568         struct ath10k *ar = htt->ar;
569         struct sk_buff *skb;
570         struct htt_cmd *cmd;
571         int len = 0;
572         int ret;
573
574         len += sizeof(cmd->hdr);
575         len += sizeof(cmd->ver_req);
576
577         skb = ath10k_htc_alloc_skb(ar, len);
578         if (!skb)
579                 return -ENOMEM;
580
581         skb_put(skb, len);
582         cmd = (struct htt_cmd *)skb->data;
583         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_VERSION_REQ;
584
585         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
586         if (ret) {
587                 dev_kfree_skb_any(skb);
588                 return ret;
589         }
590
591         return 0;
592 }
593
594 int ath10k_htt_h2t_stats_req(struct ath10k_htt *htt, u8 mask, u64 cookie)
595 {
596         struct ath10k *ar = htt->ar;
597         struct htt_stats_req *req;
598         struct sk_buff *skb;
599         struct htt_cmd *cmd;
600         int len = 0, ret;
601
602         len += sizeof(cmd->hdr);
603         len += sizeof(cmd->stats_req);
604
605         skb = ath10k_htc_alloc_skb(ar, len);
606         if (!skb)
607                 return -ENOMEM;
608
609         skb_put(skb, len);
610         cmd = (struct htt_cmd *)skb->data;
611         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_STATS_REQ;
612
613         req = &cmd->stats_req;
614
615         memset(req, 0, sizeof(*req));
616
617         /* currently we support only max 8 bit masks so no need to worry
618          * about endian support
619          */
620         req->upload_types[0] = mask;
621         req->reset_types[0] = mask;
622         req->stat_type = HTT_STATS_REQ_CFG_STAT_TYPE_INVALID;
623         req->cookie_lsb = cpu_to_le32(cookie & 0xffffffff);
624         req->cookie_msb = cpu_to_le32((cookie & 0xffffffff00000000ULL) >> 32);
625
626         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
627         if (ret) {
628                 ath10k_warn(ar, "failed to send htt type stats request: %d",
629                             ret);
630                 dev_kfree_skb_any(skb);
631                 return ret;
632         }
633
634         return 0;
635 }
636
637 static int ath10k_htt_send_frag_desc_bank_cfg_32(struct ath10k_htt *htt)
638 {
639         struct ath10k *ar = htt->ar;
640         struct sk_buff *skb;
641         struct htt_cmd *cmd;
642         struct htt_frag_desc_bank_cfg32 *cfg;
643         int ret, size;
644         u8 info;
645
646         if (!ar->hw_params.continuous_frag_desc)
647                 return 0;
648
649         if (!htt->frag_desc.paddr) {
650                 ath10k_warn(ar, "invalid frag desc memory\n");
651                 return -EINVAL;
652         }
653
654         size = sizeof(cmd->hdr) + sizeof(cmd->frag_desc_bank_cfg32);
655         skb = ath10k_htc_alloc_skb(ar, size);
656         if (!skb)
657                 return -ENOMEM;
658
659         skb_put(skb, size);
660         cmd = (struct htt_cmd *)skb->data;
661         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG;
662
663         info = 0;
664         info |= SM(htt->tx_q_state.type,
665                    HTT_FRAG_DESC_BANK_CFG_INFO_Q_STATE_DEPTH_TYPE);
666
667         if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
668                      ar->running_fw->fw_file.fw_features))
669                 info |= HTT_FRAG_DESC_BANK_CFG_INFO_Q_STATE_VALID;
670
671         cfg = &cmd->frag_desc_bank_cfg32;
672         cfg->info = info;
673         cfg->num_banks = 1;
674         cfg->desc_size = sizeof(struct htt_msdu_ext_desc);
675         cfg->bank_base_addrs[0] = __cpu_to_le32(htt->frag_desc.paddr);
676         cfg->bank_id[0].bank_min_id = 0;
677         cfg->bank_id[0].bank_max_id = __cpu_to_le16(htt->max_num_pending_tx -
678                                                     1);
679
680         cfg->q_state.paddr = cpu_to_le32(htt->tx_q_state.paddr);
681         cfg->q_state.num_peers = cpu_to_le16(htt->tx_q_state.num_peers);
682         cfg->q_state.num_tids = cpu_to_le16(htt->tx_q_state.num_tids);
683         cfg->q_state.record_size = HTT_TX_Q_STATE_ENTRY_SIZE;
684         cfg->q_state.record_multiplier = HTT_TX_Q_STATE_ENTRY_MULTIPLIER;
685
686         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt frag desc bank cmd\n");
687
688         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
689         if (ret) {
690                 ath10k_warn(ar, "failed to send frag desc bank cfg request: %d\n",
691                             ret);
692                 dev_kfree_skb_any(skb);
693                 return ret;
694         }
695
696         return 0;
697 }
698
699 static int ath10k_htt_send_frag_desc_bank_cfg_64(struct ath10k_htt *htt)
700 {
701         struct ath10k *ar = htt->ar;
702         struct sk_buff *skb;
703         struct htt_cmd *cmd;
704         struct htt_frag_desc_bank_cfg64 *cfg;
705         int ret, size;
706         u8 info;
707
708         if (!ar->hw_params.continuous_frag_desc)
709                 return 0;
710
711         if (!htt->frag_desc.paddr) {
712                 ath10k_warn(ar, "invalid frag desc memory\n");
713                 return -EINVAL;
714         }
715
716         size = sizeof(cmd->hdr) + sizeof(cmd->frag_desc_bank_cfg64);
717         skb = ath10k_htc_alloc_skb(ar, size);
718         if (!skb)
719                 return -ENOMEM;
720
721         skb_put(skb, size);
722         cmd = (struct htt_cmd *)skb->data;
723         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG;
724
725         info = 0;
726         info |= SM(htt->tx_q_state.type,
727                    HTT_FRAG_DESC_BANK_CFG_INFO_Q_STATE_DEPTH_TYPE);
728
729         if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
730                      ar->running_fw->fw_file.fw_features))
731                 info |= HTT_FRAG_DESC_BANK_CFG_INFO_Q_STATE_VALID;
732
733         cfg = &cmd->frag_desc_bank_cfg64;
734         cfg->info = info;
735         cfg->num_banks = 1;
736         cfg->desc_size = sizeof(struct htt_msdu_ext_desc_64);
737         cfg->bank_base_addrs[0] =  __cpu_to_le64(htt->frag_desc.paddr);
738         cfg->bank_id[0].bank_min_id = 0;
739         cfg->bank_id[0].bank_max_id = __cpu_to_le16(htt->max_num_pending_tx -
740                                                     1);
741
742         cfg->q_state.paddr = cpu_to_le32(htt->tx_q_state.paddr);
743         cfg->q_state.num_peers = cpu_to_le16(htt->tx_q_state.num_peers);
744         cfg->q_state.num_tids = cpu_to_le16(htt->tx_q_state.num_tids);
745         cfg->q_state.record_size = HTT_TX_Q_STATE_ENTRY_SIZE;
746         cfg->q_state.record_multiplier = HTT_TX_Q_STATE_ENTRY_MULTIPLIER;
747
748         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt frag desc bank cmd\n");
749
750         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
751         if (ret) {
752                 ath10k_warn(ar, "failed to send frag desc bank cfg request: %d\n",
753                             ret);
754                 dev_kfree_skb_any(skb);
755                 return ret;
756         }
757
758         return 0;
759 }
760
761 static void ath10k_htt_fill_rx_desc_offset_32(void *rx_ring)
762 {
763         struct htt_rx_ring_setup_ring32 *ring =
764                         (struct htt_rx_ring_setup_ring32 *)rx_ring;
765
766 #define desc_offset(x) (offsetof(struct htt_rx_desc, x) / 4)
767         ring->mac80211_hdr_offset = __cpu_to_le16(desc_offset(rx_hdr_status));
768         ring->msdu_payload_offset = __cpu_to_le16(desc_offset(msdu_payload));
769         ring->ppdu_start_offset = __cpu_to_le16(desc_offset(ppdu_start));
770         ring->ppdu_end_offset = __cpu_to_le16(desc_offset(ppdu_end));
771         ring->mpdu_start_offset = __cpu_to_le16(desc_offset(mpdu_start));
772         ring->mpdu_end_offset = __cpu_to_le16(desc_offset(mpdu_end));
773         ring->msdu_start_offset = __cpu_to_le16(desc_offset(msdu_start));
774         ring->msdu_end_offset = __cpu_to_le16(desc_offset(msdu_end));
775         ring->rx_attention_offset = __cpu_to_le16(desc_offset(attention));
776         ring->frag_info_offset = __cpu_to_le16(desc_offset(frag_info));
777 #undef desc_offset
778 }
779
780 static void ath10k_htt_fill_rx_desc_offset_64(void *rx_ring)
781 {
782         struct htt_rx_ring_setup_ring64 *ring =
783                         (struct htt_rx_ring_setup_ring64 *)rx_ring;
784
785 #define desc_offset(x) (offsetof(struct htt_rx_desc, x) / 4)
786         ring->mac80211_hdr_offset = __cpu_to_le16(desc_offset(rx_hdr_status));
787         ring->msdu_payload_offset = __cpu_to_le16(desc_offset(msdu_payload));
788         ring->ppdu_start_offset = __cpu_to_le16(desc_offset(ppdu_start));
789         ring->ppdu_end_offset = __cpu_to_le16(desc_offset(ppdu_end));
790         ring->mpdu_start_offset = __cpu_to_le16(desc_offset(mpdu_start));
791         ring->mpdu_end_offset = __cpu_to_le16(desc_offset(mpdu_end));
792         ring->msdu_start_offset = __cpu_to_le16(desc_offset(msdu_start));
793         ring->msdu_end_offset = __cpu_to_le16(desc_offset(msdu_end));
794         ring->rx_attention_offset = __cpu_to_le16(desc_offset(attention));
795         ring->frag_info_offset = __cpu_to_le16(desc_offset(frag_info));
796 #undef desc_offset
797 }
798
799 static int ath10k_htt_send_rx_ring_cfg_32(struct ath10k_htt *htt)
800 {
801         struct ath10k *ar = htt->ar;
802         struct sk_buff *skb;
803         struct htt_cmd *cmd;
804         struct htt_rx_ring_setup_ring32 *ring;
805         const int num_rx_ring = 1;
806         u16 flags;
807         u32 fw_idx;
808         int len;
809         int ret;
810
811         /*
812          * the HW expects the buffer to be an integral number of 4-byte
813          * "words"
814          */
815         BUILD_BUG_ON(!IS_ALIGNED(HTT_RX_BUF_SIZE, 4));
816         BUILD_BUG_ON((HTT_RX_BUF_SIZE & HTT_MAX_CACHE_LINE_SIZE_MASK) != 0);
817
818         len = sizeof(cmd->hdr) + sizeof(cmd->rx_setup_32.hdr)
819             + (sizeof(*ring) * num_rx_ring);
820         skb = ath10k_htc_alloc_skb(ar, len);
821         if (!skb)
822                 return -ENOMEM;
823
824         skb_put(skb, len);
825
826         cmd = (struct htt_cmd *)skb->data;
827         ring = &cmd->rx_setup_32.rings[0];
828
829         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_RX_RING_CFG;
830         cmd->rx_setup_32.hdr.num_rings = 1;
831
832         /* FIXME: do we need all of this? */
833         flags = 0;
834         flags |= HTT_RX_RING_FLAGS_MAC80211_HDR;
835         flags |= HTT_RX_RING_FLAGS_MSDU_PAYLOAD;
836         flags |= HTT_RX_RING_FLAGS_PPDU_START;
837         flags |= HTT_RX_RING_FLAGS_PPDU_END;
838         flags |= HTT_RX_RING_FLAGS_MPDU_START;
839         flags |= HTT_RX_RING_FLAGS_MPDU_END;
840         flags |= HTT_RX_RING_FLAGS_MSDU_START;
841         flags |= HTT_RX_RING_FLAGS_MSDU_END;
842         flags |= HTT_RX_RING_FLAGS_RX_ATTENTION;
843         flags |= HTT_RX_RING_FLAGS_FRAG_INFO;
844         flags |= HTT_RX_RING_FLAGS_UNICAST_RX;
845         flags |= HTT_RX_RING_FLAGS_MULTICAST_RX;
846         flags |= HTT_RX_RING_FLAGS_CTRL_RX;
847         flags |= HTT_RX_RING_FLAGS_MGMT_RX;
848         flags |= HTT_RX_RING_FLAGS_NULL_RX;
849         flags |= HTT_RX_RING_FLAGS_PHY_DATA_RX;
850
851         fw_idx = __le32_to_cpu(*htt->rx_ring.alloc_idx.vaddr);
852
853         ring->fw_idx_shadow_reg_paddr =
854                 __cpu_to_le32(htt->rx_ring.alloc_idx.paddr);
855         ring->rx_ring_base_paddr = __cpu_to_le32(htt->rx_ring.base_paddr);
856         ring->rx_ring_len = __cpu_to_le16(htt->rx_ring.size);
857         ring->rx_ring_bufsize = __cpu_to_le16(HTT_RX_BUF_SIZE);
858         ring->flags = __cpu_to_le16(flags);
859         ring->fw_idx_init_val = __cpu_to_le16(fw_idx);
860
861         ath10k_htt_fill_rx_desc_offset_32(ring);
862         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
863         if (ret) {
864                 dev_kfree_skb_any(skb);
865                 return ret;
866         }
867
868         return 0;
869 }
870
871 static int ath10k_htt_send_rx_ring_cfg_64(struct ath10k_htt *htt)
872 {
873         struct ath10k *ar = htt->ar;
874         struct sk_buff *skb;
875         struct htt_cmd *cmd;
876         struct htt_rx_ring_setup_ring64 *ring;
877         const int num_rx_ring = 1;
878         u16 flags;
879         u32 fw_idx;
880         int len;
881         int ret;
882
883         /* HW expects the buffer to be an integral number of 4-byte
884          * "words"
885          */
886         BUILD_BUG_ON(!IS_ALIGNED(HTT_RX_BUF_SIZE, 4));
887         BUILD_BUG_ON((HTT_RX_BUF_SIZE & HTT_MAX_CACHE_LINE_SIZE_MASK) != 0);
888
889         len = sizeof(cmd->hdr) + sizeof(cmd->rx_setup_64.hdr)
890             + (sizeof(*ring) * num_rx_ring);
891         skb = ath10k_htc_alloc_skb(ar, len);
892         if (!skb)
893                 return -ENOMEM;
894
895         skb_put(skb, len);
896
897         cmd = (struct htt_cmd *)skb->data;
898         ring = &cmd->rx_setup_64.rings[0];
899
900         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_RX_RING_CFG;
901         cmd->rx_setup_64.hdr.num_rings = 1;
902
903         flags = 0;
904         flags |= HTT_RX_RING_FLAGS_MAC80211_HDR;
905         flags |= HTT_RX_RING_FLAGS_MSDU_PAYLOAD;
906         flags |= HTT_RX_RING_FLAGS_PPDU_START;
907         flags |= HTT_RX_RING_FLAGS_PPDU_END;
908         flags |= HTT_RX_RING_FLAGS_MPDU_START;
909         flags |= HTT_RX_RING_FLAGS_MPDU_END;
910         flags |= HTT_RX_RING_FLAGS_MSDU_START;
911         flags |= HTT_RX_RING_FLAGS_MSDU_END;
912         flags |= HTT_RX_RING_FLAGS_RX_ATTENTION;
913         flags |= HTT_RX_RING_FLAGS_FRAG_INFO;
914         flags |= HTT_RX_RING_FLAGS_UNICAST_RX;
915         flags |= HTT_RX_RING_FLAGS_MULTICAST_RX;
916         flags |= HTT_RX_RING_FLAGS_CTRL_RX;
917         flags |= HTT_RX_RING_FLAGS_MGMT_RX;
918         flags |= HTT_RX_RING_FLAGS_NULL_RX;
919         flags |= HTT_RX_RING_FLAGS_PHY_DATA_RX;
920
921         fw_idx = __le32_to_cpu(*htt->rx_ring.alloc_idx.vaddr);
922
923         ring->fw_idx_shadow_reg_paddr = __cpu_to_le64(htt->rx_ring.alloc_idx.paddr);
924         ring->rx_ring_base_paddr = __cpu_to_le64(htt->rx_ring.base_paddr);
925         ring->rx_ring_len = __cpu_to_le16(htt->rx_ring.size);
926         ring->rx_ring_bufsize = __cpu_to_le16(HTT_RX_BUF_SIZE);
927         ring->flags = __cpu_to_le16(flags);
928         ring->fw_idx_init_val = __cpu_to_le16(fw_idx);
929
930         ath10k_htt_fill_rx_desc_offset_64(ring);
931         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
932         if (ret) {
933                 dev_kfree_skb_any(skb);
934                 return ret;
935         }
936
937         return 0;
938 }
939
940 int ath10k_htt_h2t_aggr_cfg_msg(struct ath10k_htt *htt,
941                                 u8 max_subfrms_ampdu,
942                                 u8 max_subfrms_amsdu)
943 {
944         struct ath10k *ar = htt->ar;
945         struct htt_aggr_conf *aggr_conf;
946         struct sk_buff *skb;
947         struct htt_cmd *cmd;
948         int len;
949         int ret;
950
951         /* Firmware defaults are: amsdu = 3 and ampdu = 64 */
952
953         if (max_subfrms_ampdu == 0 || max_subfrms_ampdu > 64)
954                 return -EINVAL;
955
956         if (max_subfrms_amsdu == 0 || max_subfrms_amsdu > 31)
957                 return -EINVAL;
958
959         len = sizeof(cmd->hdr);
960         len += sizeof(cmd->aggr_conf);
961
962         skb = ath10k_htc_alloc_skb(ar, len);
963         if (!skb)
964                 return -ENOMEM;
965
966         skb_put(skb, len);
967         cmd = (struct htt_cmd *)skb->data;
968         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_AGGR_CFG;
969
970         aggr_conf = &cmd->aggr_conf;
971         aggr_conf->max_num_ampdu_subframes = max_subfrms_ampdu;
972         aggr_conf->max_num_amsdu_subframes = max_subfrms_amsdu;
973
974         ath10k_dbg(ar, ATH10K_DBG_HTT, "htt h2t aggr cfg msg amsdu %d ampdu %d",
975                    aggr_conf->max_num_amsdu_subframes,
976                    aggr_conf->max_num_ampdu_subframes);
977
978         ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
979         if (ret) {
980                 dev_kfree_skb_any(skb);
981                 return ret;
982         }
983
984         return 0;
985 }
986
987 int ath10k_htt_tx_fetch_resp(struct ath10k *ar,
988                              __le32 token,
989                              __le16 fetch_seq_num,
990                              struct htt_tx_fetch_record *records,
991                              size_t num_records)
992 {
993         struct sk_buff *skb;
994         struct htt_cmd *cmd;
995         const u16 resp_id = 0;
996         int len = 0;
997         int ret;
998
999         /* Response IDs are echo-ed back only for host driver convienence
1000          * purposes. They aren't used for anything in the driver yet so use 0.
1001          */
1002
1003         len += sizeof(cmd->hdr);
1004         len += sizeof(cmd->tx_fetch_resp);
1005         len += sizeof(cmd->tx_fetch_resp.records[0]) * num_records;
1006
1007         skb = ath10k_htc_alloc_skb(ar, len);
1008         if (!skb)
1009                 return -ENOMEM;
1010
1011         skb_put(skb, len);
1012         cmd = (struct htt_cmd *)skb->data;
1013         cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FETCH_RESP;
1014         cmd->tx_fetch_resp.resp_id = cpu_to_le16(resp_id);
1015         cmd->tx_fetch_resp.fetch_seq_num = fetch_seq_num;
1016         cmd->tx_fetch_resp.num_records = cpu_to_le16(num_records);
1017         cmd->tx_fetch_resp.token = token;
1018
1019         memcpy(cmd->tx_fetch_resp.records, records,
1020                sizeof(records[0]) * num_records);
1021
1022         ret = ath10k_htc_send(&ar->htc, ar->htt.eid, skb);
1023         if (ret) {
1024                 ath10k_warn(ar, "failed to submit htc command: %d\n", ret);
1025                 goto err_free_skb;
1026         }
1027
1028         return 0;
1029
1030 err_free_skb:
1031         dev_kfree_skb_any(skb);
1032
1033         return ret;
1034 }
1035
1036 static u8 ath10k_htt_tx_get_vdev_id(struct ath10k *ar, struct sk_buff *skb)
1037 {
1038         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1039         struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
1040         struct ath10k_vif *arvif;
1041
1042         if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
1043                 return ar->scan.vdev_id;
1044         } else if (cb->vif) {
1045                 arvif = (void *)cb->vif->drv_priv;
1046                 return arvif->vdev_id;
1047         } else if (ar->monitor_started) {
1048                 return ar->monitor_vdev_id;
1049         } else {
1050                 return 0;
1051         }
1052 }
1053
1054 static u8 ath10k_htt_tx_get_tid(struct sk_buff *skb, bool is_eth)
1055 {
1056         struct ieee80211_hdr *hdr = (void *)skb->data;
1057         struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
1058
1059         if (!is_eth && ieee80211_is_mgmt(hdr->frame_control))
1060                 return HTT_DATA_TX_EXT_TID_MGMT;
1061         else if (cb->flags & ATH10K_SKB_F_QOS)
1062                 return skb->priority & IEEE80211_QOS_CTL_TID_MASK;
1063         else
1064                 return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1065 }
1066
1067 int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
1068 {
1069         struct ath10k *ar = htt->ar;
1070         struct device *dev = ar->dev;
1071         struct sk_buff *txdesc = NULL;
1072         struct htt_cmd *cmd;
1073         struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
1074         u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
1075         int len = 0;
1076         int msdu_id = -1;
1077         int res;
1078         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
1079
1080         len += sizeof(cmd->hdr);
1081         len += sizeof(cmd->mgmt_tx);
1082
1083         res = ath10k_htt_tx_alloc_msdu_id(htt, msdu);
1084         if (res < 0)
1085                 goto err;
1086
1087         msdu_id = res;
1088
1089         if ((ieee80211_is_action(hdr->frame_control) ||
1090              ieee80211_is_deauth(hdr->frame_control) ||
1091              ieee80211_is_disassoc(hdr->frame_control)) &&
1092              ieee80211_has_protected(hdr->frame_control)) {
1093                 skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
1094         }
1095
1096         txdesc = ath10k_htc_alloc_skb(ar, len);
1097         if (!txdesc) {
1098                 res = -ENOMEM;
1099                 goto err_free_msdu_id;
1100         }
1101
1102         skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
1103                                        DMA_TO_DEVICE);
1104         res = dma_mapping_error(dev, skb_cb->paddr);
1105         if (res) {
1106                 res = -EIO;
1107                 goto err_free_txdesc;
1108         }
1109
1110         skb_put(txdesc, len);
1111         cmd = (struct htt_cmd *)txdesc->data;
1112         memset(cmd, 0, len);
1113
1114         cmd->hdr.msg_type         = HTT_H2T_MSG_TYPE_MGMT_TX;
1115         cmd->mgmt_tx.msdu_paddr = __cpu_to_le32(ATH10K_SKB_CB(msdu)->paddr);
1116         cmd->mgmt_tx.len        = __cpu_to_le32(msdu->len);
1117         cmd->mgmt_tx.desc_id    = __cpu_to_le32(msdu_id);
1118         cmd->mgmt_tx.vdev_id    = __cpu_to_le32(vdev_id);
1119         memcpy(cmd->mgmt_tx.hdr, msdu->data,
1120                min_t(int, msdu->len, HTT_MGMT_FRM_HDR_DOWNLOAD_LEN));
1121
1122         res = ath10k_htc_send(&htt->ar->htc, htt->eid, txdesc);
1123         if (res)
1124                 goto err_unmap_msdu;
1125
1126         return 0;
1127
1128 err_unmap_msdu:
1129         dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
1130 err_free_txdesc:
1131         dev_kfree_skb_any(txdesc);
1132 err_free_msdu_id:
1133         spin_lock_bh(&htt->tx_lock);
1134         ath10k_htt_tx_free_msdu_id(htt, msdu_id);
1135         spin_unlock_bh(&htt->tx_lock);
1136 err:
1137         return res;
1138 }
1139
1140 static int ath10k_htt_tx_32(struct ath10k_htt *htt,
1141                             enum ath10k_hw_txrx_mode txmode,
1142                             struct sk_buff *msdu)
1143 {
1144         struct ath10k *ar = htt->ar;
1145         struct device *dev = ar->dev;
1146         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
1147         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
1148         struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
1149         struct ath10k_hif_sg_item sg_items[2];
1150         struct ath10k_htt_txbuf_32 *txbuf;
1151         struct htt_data_tx_desc_frag *frags;
1152         bool is_eth = (txmode == ATH10K_HW_TXRX_ETHERNET);
1153         u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
1154         u8 tid = ath10k_htt_tx_get_tid(msdu, is_eth);
1155         int prefetch_len;
1156         int res;
1157         u8 flags0 = 0;
1158         u16 msdu_id, flags1 = 0;
1159         u16 freq = 0;
1160         u32 frags_paddr = 0;
1161         u32 txbuf_paddr;
1162         struct htt_msdu_ext_desc *ext_desc = NULL;
1163         struct htt_msdu_ext_desc *ext_desc_t = NULL;
1164
1165         res = ath10k_htt_tx_alloc_msdu_id(htt, msdu);
1166         if (res < 0)
1167                 goto err;
1168
1169         msdu_id = res;
1170
1171         prefetch_len = min(htt->prefetch_len, msdu->len);
1172         prefetch_len = roundup(prefetch_len, 4);
1173
1174         txbuf = htt->txbuf.vaddr_txbuff_32 + msdu_id;
1175         txbuf_paddr = htt->txbuf.paddr +
1176                       (sizeof(struct ath10k_htt_txbuf_32) * msdu_id);
1177
1178         if ((ieee80211_is_action(hdr->frame_control) ||
1179              ieee80211_is_deauth(hdr->frame_control) ||
1180              ieee80211_is_disassoc(hdr->frame_control)) &&
1181              ieee80211_has_protected(hdr->frame_control)) {
1182                 skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
1183         } else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
1184                    txmode == ATH10K_HW_TXRX_RAW &&
1185                    ieee80211_has_protected(hdr->frame_control)) {
1186                 skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
1187         }
1188
1189         skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
1190                                        DMA_TO_DEVICE);
1191         res = dma_mapping_error(dev, skb_cb->paddr);
1192         if (res) {
1193                 res = -EIO;
1194                 goto err_free_msdu_id;
1195         }
1196
1197         if (unlikely(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN))
1198                 freq = ar->scan.roc_freq;
1199
1200         switch (txmode) {
1201         case ATH10K_HW_TXRX_RAW:
1202         case ATH10K_HW_TXRX_NATIVE_WIFI:
1203                 flags0 |= HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT;
1204                 /* fall through */
1205         case ATH10K_HW_TXRX_ETHERNET:
1206                 if (ar->hw_params.continuous_frag_desc) {
1207                         ext_desc_t = htt->frag_desc.vaddr_desc_32;
1208                         memset(&ext_desc_t[msdu_id], 0,
1209                                sizeof(struct htt_msdu_ext_desc));
1210                         frags = (struct htt_data_tx_desc_frag *)
1211                                 &ext_desc_t[msdu_id].frags;
1212                         ext_desc = &ext_desc_t[msdu_id];
1213                         frags[0].tword_addr.paddr_lo =
1214                                 __cpu_to_le32(skb_cb->paddr);
1215                         frags[0].tword_addr.paddr_hi = 0;
1216                         frags[0].tword_addr.len_16 = __cpu_to_le16(msdu->len);
1217
1218                         frags_paddr =  htt->frag_desc.paddr +
1219                                 (sizeof(struct htt_msdu_ext_desc) * msdu_id);
1220                 } else {
1221                         frags = txbuf->frags;
1222                         frags[0].dword_addr.paddr =
1223                                 __cpu_to_le32(skb_cb->paddr);
1224                         frags[0].dword_addr.len = __cpu_to_le32(msdu->len);
1225                         frags[1].dword_addr.paddr = 0;
1226                         frags[1].dword_addr.len = 0;
1227
1228                         frags_paddr = txbuf_paddr;
1229                 }
1230                 flags0 |= SM(txmode, HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
1231                 break;
1232         case ATH10K_HW_TXRX_MGMT:
1233                 flags0 |= SM(ATH10K_HW_TXRX_MGMT,
1234                              HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
1235                 flags0 |= HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT;
1236
1237                 frags_paddr = skb_cb->paddr;
1238                 break;
1239         }
1240
1241         /* Normally all commands go through HTC which manages tx credits for
1242          * each endpoint and notifies when tx is completed.
1243          *
1244          * HTT endpoint is creditless so there's no need to care about HTC
1245          * flags. In that case it is trivial to fill the HTC header here.
1246          *
1247          * MSDU transmission is considered completed upon HTT event. This
1248          * implies no relevant resources can be freed until after the event is
1249          * received. That's why HTC tx completion handler itself is ignored by
1250          * setting NULL to transfer_context for all sg items.
1251          *
1252          * There is simply no point in pushing HTT TX_FRM through HTC tx path
1253          * as it's a waste of resources. By bypassing HTC it is possible to
1254          * avoid extra memory allocations, compress data structures and thus
1255          * improve performance.
1256          */
1257
1258         txbuf->htc_hdr.eid = htt->eid;
1259         txbuf->htc_hdr.len = __cpu_to_le16(sizeof(txbuf->cmd_hdr) +
1260                                            sizeof(txbuf->cmd_tx) +
1261                                            prefetch_len);
1262         txbuf->htc_hdr.flags = 0;
1263
1264         if (skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT)
1265                 flags0 |= HTT_DATA_TX_DESC_FLAGS0_NO_ENCRYPT;
1266
1267         flags1 |= SM((u16)vdev_id, HTT_DATA_TX_DESC_FLAGS1_VDEV_ID);
1268         flags1 |= SM((u16)tid, HTT_DATA_TX_DESC_FLAGS1_EXT_TID);
1269         if (msdu->ip_summed == CHECKSUM_PARTIAL &&
1270             !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
1271                 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD;
1272                 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD;
1273                 if (ar->hw_params.continuous_frag_desc)
1274                         ext_desc->flags |= HTT_MSDU_CHECKSUM_ENABLE;
1275         }
1276
1277         /* Prevent firmware from sending up tx inspection requests. There's
1278          * nothing ath10k can do with frames requested for inspection so force
1279          * it to simply rely a regular tx completion with discard status.
1280          */
1281         flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED;
1282
1283         txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM;
1284         txbuf->cmd_tx.flags0 = flags0;
1285         txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1);
1286         txbuf->cmd_tx.len = __cpu_to_le16(msdu->len);
1287         txbuf->cmd_tx.id = __cpu_to_le16(msdu_id);
1288         txbuf->cmd_tx.frags_paddr = __cpu_to_le32(frags_paddr);
1289         if (ath10k_mac_tx_frm_has_freq(ar)) {
1290                 txbuf->cmd_tx.offchan_tx.peerid =
1291                                 __cpu_to_le16(HTT_INVALID_PEERID);
1292                 txbuf->cmd_tx.offchan_tx.freq =
1293                                 __cpu_to_le16(freq);
1294         } else {
1295                 txbuf->cmd_tx.peerid =
1296                                 __cpu_to_le32(HTT_INVALID_PEERID);
1297         }
1298
1299         trace_ath10k_htt_tx(ar, msdu_id, msdu->len, vdev_id, tid);
1300         ath10k_dbg(ar, ATH10K_DBG_HTT,
1301                    "htt tx flags0 %hhu flags1 %hu len %d id %hu frags_paddr %pad, msdu_paddr %pad vdev %hhu tid %hhu freq %hu\n",
1302                    flags0, flags1, msdu->len, msdu_id, &frags_paddr,
1303                    &skb_cb->paddr, vdev_id, tid, freq);
1304         ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL, "htt tx msdu: ",
1305                         msdu->data, msdu->len);
1306         trace_ath10k_tx_hdr(ar, msdu->data, msdu->len);
1307         trace_ath10k_tx_payload(ar, msdu->data, msdu->len);
1308
1309         sg_items[0].transfer_id = 0;
1310         sg_items[0].transfer_context = NULL;
1311         sg_items[0].vaddr = &txbuf->htc_hdr;
1312         sg_items[0].paddr = txbuf_paddr +
1313                             sizeof(txbuf->frags);
1314         sg_items[0].len = sizeof(txbuf->htc_hdr) +
1315                           sizeof(txbuf->cmd_hdr) +
1316                           sizeof(txbuf->cmd_tx);
1317
1318         sg_items[1].transfer_id = 0;
1319         sg_items[1].transfer_context = NULL;
1320         sg_items[1].vaddr = msdu->data;
1321         sg_items[1].paddr = skb_cb->paddr;
1322         sg_items[1].len = prefetch_len;
1323
1324         res = ath10k_hif_tx_sg(htt->ar,
1325                                htt->ar->htc.endpoint[htt->eid].ul_pipe_id,
1326                                sg_items, ARRAY_SIZE(sg_items));
1327         if (res)
1328                 goto err_unmap_msdu;
1329
1330         return 0;
1331
1332 err_unmap_msdu:
1333         dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
1334 err_free_msdu_id:
1335         spin_lock_bh(&htt->tx_lock);
1336         ath10k_htt_tx_free_msdu_id(htt, msdu_id);
1337         spin_unlock_bh(&htt->tx_lock);
1338 err:
1339         return res;
1340 }
1341
1342 static int ath10k_htt_tx_64(struct ath10k_htt *htt,
1343                             enum ath10k_hw_txrx_mode txmode,
1344                             struct sk_buff *msdu)
1345 {
1346         struct ath10k *ar = htt->ar;
1347         struct device *dev = ar->dev;
1348         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
1349         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
1350         struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
1351         struct ath10k_hif_sg_item sg_items[2];
1352         struct ath10k_htt_txbuf_64 *txbuf;
1353         struct htt_data_tx_desc_frag *frags;
1354         bool is_eth = (txmode == ATH10K_HW_TXRX_ETHERNET);
1355         u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
1356         u8 tid = ath10k_htt_tx_get_tid(msdu, is_eth);
1357         int prefetch_len;
1358         int res;
1359         u8 flags0 = 0;
1360         u16 msdu_id, flags1 = 0;
1361         u16 freq = 0;
1362         dma_addr_t frags_paddr = 0;
1363         u32 txbuf_paddr;
1364         struct htt_msdu_ext_desc_64 *ext_desc = NULL;
1365         struct htt_msdu_ext_desc_64 *ext_desc_t = NULL;
1366
1367         res = ath10k_htt_tx_alloc_msdu_id(htt, msdu);
1368         if (res < 0)
1369                 goto err;
1370
1371         msdu_id = res;
1372
1373         prefetch_len = min(htt->prefetch_len, msdu->len);
1374         prefetch_len = roundup(prefetch_len, 4);
1375
1376         txbuf = htt->txbuf.vaddr_txbuff_64 + msdu_id;
1377         txbuf_paddr = htt->txbuf.paddr +
1378                       (sizeof(struct ath10k_htt_txbuf_64) * msdu_id);
1379
1380         if ((ieee80211_is_action(hdr->frame_control) ||
1381              ieee80211_is_deauth(hdr->frame_control) ||
1382              ieee80211_is_disassoc(hdr->frame_control)) &&
1383              ieee80211_has_protected(hdr->frame_control)) {
1384                 skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
1385         } else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
1386                    txmode == ATH10K_HW_TXRX_RAW &&
1387                    ieee80211_has_protected(hdr->frame_control)) {
1388                 skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
1389         }
1390
1391         skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
1392                                        DMA_TO_DEVICE);
1393         res = dma_mapping_error(dev, skb_cb->paddr);
1394         if (res) {
1395                 res = -EIO;
1396                 goto err_free_msdu_id;
1397         }
1398
1399         if (unlikely(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN))
1400                 freq = ar->scan.roc_freq;
1401
1402         switch (txmode) {
1403         case ATH10K_HW_TXRX_RAW:
1404         case ATH10K_HW_TXRX_NATIVE_WIFI:
1405                 flags0 |= HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT;
1406                 /* fall through */
1407         case ATH10K_HW_TXRX_ETHERNET:
1408                 if (ar->hw_params.continuous_frag_desc) {
1409                         ext_desc_t = htt->frag_desc.vaddr_desc_64;
1410                         memset(&ext_desc_t[msdu_id], 0,
1411                                sizeof(struct htt_msdu_ext_desc_64));
1412                         frags = (struct htt_data_tx_desc_frag *)
1413                                 &ext_desc_t[msdu_id].frags;
1414                         ext_desc = &ext_desc_t[msdu_id];
1415                         frags[0].tword_addr.paddr_lo =
1416                                 __cpu_to_le32(skb_cb->paddr);
1417                         frags[0].tword_addr.paddr_hi =
1418                                 __cpu_to_le16(upper_32_bits(skb_cb->paddr));
1419                         frags[0].tword_addr.len_16 = __cpu_to_le16(msdu->len);
1420
1421                         frags_paddr =  htt->frag_desc.paddr +
1422                            (sizeof(struct htt_msdu_ext_desc_64) * msdu_id);
1423                 } else {
1424                         frags = txbuf->frags;
1425                         frags[0].tword_addr.paddr_lo =
1426                                                 __cpu_to_le32(skb_cb->paddr);
1427                         frags[0].tword_addr.paddr_hi =
1428                                 __cpu_to_le16(upper_32_bits(skb_cb->paddr));
1429                         frags[0].tword_addr.len_16 = __cpu_to_le16(msdu->len);
1430                         frags[1].tword_addr.paddr_lo = 0;
1431                         frags[1].tword_addr.paddr_hi = 0;
1432                         frags[1].tword_addr.len_16 = 0;
1433                 }
1434                 flags0 |= SM(txmode, HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
1435                 break;
1436         case ATH10K_HW_TXRX_MGMT:
1437                 flags0 |= SM(ATH10K_HW_TXRX_MGMT,
1438                              HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
1439                 flags0 |= HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT;
1440
1441                 frags_paddr = skb_cb->paddr;
1442                 break;
1443         }
1444
1445         /* Normally all commands go through HTC which manages tx credits for
1446          * each endpoint and notifies when tx is completed.
1447          *
1448          * HTT endpoint is creditless so there's no need to care about HTC
1449          * flags. In that case it is trivial to fill the HTC header here.
1450          *
1451          * MSDU transmission is considered completed upon HTT event. This
1452          * implies no relevant resources can be freed until after the event is
1453          * received. That's why HTC tx completion handler itself is ignored by
1454          * setting NULL to transfer_context for all sg items.
1455          *
1456          * There is simply no point in pushing HTT TX_FRM through HTC tx path
1457          * as it's a waste of resources. By bypassing HTC it is possible to
1458          * avoid extra memory allocations, compress data structures and thus
1459          * improve performance.
1460          */
1461
1462         txbuf->htc_hdr.eid = htt->eid;
1463         txbuf->htc_hdr.len = __cpu_to_le16(sizeof(txbuf->cmd_hdr) +
1464                                            sizeof(txbuf->cmd_tx) +
1465                                            prefetch_len);
1466         txbuf->htc_hdr.flags = 0;
1467
1468         if (skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT)
1469                 flags0 |= HTT_DATA_TX_DESC_FLAGS0_NO_ENCRYPT;
1470
1471         flags1 |= SM((u16)vdev_id, HTT_DATA_TX_DESC_FLAGS1_VDEV_ID);
1472         flags1 |= SM((u16)tid, HTT_DATA_TX_DESC_FLAGS1_EXT_TID);
1473         if (msdu->ip_summed == CHECKSUM_PARTIAL &&
1474             !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
1475                 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD;
1476                 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD;
1477                 if (ar->hw_params.continuous_frag_desc) {
1478                         memset(ext_desc->tso_flag, 0, sizeof(ext_desc->tso_flag));
1479                         ext_desc->tso_flag[3] |=
1480                                 __cpu_to_le32(HTT_MSDU_CHECKSUM_ENABLE_64);
1481                 }
1482         }
1483
1484         /* Prevent firmware from sending up tx inspection requests. There's
1485          * nothing ath10k can do with frames requested for inspection so force
1486          * it to simply rely a regular tx completion with discard status.
1487          */
1488         flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED;
1489
1490         txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM;
1491         txbuf->cmd_tx.flags0 = flags0;
1492         txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1);
1493         txbuf->cmd_tx.len = __cpu_to_le16(msdu->len);
1494         txbuf->cmd_tx.id = __cpu_to_le16(msdu_id);
1495
1496         /* fill fragment descriptor */
1497         txbuf->cmd_tx.frags_paddr = __cpu_to_le64(frags_paddr);
1498         if (ath10k_mac_tx_frm_has_freq(ar)) {
1499                 txbuf->cmd_tx.offchan_tx.peerid =
1500                                 __cpu_to_le16(HTT_INVALID_PEERID);
1501                 txbuf->cmd_tx.offchan_tx.freq =
1502                                 __cpu_to_le16(freq);
1503         } else {
1504                 txbuf->cmd_tx.peerid =
1505                                 __cpu_to_le32(HTT_INVALID_PEERID);
1506         }
1507
1508         trace_ath10k_htt_tx(ar, msdu_id, msdu->len, vdev_id, tid);
1509         ath10k_dbg(ar, ATH10K_DBG_HTT,
1510                    "htt tx flags0 %hhu flags1 %hu len %d id %hu frags_paddr %pad, msdu_paddr %pad vdev %hhu tid %hhu freq %hu\n",
1511                    flags0, flags1, msdu->len, msdu_id, &frags_paddr,
1512                    &skb_cb->paddr, vdev_id, tid, freq);
1513         ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL, "htt tx msdu: ",
1514                         msdu->data, msdu->len);
1515         trace_ath10k_tx_hdr(ar, msdu->data, msdu->len);
1516         trace_ath10k_tx_payload(ar, msdu->data, msdu->len);
1517
1518         sg_items[0].transfer_id = 0;
1519         sg_items[0].transfer_context = NULL;
1520         sg_items[0].vaddr = &txbuf->htc_hdr;
1521         sg_items[0].paddr = txbuf_paddr +
1522                             sizeof(txbuf->frags);
1523         sg_items[0].len = sizeof(txbuf->htc_hdr) +
1524                           sizeof(txbuf->cmd_hdr) +
1525                           sizeof(txbuf->cmd_tx);
1526
1527         sg_items[1].transfer_id = 0;
1528         sg_items[1].transfer_context = NULL;
1529         sg_items[1].vaddr = msdu->data;
1530         sg_items[1].paddr = skb_cb->paddr;
1531         sg_items[1].len = prefetch_len;
1532
1533         res = ath10k_hif_tx_sg(htt->ar,
1534                                htt->ar->htc.endpoint[htt->eid].ul_pipe_id,
1535                                sg_items, ARRAY_SIZE(sg_items));
1536         if (res)
1537                 goto err_unmap_msdu;
1538
1539         return 0;
1540
1541 err_unmap_msdu:
1542         dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
1543 err_free_msdu_id:
1544         spin_lock_bh(&htt->tx_lock);
1545         ath10k_htt_tx_free_msdu_id(htt, msdu_id);
1546         spin_unlock_bh(&htt->tx_lock);
1547 err:
1548         return res;
1549 }
1550
1551 static const struct ath10k_htt_tx_ops htt_tx_ops_32 = {
1552         .htt_send_rx_ring_cfg = ath10k_htt_send_rx_ring_cfg_32,
1553         .htt_send_frag_desc_bank_cfg = ath10k_htt_send_frag_desc_bank_cfg_32,
1554         .htt_alloc_frag_desc = ath10k_htt_tx_alloc_cont_frag_desc_32,
1555         .htt_free_frag_desc = ath10k_htt_tx_free_cont_frag_desc_32,
1556         .htt_tx = ath10k_htt_tx_32,
1557         .htt_alloc_txbuff = ath10k_htt_tx_alloc_cont_txbuf_32,
1558         .htt_free_txbuff = ath10k_htt_tx_free_cont_txbuf_32,
1559 };
1560
1561 static const struct ath10k_htt_tx_ops htt_tx_ops_64 = {
1562         .htt_send_rx_ring_cfg = ath10k_htt_send_rx_ring_cfg_64,
1563         .htt_send_frag_desc_bank_cfg = ath10k_htt_send_frag_desc_bank_cfg_64,
1564         .htt_alloc_frag_desc = ath10k_htt_tx_alloc_cont_frag_desc_64,
1565         .htt_free_frag_desc = ath10k_htt_tx_free_cont_frag_desc_64,
1566         .htt_tx = ath10k_htt_tx_64,
1567         .htt_alloc_txbuff = ath10k_htt_tx_alloc_cont_txbuf_64,
1568         .htt_free_txbuff = ath10k_htt_tx_free_cont_txbuf_64,
1569 };
1570
1571 void ath10k_htt_set_tx_ops(struct ath10k_htt *htt)
1572 {
1573         struct ath10k *ar = htt->ar;
1574
1575         if (ar->hw_params.target_64bit)
1576                 htt->tx_ops = &htt_tx_ops_64;
1577         else
1578                 htt->tx_ops = &htt_tx_ops_32;
1579 }