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