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 }
116