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