net: wireless: rockchip_wlan: add rtl8723bs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / hal / hal_hci / hal_sdio.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *                                        
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #define _HAL_SDIO_C_
21
22 #include <drv_types.h>
23 #include <hal_data.h>
24
25 u8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter)
26 {
27         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
28
29         if(pHalData->SdioTxOQTMaxFreeSpace < 8 )
30                 pHalData->SdioTxOQTMaxFreeSpace = 8;
31
32         return pHalData->SdioTxOQTMaxFreeSpace; 
33 }
34
35 u8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
36 {
37         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
38
39         if ((pHalData->SdioTxFIFOFreePage[PageIdx]+pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) >= (RequiredPageNum))
40                 return _TRUE;
41         else
42                 return _FALSE;
43 }
44
45 void rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
46 {
47         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
48         u8      DedicatedPgNum = 0;
49         u8      RequiredPublicFreePgNum = 0;
50         //_irqL irql;
51
52         //_enter_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql);
53
54         DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
55         if (RequiredPageNum <= DedicatedPgNum) {
56                 pHalData->SdioTxFIFOFreePage[PageIdx] -= RequiredPageNum;
57         } else {
58                 pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
59                 RequiredPublicFreePgNum = RequiredPageNum - DedicatedPgNum;
60                 pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
61         }
62
63         //_exit_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql);
64 }
65
66 void rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ)
67 {
68         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
69         u32     page_size;
70         u32     lenHQ, lenNQ, lenLQ;
71
72         rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE,&page_size);
73
74         lenHQ = ((numHQ + numPubQ) >> 1) * page_size;
75         lenNQ = ((numNQ + numPubQ) >> 1) * page_size;
76         lenLQ = ((numLQ + numPubQ) >> 1) * page_size;
77
78         pHalData->sdio_tx_max_len[HI_QUEUE_IDX] = (lenHQ > MAX_XMITBUF_SZ)? MAX_XMITBUF_SZ:lenHQ;
79         pHalData->sdio_tx_max_len[MID_QUEUE_IDX] = (lenNQ > MAX_XMITBUF_SZ)? MAX_XMITBUF_SZ:lenNQ;
80         pHalData->sdio_tx_max_len[LOW_QUEUE_IDX] = (lenLQ > MAX_XMITBUF_SZ)? MAX_XMITBUF_SZ:lenLQ;
81 }
82
83 u32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx)
84 {
85         struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
86         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
87         u32     deviceId, max_len;
88         
89
90         deviceId = ffaddr2deviceId(pdvobjpriv, queue_idx);
91         switch (deviceId) {
92                 case WLAN_TX_HIQ_DEVICE_ID:
93                         max_len = pHalData->sdio_tx_max_len[HI_QUEUE_IDX];
94                         break;
95
96                 case WLAN_TX_MIQ_DEVICE_ID:
97                         max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
98                         break;
99
100                 case WLAN_TX_LOQ_DEVICE_ID:
101                         max_len = pHalData->sdio_tx_max_len[LOW_QUEUE_IDX];
102                         break;
103
104                 default:
105                         max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
106                         break;
107         }
108
109         return max_len;
110 }
111
112