1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #define _HAL_SDIO_C_
8 
9 #include <drv_types.h>
10 #include <rtw_debug.h>
11 #include <hal_data.h>
12 
13 u8 rtw_hal_sdio_max_txoqt_free_space(struct adapter *padapter)
14 {
15 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
16 
17 	if (pHalData->SdioTxOQTMaxFreeSpace < 8)
18 		pHalData->SdioTxOQTMaxFreeSpace = 8;
19 
20 	return pHalData->SdioTxOQTMaxFreeSpace;
21 }
22 
23 u8 rtw_hal_sdio_query_tx_freepage(
24 	struct adapter *padapter, u8 PageIdx, u8 RequiredPageNum
25 )
26 {
27 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
28 
29 	if ((pHalData->SdioTxFIFOFreePage[PageIdx]+pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) >= (RequiredPageNum))
30 		return true;
31 	else
32 		return false;
33 }
34 
35 void rtw_hal_sdio_update_tx_freepage(
36 	struct adapter *padapter, u8 PageIdx, u8 RequiredPageNum
37 )
38 {
39 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
40 	u8 DedicatedPgNum = 0;
41 	u8 RequiredPublicFreePgNum = 0;
42 	/* _irqL irql; */
43 
44 	/* spin_lock_bh(&pHalData->SdioTxFIFOFreePageLock); */
45 
46 	DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
47 	if (RequiredPageNum <= DedicatedPgNum) {
48 		pHalData->SdioTxFIFOFreePage[PageIdx] -= RequiredPageNum;
49 	} else {
50 		pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
51 		RequiredPublicFreePgNum = RequiredPageNum - DedicatedPgNum;
52 		pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
53 	}
54 
55 	/* spin_unlock_bh(&pHalData->SdioTxFIFOFreePageLock); */
56 }
57 
58 void rtw_hal_set_sdio_tx_max_length(
59 	struct adapter *padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ
60 )
61 {
62 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
63 	u32 page_size;
64 	u32 lenHQ, lenNQ, lenLQ;
65 
66 	rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE, &page_size);
67 
68 	lenHQ = ((numHQ + numPubQ) >> 1) * page_size;
69 	lenNQ = ((numNQ + numPubQ) >> 1) * page_size;
70 	lenLQ = ((numLQ + numPubQ) >> 1) * page_size;
71 
72 	pHalData->sdio_tx_max_len[HI_QUEUE_IDX] =
73 		(lenHQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenHQ;
74 	pHalData->sdio_tx_max_len[MID_QUEUE_IDX] =
75 		(lenNQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenNQ;
76 	pHalData->sdio_tx_max_len[LOW_QUEUE_IDX] =
77 		(lenLQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenLQ;
78 }
79 
80 u32 rtw_hal_get_sdio_tx_max_length(struct adapter *padapter, u8 queue_idx)
81 {
82 	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
83 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
84 	u32 deviceId, max_len;
85 
86 
87 	deviceId = ffaddr2deviceId(pdvobjpriv, queue_idx);
88 	switch (deviceId) {
89 	case WLAN_TX_HIQ_DEVICE_ID:
90 		max_len = pHalData->sdio_tx_max_len[HI_QUEUE_IDX];
91 		break;
92 
93 	case WLAN_TX_MIQ_DEVICE_ID:
94 		max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
95 		break;
96 
97 	case WLAN_TX_LOQ_DEVICE_ID:
98 		max_len = pHalData->sdio_tx_max_len[LOW_QUEUE_IDX];
99 		break;
100 
101 	default:
102 		max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
103 		break;
104 	}
105 
106 	return max_len;
107 }
108