1 #include "halmac_8822b_cfg.h"
2 #include "halmac_func_8822b.h"
3 #include "../halmac_func_88xx.h"
4 
5 
6 /**
7  * halmac_mount_api_8822b() - attach functions to function pointer
8  * @pHalmac_adapter
9  *
10  * SD1 internal use
11  *
12  * Author : KaiYuan Chang/Ivan Lin
13  * Return : HALMAC_RET_STATUS
14  */
15 HALMAC_RET_STATUS
halmac_mount_api_8822b(IN PHALMAC_ADAPTER pHalmac_adapter)16 halmac_mount_api_8822b(
17 	IN PHALMAC_ADAPTER pHalmac_adapter
18 )
19 {
20 	PHALMAC_API pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
21 
22 	pHalmac_adapter->chip_id = HALMAC_CHIP_ID_8822B;
23 	pHalmac_adapter->hw_config_info.efuse_size = HALMAC_EFUSE_SIZE_8822B;
24 	pHalmac_adapter->hw_config_info.eeprom_size = HALMAC_EEPROM_SIZE_8822B;
25 	pHalmac_adapter->hw_config_info.bt_efuse_size = HALMAC_BT_EFUSE_SIZE_8822B;
26 	pHalmac_adapter->hw_config_info.cam_entry_num = HALMAC_SECURITY_CAM_ENTRY_NUM_8822B;
27 	pHalmac_adapter->hw_config_info.txdesc_size = HALMAC_TX_DESC_SIZE_8822B;
28 	pHalmac_adapter->hw_config_info.rxdesc_size = HALMAC_RX_DESC_SIZE_8822B;
29 	pHalmac_adapter->hw_config_info.tx_fifo_size = HALMAC_TX_FIFO_SIZE_8822B;
30 	pHalmac_adapter->hw_config_info.rx_fifo_size = HALMAC_RX_FIFO_SIZE_8822B;
31 
32 	pHalmac_adapter->txff_allocation.rsvd_drv_pg_num = HALMAC_RSVD_DRV_PGNUM_8822B;
33 
34 #if HALMAC_8822B_SUPPORT
35 	pHalmac_api->halmac_init_trx_cfg = halmac_init_trx_cfg_8822b;
36 	pHalmac_api->halmac_init_h2c = halmac_init_h2c_8822b;
37 
38 	if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
39 		pHalmac_api->halmac_tx_allowed_sdio = halmac_tx_allowed_sdio_8822b;
40 		pHalmac_api->halmac_cfg_tx_agg_align = halmac_cfg_tx_agg_align_sdio_not_support_88xx;
41 		pHalmac_api->halmac_mac_power_switch = halmac_mac_power_switch_8822b_sdio;
42 	} else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
43 		pHalmac_api->halmac_mac_power_switch = halmac_mac_power_switch_8822b_usb;
44 		pHalmac_api->halmac_cfg_tx_agg_align = halmac_cfg_tx_agg_align_usb_not_support_88xx;
45 	} else if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) {
46 		pHalmac_api->halmac_mac_power_switch = halmac_mac_power_switch_8822b_pcie;
47 		pHalmac_api->halmac_cfg_tx_agg_align = halmac_cfg_tx_agg_align_pcie_not_support_88xx;
48 	}
49 #endif
50 	return HALMAC_RET_SUCCESS;
51 }
52 
53 
54 /**
55  * halmac_init_trx_cfg_8822b() - config trx dma register
56  * @pHalmac_adapter
57  * @halmac_trx_mode
58  * Author : KaiYuan Chang/Ivan Lin
59  * Return : HALMAC_RET_STATUS
60  */
61 HALMAC_RET_STATUS
halmac_init_trx_cfg_8822b(IN PHALMAC_ADAPTER pHalmac_adapter,IN HALMAC_TRX_MODE halmac_trx_mode)62 halmac_init_trx_cfg_8822b(
63 	IN PHALMAC_ADAPTER pHalmac_adapter,
64 	IN HALMAC_TRX_MODE halmac_trx_mode
65 )
66 {
67 	u8 value8;
68 	u16 value16;
69 	u32 value32;
70 	VOID *pDriver_adapter = NULL;
71 	PHALMAC_API pHalmac_api;
72 	HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
73 
74 	if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
75 		return HALMAC_RET_ADAPTER_INVALID;
76 
77 	if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
78 		return HALMAC_RET_API_INVALID;
79 
80 	halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_TRX_CFG);
81 
82 	pDriver_adapter = pHalmac_adapter->pDriver_adapter;
83 	pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
84 	pHalmac_adapter->trx_mode = halmac_trx_mode;
85 
86 	PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg ==========>halmac_trx_mode = %d\n", halmac_trx_mode);
87 
88 	status = halmac_txdma_queue_mapping_8822b(pHalmac_adapter, halmac_trx_mode);
89 
90 	if (HALMAC_RET_SUCCESS != status) {
91 		PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_txdma_queue_mapping fail!\n");
92 		return status;
93 	}
94 
95 	value8 = 0;
96 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
97 	value8 = HALMAC_CR_TRX_ENABLE_8822B;
98 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
99 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2CQ_CSR, BIT(31));
100 	value16 = BIT_MAC_SEC_EN | BIT_32K_CAL_TMR_EN;
101 	HALMAC_REG_WRITE_16(pHalmac_adapter, REG_CR, (u16)(HALMAC_REG_READ_16(pHalmac_adapter, REG_CR) | value16));
102 
103 	status = halmac_priority_queue_config_8822b(pHalmac_adapter, halmac_trx_mode);
104 
105 	if (HALMAC_RET_SUCCESS != status) {
106 		PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_txdma_queue_mapping fail!\n");
107 		return status;
108 	}
109 
110 	PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Init Network type\n");
111 
112 	value8 = (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_CR + 2) & ~BIT_MASK_NETYPE0);
113 	value8 = (u8)(value8 | HALMAC_NETWORK_NO_LINK);
114 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR + 2, value8);
115 
116 	/* Config H2C packet buffer */
117 	value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_HEAD);
118 	value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
119 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_HEAD, value32);
120 
121 	value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_READ_ADDR);
122 	value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
123 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_READ_ADDR, value32);
124 
125 	value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_TAIL);
126 	value32 = (value32 & 0xFFFC0000) | ((pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8822B) + (HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B << HALMAC_TX_PAGE_SIZE_2_POWER_8822B));
127 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_TAIL, value32);
128 
129 	value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
130 	value8 = (u8)((value8 & 0xFC) | 0x01);
131 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
132 
133 	value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
134 	value8 = (u8)((value8 & 0xFB) | 0x04);
135 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
136 
137 	value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
138 	value8 = (u8)((value8 & 0x7f) | 0x80);
139 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
140 
141 	pHalmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B << HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
142 	halmac_get_h2c_buff_free_space_88xx(pHalmac_adapter);
143 
144 	if (pHalmac_adapter->h2c_buff_size != pHalmac_adapter->h2c_buf_free_space) {
145 		PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "get h2c free space error!\n");
146 		return HALMAC_RET_GET_H2C_SPACE_ERR;
147 	}
148 
149 	PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg <==========\n");
150 
151 	return HALMAC_RET_SUCCESS;
152 }
153 
154 /**
155  * halmac_init_h2c_8822b() - config h2c packet buffer
156  * @pHalmac_adapter
157  * Author : KaiYuan Chang/Ivan Lin
158  * Return : HALMAC_RET_STATUS
159  */
160 HALMAC_RET_STATUS
halmac_init_h2c_8822b(IN PHALMAC_ADAPTER pHalmac_adapter)161 halmac_init_h2c_8822b(
162 	IN PHALMAC_ADAPTER pHalmac_adapter
163 )
164 {
165 	u8 value8;
166 	u32 value32;
167 	VOID *pDriver_adapter = NULL;
168 	PHALMAC_API pHalmac_api;
169 
170 	if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
171 		return HALMAC_RET_ADAPTER_INVALID;
172 
173 	if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
174 		return HALMAC_RET_API_INVALID;
175 
176 	pDriver_adapter = pHalmac_adapter->pDriver_adapter;
177 	pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
178 
179 	value8 = 0;
180 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
181 	value8 = HALMAC_CR_TRX_ENABLE_8822B;
182 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
183 
184 	value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_HEAD);
185 	value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
186 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_HEAD, value32);
187 
188 	value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_READ_ADDR);
189 	value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
190 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_READ_ADDR, value32);
191 
192 	value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_TAIL);
193 	value32 = (value32 & 0xFFFC0000) | ((pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8822B) + (HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B << HALMAC_TX_PAGE_SIZE_2_POWER_8822B));
194 	HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_TAIL, value32);
195 	value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
196 	value8 = (u8)((value8 & 0xFC) | 0x01);
197 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
198 
199 	value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
200 	value8 = (u8)((value8 & 0xFB) | 0x04);
201 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
202 
203 	value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
204 	value8 = (u8)((value8 & 0x7f) | 0x80);
205 	HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
206 
207 	pHalmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B << HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
208 	halmac_get_h2c_buff_free_space_88xx(pHalmac_adapter);
209 
210 	if (pHalmac_adapter->h2c_buff_size != pHalmac_adapter->h2c_buf_free_space) {
211 		PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "get h2c free space error!\n");
212 		return HALMAC_RET_GET_H2C_SPACE_ERR;
213 	}
214 
215 	PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "h2c free space : %d\n", pHalmac_adapter->h2c_buf_free_space);
216 
217 	return HALMAC_RET_SUCCESS;
218 }
219