1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 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
18 *******************************************************************************/
21 #include <rtl8723d_hal.h>
23 /* #define SDIO_DEBUG_IO 1 */
28 * The following mapping is for SDIO host local register space.
30 * Creadted by Roger, 2011.01.31.
32 static void HalSdioGetCmdAddr8723DSdio(
40 case SDIO_LOCAL_DEVICE_ID:
41 *pCmdAddr = ((SDIO_LOCAL_DEVICE_ID << 13) | (Addr & SDIO_LOCAL_MSK));
44 case WLAN_IOREG_DEVICE_ID:
45 *pCmdAddr = ((WLAN_IOREG_DEVICE_ID << 13) | (Addr & WLAN_IOREG_MSK));
48 case WLAN_TX_HIQ_DEVICE_ID:
49 *pCmdAddr = ((WLAN_TX_HIQ_DEVICE_ID << 13) | (Addr & WLAN_FIFO_MSK));
52 case WLAN_TX_MIQ_DEVICE_ID:
53 *pCmdAddr = ((WLAN_TX_MIQ_DEVICE_ID << 13) | (Addr & WLAN_FIFO_MSK));
56 case WLAN_TX_LOQ_DEVICE_ID:
57 *pCmdAddr = ((WLAN_TX_LOQ_DEVICE_ID << 13) | (Addr & WLAN_FIFO_MSK));
60 case WLAN_RX0FF_DEVICE_ID:
61 *pCmdAddr = ((WLAN_RX0FF_DEVICE_ID << 13) | (Addr & WLAN_RX0FF_MSK));
69 static u8 get_deviceid(u32 addr)
75 pseudoId = (u16)(addr >> 16);
78 devideId = SDIO_LOCAL_DEVICE_ID;
82 devideId = WLAN_IOREG_DEVICE_ID;
86 * devideId = SDIO_FIRMWARE_FIFO;
90 devideId = WLAN_TX_HIQ_DEVICE_ID;
94 devideId = WLAN_TX_MIQ_DEVICE_ID;
98 devideId = WLAN_TX_LOQ_DEVICE_ID;
102 devideId = WLAN_RX0FF_DEVICE_ID;
106 /* devideId = (u8)((addr >> 13) & 0xF); */
107 devideId = WLAN_IOREG_DEVICE_ID;
116 * HalSdioGetCmdAddr8723DSdio()
118 static u32 _cvrt2ftaddr(const u32 addr, u8 *pdeviceId, u16 *poffset)
125 deviceId = get_deviceid(addr);
129 case SDIO_LOCAL_DEVICE_ID:
130 offset = addr & SDIO_LOCAL_MSK;
133 case WLAN_TX_HIQ_DEVICE_ID:
134 case WLAN_TX_MIQ_DEVICE_ID:
135 case WLAN_TX_LOQ_DEVICE_ID:
136 offset = addr & WLAN_FIFO_MSK;
139 case WLAN_RX0FF_DEVICE_ID:
140 offset = addr & WLAN_RX0FF_MSK;
143 case WLAN_IOREG_DEVICE_ID:
145 deviceId = WLAN_IOREG_DEVICE_ID;
146 offset = addr & WLAN_IOREG_MSK;
149 ftaddr = (deviceId << 13) | offset;
152 *pdeviceId = deviceId;
159 u8 sdio_read8(struct intf_hdl *pintfhdl, u32 addr)
164 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
165 val = sd_read8(pintfhdl, ftaddr, NULL);
171 u16 sdio_read16(struct intf_hdl *pintfhdl, u32 addr)
176 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
178 sd_cmd52_read(pintfhdl, ftaddr, 2, (u8 *)&val);
179 val = le16_to_cpu(val);
185 u32 sdio_read32(struct intf_hdl *pintfhdl, u32 addr)
197 padapter = pintfhdl->padapter;
198 ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset);
200 bMacPwrCtrlOn = _FALSE;
201 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
202 if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100))
203 || (_FALSE == bMacPwrCtrlOn)
204 #ifdef CONFIG_LPS_LCLK
205 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
209 err = sd_cmd52_read(pintfhdl, ftaddr, 4, (u8 *)&val);
213 val = le32_to_cpu(val);
218 RTW_ERR("%s: Mac Power off, Read FAIL(%d)! addr=0x%x\n",
219 __func__, err, addr);
221 return SDIO_ERR_VAL32;
225 /* 4 bytes alignment */
226 shift = ftaddr & 0x3;
228 val = sd_read32(pintfhdl, ftaddr, NULL);
232 ptmpbuf = (u8 *)rtw_malloc(8);
233 if (NULL == ptmpbuf) {
234 RTW_ERR("%s: Allocate memory FAIL!(size=8) addr=0x%x\n",
236 return SDIO_ERR_VAL32;
240 sd_read(pintfhdl, ftaddr, 8, ptmpbuf);
241 _rtw_memcpy(&val, ptmpbuf + shift, 4);
242 val = le32_to_cpu(val);
244 rtw_mfree(ptmpbuf, 8);
251 s32 sdio_readN(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pbuf)
262 padapter = pintfhdl->padapter;
265 ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset);
267 bMacPwrCtrlOn = _FALSE;
268 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
269 if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100))
270 || (_FALSE == bMacPwrCtrlOn)
271 #ifdef CONFIG_LPS_LCLK
272 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
275 err = sd_cmd52_read(pintfhdl, ftaddr, cnt, pbuf);
279 /* 4 bytes alignment */
280 shift = ftaddr & 0x3;
282 err = sd_read(pintfhdl, ftaddr, cnt, pbuf);
289 ptmpbuf = rtw_malloc(n);
292 err = sd_read(pintfhdl, ftaddr, n, ptmpbuf);
294 _rtw_memcpy(pbuf, ptmpbuf + shift, cnt);
295 rtw_mfree(ptmpbuf, n);
302 s32 sdio_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
307 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
309 sd_write8(pintfhdl, ftaddr, val, &err);
315 s32 sdio_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
321 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
322 val = cpu_to_le16(val);
323 err = sd_cmd52_write(pintfhdl, ftaddr, 2, (u8 *)&val);
329 s32 sdio_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
340 padapter = pintfhdl->padapter;
343 ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset);
345 bMacPwrCtrlOn = _FALSE;
346 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
347 if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100))
348 || (_FALSE == bMacPwrCtrlOn)
349 #ifdef CONFIG_LPS_LCLK
350 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
353 val = cpu_to_le32(val);
354 err = sd_cmd52_write(pintfhdl, ftaddr, 4, (u8 *)&val);
358 /* 4 bytes alignment */
359 shift = ftaddr & 0x3;
362 sd_write32(pintfhdl, ftaddr, val, &err);
364 val = cpu_to_le32(val);
365 err = sd_cmd52_write(pintfhdl, ftaddr, 4, (u8 *)&val);
369 sd_write32(pintfhdl, ftaddr, val, &err);
373 ptmpbuf = (u8 *)rtw_malloc(8);
378 err = sd_read(pintfhdl, ftaddr, 8, ptmpbuf);
380 rtw_mfree(ptmpbuf, 8);
383 val = cpu_to_le32(val);
384 _rtw_memcpy(ptmpbuf + shift, &val, 4);
385 err = sd_write(pintfhdl, ftaddr, 8, ptmpbuf);
387 rtw_mfree(ptmpbuf, 8);
395 s32 sdio_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pbuf)
406 padapter = pintfhdl->padapter;
409 ftaddr = _cvrt2ftaddr(addr, &deviceId, &offset);
411 bMacPwrCtrlOn = _FALSE;
412 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
413 if (((deviceId == WLAN_IOREG_DEVICE_ID) && (offset < 0x100))
414 || (_FALSE == bMacPwrCtrlOn)
415 #ifdef CONFIG_LPS_LCLK
416 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
419 err = sd_cmd52_write(pintfhdl, ftaddr, cnt, pbuf);
423 shift = ftaddr & 0x3;
425 err = sd_write(pintfhdl, ftaddr, cnt, pbuf);
432 ptmpbuf = rtw_malloc(n);
435 err = sd_read(pintfhdl, ftaddr, 4, ptmpbuf);
437 rtw_mfree(ptmpbuf, n);
440 _rtw_memcpy(ptmpbuf + shift, pbuf, cnt);
441 err = sd_write(pintfhdl, ftaddr, n, ptmpbuf);
442 rtw_mfree(ptmpbuf, n);
449 u8 sdio_f0_read8(struct intf_hdl *pintfhdl, u32 addr)
454 val = sd_f0_read8(pintfhdl, addr, NULL);
460 void sdio_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
465 err = sdio_readN(pintfhdl, addr, cnt, rmem);
469 void sdio_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
472 sdio_writeN(pintfhdl, addr, cnt, wmem);
479 * Round read size to block size,
480 * and make sure data transfer will be done in one command.
483 * pintfhdl a pointer of intf_hdl
486 * rmem address to put data
489 * _SUCCESS(1) Success
492 static u32 sdio_read_port(
493 struct intf_hdl *pintfhdl,
502 #ifdef SDIO_DYNAMIC_ALLOC_MEM
508 padapter = pintfhdl->padapter;
509 psdio = &adapter_to_dvobj(padapter)->intf_data;
510 phal = GET_HAL_DATA(padapter);
512 HalSdioGetCmdAddr8723DSdio(padapter, addr, phal->SdioRxFIFOCnt++, &addr);
515 if (cnt > psdio->block_transfer_len)
516 cnt = _RND(cnt, psdio->block_transfer_len);
517 /* cnt = sdio_align_size(cnt); */
520 #ifdef SDIO_DYNAMIC_ALLOC_MEM
522 mem = rtw_malloc(cnt);
524 RTW_WARN("%s: allocate memory %d bytes fail!\n",
530 /* in this case, caller should gurante the buffer is big enough */
531 /* to receive data after alignment */
535 err = _sd_read(pintfhdl, addr, cnt, mem);
537 #ifdef SDIO_DYNAMIC_ALLOC_MEM
538 if ((oldcnt != cnt) && (oldmem)) {
539 _rtw_memcpy(oldmem, mem, oldcnt);
552 * Align write size block size,
553 * and make sure data could be written in one command.
556 * pintfhdl a pointer of intf_hdl
559 * wmem data pointer to write
562 * _SUCCESS(1) Success
565 static u32 sdio_write_port(
566 struct intf_hdl *pintfhdl,
574 struct xmit_buf *xmitbuf = (struct xmit_buf *)mem;
576 padapter = pintfhdl->padapter;
577 psdio = &adapter_to_dvobj(padapter)->intf_data;
579 #ifndef CONFIG_DLFW_TXPKT
580 if (!rtw_is_hw_init_completed(padapter)) {
581 RTW_INFO("%s [addr=0x%x cnt=%d] hw_init_completed is FALSE\n",
582 __func__, addr, cnt);
588 HalSdioGetCmdAddr8723DSdio(padapter, addr, cnt >> 2, &addr);
590 if (cnt > psdio->block_transfer_len)
591 cnt = _RND(cnt, psdio->block_transfer_len);
592 /* cnt = sdio_align_size(cnt); */
594 err = sd_write(pintfhdl, addr, cnt, xmitbuf->pdata);
596 rtw_sctx_done_err(&xmitbuf->sctx,
597 err ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS);
604 void sdio_set_intf_ops(_adapter *padapter, struct _io_ops *pops)
607 pops->_read8 = &sdio_read8;
608 pops->_read16 = &sdio_read16;
609 pops->_read32 = &sdio_read32;
610 pops->_read_mem = &sdio_read_mem;
611 pops->_read_port = &sdio_read_port;
613 pops->_write8 = &sdio_write8;
614 pops->_write16 = &sdio_write16;
615 pops->_write32 = &sdio_write32;
616 pops->_writeN = &sdio_writeN;
617 pops->_write_mem = &sdio_write_mem;
618 pops->_write_port = &sdio_write_port;
620 pops->_sd_f0_read8 = sdio_f0_read8;
625 * Todo: align address to 4 bytes.
627 s32 _sdio_local_read(
633 struct intf_hdl *pintfhdl;
640 pintfhdl = &padapter->iopriv.intf;
642 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
644 bMacPwrCtrlOn = _FALSE;
645 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
646 if (_FALSE == bMacPwrCtrlOn) {
647 err = _sd_cmd52_read(pintfhdl, addr, cnt, pbuf);
652 ptmpbuf = (u8 *)rtw_malloc(n);
656 err = _sd_read(pintfhdl, addr, n, ptmpbuf);
658 _rtw_memcpy(pbuf, ptmpbuf, cnt);
661 rtw_mfree(ptmpbuf, n);
667 * Todo: align address to 4 bytes.
675 struct intf_hdl *pintfhdl;
681 pintfhdl = &padapter->iopriv.intf;
683 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
685 bMacPwrCtrlOn = _FALSE;
686 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
687 if ((_FALSE == bMacPwrCtrlOn)
688 #ifdef CONFIG_LPS_LCLK
689 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
692 err = sd_cmd52_read(pintfhdl, addr, cnt, pbuf);
697 ptmpbuf = (u8 *)rtw_malloc(n);
701 err = sd_read(pintfhdl, addr, n, ptmpbuf);
703 _rtw_memcpy(pbuf, ptmpbuf, cnt);
706 rtw_mfree(ptmpbuf, n);
712 * Todo: align address to 4 bytes.
714 s32 _sdio_local_write(
720 struct intf_hdl *pintfhdl;
726 RTW_INFO("%s, address must be 4 bytes alignment\n", __func__);
729 RTW_INFO("%s, size must be the multiple of 4\n", __func__);
731 pintfhdl = &padapter->iopriv.intf;
733 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
735 bMacPwrCtrlOn = _FALSE;
736 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
737 if ((_FALSE == bMacPwrCtrlOn)
738 #ifdef CONFIG_LPS_LCLK
739 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
742 err = _sd_cmd52_write(pintfhdl, addr, cnt, pbuf);
746 ptmpbuf = (u8 *)rtw_malloc(cnt);
750 _rtw_memcpy(ptmpbuf, pbuf, cnt);
752 err = _sd_write(pintfhdl, addr, cnt, ptmpbuf);
755 rtw_mfree(ptmpbuf, cnt);
761 * Todo: align address to 4 bytes.
763 s32 sdio_local_write(
769 struct intf_hdl *pintfhdl;
775 RTW_INFO("%s, address must be 4 bytes alignment\n", __func__);
778 RTW_INFO("%s, size must be the multiple of 4\n", __func__);
780 pintfhdl = &padapter->iopriv.intf;
782 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
784 bMacPwrCtrlOn = _FALSE;
785 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
786 if ((_FALSE == bMacPwrCtrlOn)
787 #ifdef CONFIG_LPS_LCLK
788 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
791 err = sd_cmd52_write(pintfhdl, addr, cnt, pbuf);
795 ptmpbuf = (u8 *)rtw_malloc(cnt);
799 _rtw_memcpy(ptmpbuf, pbuf, cnt);
801 err = sd_write(pintfhdl, addr, cnt, ptmpbuf);
804 rtw_mfree(ptmpbuf, cnt);
809 u8 SdioLocalCmd52Read1Byte(PADAPTER padapter, u32 addr)
812 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
814 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
815 sd_cmd52_read(pintfhdl, addr, 1, &val);
820 u16 SdioLocalCmd52Read2Byte(PADAPTER padapter, u32 addr)
823 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
825 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
826 sd_cmd52_read(pintfhdl, addr, 2, (u8 *)&val);
828 val = le16_to_cpu(val);
833 u32 SdioLocalCmd52Read4Byte(PADAPTER padapter, u32 addr)
836 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
838 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
839 sd_cmd52_read(pintfhdl, addr, 4, (u8 *)&val);
841 val = le32_to_cpu(val);
846 u32 SdioLocalCmd53Read4Byte(PADAPTER padapter, u32 addr)
851 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
853 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
854 bMacPwrCtrlOn = _FALSE;
855 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
856 if ((_FALSE == bMacPwrCtrlOn)
857 #ifdef CONFIG_LPS_LCLK
858 || (_TRUE == adapter_to_pwrctl(padapter)->bFwCurrentInPSMode)
861 sd_cmd52_read(pintfhdl, addr, 4, (u8 *)&val);
862 val = le32_to_cpu(val);
864 val = sd_read32(pintfhdl, addr, NULL);
869 void SdioLocalCmd52Write1Byte(PADAPTER padapter, u32 addr, u8 v)
871 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
873 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
874 sd_cmd52_write(pintfhdl, addr, 1, &v);
877 void SdioLocalCmd52Write2Byte(PADAPTER padapter, u32 addr, u16 v)
879 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
881 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
883 sd_cmd52_write(pintfhdl, addr, 2, (u8 *)&v);
886 void SdioLocalCmd52Write4Byte(PADAPTER padapter, u32 addr, u32 v)
888 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
890 HalSdioGetCmdAddr8723DSdio(padapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
892 sd_cmd52_write(pintfhdl, addr, 4, (u8 *)&v);
897 DumpLoggedInterruptHistory8723Sdio(
901 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
902 u4Byte DebugLevel = DBG_LOUD;
904 if (DBG_Var.DbgPrintIsr == 0)
907 DBG_ChkDrvResource(padapter);
914 LogInterruptHistory8723Sdio(
916 PRT_ISR_CONTENT pIsrContent
919 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
921 if ((pHalData->IntrMask[0] & SDIO_HIMR_RX_REQUEST_MSK) &&
922 (pIsrContent->IntArray[0] & SDIO_HISR_RX_REQUEST))
923 pHalData->InterruptLog.nISR_RX_REQUEST++;
924 if ((pHalData->IntrMask[0] & SDIO_HIMR_AVAL_MSK) &&
925 (pIsrContent->IntArray[0] & SDIO_HISR_AVAL))
926 pHalData->InterruptLog.nISR_AVAL++;
927 if ((pHalData->IntrMask[0] & SDIO_HIMR_TXERR_MSK) &&
928 (pIsrContent->IntArray[0] & SDIO_HISR_TXERR))
929 pHalData->InterruptLog.nISR_TXERR++;
930 if ((pHalData->IntrMask[0] & SDIO_HIMR_RXERR_MSK) &&
931 (pIsrContent->IntArray[0] & SDIO_HISR_RXERR))
932 pHalData->InterruptLog.nISR_RXERR++;
933 if ((pHalData->IntrMask[0] & SDIO_HIMR_TXFOVW_MSK) &&
934 (pIsrContent->IntArray[0] & SDIO_HISR_TXFOVW))
935 pHalData->InterruptLog.nISR_TXFOVW++;
936 if ((pHalData->IntrMask[0] & SDIO_HIMR_RXFOVW_MSK) &&
937 (pIsrContent->IntArray[0] & SDIO_HISR_RXFOVW))
938 pHalData->InterruptLog.nISR_RXFOVW++;
939 if ((pHalData->IntrMask[0] & SDIO_HIMR_TXBCNOK_MSK) &&
940 (pIsrContent->IntArray[0] & SDIO_HISR_TXBCNOK))
941 pHalData->InterruptLog.nISR_TXBCNOK++;
942 if ((pHalData->IntrMask[0] & SDIO_HIMR_TXBCNERR_MSK) &&
943 (pIsrContent->IntArray[0] & SDIO_HISR_TXBCNERR))
944 pHalData->InterruptLog.nISR_TXBCNERR++;
945 if ((pHalData->IntrMask[0] & SDIO_HIMR_BCNERLY_INT_MSK) &&
946 (pIsrContent->IntArray[0] & SDIO_HISR_BCNERLY_INT))
947 pHalData->InterruptLog.nISR_BCNERLY_INT++;
948 if ((pHalData->IntrMask[0] & SDIO_HIMR_C2HCMD_MSK) &&
949 (pIsrContent->IntArray[0] & SDIO_HISR_C2HCMD))
950 pHalData->InterruptLog.nISR_C2HCMD++;
951 if ((pHalData->IntrMask[0] & SDIO_HIMR_CPWM1_MSK) &&
952 (pIsrContent->IntArray[0] & SDIO_HISR_CPWM1))
953 pHalData->InterruptLog.nISR_CPWM1++;
954 if ((pHalData->IntrMask[0] & SDIO_HIMR_CPWM2_MSK) &&
955 (pIsrContent->IntArray[0] & SDIO_HISR_CPWM2))
956 pHalData->InterruptLog.nISR_CPWM2++;
957 if ((pHalData->IntrMask[0] & SDIO_HIMR_HSISR_IND_MSK) &&
958 (pIsrContent->IntArray[0] & SDIO_HISR_HSISR_IND))
959 pHalData->InterruptLog.nISR_HSISR_IND++;
960 if ((pHalData->IntrMask[0] & SDIO_HIMR_GTINT3_IND_MSK) &&
961 (pIsrContent->IntArray[0] & SDIO_HISR_GTINT3_IND))
962 pHalData->InterruptLog.nISR_GTINT3_IND++;
963 if ((pHalData->IntrMask[0] & SDIO_HIMR_GTINT4_IND_MSK) &&
964 (pIsrContent->IntArray[0] & SDIO_HISR_GTINT4_IND))
965 pHalData->InterruptLog.nISR_GTINT4_IND++;
966 if ((pHalData->IntrMask[0] & SDIO_HIMR_PSTIMEOUT_MSK) &&
967 (pIsrContent->IntArray[0] & SDIO_HISR_PSTIMEOUT))
968 pHalData->InterruptLog.nISR_PSTIMEOUT++;
969 if ((pHalData->IntrMask[0] & SDIO_HIMR_OCPINT_MSK) &&
970 (pIsrContent->IntArray[0] & SDIO_HISR_OCPINT))
971 pHalData->InterruptLog.nISR_OCPINT++;
972 if ((pHalData->IntrMask[0] & SDIO_HIMR_ATIMEND_MSK) &&
973 (pIsrContent->IntArray[0] & SDIO_HISR_ATIMEND))
974 pHalData->InterruptLog.nISR_ATIMEND++;
975 if ((pHalData->IntrMask[0] & SDIO_HIMR_ATIMEND_E_MSK) &&
976 (pIsrContent->IntArray[0] & SDIO_HISR_ATIMEND_E))
977 pHalData->InterruptLog.nISR_ATIMEND_E++;
978 if ((pHalData->IntrMask[0] & SDIO_HIMR_CTWEND_MSK) &&
979 (pIsrContent->IntArray[0] & SDIO_HISR_CTWEND))
980 pHalData->InterruptLog.nISR_CTWEND++;
985 DumpHardwareProfile8723Sdio(
989 DumpLoggedInterruptHistory8723Sdio(padapter);
993 static s32 ReadInterrupt8723DSdio(PADAPTER padapter, u32 *phisr)
1002 himr = GET_HAL_DATA(padapter)->sdio_himr;
1004 /* decide how many bytes need to be read */
1012 while (hisr_len != 0) {
1014 val8 = SdioLocalCmd52Read1Byte(padapter, SDIO_REG_HISR + hisr_len);
1015 hisr |= (val8 << (8 * hisr_len));
1025 * Initialize SDIO Host Interrupt Mask configuration variables for future use.
1028 * Using SDIO Local register ONLY for configuration.
1030 * Created by Roger, 2011.02.11.
1032 void InitInterrupt8723DSdio(PADAPTER padapter)
1034 PHAL_DATA_TYPE pHalData;
1037 pHalData = GET_HAL_DATA(padapter);
1038 pHalData->sdio_himr = (u32)(
1039 SDIO_HIMR_RX_REQUEST_MSK |
1040 #ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
1041 SDIO_HIMR_AVAL_MSK |
1043 /* SDIO_HIMR_TXERR_MSK |
1044 * SDIO_HIMR_RXERR_MSK |
1045 * SDIO_HIMR_TXFOVW_MSK |
1046 * SDIO_HIMR_RXFOVW_MSK |
1047 * SDIO_HIMR_TXBCNOK_MSK |
1048 * SDIO_HIMR_TXBCNERR_MSK |
1049 * SDIO_HIMR_BCNERLY_INT_MSK |
1050 * SDIO_HIMR_C2HCMD_MSK | */
1051 #if defined(CONFIG_LPS_LCLK) && !defined(CONFIG_DETECT_CPWM_BY_POLLING)
1052 SDIO_HIMR_CPWM1_MSK |
1053 /* SDIO_HIMR_CPWM2_MSK | */
1054 #endif /* CONFIG_LPS_LCLK && !CONFIG_DETECT_CPWM_BY_POLLING
1055 * SDIO_HIMR_HSISR_IND_MSK |
1056 * SDIO_HIMR_GTINT3_IND_MSK |
1057 * SDIO_HIMR_GTINT4_IND_MSK |
1058 * SDIO_HIMR_PSTIMEOUT_MSK |
1059 * SDIO_HIMR_OCPINT_MSK |
1060 * SDIO_HIMR_ATIMEND_MSK |
1061 * SDIO_HIMR_ATIMEND_E_MSK |
1062 * SDIO_HIMR_CTWEND_MSK | */
1068 * Initialize System Host Interrupt Mask configuration variables for future use.
1070 * Created by Roger, 2011.08.03.
1072 void InitSysInterrupt8723DSdio(PADAPTER padapter)
1074 PHAL_DATA_TYPE pHalData;
1077 pHalData = GET_HAL_DATA(padapter);
1079 pHalData->SysIntrMask = (
1080 /* HSIMR_GPIO12_0_INT_EN |
1081 * HSIMR_SPS_OCP_INT_EN |
1082 * HSIMR_RON_INT_EN |
1084 * HSIMR_GPIO9_INT_EN | */
1088 #ifdef CONFIG_WOWLAN
1091 * Clear corresponding SDIO Host ISR interrupt service.
1094 * Using SDIO Local register ONLY for configuration.
1096 * Created by Roger, 2011.02.11.
1098 void ClearInterrupt8723DSdio(PADAPTER padapter)
1100 PHAL_DATA_TYPE pHalData;
1105 if (rtw_is_surprise_removed(padapter))
1108 pHalData = GET_HAL_DATA(padapter);
1109 clear = rtw_zmalloc(4);
1111 /* Clear corresponding HISR Content if needed */
1112 val_8 = SdioLocalCmd52Read1Byte(padapter, SDIO_REG_HISR + 2);
1114 val_32 = pHalData->sdio_hisr & MASK_SDIO_HISR_CLEAR;
1117 *(u32 *)clear = cpu_to_le32(val_32 | SDIO_HISR_CPWM2);
1119 *(u32 *)clear = cpu_to_le32(val_32);
1121 if (*(u32 *)clear) {
1122 /* Perform write one clear operation */
1123 sdio_local_write(padapter, SDIO_REG_HISR, 4, clear);
1126 rtw_mfree(clear, 4);
1132 * Clear corresponding system Host ISR interrupt service.
1135 * Created by Roger, 2011.02.11.
1137 void ClearSysInterrupt8723DSdio(PADAPTER padapter)
1139 PHAL_DATA_TYPE pHalData;
1143 if (rtw_is_surprise_removed(padapter))
1146 pHalData = GET_HAL_DATA(padapter);
1148 /* Clear corresponding HISR Content if needed */
1149 clear = pHalData->SysIntrStatus & MASK_HSISR_CLEAR;
1151 /* Perform write one clear operation */
1152 rtw_write32(padapter, REG_HSISR, clear);
1158 * Enalbe SDIO Host Interrupt Mask configuration on SDIO local domain.
1161 * 1. Using SDIO Local register ONLY for configuration.
1164 * Created by Roger, 2011.02.11.
1166 void EnableInterrupt8723DSdio(PADAPTER padapter)
1168 PHAL_DATA_TYPE pHalData;
1171 pHalData = GET_HAL_DATA(padapter);
1173 himr = cpu_to_le32(pHalData->sdio_himr);
1174 sdio_local_write(padapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
1177 /* Update current system IMR settings */
1178 himr = rtw_read32(padapter, REG_HSIMR);
1179 rtw_write32(padapter, REG_HSIMR, himr | pHalData->SysIntrMask);
1183 /* <Roger_Notes> There are some C2H CMDs have been sent before system interrupt is enabled, e.g., C2H, CPWM. */
1184 /* So we need to clear all C2H events that FW has notified, otherwise FW won't schedule any commands anymore. */
1187 rtw_write8(padapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
1192 * Disable SDIO Host IMR configuration to mask unnecessary interrupt service.
1195 * Using SDIO Local register ONLY for configuration.
1197 * Created by Roger, 2011.02.11.
1199 void DisableInterrupt8723DSdio(PADAPTER padapter)
1203 himr = cpu_to_le32(SDIO_HIMR_DISABLED);
1204 sdio_local_write(padapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
1210 * Using 0x100 to check the power status of FW.
1213 * Using SDIO Local register ONLY for configuration.
1215 * Created by Isaac, 2013.09.10.
1217 u8 CheckIPSStatus(PADAPTER padapter)
1219 RTW_INFO("%s(): Read 0x100=0x%02x 0x86=0x%02x\n", __func__,
1220 rtw_read8(padapter, 0x100), rtw_read8(padapter, 0x86));
1222 if (rtw_read8(padapter, 0x100) == 0xEA)
1228 #ifdef CONFIG_WOWLAN
1229 void DisableInterruptButCpwm28723DSdio(PADAPTER padapter)
1233 sdio_local_read(padapter, SDIO_REG_HIMR, 4, (u8 *)&tmp);
1234 RTW_INFO("DisableInterruptButCpwm28723DSdio(): Read SDIO_REG_HIMR: 0x%08x\n", tmp);
1236 himr = cpu_to_le32(SDIO_HIMR_DISABLED) | SDIO_HIMR_CPWM2_MSK;
1237 sdio_local_write(padapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
1239 sdio_local_read(padapter, SDIO_REG_HIMR, 4, (u8 *)&tmp);
1240 RTW_INFO("DisableInterruptButCpwm28723DSdio(): Read again SDIO_REG_HIMR: 0x%08x\n", tmp);
1242 #endif /* CONFIG_WOWLAN
1245 * Update SDIO Host Interrupt Mask configuration on SDIO local domain.
1248 * 1. Using SDIO Local register ONLY for configuration.
1251 * Created by Roger, 2011.02.11.
1253 void UpdateInterruptMask8723DSdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR)
1255 HAL_DATA_TYPE *pHalData;
1257 pHalData = GET_HAL_DATA(padapter);
1260 pHalData->sdio_himr |= AddMSR;
1263 pHalData->sdio_himr &= (~RemoveMSR);
1265 DisableInterrupt8723DSdio(padapter);
1266 EnableInterrupt8723DSdio(padapter);
1269 #ifdef CONFIG_MAC_LOOPBACK_DRIVER
1270 static void sd_recv_loopback(PADAPTER padapter, u32 size)
1272 PLOOPBACKDATA ploopback;
1273 u32 readsize, allocsize;
1278 RTW_INFO("%s: read size=%d\n", __func__, readsize);
1279 allocsize = _RND(readsize, adapter_to_dvobj(padapter)->intf_data.block_transfer_len);
1281 ploopback = padapter->ploopback;
1283 ploopback->rxsize = readsize;
1284 preadbuf = ploopback->rxbuf;
1286 preadbuf = rtw_malloc(allocsize);
1287 if (preadbuf == NULL) {
1288 RTW_INFO("%s: malloc fail size=%d\n", __func__, allocsize);
1293 /* rtw_read_port(padapter, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); */
1294 sdio_read_port(&padapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf);
1297 _rtw_up_sema(&ploopback->sema);
1301 RTW_INFO("%s: drop pkt\n", __func__);
1302 for (i = 0; i < readsize; i += 4) {
1303 RTW_INFO("%08X", *(u32 *)(preadbuf + i));
1305 printk(KERN_ERR " ");
1307 printk(KERN_ERR "\n");
1309 printk(KERN_ERR "\n");
1310 rtw_mfree(preadbuf, allocsize);
1313 #endif /* CONFIG_MAC_LOOPBACK_DRIVER */
1315 #ifdef CONFIG_SDIO_RX_COPY
1316 static struct recv_buf *sd_recv_rxfifo(PADAPTER padapter, u32 size)
1320 struct recv_priv *precvpriv;
1321 struct recv_buf *precvbuf;
1327 /* Patch for some SDIO Host 4 bytes issue */
1329 readsize = RND4(size);
1332 /* 3 1. alloc recvbuf */
1333 precvpriv = &padapter->recvpriv;
1334 precvbuf = rtw_dequeue_recvbuf(&precvpriv->free_recv_buf_queue);
1335 if (precvbuf == NULL) {
1336 RTW_ERR("%s: alloc recvbuf FAIL!\n", __func__);
1340 /* 3 2. alloc skb */
1341 if (precvbuf->pskb == NULL) {
1342 SIZE_PTR tmpaddr = 0;
1343 SIZE_PTR alignment = 0;
1345 precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
1346 if (precvbuf->pskb == NULL) {
1347 RTW_INFO("%s: alloc_skb fail! read=%d\n", __func__, readsize);
1348 rtw_enqueue_recvbuf(precvbuf, &precvpriv->free_recv_buf_queue);
1352 precvbuf->pskb->dev = padapter->pnetdev;
1354 tmpaddr = (SIZE_PTR)precvbuf->pskb->data;
1355 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1);
1356 skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
1359 /* 3 3. read data from rxfifo */
1360 preadbuf = precvbuf->pskb->data;
1361 /* rtw_read_port(padapter, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); */
1362 ret = sdio_read_port(&padapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf);
1364 rtw_enqueue_recvbuf(precvbuf, &precvpriv->free_recv_buf_queue);
1368 /* 3 4. init recvbuf */
1369 precvbuf->len = size;
1370 precvbuf->phead = precvbuf->pskb->head;
1371 precvbuf->pdata = precvbuf->pskb->data;
1372 skb_set_tail_pointer(precvbuf->pskb, size);
1373 precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
1374 precvbuf->pend = skb_end_pointer(precvbuf->pskb);
1378 #else /* !CONFIG_SDIO_RX_COPY */
1379 static struct recv_buf *sd_recv_rxfifo(PADAPTER padapter, u32 size)
1381 u32 sdioblksize, readsize, allocsize, ret;
1384 struct recv_priv *precvpriv;
1385 struct recv_buf *precvbuf;
1388 sdioblksize = adapter_to_dvobj(padapter)->intf_data.block_transfer_len;
1392 /* Patch for some SDIO Host 4 bytes issue */
1394 readsize = RND4(size);
1397 /* 3 1. alloc skb */
1398 /* align to block size */
1399 if (readsize > sdioblksize)
1400 allocsize = _RND(readsize, sdioblksize);
1402 allocsize = readsize;
1404 ppkt = rtw_skb_alloc(allocsize);
1410 /* 3 2. read data from rxfifo */
1411 preadbuf = skb_put(ppkt, size);
1412 /* rtw_read_port(padapter, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf); */
1413 ret = sdio_read_port(&padapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, preadbuf);
1419 /* 3 3. alloc recvbuf */
1420 precvpriv = &padapter->recvpriv;
1421 precvbuf = rtw_dequeue_recvbuf(&precvpriv->free_recv_buf_queue);
1422 if (precvbuf == NULL) {
1424 RTW_ERR("%s: alloc recvbuf FAIL!\n", __func__);
1428 /* 3 4. init recvbuf */
1429 precvbuf->pskb = ppkt;
1431 precvbuf->len = ppkt->len;
1433 precvbuf->phead = ppkt->head;
1434 precvbuf->pdata = ppkt->data;
1435 precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
1436 precvbuf->pend = skb_end_pointer(precvbuf->pskb);
1440 #endif /* !CONFIG_SDIO_RX_COPY */
1442 static void sd_rxhandler(PADAPTER padapter, struct recv_buf *precvbuf)
1444 struct recv_priv *precvpriv;
1445 _queue *ppending_queue;
1448 precvpriv = &padapter->recvpriv;
1449 ppending_queue = &precvpriv->recv_buf_pending_queue;
1451 /* 3 1. enqueue recvbuf */
1452 rtw_enqueue_recvbuf(precvbuf, ppending_queue);
1454 /* 3 2. schedule tasklet */
1455 #ifdef PLATFORM_LINUX
1456 tasklet_schedule(&precvpriv->recv_tasklet);
1460 void sd_int_dpc(PADAPTER padapter)
1462 PHAL_DATA_TYPE phal;
1463 struct dvobj_priv *dvobj;
1464 struct intf_hdl *pintfhdl = &padapter->iopriv.intf;
1465 struct pwrctrl_priv *pwrctl;
1468 phal = GET_HAL_DATA(padapter);
1469 dvobj = adapter_to_dvobj(padapter);
1470 pwrctl = dvobj_to_pwrctl(dvobj);
1472 #ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
1473 if (phal->sdio_hisr & SDIO_HISR_AVAL) {
1477 _sdio_local_read(padapter, SDIO_REG_FREE_TXPG, 4, freepage);
1478 /* _enter_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); */
1479 /* _rtw_memcpy(phal->SdioTxFIFOFreePage, freepage, 4); */
1480 /* _exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); */
1481 /* RTW_INFO("SDIO_HISR_AVAL, Tx Free Page = 0x%x%x%x%x\n", */
1486 _rtw_up_sema(&(padapter->xmitpriv.xmit_sema));
1489 if (phal->sdio_hisr & SDIO_HISR_CPWM1) {
1490 struct reportpwrstate_parm report;
1492 #ifdef CONFIG_LPS_RPWM_TIMER
1495 _cancel_timer(&(pwrctl->pwr_rpwm_timer), &bcancelled);
1496 #endif /* CONFIG_LPS_RPWM_TIMER */
1498 report.state = SdioLocalCmd52Read1Byte(padapter, SDIO_REG_HCPWM1_8723D);
1500 #ifdef CONFIG_LPS_LCLK
1501 /* cpwm_int_hdl(padapter, &report); */
1502 _set_workitem(&(pwrctl->cpwm_event));
1506 if (phal->sdio_hisr & SDIO_HISR_TXERR) {
1510 status = rtw_malloc(4);
1512 addr = REG_TXDMA_STATUS;
1513 HalSdioGetCmdAddr8723DSdio(padapter, WLAN_IOREG_DEVICE_ID, addr, &addr);
1514 _sd_read(pintfhdl, addr, 4, status);
1515 _sd_write(pintfhdl, addr, 4, status);
1516 RTW_INFO("%s: SDIO_HISR_TXERR (0x%08x)\n", __func__, le32_to_cpu(*(u32 *)status));
1517 rtw_mfree(status, 4);
1519 RTW_INFO("%s: SDIO_HISR_TXERR, but can't allocate memory to read status!\n", __func__);
1522 if (phal->sdio_hisr & SDIO_HISR_TXBCNOK)
1523 RTW_INFO("%s: SDIO_HISR_TXBCNOK\n", __func__);
1525 if (phal->sdio_hisr & SDIO_HISR_TXBCNERR)
1526 RTW_INFO("%s: SDIO_HISR_TXBCNERR\n", __func__);
1528 #ifdef CONFIG_FW_C2H_REG
1529 if (phal->sdio_hisr & SDIO_HISR_C2HCMD) {
1530 RTW_INFO("%s: C2H Command\n", __func__);
1531 sd_c2h_hisr_hdl(padapter);
1535 if (phal->sdio_hisr & SDIO_HISR_RXFOVW)
1536 RTW_INFO("%s: Rx Overflow\n", __func__);
1537 if (phal->sdio_hisr & SDIO_HISR_RXERR)
1538 RTW_INFO("%s: Rx Error\n", __func__);
1540 if (phal->sdio_hisr & SDIO_HISR_RX_REQUEST) {
1541 struct recv_buf *precvbuf;
1542 int alloc_fail_time = 0;
1545 phal->sdio_hisr ^= SDIO_HISR_RX_REQUEST;
1547 phal->SdioRxFIFOSize = SdioLocalCmd52Read2Byte(padapter, SDIO_REG_RX0_REQ_LEN);
1548 if (phal->SdioRxFIFOSize != 0) {
1549 #ifdef CONFIG_MAC_LOOPBACK_DRIVER
1550 sd_recv_loopback(padapter, phal->SdioRxFIFOSize);
1552 precvbuf = sd_recv_rxfifo(padapter, phal->SdioRxFIFOSize);
1554 sd_rxhandler(padapter, precvbuf);
1557 RTW_INFO("%s: recv fail!(time=%d)\n", __func__, alloc_fail_time);
1558 if (alloc_fail_time >= 10)
1561 phal->SdioRxFIFOSize = 0;
1567 ReadInterrupt8723DSdio(padapter, &hisr);
1568 hisr &= SDIO_HISR_RX_REQUEST;
1573 if (alloc_fail_time == 10)
1574 RTW_INFO("%s: exit because recv failed more than 10 times!\n", __func__);
1578 void sd_int_hdl(PADAPTER padapter)
1580 PHAL_DATA_TYPE phal;
1583 if (RTW_CANNOT_RUN(padapter))
1586 phal = GET_HAL_DATA(padapter);
1588 phal->sdio_hisr = 0;
1589 ReadInterrupt8723DSdio(padapter, &phal->sdio_hisr);
1591 if (phal->sdio_hisr & phal->sdio_himr) {
1594 phal->sdio_hisr &= phal->sdio_himr;
1597 v32 = phal->sdio_hisr & MASK_SDIO_HISR_CLEAR;
1599 SdioLocalCmd52Write4Byte(padapter, SDIO_REG_HISR, v32);
1601 sd_int_dpc(padapter);
1607 * Query SDIO Local register to query current the number of Free TxPacketBuffer page.
1610 * 1. Running at PASSIVE_LEVEL
1611 * 2. RT_TX_SPINLOCK is NOT acquired.
1613 * Created by Roger, 2011.01.28.
1615 u8 HalQueryTxBufferStatus8723DSdio(PADAPTER padapter)
1617 PHAL_DATA_TYPE phal;
1622 phal = GET_HAL_DATA(padapter);
1624 NumOfFreePage = SdioLocalCmd53Read4Byte(padapter, SDIO_REG_FREE_TXPG);
1626 /* _enter_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); */
1627 _rtw_memcpy(phal->SdioTxFIFOFreePage, &NumOfFreePage, 4);
1628 /* _exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql); */
1635 * Query SDIO Local register to get the current number of TX OQT Free Space.
1637 u8 HalQueryTxOQTBufferStatus8723DSdio(PADAPTER padapter)
1639 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1641 pHalData->SdioTxOQTFreeSpace = SdioLocalCmd52Read1Byte(padapter, SDIO_REG_OQT_FREE_PG);
1645 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
1646 u8 RecvOnePkt(PADAPTER padapter, u32 size)
1648 struct recv_buf *precvbuf;
1649 struct dvobj_priv *psddev;
1650 PSDIO_DATA psdio_data;
1651 struct sdio_func *func;
1655 RTW_INFO("+%s: size: %d+\n", __func__, size);
1657 if (padapter == NULL) {
1658 RTW_INFO(KERN_ERR "%s: padapter is NULL!\n", __func__);
1662 psddev = adapter_to_dvobj(padapter);
1663 psdio_data = &psddev->intf_data;
1664 func = psdio_data->func;
1667 sdio_claim_host(func);
1668 precvbuf = sd_recv_rxfifo(padapter, size);
1671 /* printk("Completed Recv One Pkt.\n"); */
1672 sd_rxhandler(padapter, precvbuf);
1676 sdio_release_host(func);
1678 RTW_INFO("-%s-\n", __func__);
1681 #endif /* CONFIG_WOWLAN */