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

source code of linux/drivers/staging/rtl8723bs/hal/hal_sdio.c