1 /*
2 * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #pragma once
8
9 #include <stdint.h>
10 #include "sys/queue.h"
11 #include "esp_rom_lldesc.h"
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 #define LLDESC_TX_MBLK_SIZE 268 /* */
18 #define LLDESC_RX_SMBLK_SIZE 64 /* small block size, for small mgmt frame */
19 #define LLDESC_RX_MBLK_SIZE 524 /* rx is large sinec we want to contain mgmt frame in one block*/
20 #define LLDESC_RX_AMPDU_ENTRY_MBLK_SIZE 64 /* it is a small buffer which is a cycle link*/
21 #define LLDESC_RX_AMPDU_LEN_MBLK_SIZE 256 /*for ampdu entry*/
22 #ifdef ESP_MAC_5
23 #define LLDESC_TX_MBLK_NUM 116 /* 64K / 256 */
24 #define LLDESC_RX_MBLK_NUM 82 /* 64K / 512 MAX 172*/
25 #define LLDESC_RX_AMPDU_ENTRY_MBLK_NUM 4
26 #define LLDESC_RX_AMPDU_LEN_MLBK_NUM 12
27 #else
28 #ifdef SBUF_RXTX
29 #define LLDESC_TX_MBLK_NUM_MAX (2 * 48) /* 23K / 260 - 8 */
30 #define LLDESC_RX_MBLK_NUM_MAX (2 * 48) /* 23K / 524 */
31 #define LLDESC_TX_MBLK_NUM_MIN (2 * 16) /* 23K / 260 - 8 */
32 #define LLDESC_RX_MBLK_NUM_MIN (2 * 16) /* 23K / 524 */
33 #endif
34 #define LLDESC_TX_MBLK_NUM 10 //(2 * 32) /* 23K / 260 - 8 */
35
36 #ifdef IEEE80211_RX_AMPDU
37 #define LLDESC_RX_MBLK_NUM 30
38 #else
39 #define LLDESC_RX_MBLK_NUM 10
40 #endif /*IEEE80211_RX_AMPDU*/
41
42 #define LLDESC_RX_AMPDU_ENTRY_MBLK_NUM 4
43 #define LLDESC_RX_AMPDU_LEN_MLBK_NUM 8
44 #endif /* !ESP_MAC_5 */
45 typedef struct tx_ampdu_entry_s {
46 uint32_t sub_len : 12,
47 dili_num : 7,
48 : 1,
49 null_byte: 2,
50 data : 1,
51 enc : 1,
52 seq : 8;
53 } tx_ampdu_entry_t;
54
55 typedef struct lldesc_chain_s {
56 lldesc_t *head;
57 lldesc_t *tail;
58 } lldesc_chain_t;
59
60 #ifdef SBUF_RXTX
61 enum sbuf_mask_s {
62 SBUF_MOVE_NO = 0,
63 SBUF_MOVE_TX2RX,
64 SBUF_MOVE_RX2TX,
65 } ;
66
67 #define SBUF_MOVE_STEP 8
68 #endif
69 #define LLDESC_SIZE sizeof(struct lldesc_s)
70
71 /* SLC Descriptor */
72 #define LLDESC_OWNER_MASK 0x80000000
73 #define LLDESC_OWNER_SHIFT 31
74 #define LLDESC_SW_OWNED 0
75 #define LLDESC_HW_OWNED 1
76
77 #define LLDESC_EOF_MASK 0x40000000
78 #define LLDESC_EOF_SHIFT 30
79
80 #define LLDESC_SOSF_MASK 0x20000000
81 #define LLDESC_SOSF_SHIFT 29
82
83 #define LLDESC_LENGTH_MASK 0x00fff000
84 #define LLDESC_LENGTH_SHIFT 12
85
86 #define LLDESC_SIZE_MASK 0x00000fff
87 #define LLDESC_SIZE_SHIFT 0
88
89 #define LLDESC_ADDR_MASK 0x000fffff
90
lldesc_get_chain_length(lldesc_t * head)91 static inline uint32_t lldesc_get_chain_length(lldesc_t *head)
92 {
93 lldesc_t *ds = head;
94 uint32_t len = 0;
95
96 while (ds) {
97 len += ds->length;
98 ds = STAILQ_NEXT(ds, qe);
99 }
100
101 return len;
102 }
103
lldesc_config(lldesc_t * ds,uint8_t owner,uint8_t eof,uint8_t sosf,uint16_t len)104 static inline void lldesc_config(lldesc_t *ds, uint8_t owner, uint8_t eof, uint8_t sosf, uint16_t len)
105 {
106 ds->owner = owner;
107 ds->eof = eof;
108 ds->sosf = sosf;
109 ds->length = len;
110 }
111
112 #define LLDESC_CONFIG(_desc, _owner, _eof, _sosf, _len) \
113 do { \
114 (_desc)->owner = (_owner); \
115 (_desc)->eof = (_eof); \
116 (_desc)->sosf = (_sosf); \
117 (_desc)->length = (_len); \
118 } while(0)
119
120 #define LLDESC_FROM_HOST_CLEANUP(ds) LLDESC_CONFIG((ds), LLDESC_HW_OWNED, 0, 0, 0)
121
122 #define LLDESC_MAC_RX_CLEANUP(ds) LLDESC_CONFIG((ds), LLDESC_HW_OWNED, 0, 0, (ds)->size)
123
124 #define LLDESC_TO_HOST_CLEANUP(ds) LLDESC_CONFIG((ds), LLDESC_HW_OWNED, 0, 0, 0)
125
126 #ifdef __cplusplus
127 }
128 #endif
129