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