1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
22 #include <drv_types.h>
26 static void dump_mac_page0(PADAPTER padapter)
34 RTW_ERR("Dump MAC Page0 register:\n");
35 for (index = 0 ; index < 0x100 ; index += 16) {
37 len = snprintf(str_val, sizeof(str_val),
39 strncpy(str_out, str_val, len);
42 for (i = 0 ; i < 16 ; i++) {
43 len = snprintf(str_val, sizeof(str_val), "%02x ",
44 rtw_read8(padapter, index + i));
45 strncpy(p, str_val, len);
48 RTW_INFO("%s\n", str_out);
49 _rtw_memset(&str_out, '\0', sizeof(str_out));
55 * Call this function to make sure power on successfully
58 * _SUCCESS enable success
61 bool sdio_power_on_check(PADAPTER padapter) {
62 u32 val_offset0, val_offset1, val_offset2, val_offset3;
68 val_offset0 = rtw_read8(padapter, REG_CR);
69 val_offset1 = rtw_read8(padapter, REG_CR + 1);
70 val_offset2 = rtw_read8(padapter, REG_CR + 2);
71 val_offset3 = rtw_read8(padapter, REG_CR + 3);
73 if (val_offset0 == 0xEA || val_offset1 == 0xEA ||
74 val_offset2 == 0xEA || val_offset3 == 0xEA) {
75 RTW_INFO("%s: power on fail, do Power on again\n", __func__);
79 val_mix = val_offset3 << 24 | val_mix;
80 val_mix = val_offset2 << 16 | val_mix;
81 val_mix = val_offset1 << 8 | val_mix;
82 val_mix = val_offset0 | val_mix;
84 res = rtw_read32(padapter, REG_CR);
86 RTW_INFO("%s: val_mix:0x%08x, res:0x%08x\n", __func__, val_mix, res);
90 RTW_INFO("%s: 0x100 the result of cmd52 and cmd53 is the same.\n", __func__);
94 RTW_INFO("%s: 0x100 cmd52 and cmd53 is not the same(index:%d).\n", __func__, index);
95 res = rtw_read32(padapter, REG_CR);
103 while (index < 100) {
104 rtw_write32(padapter, 0x1B8, 0x12345678);
105 res = rtw_read32(padapter, 0x1B8);
106 if (res == 0x12345678) {
107 RTW_INFO("%s: 0x1B8 test Pass.\n", __func__);
112 RTW_INFO("%s: 0x1B8 test Fail(index: %d).\n", __func__, index);
117 RTW_INFO("%s: fail at cmd52, cmd53.\n", __func__);
120 dump_mac_page0(padapter);
125 u8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter)
127 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
129 if (pHalData->SdioTxOQTMaxFreeSpace < 8)
130 pHalData->SdioTxOQTMaxFreeSpace = 8;
132 return pHalData->SdioTxOQTMaxFreeSpace;
135 u8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
137 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
139 if ((pHalData->SdioTxFIFOFreePage[PageIdx] + pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) >= (RequiredPageNum))
145 void rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
147 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
148 u8 DedicatedPgNum = 0;
149 u8 RequiredPublicFreePgNum = 0;
152 /* _enter_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql); */
154 DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
155 if (RequiredPageNum <= DedicatedPgNum)
156 pHalData->SdioTxFIFOFreePage[PageIdx] -= RequiredPageNum;
158 pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
159 RequiredPublicFreePgNum = RequiredPageNum - DedicatedPgNum;
160 pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
163 /* _exit_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql); */
166 void rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ)
168 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
170 u32 lenHQ, lenNQ, lenLQ;
172 rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE, &page_size);
174 lenHQ = ((numHQ + numPubQ) >> 1) * page_size;
175 lenNQ = ((numNQ + numPubQ) >> 1) * page_size;
176 lenLQ = ((numLQ + numPubQ) >> 1) * page_size;
178 pHalData->sdio_tx_max_len[HI_QUEUE_IDX] = (lenHQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenHQ;
179 pHalData->sdio_tx_max_len[MID_QUEUE_IDX] = (lenNQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenNQ;
180 pHalData->sdio_tx_max_len[LOW_QUEUE_IDX] = (lenLQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenLQ;
183 u32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx)
185 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
186 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
187 u32 deviceId, max_len;
190 deviceId = ffaddr2deviceId(pdvobjpriv, queue_idx);
192 case WLAN_TX_HIQ_DEVICE_ID:
193 max_len = pHalData->sdio_tx_max_len[HI_QUEUE_IDX];
196 case WLAN_TX_MIQ_DEVICE_ID:
197 max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
200 case WLAN_TX_LOQ_DEVICE_ID:
201 max_len = pHalData->sdio_tx_max_len[LOW_QUEUE_IDX];
205 max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
212 #ifdef CONFIG_FW_C2H_REG
213 void sd_c2h_hisr_hdl(_adapter *adapter)
215 u8 c2h_evt[C2H_REG_LEN] = {0};
219 if (rtw_hal_c2h_evt_read(adapter, c2h_evt) != _SUCCESS)
222 if (rtw_hal_c2h_reg_hdr_parse(adapter, c2h_evt, &id, &seq, &plen, &payload) != _SUCCESS)
225 if (rtw_hal_c2h_id_handle_directly(adapter, id, seq, plen, payload)) {
226 /* Handle directly */
227 rtw_hal_c2h_handler(adapter, id, seq, plen, payload);
231 if (rtw_c2h_reg_wk_cmd(adapter, c2h_evt) != _SUCCESS)
232 RTW_ERR("%s rtw_c2h_reg_wk_cmd fail\n", __func__);
239 #endif /* !RTW_HALMAC */