Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / staging / rtl8723bs / hal / hal_sdio.c
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 }