OSDN Git Service

staging: rtl8723bs: add source files for the new driver
[android-x86/kernel.git] / drivers / staging / rtl8723bs / hal / 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  ******************************************************************************/
15 #define _HAL_SDIO_C_
16
17 #include <drv_types.h>
18 #include <rtw_debug.h>
19 #include <hal_data.h>
20
21 u8 rtw_hal_sdio_max_txoqt_free_space(struct adapter *padapter)
22 {
23         struct hal_com_data     *pHalData = GET_HAL_DATA(padapter);
24
25         if (pHalData->SdioTxOQTMaxFreeSpace < 8)
26                 pHalData->SdioTxOQTMaxFreeSpace = 8;
27
28         return pHalData->SdioTxOQTMaxFreeSpace;
29 }
30
31 u8 rtw_hal_sdio_query_tx_freepage(
32         struct adapter *padapter, u8 PageIdx, u8 RequiredPageNum
33 )
34 {
35         struct hal_com_data     *pHalData = GET_HAL_DATA(padapter);
36
37         if ((pHalData->SdioTxFIFOFreePage[PageIdx]+pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) >= (RequiredPageNum))
38                 return true;
39         else
40                 return false;
41 }
42
43 void rtw_hal_sdio_update_tx_freepage(
44         struct adapter *padapter, u8 PageIdx, u8 RequiredPageNum
45 )
46 {
47         struct hal_com_data     *pHalData = GET_HAL_DATA(padapter);
48         u8 DedicatedPgNum = 0;
49         u8 RequiredPublicFreePgNum = 0;
50         /* _irqL irql; */
51
52         /* spin_lock_bh(&pHalData->SdioTxFIFOFreePageLock); */
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         /* spin_unlock_bh(&pHalData->SdioTxFIFOFreePageLock); */
64 }
65
66 void rtw_hal_set_sdio_tx_max_length(
67         struct adapter *padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ
68 )
69 {
70         struct hal_com_data     *pHalData = GET_HAL_DATA(padapter);
71         u32 page_size;
72         u32 lenHQ, lenNQ, lenLQ;
73
74         rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE, &page_size);
75
76         lenHQ = ((numHQ + numPubQ) >> 1) * page_size;
77         lenNQ = ((numNQ + numPubQ) >> 1) * page_size;
78         lenLQ = ((numLQ + numPubQ) >> 1) * page_size;
79
80         pHalData->sdio_tx_max_len[HI_QUEUE_IDX] =
81                 (lenHQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenHQ;
82         pHalData->sdio_tx_max_len[MID_QUEUE_IDX] =
83                 (lenNQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenNQ;
84         pHalData->sdio_tx_max_len[LOW_QUEUE_IDX] =
85                 (lenLQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenLQ;
86 }
87
88 u32 rtw_hal_get_sdio_tx_max_length(struct adapter *padapter, u8 queue_idx)
89 {
90         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
91         struct hal_com_data     *pHalData = GET_HAL_DATA(padapter);
92         u32 deviceId, max_len;
93
94
95         deviceId = ffaddr2deviceId(pdvobjpriv, queue_idx);
96         switch (deviceId) {
97         case WLAN_TX_HIQ_DEVICE_ID:
98                 max_len = pHalData->sdio_tx_max_len[HI_QUEUE_IDX];
99                 break;
100
101         case WLAN_TX_MIQ_DEVICE_ID:
102                 max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
103                 break;
104
105         case WLAN_TX_LOQ_DEVICE_ID:
106                 max_len = pHalData->sdio_tx_max_len[LOW_QUEUE_IDX];
107                 break;
108
109         default:
110                 max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
111                 break;
112         }
113
114         return max_len;
115 }