1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include "halmac_8822b_cfg.h"
3
4 /**
5 * halmac_mac_power_switch_8822b_sdio() - change mac power
6 * @pHalmac_adapter
7 * @halmac_power
8 * Author : KaiYuan Chang/Ivan Lin
9 * Return : HALMAC_RET_STATUS
10 */
11 HALMAC_RET_STATUS
halmac_mac_power_switch_8822b_sdio(IN PHALMAC_ADAPTER pHalmac_adapter,IN HALMAC_MAC_POWER halmac_power)12 halmac_mac_power_switch_8822b_sdio(
13 IN PHALMAC_ADAPTER pHalmac_adapter,
14 IN HALMAC_MAC_POWER halmac_power
15 )
16 {
17 u8 interface_mask;
18 u8 rpwm;
19 VOID *pDriver_adapter = NULL;
20 PHALMAC_API pHalmac_api;
21
22 if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
23 return HALMAC_RET_ADAPTER_INVALID;
24
25 if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
26 return HALMAC_RET_API_INVALID;
27
28 halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_MAC_POWER_SWITCH);
29
30 pDriver_adapter = pHalmac_adapter->pDriver_adapter;
31 pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
32
33 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "halmac_mac_power_switch_88xx_sdio halmac_power = %x ==========>\n", halmac_power);
34
35 interface_mask = HALMAC_PWR_INTF_SDIO_MSK;
36
37 pHalmac_adapter->rpwm_record = HALMAC_REG_READ_8(pHalmac_adapter, REG_SDIO_HRPWM1);
38
39 /* Check FW still exist or not */
40 if (0xC078 == HALMAC_REG_READ_16(pHalmac_adapter, REG_MCUFW_CTRL)) {
41 /* Leave 32K */
42 rpwm = (u8)((pHalmac_adapter->rpwm_record ^ BIT(7)) & 0x80);
43 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SDIO_HRPWM1, rpwm);
44 }
45
46 if (0xEA == HALMAC_REG_READ_8(pHalmac_adapter, REG_CR))
47 pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
48
49 /*Check if power switch is needed*/
50 if (halmac_power == pHalmac_adapter->halmac_state.mac_power) {
51 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_WARN, "halmac_mac_power_switch power state unchange!\n");
52 } else {
53 if (HALMAC_MAC_POWER_OFF == halmac_power) {
54 if (HALMAC_RET_SUCCESS != halmac_pwr_seq_parser_88xx(pHalmac_adapter, HALMAC_PWR_CUT_TESTCHIP_MSK, HALMAC_PWR_FAB_TSMC_MSK,
55 interface_mask, halmac_8822b_card_disable_flow)) {
56 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "Handle power off cmd error\n");
57 return HALMAC_RET_POWER_OFF_FAIL;
58 }
59
60 pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
61 pHalmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_UNDEFINE;
62 pHalmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
63 } else {
64 if (HALMAC_RET_SUCCESS != halmac_pwr_seq_parser_88xx(pHalmac_adapter, HALMAC_PWR_CUT_TESTCHIP_MSK, HALMAC_PWR_FAB_TSMC_MSK,
65 interface_mask, halmac_8822b_card_enable_flow)) {
66 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "Handle power on cmd error\n");
67 return HALMAC_RET_POWER_ON_FAIL;
68 }
69
70 pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
71 pHalmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
72 }
73 }
74
75 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "halmac_mac_power_switch_88xx_sdio <==========\n");
76
77 return HALMAC_RET_SUCCESS;
78 }
79
80 /**
81 * halmac_tx_allowed_sdio_8822b() - check sdio tx reserved page
82 * @pHalmac_adapter
83 * @pHalmac_buf
84 * @halmac_size
85 * Author : Ivan Lin
86 * Return : HALMAC_RET_STATUS
87 */
88 HALMAC_RET_STATUS
halmac_tx_allowed_sdio_8822b(IN PHALMAC_ADAPTER pHalmac_adapter,IN u8 * pHalmac_buf,IN u32 halmac_size)89 halmac_tx_allowed_sdio_8822b(
90 IN PHALMAC_ADAPTER pHalmac_adapter,
91 IN u8 *pHalmac_buf,
92 IN u32 halmac_size
93 )
94 {
95 u8 *pCurr_packet;
96 u16 *pCurr_free_space;
97 u32 i, counter;
98 u32 tx_agg_num, packet_size;
99 u32 tx_required_page_num, total_required_page_num = 0;
100 VOID *pDriver_adapter = NULL;
101 HALMAC_DMA_MAPPING dma_mapping;
102
103 if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
104 return HALMAC_RET_ADAPTER_INVALID;
105
106 if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
107 return HALMAC_RET_API_INVALID;
108
109 halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_TX_ALLOWED_SDIO);
110
111 pDriver_adapter = pHalmac_adapter->pDriver_adapter;
112
113 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_tx_allowed_sdio_8822b ==========>\n");
114
115 tx_agg_num = GET_TX_DESC_DMA_TXAGG_NUM(pHalmac_buf);
116 pCurr_packet = pHalmac_buf;
117
118 tx_agg_num = (tx_agg_num == 0) ? 1 : tx_agg_num;
119
120 switch ((HALMAC_QUEUE_SELECT)GET_TX_DESC_QSEL(pCurr_packet)) {
121 case HALMAC_QUEUE_SELECT_VO:
122 case HALMAC_QUEUE_SELECT_VO_V2:
123 dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO];
124 break;
125 case HALMAC_QUEUE_SELECT_VI:
126 case HALMAC_QUEUE_SELECT_VI_V2:
127 dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI];
128 break;
129 case HALMAC_QUEUE_SELECT_BE:
130 case HALMAC_QUEUE_SELECT_BE_V2:
131 dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE];
132 break;
133 case HALMAC_QUEUE_SELECT_BK:
134 case HALMAC_QUEUE_SELECT_BK_V2:
135 dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK];
136 break;
137 case HALMAC_QUEUE_SELECT_MGNT:
138 dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG];
139 break;
140 case HALMAC_QUEUE_SELECT_HIGH:
141 dma_mapping = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI];
142 break;
143 case HALMAC_QUEUE_SELECT_BCN:
144 case HALMAC_QUEUE_SELECT_CMD:
145 return HALMAC_RET_SUCCESS;
146 default:
147 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Qsel is out of range\n");
148 return HALMAC_RET_QSEL_INCORRECT;
149 }
150
151 switch (dma_mapping) {
152 case HALMAC_DMA_MAPPING_HIGH:
153 pCurr_free_space = &(pHalmac_adapter->sdio_free_space.high_queue_number);
154 break;
155 case HALMAC_DMA_MAPPING_NORMAL:
156 pCurr_free_space = &(pHalmac_adapter->sdio_free_space.normal_queue_number);
157 break;
158 case HALMAC_DMA_MAPPING_LOW:
159 pCurr_free_space = &(pHalmac_adapter->sdio_free_space.low_queue_number);
160 break;
161 case HALMAC_DMA_MAPPING_EXTRA:
162 pCurr_free_space = &(pHalmac_adapter->sdio_free_space.extra_queue_number);
163 break;
164 default:
165 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "DmaMapping is out of range\n");
166 return HALMAC_RET_DMA_MAP_INCORRECT;
167 }
168
169 for (i = 0; i < tx_agg_num; i++) {
170 packet_size = GET_TX_DESC_TXPKTSIZE(pCurr_packet) + GET_TX_DESC_OFFSET(pCurr_packet);
171 tx_required_page_num = (packet_size >> HALMAC_TX_PAGE_SIZE_2_POWER_8822B) + ((packet_size & (HALMAC_TX_PAGE_SIZE_8822B - 1)) ? 1 : 0);
172 total_required_page_num += tx_required_page_num;
173
174 packet_size = HALMAC_ALIGN(packet_size, 8);
175
176 pCurr_packet += packet_size;
177 }
178
179 counter = 10;
180 while (1) {
181 if ((u32)(*pCurr_free_space + pHalmac_adapter->sdio_free_space.public_queue_number) >= total_required_page_num) {
182 if (*pCurr_free_space >= total_required_page_num) {
183 *pCurr_free_space -= (u16)total_required_page_num;
184 } else {
185 pHalmac_adapter->sdio_free_space.public_queue_number -= (u16)(total_required_page_num - *pCurr_free_space);
186 *pCurr_free_space = 0;
187 }
188 break;
189 } else {
190 halmac_update_sdio_free_page_88xx(pHalmac_adapter);
191 }
192
193 counter--;
194 if (0 == counter)
195 return HALMAC_RET_FREE_SPACE_NOT_ENOUGH;
196 }
197
198 counter = 10;
199 while (pHalmac_adapter->sdio_free_space.ac_oqt_number < tx_agg_num) {
200 halmac_update_oqt_free_space_88xx(pHalmac_adapter);
201
202 counter--;
203 if (0 == counter)
204 return HALMAC_RET_FREE_SPACE_NOT_ENOUGH;
205 }
206 pHalmac_adapter->sdio_free_space.ac_oqt_number -= (u8)tx_agg_num;
207
208 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_tx_allowed_sdio_8822b <==========\n");
209
210 return HALMAC_RET_SUCCESS;
211 }
212
213
214