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