1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 *******************************************************************************/
10 #include <rtw_debug.h>
11 #include <rtl8723b_hal.h>
13 /* define SDIO_DEBUG_IO 1 */
18 /* The following mapping is for SDIO host local register space. */
20 /* Creadted by Roger, 2011.01.31. */
22 static void HalSdioGetCmdAddr8723BSdio(
23 struct adapter *adapter,
30 case SDIO_LOCAL_DEVICE_ID:
31 *cmdaddr = ((SDIO_LOCAL_DEVICE_ID << 13) | (addr & SDIO_LOCAL_MSK));
34 case WLAN_IOREG_DEVICE_ID:
35 *cmdaddr = ((WLAN_IOREG_DEVICE_ID << 13) | (addr & WLAN_IOREG_MSK));
38 case WLAN_TX_HIQ_DEVICE_ID:
39 *cmdaddr = ((WLAN_TX_HIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK));
42 case WLAN_TX_MIQ_DEVICE_ID:
43 *cmdaddr = ((WLAN_TX_MIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK));
46 case WLAN_TX_LOQ_DEVICE_ID:
47 *cmdaddr = ((WLAN_TX_LOQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK));
50 case WLAN_RX0FF_DEVICE_ID:
51 *cmdaddr = ((WLAN_RX0FF_DEVICE_ID << 13) | (addr & WLAN_RX0FF_MSK));
59 static u8 get_deviceid(u32 addr)
65 pseudo_id = (u16)(addr >> 16);
68 devide_id = SDIO_LOCAL_DEVICE_ID;
72 devide_id = WLAN_IOREG_DEVICE_ID;
77 devide_id = WLAN_TX_HIQ_DEVICE_ID;
81 devide_id = WLAN_TX_MIQ_DEVICE_ID;
85 devide_id = WLAN_TX_LOQ_DEVICE_ID;
89 devide_id = WLAN_RX0FF_DEVICE_ID;
93 devide_id = WLAN_IOREG_DEVICE_ID;
102 *HalSdioGetCmdAddr8723BSdio()
104 static u32 _cvrt2ftaddr(const u32 addr, u8 *pdevice_id, u16 *poffset)
111 device_id = get_deviceid(addr);
115 case SDIO_LOCAL_DEVICE_ID:
116 offset = addr & SDIO_LOCAL_MSK;
119 case WLAN_TX_HIQ_DEVICE_ID:
120 case WLAN_TX_MIQ_DEVICE_ID:
121 case WLAN_TX_LOQ_DEVICE_ID:
122 offset = addr & WLAN_FIFO_MSK;
125 case WLAN_RX0FF_DEVICE_ID:
126 offset = addr & WLAN_RX0FF_MSK;
129 case WLAN_IOREG_DEVICE_ID:
131 device_id = WLAN_IOREG_DEVICE_ID;
132 offset = addr & WLAN_IOREG_MSK;
135 ftaddr = (device_id << 13) | offset;
138 *pdevice_id = device_id;
145 static u8 sdio_read8(struct intf_hdl *intfhdl, u32 addr)
148 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
150 return sd_read8(intfhdl, ftaddr, NULL);
153 static u16 sdio_read16(struct intf_hdl *intfhdl, u32 addr)
158 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
159 sd_cmd52_read(intfhdl, ftaddr, 2, (u8 *)&le_tmp);
161 return le16_to_cpu(le_tmp);
164 static u32 sdio_read32(struct intf_hdl *intfhdl, u32 addr)
166 struct adapter *adapter;
176 adapter = intfhdl->padapter;
177 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
179 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
181 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
182 (!mac_pwr_ctrl_on) ||
183 (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode)
185 err = sd_cmd52_read(intfhdl, ftaddr, 4, (u8 *)&le_tmp);
189 return le32_to_cpu(le_tmp);
193 DBG_8192C(KERN_ERR "%s: Mac Power off, Read FAIL(%d)! addr = 0x%x\n", __func__, err, addr);
194 return SDIO_ERR_VAL32;
198 /* 4 bytes alignment */
199 shift = ftaddr & 0x3;
201 val = sd_read32(intfhdl, ftaddr, NULL);
205 tmpbuf = rtw_malloc(8);
207 DBG_8192C(KERN_ERR "%s: Allocate memory FAIL!(size =8) addr = 0x%x\n", __func__, addr);
208 return SDIO_ERR_VAL32;
212 sd_read(intfhdl, ftaddr, 8, tmpbuf);
213 memcpy(&le_tmp, tmpbuf + shift, 4);
214 val = le32_to_cpu(le_tmp);
221 static s32 sdio_readN(struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *buf)
223 struct adapter *adapter;
231 adapter = intfhdl->padapter;
234 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
236 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
238 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
239 (!mac_pwr_ctrl_on) ||
240 (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode)
242 return sd_cmd52_read(intfhdl, ftaddr, cnt, buf);
244 /* 4 bytes alignment */
245 shift = ftaddr & 0x3;
247 err = sd_read(intfhdl, ftaddr, cnt, buf);
254 tmpbuf = rtw_malloc(n);
258 err = sd_read(intfhdl, ftaddr, n, tmpbuf);
260 memcpy(buf, tmpbuf + shift, cnt);
266 static s32 sdio_write8(struct intf_hdl *intfhdl, u32 addr, u8 val)
271 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
272 sd_write8(intfhdl, ftaddr, val, &err);
277 static s32 sdio_write16(struct intf_hdl *intfhdl, u32 addr, u16 val)
282 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
283 le_tmp = cpu_to_le16(val);
284 return sd_cmd52_write(intfhdl, ftaddr, 2, (u8 *)&le_tmp);
287 static s32 sdio_write32(struct intf_hdl *intfhdl, u32 addr, u32 val)
289 struct adapter *adapter;
298 adapter = intfhdl->padapter;
301 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
303 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
305 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
306 (!mac_pwr_ctrl_on) ||
307 (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode)
309 le_tmp = cpu_to_le32(val);
311 return sd_cmd52_write(intfhdl, ftaddr, 4, (u8 *)&le_tmp);
314 /* 4 bytes alignment */
315 shift = ftaddr & 0x3;
317 sd_write32(intfhdl, ftaddr, val, &err);
319 le_tmp = cpu_to_le32(val);
320 err = sd_cmd52_write(intfhdl, ftaddr, 4, (u8 *)&le_tmp);
325 static s32 sdio_writeN(struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *buf)
327 struct adapter *adapter;
335 adapter = intfhdl->padapter;
338 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
340 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
342 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
343 (!mac_pwr_ctrl_on) ||
344 (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode)
346 return sd_cmd52_write(intfhdl, ftaddr, cnt, buf);
348 shift = ftaddr & 0x3;
350 err = sd_write(intfhdl, ftaddr, cnt, buf);
357 tmpbuf = rtw_malloc(n);
360 err = sd_read(intfhdl, ftaddr, 4, tmpbuf);
365 memcpy(tmpbuf + shift, buf, cnt);
366 err = sd_write(intfhdl, ftaddr, n, tmpbuf);
372 static u8 sdio_f0_read8(struct intf_hdl *intfhdl, u32 addr)
374 return sd_f0_read8(intfhdl, addr, NULL);
377 static void sdio_read_mem(
378 struct intf_hdl *intfhdl,
386 err = sdio_readN(intfhdl, addr, cnt, rmem);
387 /* TODO: Report error is err not zero */
390 static void sdio_write_mem(
391 struct intf_hdl *intfhdl,
397 sdio_writeN(intfhdl, addr, cnt, wmem);
403 *Round read size to block size,
404 *and make sure data transfer will be done in one command.
407 *intfhdl a pointer of intf_hdl
410 *rmem address to put data
416 static u32 sdio_read_port(
417 struct intf_hdl *intfhdl,
423 struct adapter *adapter;
424 struct sdio_data *psdio;
425 struct hal_com_data *hal;
429 adapter = intfhdl->padapter;
430 psdio = &adapter_to_dvobj(adapter)->intf_data;
431 hal = GET_HAL_DATA(adapter);
433 HalSdioGetCmdAddr8723BSdio(adapter, addr, hal->SdioRxFIFOCnt++, &addr);
435 if (cnt > psdio->block_transfer_len)
436 cnt = _RND(cnt, psdio->block_transfer_len);
438 err = _sd_read(intfhdl, addr, cnt, mem);
448 *Align write size block size,
449 *and make sure data could be written in one command.
452 *intfhdl a pointer of intf_hdl
455 *wmem data pointer to write
461 static u32 sdio_write_port(
462 struct intf_hdl *intfhdl,
468 struct adapter *adapter;
469 struct sdio_data *psdio;
471 struct xmit_buf *xmitbuf = (struct xmit_buf *)mem;
473 adapter = intfhdl->padapter;
474 psdio = &adapter_to_dvobj(adapter)->intf_data;
476 if (!adapter->hw_init_completed) {
477 DBG_871X("%s [addr = 0x%x cnt =%d] adapter->hw_init_completed == false\n", __func__, addr, cnt);
482 HalSdioGetCmdAddr8723BSdio(adapter, addr, cnt >> 2, &addr);
484 if (cnt > psdio->block_transfer_len)
485 cnt = _RND(cnt, psdio->block_transfer_len);
487 err = sd_write(intfhdl, addr, cnt, xmitbuf->pdata);
491 err ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS
499 void sdio_set_intf_ops(struct adapter *adapter, struct _io_ops *ops)
501 ops->_read8 = &sdio_read8;
502 ops->_read16 = &sdio_read16;
503 ops->_read32 = &sdio_read32;
504 ops->_read_mem = &sdio_read_mem;
505 ops->_read_port = &sdio_read_port;
507 ops->_write8 = &sdio_write8;
508 ops->_write16 = &sdio_write16;
509 ops->_write32 = &sdio_write32;
510 ops->_writeN = &sdio_writeN;
511 ops->_write_mem = &sdio_write_mem;
512 ops->_write_port = &sdio_write_port;
514 ops->_sd_f0_read8 = sdio_f0_read8;
518 * Todo: align address to 4 bytes.
520 static s32 _sdio_local_read(
521 struct adapter *adapter,
527 struct intf_hdl *intfhdl;
534 intfhdl = &adapter->iopriv.intf;
536 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
538 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
539 if (!mac_pwr_ctrl_on)
540 return _sd_cmd52_read(intfhdl, addr, cnt, buf);
543 tmpbuf = rtw_malloc(n);
547 err = _sd_read(intfhdl, addr, n, tmpbuf);
549 memcpy(buf, tmpbuf, cnt);
557 * Todo: align address to 4 bytes.
560 struct adapter *adapter,
566 struct intf_hdl *intfhdl;
572 intfhdl = &adapter->iopriv.intf;
574 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
576 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
578 (!mac_pwr_ctrl_on) ||
579 (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode)
581 return sd_cmd52_read(intfhdl, addr, cnt, buf);
584 tmpbuf = rtw_malloc(n);
588 err = sd_read(intfhdl, addr, n, tmpbuf);
590 memcpy(buf, tmpbuf, cnt);
598 * Todo: align address to 4 bytes.
600 s32 sdio_local_write(
601 struct adapter *adapter,
607 struct intf_hdl *intfhdl;
613 DBG_8192C("%s, address must be 4 bytes alignment\n", __func__);
616 DBG_8192C("%s, size must be the multiple of 4\n", __func__);
618 intfhdl = &adapter->iopriv.intf;
620 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
622 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
624 (!mac_pwr_ctrl_on) ||
625 (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode)
627 return sd_cmd52_write(intfhdl, addr, cnt, buf);
629 tmpbuf = rtw_malloc(cnt);
633 memcpy(tmpbuf, buf, cnt);
635 err = sd_write(intfhdl, addr, cnt, tmpbuf);
642 u8 SdioLocalCmd52Read1Byte(struct adapter *adapter, u32 addr)
645 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
647 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
648 sd_cmd52_read(intfhdl, addr, 1, &val);
653 static u16 SdioLocalCmd52Read2Byte(struct adapter *adapter, u32 addr)
656 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
658 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
659 sd_cmd52_read(intfhdl, addr, 2, (u8 *)&val);
661 return le16_to_cpu(val);
664 static u32 SdioLocalCmd53Read4Byte(struct adapter *adapter, u32 addr)
669 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
672 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
673 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
674 if (!mac_pwr_ctrl_on || adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) {
675 sd_cmd52_read(intfhdl, addr, 4, (u8 *)&le_tmp);
676 val = le32_to_cpu(le_tmp);
678 val = sd_read32(intfhdl, addr, NULL);
683 void SdioLocalCmd52Write1Byte(struct adapter *adapter, u32 addr, u8 v)
685 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
687 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
688 sd_cmd52_write(intfhdl, addr, 1, &v);
691 static void SdioLocalCmd52Write4Byte(struct adapter *adapter, u32 addr, u32 v)
693 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
696 HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
697 le_tmp = cpu_to_le32(v);
698 sd_cmd52_write(intfhdl, addr, 4, (u8 *)&le_tmp);
701 static s32 ReadInterrupt8723BSdio(struct adapter *adapter, u32 *phisr)
710 himr = GET_HAL_DATA(adapter)->sdio_himr;
712 /* decide how many bytes need to be read */
720 while (hisr_len != 0) {
722 val8 = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_HISR + hisr_len);
723 hisr |= (val8 << (8 * hisr_len));
733 /* Initialize SDIO Host Interrupt Mask configuration variables for future use. */
736 /* Using SDIO Local register ONLY for configuration. */
738 /* Created by Roger, 2011.02.11. */
740 void InitInterrupt8723BSdio(struct adapter *adapter)
742 struct hal_com_data *haldata;
745 haldata = GET_HAL_DATA(adapter);
746 haldata->sdio_himr = (u32)( \
747 SDIO_HIMR_RX_REQUEST_MSK |
754 /* Initialize System Host Interrupt Mask configuration variables for future use. */
756 /* Created by Roger, 2011.08.03. */
758 void InitSysInterrupt8723BSdio(struct adapter *adapter)
760 struct hal_com_data *haldata;
763 haldata = GET_HAL_DATA(adapter);
765 haldata->SysIntrMask = ( \
771 /* Enalbe SDIO Host Interrupt Mask configuration on SDIO local domain. */
774 /* 1. Using SDIO Local register ONLY for configuration. */
775 /* 2. PASSIVE LEVEL */
777 /* Created by Roger, 2011.02.11. */
779 void EnableInterrupt8723BSdio(struct adapter *adapter)
781 struct hal_com_data *haldata;
785 haldata = GET_HAL_DATA(adapter);
787 himr = cpu_to_le32(haldata->sdio_himr);
788 sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
794 "%s: enable SDIO HIMR = 0x%08X\n",
800 /* Update current system IMR settings */
801 tmp = rtw_read32(adapter, REG_HSIMR);
802 rtw_write32(adapter, REG_HSIMR, tmp | haldata->SysIntrMask);
808 "%s: enable HSIMR = 0x%08X\n",
815 /* <Roger_Notes> There are some C2H CMDs have been sent before system interrupt is enabled, e.g., C2H, CPWM. */
816 /* So we need to clear all C2H events that FW has notified, otherwise FW won't schedule any commands anymore. */
819 rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
824 /* Disable SDIO Host IMR configuration to mask unnecessary interrupt service. */
827 /* Using SDIO Local register ONLY for configuration. */
829 /* Created by Roger, 2011.02.11. */
831 void DisableInterrupt8723BSdio(struct adapter *adapter)
835 himr = cpu_to_le32(SDIO_HIMR_DISABLED);
836 sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
841 /* Using 0x100 to check the power status of FW. */
844 /* Using SDIO Local register ONLY for configuration. */
846 /* Created by Isaac, 2013.09.10. */
848 u8 CheckIPSStatus(struct adapter *adapter)
851 "%s(): Read 0x100 = 0x%02x 0x86 = 0x%02x\n",
853 rtw_read8(adapter, 0x100),
854 rtw_read8(adapter, 0x86)
857 if (rtw_read8(adapter, 0x100) == 0xEA)
863 static struct recv_buf *sd_recv_rxfifo(struct adapter *adapter, u32 size)
867 struct recv_priv *recv_priv;
868 struct recv_buf *recvbuf;
871 /* Patch for some SDIO Host 4 bytes issue */
873 readsize = RND4(size);
875 /* 3 1. alloc recvbuf */
876 recv_priv = &adapter->recvpriv;
877 recvbuf = rtw_dequeue_recvbuf(&recv_priv->free_recv_buf_queue);
879 DBG_871X_LEVEL(_drv_err_, "%s: alloc recvbuf FAIL!\n", __func__);
884 if (!recvbuf->pskb) {
885 SIZE_PTR tmpaddr = 0;
886 SIZE_PTR alignment = 0;
888 recvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
891 recvbuf->pskb->dev = adapter->pnetdev;
893 tmpaddr = (SIZE_PTR)recvbuf->pskb->data;
894 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1);
895 skb_reserve(recvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
898 if (!recvbuf->pskb) {
899 DBG_871X("%s: alloc_skb fail! read =%d\n", __func__, readsize);
904 /* 3 3. read data from rxfifo */
905 readbuf = recvbuf->pskb->data;
906 ret = sdio_read_port(&adapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, readbuf);
908 RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("%s: read port FAIL!\n", __func__));
913 /* 3 4. init recvbuf */
915 recvbuf->phead = recvbuf->pskb->head;
916 recvbuf->pdata = recvbuf->pskb->data;
917 skb_set_tail_pointer(recvbuf->pskb, size);
918 recvbuf->ptail = skb_tail_pointer(recvbuf->pskb);
919 recvbuf->pend = skb_end_pointer(recvbuf->pskb);
924 static void sd_rxhandler(struct adapter *adapter, struct recv_buf *recvbuf)
926 struct recv_priv *recv_priv;
927 struct __queue *pending_queue;
929 recv_priv = &adapter->recvpriv;
930 pending_queue = &recv_priv->recv_buf_pending_queue;
932 /* 3 1. enqueue recvbuf */
933 rtw_enqueue_recvbuf(recvbuf, pending_queue);
935 /* 3 2. schedule tasklet */
936 tasklet_schedule(&recv_priv->recv_tasklet);
939 void sd_int_dpc(struct adapter *adapter)
941 struct hal_com_data *hal;
942 struct dvobj_priv *dvobj;
943 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
944 struct pwrctrl_priv *pwrctl;
947 hal = GET_HAL_DATA(adapter);
948 dvobj = adapter_to_dvobj(adapter);
949 pwrctl = dvobj_to_pwrctl(dvobj);
951 if (hal->sdio_hisr & SDIO_HISR_AVAL) {
954 _sdio_local_read(adapter, SDIO_REG_FREE_TXPG, 4, freepage);
955 complete(&(adapter->xmitpriv.xmit_comp));
958 if (hal->sdio_hisr & SDIO_HISR_CPWM1) {
959 struct reportpwrstate_parm report;
962 _cancel_timer(&(pwrctl->pwr_rpwm_timer), &bcancelled);
964 report.state = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_HCPWM1_8723B);
966 _set_workitem(&(pwrctl->cpwm_event));
969 if (hal->sdio_hisr & SDIO_HISR_TXERR) {
973 status = rtw_malloc(4);
975 addr = REG_TXDMA_STATUS;
976 HalSdioGetCmdAddr8723BSdio(adapter, WLAN_IOREG_DEVICE_ID, addr, &addr);
977 _sd_read(intfhdl, addr, 4, status);
978 _sd_write(intfhdl, addr, 4, status);
979 DBG_8192C("%s: SDIO_HISR_TXERR (0x%08x)\n", __func__, le32_to_cpu(*(u32 *)status));
982 DBG_8192C("%s: SDIO_HISR_TXERR, but can't allocate memory to read status!\n", __func__);
986 if (hal->sdio_hisr & SDIO_HISR_TXBCNOK)
987 DBG_8192C("%s: SDIO_HISR_TXBCNOK\n", __func__);
989 if (hal->sdio_hisr & SDIO_HISR_TXBCNERR)
990 DBG_8192C("%s: SDIO_HISR_TXBCNERR\n", __func__);
991 #ifndef CONFIG_C2H_PACKET_EN
992 if (hal->sdio_hisr & SDIO_HISR_C2HCMD) {
993 struct c2h_evt_hdr_88xx *c2h_evt;
995 DBG_8192C("%s: C2H Command\n", __func__);
996 c2h_evt = rtw_zmalloc(16);
998 if (c2h_evt_read_88xx(adapter, (u8 *)c2h_evt) == _SUCCESS) {
999 if (c2h_id_filter_ccx_8723b((u8 *)c2h_evt)) {
1000 /* Handle CCX report here */
1001 rtw_hal_c2h_handler(adapter, (u8 *)c2h_evt);
1002 kfree((u8 *)c2h_evt);
1004 rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt);
1008 /* Error handling for malloc fail */
1009 if (rtw_cbuf_push(adapter->evtpriv.c2h_queue, NULL) != _SUCCESS)
1010 DBG_871X("%s rtw_cbuf_push fail\n", __func__);
1011 _set_workitem(&adapter->evtpriv.c2h_wk);
1016 if (hal->sdio_hisr & SDIO_HISR_RXFOVW)
1017 DBG_8192C("%s: Rx Overflow\n", __func__);
1019 if (hal->sdio_hisr & SDIO_HISR_RXERR)
1020 DBG_8192C("%s: Rx Error\n", __func__);
1023 if (hal->sdio_hisr & SDIO_HISR_RX_REQUEST) {
1024 struct recv_buf *recvbuf;
1025 int alloc_fail_time = 0;
1028 hal->sdio_hisr ^= SDIO_HISR_RX_REQUEST;
1030 hal->SdioRxFIFOSize = SdioLocalCmd52Read2Byte(adapter, SDIO_REG_RX0_REQ_LEN);
1031 if (hal->SdioRxFIFOSize != 0) {
1032 recvbuf = sd_recv_rxfifo(adapter, hal->SdioRxFIFOSize);
1034 sd_rxhandler(adapter, recvbuf);
1037 DBG_871X("recvbuf is Null for %d times because alloc memory failed\n", alloc_fail_time);
1038 if (alloc_fail_time >= 10)
1041 hal->SdioRxFIFOSize = 0;
1046 ReadInterrupt8723BSdio(adapter, &hisr);
1047 hisr &= SDIO_HISR_RX_REQUEST;
1052 if (alloc_fail_time == 10)
1053 DBG_871X("exit because alloc memory failed more than 10 times\n");
1058 void sd_int_hdl(struct adapter *adapter)
1060 struct hal_com_data *hal;
1064 (adapter->bDriverStopped) || (adapter->bSurpriseRemoved)
1068 hal = GET_HAL_DATA(adapter);
1071 ReadInterrupt8723BSdio(adapter, &hal->sdio_hisr);
1073 if (hal->sdio_hisr & hal->sdio_himr) {
1076 hal->sdio_hisr &= hal->sdio_himr;
1079 v32 = hal->sdio_hisr & MASK_SDIO_HISR_CLEAR;
1081 SdioLocalCmd52Write4Byte(adapter, SDIO_REG_HISR, v32);
1083 sd_int_dpc(adapter);
1085 RT_TRACE(_module_hci_ops_c_, _drv_err_,
1086 ("%s: HISR(0x%08x) and HIMR(0x%08x) not match!\n",
1087 __func__, hal->sdio_hisr, hal->sdio_himr));
1093 /* Query SDIO Local register to query current the number of Free TxPacketBuffer page. */
1096 /* 1. Running at PASSIVE_LEVEL */
1097 /* 2. RT_TX_SPINLOCK is NOT acquired. */
1099 /* Created by Roger, 2011.01.28. */
1101 u8 HalQueryTxBufferStatus8723BSdio(struct adapter *adapter)
1103 struct hal_com_data *hal;
1104 u32 numof_free_page;
1107 hal = GET_HAL_DATA(adapter);
1109 numof_free_page = SdioLocalCmd53Read4Byte(adapter, SDIO_REG_FREE_TXPG);
1111 memcpy(hal->SdioTxFIFOFreePage, &numof_free_page, 4);
1112 RT_TRACE(_module_hci_ops_c_, _drv_notice_,
1113 ("%s: Free page for HIQ(%#x), MIDQ(%#x), LOWQ(%#x), PUBQ(%#x)\n",
1115 hal->SdioTxFIFOFreePage[HI_QUEUE_IDX],
1116 hal->SdioTxFIFOFreePage[MID_QUEUE_IDX],
1117 hal->SdioTxFIFOFreePage[LOW_QUEUE_IDX],
1118 hal->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]));
1125 /* Query SDIO Local register to get the current number of TX OQT Free Space. */
1127 void HalQueryTxOQTBufferStatus8723BSdio(struct adapter *adapter)
1129 struct hal_com_data *haldata = GET_HAL_DATA(adapter);
1131 haldata->SdioTxOQTFreeSpace = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_OQT_FREE_PG);
1134 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
1135 u8 RecvOnePkt(struct adapter *adapter, u32 size)
1137 struct recv_buf *recvbuf;
1138 struct dvobj_priv *sddev;
1139 struct sdio_func *func;
1143 DBG_871X("+%s: size: %d+\n", __func__, size);
1146 DBG_871X(KERN_ERR "%s: adapter is NULL!\n", __func__);
1150 sddev = adapter_to_dvobj(adapter);
1151 psdio_data = &sddev->intf_data;
1152 func = psdio_data->func;
1155 sdio_claim_host(func);
1156 recvbuf = sd_recv_rxfifo(adapter, size);
1159 sd_rxhandler(adapter, recvbuf);
1164 sdio_release_host(func);
1166 DBG_871X("-%s-\n", __func__);
1169 #endif /* CONFIG_WOWLAN */