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_sdio_f0(PADAPTER padapter)
34 RTW_ERR("Dump SDIO function_0 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_sd_f0_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));
53 static void dump_sdio_local(PADAPTER padapter)
61 RTW_ERR("Dump SDIO local register:\n");
62 for (index = 0 ; index < 0x100 ; index += 16) {
64 len = snprintf(str_val, sizeof(str_val),
66 strncpy(str_out, str_val, len);
69 for (i = 0 ; i < 16 ; i++) {
70 len = snprintf(str_val, sizeof(str_val), "%02x ",
71 rtw_read8(padapter, (0x1025 << 16) | (index + i)));
72 strncpy(p, str_val, len);
75 RTW_INFO("%s\n", str_out);
76 _rtw_memset(&str_out, '\0', sizeof(str_out));
80 static void dump_mac_page0(PADAPTER padapter)
88 RTW_ERR("Dump MAC Page0 register:\n");
89 for (index = 0 ; index < 0x100 ; index += 16) {
91 len = snprintf(str_val, sizeof(str_val),
93 strncpy(str_out, str_val, len);
96 for (i = 0 ; i < 16 ; i++) {
97 len = snprintf(str_val, sizeof(str_val), "%02x ",
98 rtw_read8(padapter, index + i));
99 strncpy(p, str_val, len);
102 RTW_INFO("%s\n", str_out);
103 _rtw_memset(&str_out, '\0', sizeof(str_out));
109 * Call this function to make sure power on successfully
112 * _SUCCESS enable success
115 bool sdio_power_on_check(PADAPTER padapter) {
116 u32 val_offset0, val_offset1, val_offset2, val_offset3;
122 val_offset0 = rtw_read8(padapter, REG_CR);
123 val_offset1 = rtw_read8(padapter, REG_CR + 1);
124 val_offset2 = rtw_read8(padapter, REG_CR + 2);
125 val_offset3 = rtw_read8(padapter, REG_CR + 3);
127 if (val_offset0 == 0xEA || val_offset1 == 0xEA ||
128 val_offset2 == 0xEA || val_offset3 == 0xEA) {
129 RTW_INFO("%s: power on fail, do Power on again\n", __func__);
133 val_mix = val_offset3 << 24 | val_mix;
134 val_mix = val_offset2 << 16 | val_mix;
135 val_mix = val_offset1 << 8 | val_mix;
136 val_mix = val_offset0 | val_mix;
138 res = rtw_read32(padapter, REG_CR);
140 RTW_INFO("%s: val_mix:0x%08x, res:0x%08x\n", __func__, val_mix, res);
142 while (index < 100) {
143 if (res == val_mix) {
144 RTW_INFO("%s: 0x100 the result of cmd52 and cmd53 is the same.\n", __func__);
148 RTW_INFO("%s: 0x100 cmd52 and cmd53 is not the same(index:%d).\n", __func__, index);
149 res = rtw_read32(padapter, REG_CR);
157 while (index < 100) {
158 rtw_write32(padapter, 0x1B8, 0x12345678);
159 res = rtw_read32(padapter, 0x1B8);
160 if (res == 0x12345678) {
161 RTW_INFO("%s: 0x1B8 test Pass.\n", __func__);
166 RTW_INFO("%s: 0x1B8 test Fail(index: %d).\n", __func__, index);
171 RTW_INFO("%s: fail at cmd52, cmd53.\n", __func__);
175 dump_sdio_f0(padapter);
176 dump_sdio_local(padapter);
177 dump_mac_page0(padapter);
183 u8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter)
185 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
187 if (pHalData->SdioTxOQTMaxFreeSpace < 8)
188 pHalData->SdioTxOQTMaxFreeSpace = 8;
190 return pHalData->SdioTxOQTMaxFreeSpace;
193 u8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
195 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
197 if ((pHalData->SdioTxFIFOFreePage[PageIdx] + pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) >= (RequiredPageNum))
203 void rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
205 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
206 u8 DedicatedPgNum = 0;
207 u8 RequiredPublicFreePgNum = 0;
210 /* _enter_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql); */
212 DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
213 if (RequiredPageNum <= DedicatedPgNum)
214 pHalData->SdioTxFIFOFreePage[PageIdx] -= RequiredPageNum;
216 pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
217 RequiredPublicFreePgNum = RequiredPageNum - DedicatedPgNum;
218 pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
221 /* _exit_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql); */
224 void rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ)
226 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
228 u32 lenHQ, lenNQ, lenLQ;
230 rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE, &page_size);
232 lenHQ = ((numHQ + numPubQ) >> 1) * page_size;
233 lenNQ = ((numNQ + numPubQ) >> 1) * page_size;
234 lenLQ = ((numLQ + numPubQ) >> 1) * page_size;
236 pHalData->sdio_tx_max_len[HI_QUEUE_IDX] = (lenHQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenHQ;
237 pHalData->sdio_tx_max_len[MID_QUEUE_IDX] = (lenNQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenNQ;
238 pHalData->sdio_tx_max_len[LOW_QUEUE_IDX] = (lenLQ > MAX_XMITBUF_SZ) ? MAX_XMITBUF_SZ : lenLQ;
241 u32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx)
243 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
244 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
245 u32 deviceId, max_len;
248 deviceId = ffaddr2deviceId(pdvobjpriv, queue_idx);
250 case WLAN_TX_HIQ_DEVICE_ID:
251 max_len = pHalData->sdio_tx_max_len[HI_QUEUE_IDX];
254 case WLAN_TX_MIQ_DEVICE_ID:
255 max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
258 case WLAN_TX_LOQ_DEVICE_ID:
259 max_len = pHalData->sdio_tx_max_len[LOW_QUEUE_IDX];
263 max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
270 #ifdef CONFIG_FW_C2H_REG
271 void sd_c2h_hisr_hdl(_adapter *adapter)
273 u8 c2h_evt[C2H_REG_LEN] = {0};
277 if (rtw_hal_c2h_evt_read(adapter, c2h_evt) != _SUCCESS)
280 if (rtw_hal_c2h_reg_hdr_parse(adapter, c2h_evt, &id, &seq, &plen, &payload) != _SUCCESS)
283 if (rtw_hal_c2h_id_handle_directly(adapter, id, seq, plen, payload)) {
284 /* Handle directly */
285 rtw_hal_c2h_handler(adapter, id, seq, plen, payload);
289 if (rtw_c2h_reg_wk_cmd(adapter, c2h_evt) != _SUCCESS)
290 RTW_ERR("%s rtw_c2h_reg_wk_cmd fail\n", __func__);
297 #endif /* !RTW_HALMAC */