1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 *******************************************************************************/
9 #include <rtl8723b_hal.h>
13 /* The following mapping is for SDIO host local register space. */
15 /* Creadted by Roger, 2011.01.31. */
17 static void hal_sdio_get_cmd_addr_8723b(
18 struct adapter *adapter,
25 case SDIO_LOCAL_DEVICE_ID:
26 *cmdaddr = ((SDIO_LOCAL_DEVICE_ID << 13) | (addr & SDIO_LOCAL_MSK));
29 case WLAN_IOREG_DEVICE_ID:
30 *cmdaddr = ((WLAN_IOREG_DEVICE_ID << 13) | (addr & WLAN_IOREG_MSK));
33 case WLAN_TX_HIQ_DEVICE_ID:
34 *cmdaddr = ((WLAN_TX_HIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK));
37 case WLAN_TX_MIQ_DEVICE_ID:
38 *cmdaddr = ((WLAN_TX_MIQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK));
41 case WLAN_TX_LOQ_DEVICE_ID:
42 *cmdaddr = ((WLAN_TX_LOQ_DEVICE_ID << 13) | (addr & WLAN_FIFO_MSK));
45 case WLAN_RX0FF_DEVICE_ID:
46 *cmdaddr = ((WLAN_RX0FF_DEVICE_ID << 13) | (addr & WLAN_RX0FF_MSK));
54 static u8 get_deviceid(u32 addr)
59 pseudo_id = (u16)(addr >> 16);
62 devide_id = SDIO_LOCAL_DEVICE_ID;
66 devide_id = WLAN_IOREG_DEVICE_ID;
70 devide_id = WLAN_TX_HIQ_DEVICE_ID;
74 devide_id = WLAN_TX_MIQ_DEVICE_ID;
78 devide_id = WLAN_TX_LOQ_DEVICE_ID;
82 devide_id = WLAN_RX0FF_DEVICE_ID;
86 devide_id = WLAN_IOREG_DEVICE_ID;
93 static u32 _cvrt2ftaddr(const u32 addr, u8 *pdevice_id, u16 *poffset)
99 device_id = get_deviceid(addr);
103 case SDIO_LOCAL_DEVICE_ID:
104 offset = addr & SDIO_LOCAL_MSK;
107 case WLAN_TX_HIQ_DEVICE_ID:
108 case WLAN_TX_MIQ_DEVICE_ID:
109 case WLAN_TX_LOQ_DEVICE_ID:
110 offset = addr & WLAN_FIFO_MSK;
113 case WLAN_RX0FF_DEVICE_ID:
114 offset = addr & WLAN_RX0FF_MSK;
117 case WLAN_IOREG_DEVICE_ID:
119 device_id = WLAN_IOREG_DEVICE_ID;
120 offset = addr & WLAN_IOREG_MSK;
123 ftaddr = (device_id << 13) | offset;
126 *pdevice_id = device_id;
133 static u8 sdio_read8(struct intf_hdl *intfhdl, u32 addr)
136 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
138 return sd_read8(intfhdl, ftaddr, NULL);
141 static u16 sdio_read16(struct intf_hdl *intfhdl, u32 addr)
146 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
147 sd_cmd52_read(intfhdl, ftaddr, 2, (u8 *)&le_tmp);
149 return le16_to_cpu(le_tmp);
152 static u32 sdio_read32(struct intf_hdl *intfhdl, u32 addr)
154 struct adapter *adapter;
161 s32 __maybe_unused err;
164 adapter = intfhdl->padapter;
165 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
167 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
169 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
170 (!mac_pwr_ctrl_on) ||
171 (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode)
173 err = sd_cmd52_read(intfhdl, ftaddr, 4, (u8 *)&le_tmp);
174 return le32_to_cpu(le_tmp);
177 /* 4 bytes alignment */
178 shift = ftaddr & 0x3;
180 val = sd_read32(intfhdl, ftaddr, NULL);
184 tmpbuf = rtw_malloc(8);
186 return SDIO_ERR_VAL32;
189 sd_read(intfhdl, ftaddr, 8, tmpbuf);
190 memcpy(&le_tmp, tmpbuf + shift, 4);
191 val = le32_to_cpu(le_tmp);
198 static s32 sdio_readN(struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *buf)
200 struct adapter *adapter;
208 adapter = intfhdl->padapter;
211 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
213 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
215 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
216 (!mac_pwr_ctrl_on) ||
217 (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode)
219 return sd_cmd52_read(intfhdl, ftaddr, cnt, buf);
221 /* 4 bytes alignment */
222 shift = ftaddr & 0x3;
224 err = sd_read(intfhdl, ftaddr, cnt, buf);
231 tmpbuf = rtw_malloc(n);
235 err = sd_read(intfhdl, ftaddr, n, tmpbuf);
237 memcpy(buf, tmpbuf + shift, cnt);
243 static s32 sdio_write8(struct intf_hdl *intfhdl, u32 addr, u8 val)
248 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
249 sd_write8(intfhdl, ftaddr, val, &err);
254 static s32 sdio_write16(struct intf_hdl *intfhdl, u32 addr, u16 val)
259 ftaddr = _cvrt2ftaddr(addr, NULL, NULL);
260 le_tmp = cpu_to_le16(val);
261 return sd_cmd52_write(intfhdl, ftaddr, 2, (u8 *)&le_tmp);
264 static s32 sdio_write32(struct intf_hdl *intfhdl, u32 addr, u32 val)
266 struct adapter *adapter;
275 adapter = intfhdl->padapter;
278 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
280 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
282 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
283 (!mac_pwr_ctrl_on) ||
284 (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode)
286 le_tmp = cpu_to_le32(val);
288 return sd_cmd52_write(intfhdl, ftaddr, 4, (u8 *)&le_tmp);
291 /* 4 bytes alignment */
292 shift = ftaddr & 0x3;
294 sd_write32(intfhdl, ftaddr, val, &err);
296 le_tmp = cpu_to_le32(val);
297 err = sd_cmd52_write(intfhdl, ftaddr, 4, (u8 *)&le_tmp);
302 static s32 sdio_writeN(struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *buf)
304 struct adapter *adapter;
312 adapter = intfhdl->padapter;
315 ftaddr = _cvrt2ftaddr(addr, &device_id, &offset);
317 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
319 ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) ||
320 (!mac_pwr_ctrl_on) ||
321 (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode)
323 return sd_cmd52_write(intfhdl, ftaddr, cnt, buf);
325 shift = ftaddr & 0x3;
327 err = sd_write(intfhdl, ftaddr, cnt, buf);
334 tmpbuf = rtw_malloc(n);
337 err = sd_read(intfhdl, ftaddr, 4, tmpbuf);
342 memcpy(tmpbuf + shift, buf, cnt);
343 err = sd_write(intfhdl, ftaddr, n, tmpbuf);
349 static void sdio_read_mem(
350 struct intf_hdl *intfhdl,
356 sdio_readN(intfhdl, addr, cnt, rmem);
359 static void sdio_write_mem(
360 struct intf_hdl *intfhdl,
366 sdio_writeN(intfhdl, addr, cnt, wmem);
372 *Round read size to block size,
373 *and make sure data transfer will be done in one command.
376 *intfhdl a pointer of intf_hdl
379 *rmem address to put data
385 static u32 sdio_read_port(
386 struct intf_hdl *intfhdl,
392 struct adapter *adapter;
393 struct sdio_data *psdio;
394 struct hal_com_data *hal;
397 adapter = intfhdl->padapter;
398 psdio = &adapter_to_dvobj(adapter)->intf_data;
399 hal = GET_HAL_DATA(adapter);
401 hal_sdio_get_cmd_addr_8723b(adapter, addr, hal->SdioRxFIFOCnt++, &addr);
403 if (cnt > psdio->block_transfer_len)
404 cnt = _RND(cnt, psdio->block_transfer_len);
406 err = _sd_read(intfhdl, addr, cnt, mem);
416 *Align write size block size,
417 *and make sure data could be written in one command.
420 *intfhdl a pointer of intf_hdl
423 *wmem data pointer to write
429 static u32 sdio_write_port(
430 struct intf_hdl *intfhdl,
436 struct adapter *adapter;
437 struct sdio_data *psdio;
439 struct xmit_buf *xmitbuf = (struct xmit_buf *)mem;
441 adapter = intfhdl->padapter;
442 psdio = &adapter_to_dvobj(adapter)->intf_data;
444 if (!adapter->hw_init_completed)
447 cnt = round_up(cnt, 4);
448 hal_sdio_get_cmd_addr_8723b(adapter, addr, cnt >> 2, &addr);
450 if (cnt > psdio->block_transfer_len)
451 cnt = _RND(cnt, psdio->block_transfer_len);
453 err = sd_write(intfhdl, addr, cnt, xmitbuf->pdata);
457 err ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS
465 void sdio_set_intf_ops(struct adapter *adapter, struct _io_ops *ops)
467 ops->_read8 = &sdio_read8;
468 ops->_read16 = &sdio_read16;
469 ops->_read32 = &sdio_read32;
470 ops->_read_mem = &sdio_read_mem;
471 ops->_read_port = &sdio_read_port;
473 ops->_write8 = &sdio_write8;
474 ops->_write16 = &sdio_write16;
475 ops->_write32 = &sdio_write32;
476 ops->_writeN = &sdio_writeN;
477 ops->_write_mem = &sdio_write_mem;
478 ops->_write_port = &sdio_write_port;
482 * Todo: align address to 4 bytes.
484 static s32 _sdio_local_read(
485 struct adapter *adapter,
491 struct intf_hdl *intfhdl;
497 intfhdl = &adapter->iopriv.intf;
499 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
501 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
502 if (!mac_pwr_ctrl_on)
503 return _sd_cmd52_read(intfhdl, addr, cnt, buf);
505 n = round_up(cnt, 4);
506 tmpbuf = rtw_malloc(n);
510 err = _sd_read(intfhdl, addr, n, tmpbuf);
512 memcpy(buf, tmpbuf, cnt);
520 * Todo: align address to 4 bytes.
523 struct adapter *adapter,
529 struct intf_hdl *intfhdl;
535 intfhdl = &adapter->iopriv.intf;
537 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
539 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
541 (!mac_pwr_ctrl_on) ||
542 (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode)
544 return sd_cmd52_read(intfhdl, addr, cnt, buf);
546 n = round_up(cnt, 4);
547 tmpbuf = rtw_malloc(n);
551 err = sd_read(intfhdl, addr, n, tmpbuf);
553 memcpy(buf, tmpbuf, cnt);
561 * Todo: align address to 4 bytes.
563 s32 sdio_local_write(
564 struct adapter *adapter,
570 struct intf_hdl *intfhdl;
575 intfhdl = &adapter->iopriv.intf;
577 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
579 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
581 (!mac_pwr_ctrl_on) ||
582 (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode)
584 return sd_cmd52_write(intfhdl, addr, cnt, buf);
586 tmpbuf = rtw_malloc(cnt);
590 memcpy(tmpbuf, buf, cnt);
592 err = sd_write(intfhdl, addr, cnt, tmpbuf);
599 u8 SdioLocalCmd52Read1Byte(struct adapter *adapter, u32 addr)
602 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
604 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
605 sd_cmd52_read(intfhdl, addr, 1, &val);
610 static u16 sdio_local_cmd52_read2byte(struct adapter *adapter, u32 addr)
613 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
615 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
616 sd_cmd52_read(intfhdl, addr, 2, (u8 *)&val);
618 return le16_to_cpu(val);
621 static u32 sdio_local_cmd53_read4byte(struct adapter *adapter, u32 addr)
626 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
629 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
630 rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on);
631 if (!mac_pwr_ctrl_on || adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) {
632 sd_cmd52_read(intfhdl, addr, 4, (u8 *)&le_tmp);
633 val = le32_to_cpu(le_tmp);
635 val = sd_read32(intfhdl, addr, NULL);
640 void SdioLocalCmd52Write1Byte(struct adapter *adapter, u32 addr, u8 v)
642 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
644 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
645 sd_cmd52_write(intfhdl, addr, 1, &v);
648 static void sdio_local_cmd52_write4byte(struct adapter *adapter, u32 addr, u32 v)
650 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
653 hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr);
654 le_tmp = cpu_to_le32(v);
655 sd_cmd52_write(intfhdl, addr, 4, (u8 *)&le_tmp);
658 static s32 read_interrupt_8723b_sdio(struct adapter *adapter, u32 *phisr)
666 himr = GET_HAL_DATA(adapter)->sdio_himr;
668 /* decide how many bytes need to be read */
676 while (hisr_len != 0) {
678 val8 = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_HISR + hisr_len);
679 hisr |= (val8 << (8 * hisr_len));
689 /* Initialize SDIO Host Interrupt Mask configuration variables for future use. */
692 /* Using SDIO Local register ONLY for configuration. */
694 /* Created by Roger, 2011.02.11. */
696 void InitInterrupt8723BSdio(struct adapter *adapter)
698 struct hal_com_data *haldata;
700 haldata = GET_HAL_DATA(adapter);
701 haldata->sdio_himr = (u32)(SDIO_HIMR_RX_REQUEST_MSK |
708 /* Initialize System Host Interrupt Mask configuration variables for future use. */
710 /* Created by Roger, 2011.08.03. */
712 void InitSysInterrupt8723BSdio(struct adapter *adapter)
714 struct hal_com_data *haldata;
716 haldata = GET_HAL_DATA(adapter);
718 haldata->SysIntrMask = (0);
723 /* Enalbe SDIO Host Interrupt Mask configuration on SDIO local domain. */
726 /* 1. Using SDIO Local register ONLY for configuration. */
727 /* 2. PASSIVE LEVEL */
729 /* Created by Roger, 2011.02.11. */
731 void EnableInterrupt8723BSdio(struct adapter *adapter)
733 struct hal_com_data *haldata;
737 haldata = GET_HAL_DATA(adapter);
739 himr = cpu_to_le32(haldata->sdio_himr);
740 sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
742 /* Update current system IMR settings */
743 tmp = rtw_read32(adapter, REG_HSIMR);
744 rtw_write32(adapter, REG_HSIMR, tmp | haldata->SysIntrMask);
747 /* <Roger_Notes> There are some C2H CMDs have been sent before system interrupt is enabled, e.g., C2H, CPWM. */
748 /* So we need to clear all C2H events that FW has notified, otherwise FW won't schedule any commands anymore. */
751 rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
756 /* Disable SDIO Host IMR configuration to mask unnecessary interrupt service. */
759 /* Using SDIO Local register ONLY for configuration. */
761 /* Created by Roger, 2011.02.11. */
763 void DisableInterrupt8723BSdio(struct adapter *adapter)
767 himr = cpu_to_le32(SDIO_HIMR_DISABLED);
768 sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8 *)&himr);
773 /* Using 0x100 to check the power status of FW. */
776 /* Using SDIO Local register ONLY for configuration. */
778 /* Created by Isaac, 2013.09.10. */
780 u8 CheckIPSStatus(struct adapter *adapter)
782 if (rtw_read8(adapter, 0x100) == 0xEA)
788 static struct recv_buf *sd_recv_rxfifo(struct adapter *adapter, u32 size)
792 struct recv_priv *recv_priv;
793 struct recv_buf *recvbuf;
795 /* Patch for some SDIO Host 4 bytes issue */
797 readsize = round_up(size, 4);
799 /* 3 1. alloc recvbuf */
800 recv_priv = &adapter->recvpriv;
801 recvbuf = rtw_dequeue_recvbuf(&recv_priv->free_recv_buf_queue);
803 netdev_err(adapter->pnetdev, "%s: alloc recvbuf FAIL!\n",
809 if (!recvbuf->pskb) {
810 SIZE_PTR tmpaddr = 0;
811 SIZE_PTR alignment = 0;
813 recvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
817 recvbuf->pskb->dev = adapter->pnetdev;
819 tmpaddr = (SIZE_PTR)recvbuf->pskb->data;
820 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1);
821 skb_reserve(recvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
824 /* 3 3. read data from rxfifo */
825 readbuf = recvbuf->pskb->data;
826 ret = sdio_read_port(&adapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, readbuf);
830 /* 3 4. init recvbuf */
832 recvbuf->phead = recvbuf->pskb->head;
833 recvbuf->pdata = recvbuf->pskb->data;
834 skb_set_tail_pointer(recvbuf->pskb, size);
835 recvbuf->ptail = skb_tail_pointer(recvbuf->pskb);
836 recvbuf->pend = skb_end_pointer(recvbuf->pskb);
841 static void sd_rxhandler(struct adapter *adapter, struct recv_buf *recvbuf)
843 struct recv_priv *recv_priv;
844 struct __queue *pending_queue;
846 recv_priv = &adapter->recvpriv;
847 pending_queue = &recv_priv->recv_buf_pending_queue;
849 /* 3 1. enqueue recvbuf */
850 rtw_enqueue_recvbuf(recvbuf, pending_queue);
852 /* 3 2. schedule tasklet */
853 tasklet_schedule(&recv_priv->recv_tasklet);
856 void sd_int_dpc(struct adapter *adapter)
858 struct hal_com_data *hal;
859 struct dvobj_priv *dvobj;
860 struct intf_hdl *intfhdl = &adapter->iopriv.intf;
861 struct pwrctrl_priv *pwrctl;
863 hal = GET_HAL_DATA(adapter);
864 dvobj = adapter_to_dvobj(adapter);
865 pwrctl = dvobj_to_pwrctl(dvobj);
867 if (hal->sdio_hisr & SDIO_HISR_AVAL) {
870 _sdio_local_read(adapter, SDIO_REG_FREE_TXPG, 4, freepage);
871 complete(&(adapter->xmitpriv.xmit_comp));
874 if (hal->sdio_hisr & SDIO_HISR_CPWM1) {
875 del_timer_sync(&(pwrctl->pwr_rpwm_timer));
877 SdioLocalCmd52Read1Byte(adapter, SDIO_REG_HCPWM1_8723B);
879 _set_workitem(&(pwrctl->cpwm_event));
882 if (hal->sdio_hisr & SDIO_HISR_TXERR) {
886 status = rtw_malloc(4);
888 addr = REG_TXDMA_STATUS;
889 hal_sdio_get_cmd_addr_8723b(adapter, WLAN_IOREG_DEVICE_ID, addr, &addr);
890 _sd_read(intfhdl, addr, 4, status);
891 _sd_write(intfhdl, addr, 4, status);
896 if (hal->sdio_hisr & SDIO_HISR_C2HCMD) {
897 struct c2h_evt_hdr_88xx *c2h_evt;
899 c2h_evt = rtw_zmalloc(16);
901 if (c2h_evt_read_88xx(adapter, (u8 *)c2h_evt) == _SUCCESS) {
902 if (c2h_id_filter_ccx_8723b((u8 *)c2h_evt)) {
903 /* Handle CCX report here */
904 rtw_hal_c2h_handler(adapter, (u8 *)c2h_evt);
907 rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt);
913 /* Error handling for malloc fail */
914 rtw_cbuf_push(adapter->evtpriv.c2h_queue, NULL);
915 _set_workitem(&adapter->evtpriv.c2h_wk);
919 if (hal->sdio_hisr & SDIO_HISR_RX_REQUEST) {
920 struct recv_buf *recvbuf;
921 int alloc_fail_time = 0;
924 hal->sdio_hisr ^= SDIO_HISR_RX_REQUEST;
926 hal->SdioRxFIFOSize = sdio_local_cmd52_read2byte(adapter, SDIO_REG_RX0_REQ_LEN);
927 if (hal->SdioRxFIFOSize != 0) {
928 recvbuf = sd_recv_rxfifo(adapter, hal->SdioRxFIFOSize);
930 sd_rxhandler(adapter, recvbuf);
933 if (alloc_fail_time >= 10)
936 hal->SdioRxFIFOSize = 0;
941 read_interrupt_8723b_sdio(adapter, &hisr);
942 hisr &= SDIO_HISR_RX_REQUEST;
949 void sd_int_hdl(struct adapter *adapter)
951 struct hal_com_data *hal;
954 (adapter->bDriverStopped) || (adapter->bSurpriseRemoved)
958 hal = GET_HAL_DATA(adapter);
961 read_interrupt_8723b_sdio(adapter, &hal->sdio_hisr);
963 if (hal->sdio_hisr & hal->sdio_himr) {
966 hal->sdio_hisr &= hal->sdio_himr;
969 v32 = hal->sdio_hisr & MASK_SDIO_HISR_CLEAR;
971 sdio_local_cmd52_write4byte(adapter, SDIO_REG_HISR, v32);
979 /* Query SDIO Local register to query current the number of Free TxPacketBuffer page. */
982 /* 1. Running at PASSIVE_LEVEL */
983 /* 2. RT_TX_SPINLOCK is NOT acquired. */
985 /* Created by Roger, 2011.01.28. */
987 u8 HalQueryTxBufferStatus8723BSdio(struct adapter *adapter)
989 struct hal_com_data *hal;
992 hal = GET_HAL_DATA(adapter);
994 numof_free_page = sdio_local_cmd53_read4byte(adapter, SDIO_REG_FREE_TXPG);
996 memcpy(hal->SdioTxFIFOFreePage, &numof_free_page, 4);
1003 /* Query SDIO Local register to get the current number of TX OQT Free Space. */
1005 void HalQueryTxOQTBufferStatus8723BSdio(struct adapter *adapter)
1007 struct hal_com_data *haldata = GET_HAL_DATA(adapter);
1009 haldata->SdioTxOQTFreeSpace = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_OQT_FREE_PG);