1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include "halmac_8822b_cfg.h"
3
4 HALMAC_RET_STATUS
halmac_txdma_queue_mapping_8822b(IN PHALMAC_ADAPTER pHalmac_adapter,IN HALMAC_TRX_MODE halmac_trx_mode)5 halmac_txdma_queue_mapping_8822b(
6 IN PHALMAC_ADAPTER pHalmac_adapter,
7 IN HALMAC_TRX_MODE halmac_trx_mode
8 )
9 {
10 u16 value16;
11 VOID *pDriver_adapter = NULL;
12 PHALMAC_API pHalmac_api;
13
14 pDriver_adapter = pHalmac_adapter->pDriver_adapter;
15 pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
16
17 /* Default mapping (PCIE + SDIO + USB 4 bulkout) */
18 switch (halmac_trx_mode) {
19 case HALMAC_TRX_MODE_NORMAL:
20 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_NORMAL;
21 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
22 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_LOW;
23 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_LOW;
24 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_EXTRA;
25 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
26 break;
27 case HALMAC_TRX_MODE_TRXSHARE:
28 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_HIGH;
29 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_HIGH;
30 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_HIGH;
31 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_HIGH;
32 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
33 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
34 break;
35 case HALMAC_TRX_MODE_WMM:
36 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_NORMAL;
37 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
38 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_LOW;
39 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_LOW;
40 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_EXTRA;
41 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
42 break;
43 case HALMAC_TRX_MODE_P2P:
44 case HALMAC_TRX_MODE_LOOPBACK:
45 case HALMAC_TRX_MODE_DELAY_LOOPBACK:
46 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_NORMAL;
47 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
48 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_LOW;
49 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_LOW;
50 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_EXTRA;
51 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
52 break;
53 default:
54 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg_8822b 0 switch case not support\n");
55 return HALMAC_RET_TRX_MODE_NOT_SUPPORT;
56 }
57
58 /* Extra mapping */
59 if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
60 if (pHalmac_adapter->halmac_bulkout_num == 2) {
61 /* In USB 2 bulkout, only High and Normal queue can be used */
62 switch (halmac_trx_mode) {
63 case HALMAC_TRX_MODE_NORMAL:
64 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_NORMAL;
65 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
66 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_NORMAL;
67 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_HIGH;
68 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
69 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
70
71 break;
72 case HALMAC_TRX_MODE_TRXSHARE:
73 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_HIGH;
74 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_HIGH;
75 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_HIGH;
76 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_HIGH;
77 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
78 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
79 break;
80 case HALMAC_TRX_MODE_WMM:
81 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_NORMAL;
82 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
83 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_NORMAL;
84 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_HIGH;
85 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
86 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
87 break;
88 case HALMAC_TRX_MODE_P2P:
89 case HALMAC_TRX_MODE_LOOPBACK:
90 case HALMAC_TRX_MODE_DELAY_LOOPBACK:
91 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_HIGH;
92 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_HIGH;
93 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_HIGH;
94 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_NORMAL;
95 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
96 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
97
98 break;
99 default:
100 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg_8822b 1 switch case not support\n");
101 return HALMAC_RET_TRX_MODE_NOT_SUPPORT;
102 }
103 } else if (pHalmac_adapter->halmac_bulkout_num == 3) {
104 /* in USB 3 bulkout, only High, Normal, Low queue can be used */
105 switch (halmac_trx_mode) {
106 case HALMAC_TRX_MODE_NORMAL:
107 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_NORMAL;
108 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
109 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_LOW;
110 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_LOW;
111 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
112 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
113
114 break;
115 case HALMAC_TRX_MODE_TRXSHARE:
116 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_HIGH;
117 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_HIGH;
118 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_HIGH;
119 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_HIGH;
120 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
121 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
122 break;
123 case HALMAC_TRX_MODE_WMM:
124 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_HIGH;
125 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_NORMAL;
126 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_LOW;
127 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_NORMAL;
128 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_EXTRA;
129 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
130 break;
131 case HALMAC_TRX_MODE_P2P:
132 case HALMAC_TRX_MODE_LOOPBACK:
133 case HALMAC_TRX_MODE_DELAY_LOOPBACK:
134 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO] = HALMAC_DMA_MAPPING_HIGH;
135 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI] = HALMAC_DMA_MAPPING_HIGH;
136 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE] = HALMAC_DMA_MAPPING_LOW;
137 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK] = HALMAC_DMA_MAPPING_NORMAL;
138 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG] = HALMAC_DMA_MAPPING_HIGH;
139 pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
140
141 break;
142 default:
143 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg_8822b 2 switch case not support\n");
144 return HALMAC_RET_TRX_MODE_NOT_SUPPORT;
145 }
146 }
147 }
148
149 value16 = 0;
150 value16 |= BIT_TXDMA_HIQ_MAP(pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI]);
151 value16 |= BIT_TXDMA_MGQ_MAP(pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG]);
152 value16 |= BIT_TXDMA_BKQ_MAP(pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK]);
153 value16 |= BIT_TXDMA_BEQ_MAP(pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE]);
154 value16 |= BIT_TXDMA_VIQ_MAP(pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI]);
155 value16 |= BIT_TXDMA_VOQ_MAP(pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO]);
156 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXDMA_PQ_MAP, value16);
157
158 return HALMAC_RET_SUCCESS;
159 }
160
161 HALMAC_RET_STATUS
halmac_priority_queue_config_8822b(IN PHALMAC_ADAPTER pHalmac_adapter,IN HALMAC_TRX_MODE halmac_trx_mode)162 halmac_priority_queue_config_8822b(
163 IN PHALMAC_ADAPTER pHalmac_adapter,
164 IN HALMAC_TRX_MODE halmac_trx_mode
165 )
166 {
167 u8 transfer_mode = 0;
168 u8 value8;
169 u16 HPQ_num = 0, LPQ_Nnum = 0, NPQ_num = 0, GAPQ_num = 0;
170 u16 EXPQ_num = 0, PUBQ_num = 0;
171 u16 tx_page_boundary = 0, rx_f_ifo_boundary = 0;
172 u16 h2c_extra_info_boundary = 0, fw_txbuff_boundary = 0;
173 u32 counter;
174 VOID *pDriver_adapter = NULL;
175 PHALMAC_API pHalmac_api;
176
177 pDriver_adapter = pHalmac_adapter->pDriver_adapter;
178 pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
179
180 if (HALMAC_LA_MODE_DISABLE == pHalmac_adapter->txff_allocation.la_mode)
181 pHalmac_adapter->txff_allocation.tx_fifo_pg_num = HALMAC_TX_FIFO_SIZE_8822B >> HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
182 else
183 pHalmac_adapter->txff_allocation.tx_fifo_pg_num = HALMAC_TX_FIFO_SIZE_LA_8822B >> HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
184
185 pHalmac_adapter->txff_allocation.rsvd_pg_num = (pHalmac_adapter->txff_allocation.rsvd_drv_pg_num +
186 HALMAC_RSVD_H2C_EXTRAINFO_PGNUM_8822B +
187 HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B +
188 HALMAC_RSVD_CPU_INSTRUCTION_PGNUM_8822B +
189 HALMAC_RSVD_FW_TXBUFF_PGNUM_8822B);
190 if (pHalmac_adapter->txff_allocation.rsvd_pg_num > pHalmac_adapter->txff_allocation.tx_fifo_pg_num)
191 return HALMAC_RET_CFG_TXFIFO_PAGE_FAIL;
192
193 pHalmac_adapter->txff_allocation.ac_q_pg_num = pHalmac_adapter->txff_allocation.tx_fifo_pg_num - pHalmac_adapter->txff_allocation.rsvd_pg_num;
194 pHalmac_adapter->txff_allocation.rsvd_pg_bndy = pHalmac_adapter->txff_allocation.tx_fifo_pg_num - pHalmac_adapter->txff_allocation.rsvd_pg_num;
195 pHalmac_adapter->txff_allocation.rsvd_fw_txbuff_pg_bndy = pHalmac_adapter->txff_allocation.tx_fifo_pg_num - HALMAC_RSVD_FW_TXBUFF_PGNUM_8822B;
196 pHalmac_adapter->txff_allocation.rsvd_cpu_instr_pg_bndy = pHalmac_adapter->txff_allocation.rsvd_fw_txbuff_pg_bndy - HALMAC_RSVD_CPU_INSTRUCTION_PGNUM_8822B;
197 pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy = pHalmac_adapter->txff_allocation.rsvd_cpu_instr_pg_bndy - HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B;
198 pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy = pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy - HALMAC_RSVD_H2C_EXTRAINFO_PGNUM_8822B;
199 pHalmac_adapter->txff_allocation.rsvd_drv_pg_bndy = pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy - pHalmac_adapter->txff_allocation.rsvd_drv_pg_num;
200
201 /* Default setting (PCIE + SDIO + USB 4 bulkout) */
202 switch (halmac_trx_mode) {
203 case HALMAC_TRX_MODE_NORMAL:
204 HPQ_num = HALMAC_NORMAL_HPQ_PGNUM_8822B;
205 LPQ_Nnum = HALMAC_NORMAL_LPQ_PGNUM_8822B;
206 NPQ_num = HALMAC_NORMAL_NPQ_PGNUM_8822B;
207 EXPQ_num = HALMAC_NORMAL_EXPQ_PGNUM_8822B;
208 GAPQ_num = HALMAC_NORMAL_GAP_PGNUM_8822B;
209 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
210 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - HALMAC_WOWLAN_PATTERN_SIZE_8822B - 1;
211 transfer_mode = HALMAC_TRNSFER_NORMAL;
212 break;
213 case HALMAC_TRX_MODE_TRXSHARE:
214 break;
215 case HALMAC_TRX_MODE_WMM:
216 HPQ_num = HALMAC_WMM_HPQ_PGNUM_8822B;
217 LPQ_Nnum = HALMAC_WMM_LPQ_PGNUM_8822B;
218 NPQ_num = HALMAC_WMM_NPQ_PGNUM_8822B;
219 EXPQ_num = HALMAC_WMM_EXPQ_PGNUM_8822B;
220 GAPQ_num = HALMAC_WMM_GAP_PGNUM_8822B;
221 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
222 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - HALMAC_WOWLAN_PATTERN_SIZE_8822B - 1;
223 transfer_mode = HALMAC_TRNSFER_NORMAL;
224 break;
225 case HALMAC_TRX_MODE_P2P:
226 case HALMAC_TRX_MODE_LOOPBACK:
227 case HALMAC_TRX_MODE_DELAY_LOOPBACK:
228 HPQ_num = HALMAC_LB_HPQ_PGNUM_8822B;
229 LPQ_Nnum = HALMAC_LB_LPQ_PGNUM_8822B;
230 NPQ_num = HALMAC_LB_NPQ_PGNUM_8822B;
231 EXPQ_num = HALMAC_LB_EXPQ_PGNUM_8822B;
232 GAPQ_num = HALMAC_LB_GAP_PGNUM_8822B;
233 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
234 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - 1;
235 transfer_mode = HALMAC_TRNSFER_LOOPBACK_DIRECT;
236 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_WMAC_LBK_BUF_HD_V1, (u16)pHalmac_adapter->txff_allocation.rsvd_pg_bndy);
237 break;
238 default:
239 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg_8822b 3 switch case not support\n");
240 return HALMAC_RET_TRX_MODE_NOT_SUPPORT;
241 }
242
243 /* Extra setting */
244 if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
245 if (pHalmac_adapter->halmac_bulkout_num == 2) {
246 /* In USB 2 bulkout, only High and Normal queue can be used */
247 switch (halmac_trx_mode) {
248 case HALMAC_TRX_MODE_NORMAL:
249 HPQ_num = HALMAC_NORMAL_2BULKOUT_HPQ_PGNUM_8822B;
250 LPQ_Nnum = HALMAC_NORMAL_2BULKOUT_LPQ_PGNUM_8822B;
251 NPQ_num = HALMAC_NORMAL_2BULKOUT_NPQ_PGNUM_8822B;
252 EXPQ_num = HALMAC_NORMAL_2BULKOUT_EXPQ_PGNUM_8822B;
253 GAPQ_num = HALMAC_NORMAL_2BULKOUT_GAP_PGNUM_8822B;
254 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
255 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - HALMAC_WOWLAN_PATTERN_SIZE_8822B - 1;
256 transfer_mode = HALMAC_TRNSFER_NORMAL;
257 break;
258 case HALMAC_TRX_MODE_TRXSHARE:
259 break;
260 case HALMAC_TRX_MODE_WMM:
261 HPQ_num = HALMAC_WMM_HPQ_PGNUM_8822B;
262 LPQ_Nnum = HALMAC_WMM_LPQ_PGNUM_8822B;
263 NPQ_num = HALMAC_WMM_NPQ_PGNUM_8822B;
264 EXPQ_num = HALMAC_WMM_EXPQ_PGNUM_8822B;
265 GAPQ_num = HALMAC_WMM_GAP_PGNUM_8822B;
266 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
267 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - HALMAC_WOWLAN_PATTERN_SIZE_8822B - 1;
268 transfer_mode = HALMAC_TRNSFER_NORMAL;
269 break;
270 case HALMAC_TRX_MODE_P2P:
271 case HALMAC_TRX_MODE_LOOPBACK:
272 case HALMAC_TRX_MODE_DELAY_LOOPBACK:
273 HPQ_num = HALMAC_LB_2BULKOUT_HPQ_PGNUM_8822B;
274 LPQ_Nnum = HALMAC_LB_2BULKOUT_LPQ_PGNUM_8822B;
275 NPQ_num = HALMAC_LB_2BULKOUT_NPQ_PGNUM_8822B;
276 EXPQ_num = HALMAC_LB_2BULKOUT_EXPQ_PGNUM_8822B;
277 GAPQ_num = HALMAC_LB_2BULKOUT_GAP_PGNUM_8822B;
278 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
279 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - 1;
280 transfer_mode = HALMAC_TRNSFER_LOOPBACK_DIRECT;
281 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_WMAC_LBK_BUF_HD_V1, (u16)pHalmac_adapter->txff_allocation.rsvd_pg_bndy);
282 break;
283 default:
284 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg_8822b 4 switch case not support\n");
285 return HALMAC_RET_TRX_MODE_NOT_SUPPORT;
286 }
287 } else if (pHalmac_adapter->halmac_bulkout_num == 3) {
288 /* in USB 3 bulkout, only High, Normal, Low queue can be used */
289 switch (halmac_trx_mode) {
290 case HALMAC_TRX_MODE_NORMAL:
291 HPQ_num = HALMAC_NORMAL_3BULKOUT_HPQ_PGNUM_8822B;
292 LPQ_Nnum = HALMAC_NORMAL_3BULKOUT_LPQ_PGNUM_8822B;
293 NPQ_num = HALMAC_NORMAL_3BULKOUT_NPQ_PGNUM_8822B;
294 EXPQ_num = HALMAC_NORMAL_3BULKOUT_EXPQ_PGNUM_8822B;
295 GAPQ_num = HALMAC_NORMAL_3BULKOUT_GAP_PGNUM_8822B;
296 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
297 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - HALMAC_WOWLAN_PATTERN_SIZE_8822B - 1;
298 transfer_mode = HALMAC_TRNSFER_NORMAL;
299 break;
300 case HALMAC_TRX_MODE_TRXSHARE:
301 break;
302 case HALMAC_TRX_MODE_WMM:
303 HPQ_num = HALMAC_WMM_HPQ_PGNUM_8822B;
304 LPQ_Nnum = HALMAC_WMM_LPQ_PGNUM_8822B;
305 NPQ_num = HALMAC_WMM_NPQ_PGNUM_8822B;
306 EXPQ_num = HALMAC_WMM_EXPQ_PGNUM_8822B;
307 GAPQ_num = HALMAC_WMM_GAP_PGNUM_8822B;
308 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
309 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - HALMAC_WOWLAN_PATTERN_SIZE_8822B - 1;
310 transfer_mode = HALMAC_TRNSFER_NORMAL;
311 break;
312 case HALMAC_TRX_MODE_P2P:
313 case HALMAC_TRX_MODE_LOOPBACK:
314 case HALMAC_TRX_MODE_DELAY_LOOPBACK:
315 HPQ_num = HALMAC_LB_3BULKOUT_HPQ_PGNUM_8822B;
316 LPQ_Nnum = HALMAC_LB_3BULKOUT_LPQ_PGNUM_8822B;
317 NPQ_num = HALMAC_LB_3BULKOUT_NPQ_PGNUM_8822B;
318 EXPQ_num = HALMAC_LB_3BULKOUT_EXPQ_PGNUM_8822B;
319 GAPQ_num = HALMAC_LB_3BULKOUT_GAP_PGNUM_8822B;
320 PUBQ_num = pHalmac_adapter->txff_allocation.ac_q_pg_num - HPQ_num - LPQ_Nnum - NPQ_num - EXPQ_num - GAPQ_num;
321 rx_f_ifo_boundary = HALMAC_RX_FIFO_SIZE_8822B - 1;
322 transfer_mode = HALMAC_TRNSFER_LOOPBACK_DIRECT;
323 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_WMAC_LBK_BUF_HD_V1, (u16)pHalmac_adapter->txff_allocation.rsvd_pg_bndy);
324 break;
325 default:
326 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg_8822b 5 switch case not support\n");
327 return HALMAC_RET_TRX_MODE_NOT_SUPPORT;
328 }
329 }
330 }
331
332
333 if (pHalmac_adapter->txff_allocation.ac_q_pg_num < HPQ_num + LPQ_Nnum + NPQ_num + EXPQ_num + GAPQ_num)
334 return HALMAC_RET_CFG_TXFIFO_PAGE_FAIL;
335
336 pHalmac_adapter->txff_allocation.high_queue_pg_num = HPQ_num;
337 pHalmac_adapter->txff_allocation.low_queue_pg_num = LPQ_Nnum;
338 pHalmac_adapter->txff_allocation.normal_queue_pg_num = NPQ_num;
339 pHalmac_adapter->txff_allocation.extra_queue_pg_num = EXPQ_num;
340 pHalmac_adapter->txff_allocation.pub_queue_pg_num = PUBQ_num;
341
342 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Set FIFO page\n");
343
344 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_INFO_1, HPQ_num);
345 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_INFO_2, LPQ_Nnum);
346 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_INFO_3, NPQ_num);
347 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_INFO_4, EXPQ_num);
348 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_INFO_5, PUBQ_num);
349
350 pHalmac_adapter->sdio_free_space.high_queue_number = HPQ_num;
351 pHalmac_adapter->sdio_free_space.normal_queue_number = NPQ_num;
352 pHalmac_adapter->sdio_free_space.low_queue_number = LPQ_Nnum;
353 pHalmac_adapter->sdio_free_space.public_queue_number = PUBQ_num;
354 pHalmac_adapter->sdio_free_space.extra_queue_number = EXPQ_num;
355
356 HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RQPN_CTRL_2, HALMAC_REG_READ_32(pHalmac_adapter, REG_RQPN_CTRL_2) | BIT(31));
357
358 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1));
359 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BCNQ_BDNY_V1, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCNQ_PGBNDY_V1));
360 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2 + 2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1));
361 HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BCNQ1_BDNY_V1, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCNQ_PGBNDY_V1));
362
363 HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RXFF_BNDY, rx_f_ifo_boundary);
364
365 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Init LLT table\n");
366
367 if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
368 value8 = (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_AUTO_LLT_V1) & ~(BIT_MASK_BLK_DESC_NUM << BIT_SHIFT_BLK_DESC_NUM));
369 value8 = (u8)(value8 | (HALMAC_BLK_DESC_NUM_8822B << BIT_SHIFT_BLK_DESC_NUM));
370 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_AUTO_LLT_V1, value8);
371
372 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_AUTO_LLT_V1 + 3, HALMAC_BLK_DESC_NUM_8822B);
373 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1, HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1) | BIT(1));
374 }
375
376 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_AUTO_LLT_V1, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_AUTO_LLT_V1) | BIT_AUTO_INIT_LLT_V1));
377 counter = 1000;
378 while (HALMAC_REG_READ_8(pHalmac_adapter, REG_AUTO_LLT_V1) & BIT_AUTO_INIT_LLT_V1) {
379 counter--;
380 if (counter == 0)
381 return HALMAC_RET_INIT_LLT_FAIL;
382 }
383
384 if (HALMAC_TRX_MODE_DELAY_LOOPBACK == halmac_trx_mode)
385 transfer_mode = HALMAC_TRNSFER_LOOPBACK_DELAY;
386
387 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR + 3, (u8)transfer_mode);
388
389 return HALMAC_RET_SUCCESS;
390 }
391