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