1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef _HTT_H_
19#define _HTT_H_
20
21#include <linux/bug.h>
22
23#include "core.h"
24#include "htc.h"
25#include "rx_desc.h"
26
27#define HTT_CURRENT_VERSION_MAJOR 2
28#define HTT_CURRENT_VERSION_MINOR 1
29
30enum htt_dbg_stats_type {
31 HTT_DBG_STATS_WAL_PDEV_TXRX = 1 << 0,
32 HTT_DBG_STATS_RX_REORDER = 1 << 1,
33 HTT_DBG_STATS_RX_RATE_INFO = 1 << 2,
34 HTT_DBG_STATS_TX_PPDU_LOG = 1 << 3,
35 HTT_DBG_STATS_TX_RATE_INFO = 1 << 4,
36
37
38 HTT_DBG_NUM_STATS
39};
40
41enum htt_h2t_msg_type {
42 HTT_H2T_MSG_TYPE_VERSION_REQ = 0,
43 HTT_H2T_MSG_TYPE_TX_FRM = 1,
44 HTT_H2T_MSG_TYPE_RX_RING_CFG = 2,
45 HTT_H2T_MSG_TYPE_STATS_REQ = 3,
46 HTT_H2T_MSG_TYPE_SYNC = 4,
47 HTT_H2T_MSG_TYPE_AGGR_CFG = 5,
48 HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 6,
49 HTT_H2T_MSG_TYPE_MGMT_TX = 7,
50
51 HTT_H2T_NUM_MSGS
52};
53
54struct htt_cmd_hdr {
55 u8 msg_type;
56} __packed;
57
58struct htt_ver_req {
59 u8 pad[sizeof(u32) - sizeof(struct htt_cmd_hdr)];
60} __packed;
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80struct htt_data_tx_desc_frag {
81 __le32 paddr;
82 __le32 len;
83} __packed;
84
85enum htt_data_tx_desc_flags0 {
86 HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT = 1 << 0,
87 HTT_DATA_TX_DESC_FLAGS0_NO_AGGR = 1 << 1,
88 HTT_DATA_TX_DESC_FLAGS0_NO_ENCRYPT = 1 << 2,
89 HTT_DATA_TX_DESC_FLAGS0_NO_CLASSIFY = 1 << 3,
90 HTT_DATA_TX_DESC_FLAGS0_RSVD0 = 1 << 4
91#define HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE_MASK 0xE0
92#define HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE_LSB 5
93};
94
95enum htt_data_tx_desc_flags1 {
96#define HTT_DATA_TX_DESC_FLAGS1_VDEV_ID_BITS 6
97#define HTT_DATA_TX_DESC_FLAGS1_VDEV_ID_MASK 0x003F
98#define HTT_DATA_TX_DESC_FLAGS1_VDEV_ID_LSB 0
99#define HTT_DATA_TX_DESC_FLAGS1_EXT_TID_BITS 5
100#define HTT_DATA_TX_DESC_FLAGS1_EXT_TID_MASK 0x07C0
101#define HTT_DATA_TX_DESC_FLAGS1_EXT_TID_LSB 6
102 HTT_DATA_TX_DESC_FLAGS1_POSTPONED = 1 << 11,
103 HTT_DATA_TX_DESC_FLAGS1_MORE_IN_BATCH = 1 << 12,
104 HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD = 1 << 13,
105 HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD = 1 << 14,
106 HTT_DATA_TX_DESC_FLAGS1_RSVD1 = 1 << 15
107};
108
109enum htt_data_tx_ext_tid {
110 HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST = 16,
111 HTT_DATA_TX_EXT_TID_MGMT = 17,
112 HTT_DATA_TX_EXT_TID_INVALID = 31
113};
114
115#define HTT_INVALID_PEERID 0xFFFF
116
117
118
119
120
121
122
123
124
125
126
127
128struct htt_data_tx_desc {
129 u8 flags0;
130 __le16 flags1;
131 __le16 len;
132 __le16 id;
133 __le32 frags_paddr;
134 __le32 peerid;
135 u8 prefetch[0];
136} __packed;
137
138enum htt_rx_ring_flags {
139 HTT_RX_RING_FLAGS_MAC80211_HDR = 1 << 0,
140 HTT_RX_RING_FLAGS_MSDU_PAYLOAD = 1 << 1,
141 HTT_RX_RING_FLAGS_PPDU_START = 1 << 2,
142 HTT_RX_RING_FLAGS_PPDU_END = 1 << 3,
143 HTT_RX_RING_FLAGS_MPDU_START = 1 << 4,
144 HTT_RX_RING_FLAGS_MPDU_END = 1 << 5,
145 HTT_RX_RING_FLAGS_MSDU_START = 1 << 6,
146 HTT_RX_RING_FLAGS_MSDU_END = 1 << 7,
147 HTT_RX_RING_FLAGS_RX_ATTENTION = 1 << 8,
148 HTT_RX_RING_FLAGS_FRAG_INFO = 1 << 9,
149 HTT_RX_RING_FLAGS_UNICAST_RX = 1 << 10,
150 HTT_RX_RING_FLAGS_MULTICAST_RX = 1 << 11,
151 HTT_RX_RING_FLAGS_CTRL_RX = 1 << 12,
152 HTT_RX_RING_FLAGS_MGMT_RX = 1 << 13,
153 HTT_RX_RING_FLAGS_NULL_RX = 1 << 14,
154 HTT_RX_RING_FLAGS_PHY_DATA_RX = 1 << 15
155};
156
157struct htt_rx_ring_setup_ring {
158 __le32 fw_idx_shadow_reg_paddr;
159 __le32 rx_ring_base_paddr;
160 __le16 rx_ring_len;
161 __le16 rx_ring_bufsize;
162 __le16 flags;
163 __le16 fw_idx_init_val;
164
165
166 __le16 mac80211_hdr_offset;
167 __le16 msdu_payload_offset;
168 __le16 ppdu_start_offset;
169 __le16 ppdu_end_offset;
170 __le16 mpdu_start_offset;
171 __le16 mpdu_end_offset;
172 __le16 msdu_start_offset;
173 __le16 msdu_end_offset;
174 __le16 rx_attention_offset;
175 __le16 frag_info_offset;
176} __packed;
177
178struct htt_rx_ring_setup_hdr {
179 u8 num_rings;
180 __le16 rsvd0;
181} __packed;
182
183struct htt_rx_ring_setup {
184 struct htt_rx_ring_setup_hdr hdr;
185 struct htt_rx_ring_setup_ring rings[0];
186} __packed;
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201struct htt_stats_req {
202 u8 upload_types[3];
203 u8 rsvd0;
204 u8 reset_types[3];
205 struct {
206 u8 mpdu_bytes;
207 u8 mpdu_num_msdus;
208 u8 msdu_bytes;
209 } __packed;
210 u8 stat_type;
211 __le32 cookie_lsb;
212 __le32 cookie_msb;
213} __packed;
214
215#define HTT_STATS_REQ_CFG_STAT_TYPE_INVALID 0xff
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236struct htt_oob_sync_req {
237 u8 sync_count;
238 __le16 rsvd0;
239} __packed;
240
241#define HTT_AGGR_CONF_MAX_NUM_AMSDU_SUBFRAMES_MASK 0x1F
242#define HTT_AGGR_CONF_MAX_NUM_AMSDU_SUBFRAMES_LSB 0
243
244struct htt_aggr_conf {
245 u8 max_num_ampdu_subframes;
246 union {
247
248 u8 flags;
249 u8 max_num_amsdu_subframes:5;
250 } __packed;
251} __packed;
252
253#define HTT_MGMT_FRM_HDR_DOWNLOAD_LEN 32
254
255struct htt_mgmt_tx_desc {
256 u8 pad[sizeof(u32) - sizeof(struct htt_cmd_hdr)];
257 __le32 msdu_paddr;
258 __le32 desc_id;
259 __le32 len;
260 __le32 vdev_id;
261 u8 hdr[HTT_MGMT_FRM_HDR_DOWNLOAD_LEN];
262} __packed;
263
264enum htt_mgmt_tx_status {
265 HTT_MGMT_TX_STATUS_OK = 0,
266 HTT_MGMT_TX_STATUS_RETRY = 1,
267 HTT_MGMT_TX_STATUS_DROP = 2
268};
269
270
271
272
273enum htt_t2h_msg_type {
274 HTT_T2H_MSG_TYPE_VERSION_CONF = 0x0,
275 HTT_T2H_MSG_TYPE_RX_IND = 0x1,
276 HTT_T2H_MSG_TYPE_RX_FLUSH = 0x2,
277 HTT_T2H_MSG_TYPE_PEER_MAP = 0x3,
278 HTT_T2H_MSG_TYPE_PEER_UNMAP = 0x4,
279 HTT_T2H_MSG_TYPE_RX_ADDBA = 0x5,
280 HTT_T2H_MSG_TYPE_RX_DELBA = 0x6,
281 HTT_T2H_MSG_TYPE_TX_COMPL_IND = 0x7,
282 HTT_T2H_MSG_TYPE_PKTLOG = 0x8,
283 HTT_T2H_MSG_TYPE_STATS_CONF = 0x9,
284 HTT_T2H_MSG_TYPE_RX_FRAG_IND = 0xa,
285 HTT_T2H_MSG_TYPE_SEC_IND = 0xb,
286 HTT_T2H_MSG_TYPE_RC_UPDATE_IND = 0xc,
287 HTT_T2H_MSG_TYPE_TX_INSPECT_IND = 0xd,
288 HTT_T2H_MSG_TYPE_MGMT_TX_COMPLETION = 0xe,
289 HTT_T2H_MSG_TYPE_TEST,
290
291 HTT_T2H_NUM_MSGS
292};
293
294
295
296
297
298
299struct htt_resp_hdr {
300 u8 msg_type;
301} __packed;
302
303#define HTT_RESP_HDR_MSG_TYPE_OFFSET 0
304#define HTT_RESP_HDR_MSG_TYPE_MASK 0xff
305#define HTT_RESP_HDR_MSG_TYPE_LSB 0
306
307
308struct htt_ver_resp {
309 u8 minor;
310 u8 major;
311 u8 rsvd0;
312} __packed;
313
314struct htt_mgmt_tx_completion {
315 u8 rsvd0;
316 u8 rsvd1;
317 u8 rsvd2;
318 __le32 desc_id;
319 __le32 status;
320} __packed;
321
322#define HTT_RX_INDICATION_INFO0_EXT_TID_MASK (0x3F)
323#define HTT_RX_INDICATION_INFO0_EXT_TID_LSB (0)
324#define HTT_RX_INDICATION_INFO0_FLUSH_VALID (1 << 6)
325#define HTT_RX_INDICATION_INFO0_RELEASE_VALID (1 << 7)
326
327#define HTT_RX_INDICATION_INFO1_FLUSH_START_SEQNO_MASK 0x0000003F
328#define HTT_RX_INDICATION_INFO1_FLUSH_START_SEQNO_LSB 0
329#define HTT_RX_INDICATION_INFO1_FLUSH_END_SEQNO_MASK 0x00000FC0
330#define HTT_RX_INDICATION_INFO1_FLUSH_END_SEQNO_LSB 6
331#define HTT_RX_INDICATION_INFO1_RELEASE_START_SEQNO_MASK 0x0003F000
332#define HTT_RX_INDICATION_INFO1_RELEASE_START_SEQNO_LSB 12
333#define HTT_RX_INDICATION_INFO1_RELEASE_END_SEQNO_MASK 0x00FC0000
334#define HTT_RX_INDICATION_INFO1_RELEASE_END_SEQNO_LSB 18
335#define HTT_RX_INDICATION_INFO1_NUM_MPDU_RANGES_MASK 0xFF000000
336#define HTT_RX_INDICATION_INFO1_NUM_MPDU_RANGES_LSB 24
337
338struct htt_rx_indication_hdr {
339 u8 info0;
340 __le16 peer_id;
341 __le32 info1;
342} __packed;
343
344#define HTT_RX_INDICATION_INFO0_PHY_ERR_VALID (1 << 0)
345#define HTT_RX_INDICATION_INFO0_LEGACY_RATE_MASK (0x1E)
346#define HTT_RX_INDICATION_INFO0_LEGACY_RATE_LSB (1)
347#define HTT_RX_INDICATION_INFO0_LEGACY_RATE_CCK (1 << 5)
348#define HTT_RX_INDICATION_INFO0_END_VALID (1 << 6)
349#define HTT_RX_INDICATION_INFO0_START_VALID (1 << 7)
350
351#define HTT_RX_INDICATION_INFO1_VHT_SIG_A1_MASK 0x00FFFFFF
352#define HTT_RX_INDICATION_INFO1_VHT_SIG_A1_LSB 0
353#define HTT_RX_INDICATION_INFO1_PREAMBLE_TYPE_MASK 0xFF000000
354#define HTT_RX_INDICATION_INFO1_PREAMBLE_TYPE_LSB 24
355
356#define HTT_RX_INDICATION_INFO2_VHT_SIG_A1_MASK 0x00FFFFFF
357#define HTT_RX_INDICATION_INFO2_VHT_SIG_A1_LSB 0
358#define HTT_RX_INDICATION_INFO2_SERVICE_MASK 0xFF000000
359#define HTT_RX_INDICATION_INFO2_SERVICE_LSB 24
360
361enum htt_rx_legacy_rate {
362 HTT_RX_OFDM_48 = 0,
363 HTT_RX_OFDM_24 = 1,
364 HTT_RX_OFDM_12,
365 HTT_RX_OFDM_6,
366 HTT_RX_OFDM_54,
367 HTT_RX_OFDM_36,
368 HTT_RX_OFDM_18,
369 HTT_RX_OFDM_9,
370
371
372 HTT_RX_CCK_11_LP = 0,
373 HTT_RX_CCK_5_5_LP = 1,
374 HTT_RX_CCK_2_LP,
375 HTT_RX_CCK_1_LP,
376
377 HTT_RX_CCK_11_SP,
378 HTT_RX_CCK_5_5_SP,
379 HTT_RX_CCK_2_SP
380};
381
382enum htt_rx_legacy_rate_type {
383 HTT_RX_LEGACY_RATE_OFDM = 0,
384 HTT_RX_LEGACY_RATE_CCK
385};
386
387enum htt_rx_preamble_type {
388 HTT_RX_LEGACY = 0x4,
389 HTT_RX_HT = 0x8,
390 HTT_RX_HT_WITH_TXBF = 0x9,
391 HTT_RX_VHT = 0xC,
392 HTT_RX_VHT_WITH_TXBF = 0xD,
393};
394
395
396
397
398
399
400
401
402
403
404
405struct htt_rx_indication_ppdu {
406 u8 combined_rssi;
407 u8 sub_usec_timestamp;
408 u8 phy_err_code;
409 u8 info0;
410 struct {
411 u8 pri20_db;
412 u8 ext20_db;
413 u8 ext40_db;
414 u8 ext80_db;
415 } __packed rssi_chains[4];
416 __le32 tsf;
417 __le32 usec_timestamp;
418 __le32 info1;
419 __le32 info2;
420} __packed;
421
422enum htt_rx_mpdu_status {
423 HTT_RX_IND_MPDU_STATUS_UNKNOWN = 0x0,
424 HTT_RX_IND_MPDU_STATUS_OK,
425 HTT_RX_IND_MPDU_STATUS_ERR_FCS,
426 HTT_RX_IND_MPDU_STATUS_ERR_DUP,
427 HTT_RX_IND_MPDU_STATUS_ERR_REPLAY,
428 HTT_RX_IND_MPDU_STATUS_ERR_INV_PEER,
429
430 HTT_RX_IND_MPDU_STATUS_UNAUTH_PEER,
431 HTT_RX_IND_MPDU_STATUS_OUT_OF_SYNC,
432
433 HTT_RX_IND_MPDU_STATUS_MGMT_CTRL,
434 HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR,
435 HTT_RX_IND_MPDU_STATUS_DECRYPT_ERR,
436 HTT_RX_IND_MPDU_STATUS_MPDU_LENGTH_ERR,
437 HTT_RX_IND_MPDU_STATUS_ENCRYPT_REQUIRED_ERR,
438 HTT_RX_IND_MPDU_STATUS_PRIVACY_ERR,
439
440
441
442
443
444 HTT_RX_IND_MPDU_STATUS_ERR_MISC = 0xFF
445};
446
447struct htt_rx_indication_mpdu_range {
448 u8 mpdu_count;
449 u8 mpdu_range_status;
450 u8 pad0;
451 u8 pad1;
452} __packed;
453
454struct htt_rx_indication_prefix {
455 __le16 fw_rx_desc_bytes;
456 u8 pad0;
457 u8 pad1;
458};
459
460struct htt_rx_indication {
461 struct htt_rx_indication_hdr hdr;
462 struct htt_rx_indication_ppdu ppdu;
463 struct htt_rx_indication_prefix prefix;
464
465
466
467
468
469
470
471 struct fw_rx_desc_base fw_desc;
472
473
474
475
476
477 struct htt_rx_indication_mpdu_range mpdu_ranges[0];
478} __packed;
479
480static inline struct htt_rx_indication_mpdu_range *
481 htt_rx_ind_get_mpdu_ranges(struct htt_rx_indication *rx_ind)
482{
483 void *ptr = rx_ind;
484
485 ptr += sizeof(rx_ind->hdr)
486 + sizeof(rx_ind->ppdu)
487 + sizeof(rx_ind->prefix)
488 + roundup(__le16_to_cpu(rx_ind->prefix.fw_rx_desc_bytes), 4);
489 return ptr;
490}
491
492enum htt_rx_flush_mpdu_status {
493 HTT_RX_FLUSH_MPDU_DISCARD = 0,
494 HTT_RX_FLUSH_MPDU_REORDER = 1,
495};
496
497
498
499
500
501
502
503struct htt_rx_flush {
504 __le16 peer_id;
505 u8 tid;
506 u8 rsvd0;
507 u8 mpdu_status;
508 u8 seq_num_start;
509 u8 seq_num_end;
510};
511
512struct htt_rx_peer_map {
513 u8 vdev_id;
514 __le16 peer_id;
515 u8 addr[6];
516 u8 rsvd0;
517 u8 rsvd1;
518} __packed;
519
520struct htt_rx_peer_unmap {
521 u8 rsvd0;
522 __le16 peer_id;
523} __packed;
524
525enum htt_security_types {
526 HTT_SECURITY_NONE,
527 HTT_SECURITY_WEP128,
528 HTT_SECURITY_WEP104,
529 HTT_SECURITY_WEP40,
530 HTT_SECURITY_TKIP,
531 HTT_SECURITY_TKIP_NOMIC,
532 HTT_SECURITY_AES_CCMP,
533 HTT_SECURITY_WAPI,
534
535 HTT_NUM_SECURITY_TYPES
536};
537
538enum htt_security_flags {
539#define HTT_SECURITY_TYPE_MASK 0x7F
540#define HTT_SECURITY_TYPE_LSB 0
541 HTT_SECURITY_IS_UNICAST = 1 << 7
542};
543
544struct htt_security_indication {
545 union {
546
547 u8 flags;
548 struct {
549 u8 security_type:7,
550 is_unicast:1;
551 } __packed;
552 } __packed;
553 __le16 peer_id;
554 u8 michael_key[8];
555 u8 wapi_rsc[16];
556} __packed;
557
558#define HTT_RX_BA_INFO0_TID_MASK 0x000F
559#define HTT_RX_BA_INFO0_TID_LSB 0
560#define HTT_RX_BA_INFO0_PEER_ID_MASK 0xFFF0
561#define HTT_RX_BA_INFO0_PEER_ID_LSB 4
562
563struct htt_rx_addba {
564 u8 window_size;
565 __le16 info0;
566} __packed;
567
568struct htt_rx_delba {
569 u8 rsvd0;
570 __le16 info0;
571} __packed;
572
573enum htt_data_tx_status {
574 HTT_DATA_TX_STATUS_OK = 0,
575 HTT_DATA_TX_STATUS_DISCARD = 1,
576 HTT_DATA_TX_STATUS_NO_ACK = 2,
577 HTT_DATA_TX_STATUS_POSTPONE = 3,
578 HTT_DATA_TX_STATUS_DOWNLOAD_FAIL = 128
579};
580
581enum htt_data_tx_flags {
582#define HTT_DATA_TX_STATUS_MASK 0x07
583#define HTT_DATA_TX_STATUS_LSB 0
584#define HTT_DATA_TX_TID_MASK 0x78
585#define HTT_DATA_TX_TID_LSB 3
586 HTT_DATA_TX_TID_INVALID = 1 << 7
587};
588
589#define HTT_TX_COMPL_INV_MSDU_ID 0xFFFF
590
591struct htt_data_tx_completion {
592 union {
593 u8 flags;
594 struct {
595 u8 status:3,
596 tid:4,
597 tid_invalid:1;
598 } __packed;
599 } __packed;
600 u8 num_msdus;
601 u8 rsvd0;
602 __le16 msdus[0];
603} __packed;
604
605struct htt_tx_compl_ind_base {
606 u32 hdr;
607 u16 payload[1];
608} __packed;
609
610struct htt_rc_tx_done_params {
611 u32 rate_code;
612 u32 rate_code_flags;
613 u32 flags;
614 u32 num_enqued;
615 u32 num_retries;
616 u32 num_failed;
617 u32 ack_rssi;
618 u32 time_stamp;
619 u32 is_probe;
620};
621
622struct htt_rc_update {
623 u8 vdev_id;
624 __le16 peer_id;
625 u8 addr[6];
626 u8 num_elems;
627 u8 rsvd0;
628 struct htt_rc_tx_done_params params[0];
629} __packed;
630
631
632struct htt_rx_fragment_indication {
633 union {
634 u8 info0;
635 struct {
636 u8 ext_tid:5,
637 flush_valid:1;
638 } __packed;
639 } __packed;
640 __le16 peer_id;
641 __le32 info1;
642 __le16 fw_rx_desc_bytes;
643 __le16 rsvd0;
644
645 u8 fw_msdu_rx_desc[0];
646} __packed;
647
648#define HTT_RX_FRAG_IND_INFO0_EXT_TID_MASK 0x1F
649#define HTT_RX_FRAG_IND_INFO0_EXT_TID_LSB 0
650#define HTT_RX_FRAG_IND_INFO0_FLUSH_VALID_MASK 0x20
651#define HTT_RX_FRAG_IND_INFO0_FLUSH_VALID_LSB 5
652
653#define HTT_RX_FRAG_IND_INFO1_FLUSH_SEQ_NUM_START_MASK 0x0000003F
654#define HTT_RX_FRAG_IND_INFO1_FLUSH_SEQ_NUM_START_LSB 0
655#define HTT_RX_FRAG_IND_INFO1_FLUSH_SEQ_NUM_END_MASK 0x00000FC0
656#define HTT_RX_FRAG_IND_INFO1_FLUSH_SEQ_NUM_END_LSB 6
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692struct htt_rx_test {
693 u8 num_ints;
694 __le16 num_chars;
695
696
697
698
699 u8 payload[0];
700} __packed;
701
702static inline __le32 *htt_rx_test_get_ints(struct htt_rx_test *rx_test)
703{
704 return (__le32 *)rx_test->payload;
705}
706
707static inline u8 *htt_rx_test_get_chars(struct htt_rx_test *rx_test)
708{
709 return rx_test->payload + (rx_test->num_ints * sizeof(__le32));
710}
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731struct htt_pktlog_msg {
732 u8 pad[3];
733 __le32 payload[1 ];
734} __packed;
735
736struct htt_dbg_stats_rx_reorder_stats {
737
738 __le32 deliver_non_qos;
739
740
741 __le32 deliver_in_order;
742
743
744 __le32 deliver_flush_timeout;
745
746
747 __le32 deliver_flush_oow;
748
749
750 __le32 deliver_flush_delba;
751
752
753 __le32 fcs_error;
754
755
756 __le32 mgmt_ctrl;
757
758
759 __le32 invalid_peer;
760
761
762 __le32 dup_non_aggr;
763
764
765 __le32 dup_past;
766
767
768 __le32 dup_in_reorder;
769
770
771 __le32 reorder_timeout;
772
773
774 __le32 invalid_bar_ssn;
775
776
777 __le32 ssn_reset;
778};
779
780struct htt_dbg_stats_wal_tx_stats {
781
782 __le32 comp_queued;
783
784
785 __le32 comp_delivered;
786
787
788 __le32 msdu_enqued;
789
790
791 __le32 mpdu_enqued;
792
793
794 __le32 wmm_drop;
795
796
797 __le32 local_enqued;
798
799
800 __le32 local_freed;
801
802
803 __le32 hw_queued;
804
805
806 __le32 hw_reaped;
807
808
809 __le32 underrun;
810
811
812 __le32 tx_abort;
813
814
815 __le32 mpdus_requed;
816
817
818 __le32 tx_ko;
819
820
821 __le32 data_rc;
822
823
824 __le32 self_triggers;
825
826
827 __le32 sw_retry_failure;
828
829
830 __le32 illgl_rate_phy_err;
831
832
833 __le32 pdev_cont_xretry;
834
835
836 __le32 pdev_tx_timeout;
837
838
839 __le32 pdev_resets;
840
841 __le32 phy_underrun;
842
843
844 __le32 txop_ovf;
845} __packed;
846
847struct htt_dbg_stats_wal_rx_stats {
848
849 __le32 mid_ppdu_route_change;
850
851
852 __le32 status_rcvd;
853
854
855 __le32 r0_frags;
856 __le32 r1_frags;
857 __le32 r2_frags;
858 __le32 r3_frags;
859
860
861 __le32 htt_msdus;
862 __le32 htt_mpdus;
863
864
865 __le32 loc_msdus;
866 __le32 loc_mpdus;
867
868
869 __le32 oversize_amsdu;
870
871
872 __le32 phy_errs;
873
874
875 __le32 phy_err_drop;
876
877
878 __le32 mpdu_errs;
879} __packed;
880
881struct htt_dbg_stats_wal_peer_stats {
882 __le32 dummy;
883} __packed;
884
885struct htt_dbg_stats_wal_pdev_txrx {
886 struct htt_dbg_stats_wal_tx_stats tx_stats;
887 struct htt_dbg_stats_wal_rx_stats rx_stats;
888 struct htt_dbg_stats_wal_peer_stats peer_stats;
889} __packed;
890
891struct htt_dbg_stats_rx_rate_info {
892 __le32 mcs[10];
893 __le32 sgi[10];
894 __le32 nss[4];
895 __le32 stbc[10];
896 __le32 bw[3];
897 __le32 pream[6];
898 __le32 ldpc;
899 __le32 txbf;
900};
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923enum htt_dbg_stats_status {
924 HTT_DBG_STATS_STATUS_PRESENT = 0,
925 HTT_DBG_STATS_STATUS_PARTIAL = 1,
926 HTT_DBG_STATS_STATUS_ERROR = 2,
927 HTT_DBG_STATS_STATUS_INVALID = 3,
928 HTT_DBG_STATS_STATUS_SERIES_DONE = 7
929};
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007#define HTT_STATS_CONF_ITEM_INFO_STAT_TYPE_MASK 0x1F
1008#define HTT_STATS_CONF_ITEM_INFO_STAT_TYPE_LSB 0
1009#define HTT_STATS_CONF_ITEM_INFO_STATUS_MASK 0xE0
1010#define HTT_STATS_CONF_ITEM_INFO_STATUS_LSB 5
1011
1012struct htt_stats_conf_item {
1013 union {
1014 u8 info;
1015 struct {
1016 u8 stat_type:5;
1017 u8 status:3;
1018 } __packed;
1019 } __packed;
1020 u8 pad;
1021 __le16 length;
1022 u8 payload[0];
1023} __packed;
1024
1025struct htt_stats_conf {
1026 u8 pad[3];
1027 __le32 cookie_lsb;
1028 __le32 cookie_msb;
1029
1030
1031 struct htt_stats_conf_item items[0];
1032} __packed;
1033
1034static inline struct htt_stats_conf_item *htt_stats_conf_next_item(
1035 const struct htt_stats_conf_item *item)
1036{
1037 return (void *)item + sizeof(*item) + roundup(item->length, 4);
1038}
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088struct htt_frag_desc_bank_id {
1089 __le16 bank_min_id;
1090 __le16 bank_max_id;
1091} __packed;
1092
1093
1094
1095#define HTT_FRAG_DESC_BANK_MAX 4
1096
1097#define HTT_FRAG_DESC_BANK_CFG_INFO_PDEV_ID_MASK 0x03
1098#define HTT_FRAG_DESC_BANK_CFG_INFO_PDEV_ID_LSB 0
1099#define HTT_FRAG_DESC_BANK_CFG_INFO_SWAP (1 << 2)
1100
1101struct htt_frag_desc_bank_cfg {
1102 u8 info;
1103 u8 num_banks;
1104 u8 desc_size;
1105 __le32 bank_base_addrs[HTT_FRAG_DESC_BANK_MAX];
1106 struct htt_frag_desc_bank_id bank_id[HTT_FRAG_DESC_BANK_MAX];
1107} __packed;
1108
1109union htt_rx_pn_t {
1110
1111 u32 pn24;
1112
1113
1114 u_int64_t pn48;
1115
1116
1117 u_int64_t pn128[2];
1118};
1119
1120struct htt_cmd {
1121 struct htt_cmd_hdr hdr;
1122 union {
1123 struct htt_ver_req ver_req;
1124 struct htt_mgmt_tx_desc mgmt_tx;
1125 struct htt_data_tx_desc data_tx;
1126 struct htt_rx_ring_setup rx_setup;
1127 struct htt_stats_req stats_req;
1128 struct htt_oob_sync_req oob_sync_req;
1129 struct htt_aggr_conf aggr_conf;
1130 struct htt_frag_desc_bank_cfg frag_desc_bank_cfg;
1131 };
1132} __packed;
1133
1134struct htt_resp {
1135 struct htt_resp_hdr hdr;
1136 union {
1137 struct htt_ver_resp ver_resp;
1138 struct htt_mgmt_tx_completion mgmt_tx_completion;
1139 struct htt_data_tx_completion data_tx_completion;
1140 struct htt_rx_indication rx_ind;
1141 struct htt_rx_fragment_indication rx_frag_ind;
1142 struct htt_rx_peer_map peer_map;
1143 struct htt_rx_peer_unmap peer_unmap;
1144 struct htt_rx_flush rx_flush;
1145 struct htt_rx_addba rx_addba;
1146 struct htt_rx_delba rx_delba;
1147 struct htt_security_indication security_indication;
1148 struct htt_rc_update rc_update;
1149 struct htt_rx_test rx_test;
1150 struct htt_pktlog_msg pktlog_msg;
1151 struct htt_stats_conf stats_conf;
1152 };
1153} __packed;
1154
1155
1156
1157
1158struct htt_tx_done {
1159 u32 msdu_id;
1160 bool discard;
1161 bool no_ack;
1162};
1163
1164struct htt_peer_map_event {
1165 u8 vdev_id;
1166 u16 peer_id;
1167 u8 addr[ETH_ALEN];
1168};
1169
1170struct htt_peer_unmap_event {
1171 u16 peer_id;
1172};
1173
1174struct htt_rx_info {
1175 struct sk_buff *skb;
1176 enum htt_rx_mpdu_status status;
1177 enum htt_rx_mpdu_encrypt_type encrypt_type;
1178 s8 signal;
1179 struct {
1180 u8 info0;
1181 u32 info1;
1182 u32 info2;
1183 } rate;
1184 bool fcs_err;
1185};
1186
1187struct ath10k_htt {
1188 struct ath10k *ar;
1189 enum ath10k_htc_ep_id eid;
1190
1191 int max_throughput_mbps;
1192 u8 target_version_major;
1193 u8 target_version_minor;
1194 struct completion target_version_received;
1195
1196 struct {
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206 struct sk_buff **netbufs_ring;
1207
1208
1209
1210
1211
1212
1213 __le32 *paddrs_ring;
1214
1215
1216
1217
1218
1219 dma_addr_t base_paddr;
1220
1221
1222 int size;
1223
1224
1225 unsigned size_mask;
1226
1227
1228 int fill_level;
1229
1230
1231 int fill_cnt;
1232
1233
1234
1235
1236
1237
1238
1239 struct {
1240 __le32 *vaddr;
1241 dma_addr_t paddr;
1242 } alloc_idx;
1243
1244
1245 struct {
1246 unsigned msdu_payld;
1247 } sw_rd_idx;
1248
1249
1250
1251
1252
1253 struct timer_list refill_retry_timer;
1254
1255
1256 spinlock_t lock;
1257 } rx_ring;
1258
1259 unsigned int prefetch_len;
1260
1261
1262 spinlock_t tx_lock;
1263 int max_num_pending_tx;
1264 int num_pending_tx;
1265 struct sk_buff **pending_tx;
1266 unsigned long *used_msdu_ids;
1267 wait_queue_head_t empty_tx_wq;
1268
1269
1270
1271 bool rx_confused;
1272};
1273
1274#define RX_HTT_HDR_STATUS_LEN 64
1275
1276
1277
1278
1279struct htt_rx_desc {
1280 union {
1281
1282
1283 struct fw_rx_desc_base fw_desc;
1284 u32 pad;
1285 } __packed;
1286 struct {
1287 struct rx_attention attention;
1288 struct rx_frag_info frag_info;
1289 struct rx_mpdu_start mpdu_start;
1290 struct rx_msdu_start msdu_start;
1291 struct rx_msdu_end msdu_end;
1292 struct rx_mpdu_end mpdu_end;
1293 struct rx_ppdu_start ppdu_start;
1294 struct rx_ppdu_end ppdu_end;
1295 } __packed;
1296 u8 rx_hdr_status[RX_HTT_HDR_STATUS_LEN];
1297 u8 msdu_payload[0];
1298};
1299
1300#define HTT_RX_DESC_ALIGN 8
1301
1302#define HTT_MAC_ADDR_LEN 6
1303
1304
1305
1306
1307
1308
1309#define HTT_RX_BUF_SIZE 1920
1310#define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(struct htt_rx_desc))
1311
1312
1313
1314
1315
1316
1317#define HTT_LOG2_MAX_CACHE_LINE_SIZE 7
1318#define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1)
1319
1320struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar);
1321int ath10k_htt_attach_target(struct ath10k_htt *htt);
1322void ath10k_htt_detach(struct ath10k_htt *htt);
1323
1324int ath10k_htt_tx_attach(struct ath10k_htt *htt);
1325void ath10k_htt_tx_detach(struct ath10k_htt *htt);
1326int ath10k_htt_rx_attach(struct ath10k_htt *htt);
1327void ath10k_htt_rx_detach(struct ath10k_htt *htt);
1328void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb);
1329void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb);
1330int ath10k_htt_h2t_ver_req_msg(struct ath10k_htt *htt);
1331int ath10k_htt_send_rx_ring_cfg_ll(struct ath10k_htt *htt);
1332
1333void __ath10k_htt_tx_dec_pending(struct ath10k_htt *htt);
1334int ath10k_htt_tx_alloc_msdu_id(struct ath10k_htt *htt);
1335void ath10k_htt_tx_free_msdu_id(struct ath10k_htt *htt, u16 msdu_id);
1336int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *);
1337int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *);
1338#endif
1339