diff options
Diffstat (limited to 'drivers/staging/rtl8723bs/hal/sdio_ops.c')
-rw-r--r-- | drivers/staging/rtl8723bs/hal/sdio_ops.c | 201 |
1 files changed, 37 insertions, 164 deletions
diff --git a/drivers/staging/rtl8723bs/hal/sdio_ops.c b/drivers/staging/rtl8723bs/hal/sdio_ops.c index 369f55d11519..a31694525bc1 100644 --- a/drivers/staging/rtl8723bs/hal/sdio_ops.c +++ b/drivers/staging/rtl8723bs/hal/sdio_ops.c @@ -10,16 +10,13 @@ #include <rtw_debug.h> #include <rtl8723b_hal.h> -/* define SDIO_DEBUG_IO 1 */ - - /* */ /* Description: */ /* The following mapping is for SDIO host local register space. */ /* */ /* Creadted by Roger, 2011.01.31. */ /* */ -static void HalSdioGetCmdAddr8723BSdio( +static void hal_sdio_get_cmd_addr_8723b( struct adapter *adapter, u8 device_id, u32 addr, @@ -95,10 +92,6 @@ static u8 get_deviceid(u32 addr) return devide_id; } -/* - * Ref: - *HalSdioGetCmdAddr8723BSdio() - */ static u32 _cvrt2ftaddr(const u32 addr, u8 *pdevice_id, u16 *poffset) { u8 device_id; @@ -177,19 +170,10 @@ static u32 sdio_read32(struct intf_hdl *intfhdl, u32 addr) if ( ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (!mac_pwr_ctrl_on) || - (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) + (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) ) { err = sd_cmd52_read(intfhdl, ftaddr, 4, (u8 *)&le_tmp); -#ifdef SDIO_DEBUG_IO - if (!err) { -#endif - return le32_to_cpu(le_tmp); -#ifdef SDIO_DEBUG_IO - } - - DBG_8192C(KERN_ERR "%s: Mac Power off, Read FAIL(%d)! addr = 0x%x\n", __func__, err, addr); - return SDIO_ERR_VAL32; -#endif + return le32_to_cpu(le_tmp); } /* 4 bytes alignment */ @@ -200,10 +184,8 @@ static u32 sdio_read32(struct intf_hdl *intfhdl, u32 addr) u8 *tmpbuf; tmpbuf = rtw_malloc(8); - if (!tmpbuf) { - DBG_8192C(KERN_ERR "%s: Allocate memory FAIL!(size =8) addr = 0x%x\n", __func__, addr); + if (!tmpbuf) return SDIO_ERR_VAL32; - } ftaddr &= ~(u16)0x3; sd_read(intfhdl, ftaddr, 8, tmpbuf); @@ -234,7 +216,7 @@ static s32 sdio_readN(struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *buf) if ( ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (!mac_pwr_ctrl_on) || - (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) + (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) ) return sd_cmd52_read(intfhdl, ftaddr, cnt, buf); @@ -301,7 +283,7 @@ static s32 sdio_write32(struct intf_hdl *intfhdl, u32 addr, u32 val) if ( ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (!mac_pwr_ctrl_on) || - (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) + (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) ) { le_tmp = cpu_to_le32(val); @@ -338,7 +320,7 @@ static s32 sdio_writeN(struct intf_hdl *intfhdl, u32 addr, u32 cnt, u8 *buf) if ( ((device_id == WLAN_IOREG_DEVICE_ID) && (offset < 0x100)) || (!mac_pwr_ctrl_on) || - (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) + (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) ) return sd_cmd52_write(intfhdl, ftaddr, cnt, buf); @@ -426,7 +408,7 @@ static u32 sdio_read_port( psdio = &adapter_to_dvobj(adapter)->intf_data; hal = GET_HAL_DATA(adapter); - HalSdioGetCmdAddr8723BSdio(adapter, addr, hal->SdioRxFIFOCnt++, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, addr, hal->SdioRxFIFOCnt++, &addr); if (cnt > psdio->block_transfer_len) cnt = _RND(cnt, psdio->block_transfer_len); @@ -469,13 +451,11 @@ static u32 sdio_write_port( adapter = intfhdl->padapter; psdio = &adapter_to_dvobj(adapter)->intf_data; - if (!adapter->hw_init_completed) { - DBG_871X("%s [addr = 0x%x cnt =%d] adapter->hw_init_completed == false\n", __func__, addr, cnt); + if (!adapter->hw_init_completed) return _FAIL; - } cnt = round_up(cnt, 4); - HalSdioGetCmdAddr8723BSdio(adapter, addr, cnt >> 2, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, addr, cnt >> 2, &addr); if (cnt > psdio->block_transfer_len) cnt = _RND(cnt, psdio->block_transfer_len); @@ -528,7 +508,7 @@ static s32 _sdio_local_read( intfhdl = &adapter->iopriv.intf; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on); if (!mac_pwr_ctrl_on) @@ -566,12 +546,12 @@ s32 sdio_local_read( intfhdl = &adapter->iopriv.intf; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on); if ( (!mac_pwr_ctrl_on) || - (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) + (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) ) return sd_cmd52_read(intfhdl, addr, cnt, buf); @@ -604,20 +584,14 @@ s32 sdio_local_write( s32 err; u8 *tmpbuf; - if (addr & 0x3) - DBG_8192C("%s, address must be 4 bytes alignment\n", __func__); - - if (cnt & 0x3) - DBG_8192C("%s, size must be the multiple of 4\n", __func__); - intfhdl = &adapter->iopriv.intf; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on); if ( (!mac_pwr_ctrl_on) || - (adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) + (adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) ) return sd_cmd52_write(intfhdl, addr, cnt, buf); @@ -639,24 +613,24 @@ u8 SdioLocalCmd52Read1Byte(struct adapter *adapter, u32 addr) u8 val = 0; struct intf_hdl *intfhdl = &adapter->iopriv.intf; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); sd_cmd52_read(intfhdl, addr, 1, &val); return val; } -static u16 SdioLocalCmd52Read2Byte(struct adapter *adapter, u32 addr) +static u16 sdio_local_cmd52_read2byte(struct adapter *adapter, u32 addr) { __le16 val = 0; struct intf_hdl *intfhdl = &adapter->iopriv.intf; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); sd_cmd52_read(intfhdl, addr, 2, (u8 *)&val); return le16_to_cpu(val); } -static u32 SdioLocalCmd53Read4Byte(struct adapter *adapter, u32 addr) +static u32 sdio_local_cmd53_read4byte(struct adapter *adapter, u32 addr) { u8 mac_pwr_ctrl_on; @@ -664,9 +638,9 @@ static u32 SdioLocalCmd53Read4Byte(struct adapter *adapter, u32 addr) struct intf_hdl *intfhdl = &adapter->iopriv.intf; __le32 le_tmp; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &mac_pwr_ctrl_on); - if (!mac_pwr_ctrl_on || adapter_to_pwrctl(adapter)->bFwCurrentInPSMode) { + if (!mac_pwr_ctrl_on || adapter_to_pwrctl(adapter)->fw_current_in_ps_mode) { sd_cmd52_read(intfhdl, addr, 4, (u8 *)&le_tmp); val = le32_to_cpu(le_tmp); } else { @@ -679,21 +653,21 @@ void SdioLocalCmd52Write1Byte(struct adapter *adapter, u32 addr, u8 v) { struct intf_hdl *intfhdl = &adapter->iopriv.intf; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); sd_cmd52_write(intfhdl, addr, 1, &v); } -static void SdioLocalCmd52Write4Byte(struct adapter *adapter, u32 addr, u32 v) +static void sdio_local_cmd52_write4byte(struct adapter *adapter, u32 addr, u32 v) { struct intf_hdl *intfhdl = &adapter->iopriv.intf; __le32 le_tmp; - HalSdioGetCmdAddr8723BSdio(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, SDIO_LOCAL_DEVICE_ID, addr, &addr); le_tmp = cpu_to_le32(v); sd_cmd52_write(intfhdl, addr, 4, (u8 *)&le_tmp); } -static s32 ReadInterrupt8723BSdio(struct adapter *adapter, u32 *phisr) +static s32 read_interrupt_8723b_sdio(struct adapter *adapter, u32 *phisr) { u32 hisr, himr; u8 val8, hisr_len; @@ -777,30 +751,10 @@ void EnableInterrupt8723BSdio(struct adapter *adapter) himr = cpu_to_le32(haldata->sdio_himr); sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8 *)&himr); - RT_TRACE( - _module_hci_ops_c_, - _drv_notice_, - ( - "%s: enable SDIO HIMR = 0x%08X\n", - __func__, - haldata->sdio_himr - ) - ); - /* Update current system IMR settings */ tmp = rtw_read32(adapter, REG_HSIMR); rtw_write32(adapter, REG_HSIMR, tmp | haldata->SysIntrMask); - RT_TRACE( - _module_hci_ops_c_, - _drv_notice_, - ( - "%s: enable HSIMR = 0x%08X\n", - __func__, - haldata->SysIntrMask - ) - ); - /* */ /* <Roger_Notes> There are some C2H CMDs have been sent before system interrupt is enabled, e.g., C2H, CPWM. */ /* So we need to clear all C2H events that FW has notified, otherwise FW won't schedule any commands anymore. */ @@ -837,13 +791,6 @@ void DisableInterrupt8723BSdio(struct adapter *adapter) /* */ u8 CheckIPSStatus(struct adapter *adapter) { - DBG_871X( - "%s(): Read 0x100 = 0x%02x 0x86 = 0x%02x\n", - __func__, - rtw_read8(adapter, 0x100), - rtw_read8(adapter, 0x86) - ); - if (rtw_read8(adapter, 0x100) == 0xEA) return true; else @@ -865,7 +812,8 @@ static struct recv_buf *sd_recv_rxfifo(struct adapter *adapter, u32 size) recv_priv = &adapter->recvpriv; recvbuf = rtw_dequeue_recvbuf(&recv_priv->free_recv_buf_queue); if (!recvbuf) { - DBG_871X_LEVEL(_drv_err_, "%s: alloc recvbuf FAIL!\n", __func__); + netdev_err(adapter->pnetdev, "%s: alloc recvbuf FAIL!\n", + __func__); return NULL; } @@ -884,19 +832,15 @@ static struct recv_buf *sd_recv_rxfifo(struct adapter *adapter, u32 size) skb_reserve(recvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); } - if (!recvbuf->pskb) { - DBG_871X("%s: alloc_skb fail! read =%d\n", __func__, readsize); + if (!recvbuf->pskb) return NULL; - } } /* 3 3. read data from rxfifo */ readbuf = recvbuf->pskb->data; ret = sdio_read_port(&adapter->iopriv.intf, WLAN_RX0FF_DEVICE_ID, readsize, readbuf); - if (ret == _FAIL) { - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("%s: read port FAIL!\n", __func__)); + if (ret == _FAIL) return NULL; - } /* 3 4. init recvbuf */ recvbuf->len = size; @@ -943,11 +887,9 @@ void sd_int_dpc(struct adapter *adapter) } if (hal->sdio_hisr & SDIO_HISR_CPWM1) { - struct reportpwrstate_parm report; - del_timer_sync(&(pwrctl->pwr_rpwm_timer)); - report.state = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_HCPWM1_8723B); + SdioLocalCmd52Read1Byte(adapter, SDIO_REG_HCPWM1_8723B); _set_workitem(&(pwrctl->cpwm_event)); } @@ -959,26 +901,16 @@ void sd_int_dpc(struct adapter *adapter) status = rtw_malloc(4); if (status) { addr = REG_TXDMA_STATUS; - HalSdioGetCmdAddr8723BSdio(adapter, WLAN_IOREG_DEVICE_ID, addr, &addr); + hal_sdio_get_cmd_addr_8723b(adapter, WLAN_IOREG_DEVICE_ID, addr, &addr); _sd_read(intfhdl, addr, 4, status); _sd_write(intfhdl, addr, 4, status); - DBG_8192C("%s: SDIO_HISR_TXERR (0x%08x)\n", __func__, le32_to_cpu(*(u32 *)status)); kfree(status); - } else { - DBG_8192C("%s: SDIO_HISR_TXERR, but can't allocate memory to read status!\n", __func__); } } - if (hal->sdio_hisr & SDIO_HISR_TXBCNOK) - DBG_8192C("%s: SDIO_HISR_TXBCNOK\n", __func__); - - if (hal->sdio_hisr & SDIO_HISR_TXBCNERR) - DBG_8192C("%s: SDIO_HISR_TXBCNERR\n", __func__); -#ifndef CONFIG_C2H_PACKET_EN if (hal->sdio_hisr & SDIO_HISR_C2HCMD) { struct c2h_evt_hdr_88xx *c2h_evt; - DBG_8192C("%s: C2H Command\n", __func__); c2h_evt = rtw_zmalloc(16); if (c2h_evt) { if (c2h_evt_read_88xx(adapter, (u8 *)c2h_evt) == _SUCCESS) { @@ -992,18 +924,10 @@ void sd_int_dpc(struct adapter *adapter) } } else { /* Error handling for malloc fail */ - if (rtw_cbuf_push(adapter->evtpriv.c2h_queue, NULL) != _SUCCESS) - DBG_871X("%s rtw_cbuf_push fail\n", __func__); + rtw_cbuf_push(adapter->evtpriv.c2h_queue, NULL); _set_workitem(&adapter->evtpriv.c2h_wk); } } -#endif - - if (hal->sdio_hisr & SDIO_HISR_RXFOVW) - DBG_8192C("%s: Rx Overflow\n", __func__); - - if (hal->sdio_hisr & SDIO_HISR_RXERR) - DBG_8192C("%s: Rx Error\n", __func__); if (hal->sdio_hisr & SDIO_HISR_RX_REQUEST) { struct recv_buf *recvbuf; @@ -1012,14 +936,13 @@ void sd_int_dpc(struct adapter *adapter) hal->sdio_hisr ^= SDIO_HISR_RX_REQUEST; do { - hal->SdioRxFIFOSize = SdioLocalCmd52Read2Byte(adapter, SDIO_REG_RX0_REQ_LEN); + hal->SdioRxFIFOSize = sdio_local_cmd52_read2byte(adapter, SDIO_REG_RX0_REQ_LEN); if (hal->SdioRxFIFOSize != 0) { recvbuf = sd_recv_rxfifo(adapter, hal->SdioRxFIFOSize); if (recvbuf) sd_rxhandler(adapter, recvbuf); else { alloc_fail_time++; - DBG_871X("recvbuf is Null for %d times because alloc memory failed\n", alloc_fail_time); if (alloc_fail_time >= 10) break; } @@ -1028,15 +951,11 @@ void sd_int_dpc(struct adapter *adapter) break; hisr = 0; - ReadInterrupt8723BSdio(adapter, &hisr); + read_interrupt_8723b_sdio(adapter, &hisr); hisr &= SDIO_HISR_RX_REQUEST; if (!hisr) break; } while (1); - - if (alloc_fail_time == 10) - DBG_871X("exit because alloc memory failed more than 10 times\n"); - } } @@ -1052,7 +971,7 @@ void sd_int_hdl(struct adapter *adapter) hal = GET_HAL_DATA(adapter); hal->sdio_hisr = 0; - ReadInterrupt8723BSdio(adapter, &hal->sdio_hisr); + read_interrupt_8723b_sdio(adapter, &hal->sdio_hisr); if (hal->sdio_hisr & hal->sdio_himr) { u32 v32; @@ -1062,13 +981,9 @@ void sd_int_hdl(struct adapter *adapter) /* clear HISR */ v32 = hal->sdio_hisr & MASK_SDIO_HISR_CLEAR; if (v32) - SdioLocalCmd52Write4Byte(adapter, SDIO_REG_HISR, v32); + sdio_local_cmd52_write4byte(adapter, SDIO_REG_HISR, v32); sd_int_dpc(adapter); - } else { - RT_TRACE(_module_hci_ops_c_, _drv_err_, - ("%s: HISR(0x%08x) and HIMR(0x%08x) not match!\n", - __func__, hal->sdio_hisr, hal->sdio_himr)); } } @@ -1089,16 +1004,9 @@ u8 HalQueryTxBufferStatus8723BSdio(struct adapter *adapter) hal = GET_HAL_DATA(adapter); - numof_free_page = SdioLocalCmd53Read4Byte(adapter, SDIO_REG_FREE_TXPG); + numof_free_page = sdio_local_cmd53_read4byte(adapter, SDIO_REG_FREE_TXPG); memcpy(hal->SdioTxFIFOFreePage, &numof_free_page, 4); - RT_TRACE(_module_hci_ops_c_, _drv_notice_, - ("%s: Free page for HIQ(%#x), MIDQ(%#x), LOWQ(%#x), PUBQ(%#x)\n", - __func__, - hal->SdioTxFIFOFreePage[HI_QUEUE_IDX], - hal->SdioTxFIFOFreePage[MID_QUEUE_IDX], - hal->SdioTxFIFOFreePage[LOW_QUEUE_IDX], - hal->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX])); return true; } @@ -1114,39 +1022,4 @@ void HalQueryTxOQTBufferStatus8723BSdio(struct adapter *adapter) haldata->SdioTxOQTFreeSpace = SdioLocalCmd52Read1Byte(adapter, SDIO_REG_OQT_FREE_PG); } -#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -u8 RecvOnePkt(struct adapter *adapter, u32 size) -{ - struct recv_buf *recvbuf; - struct dvobj_priv *sddev; - struct sdio_func *func; - - u8 res = false; - - DBG_871X("+%s: size: %d+\n", __func__, size); - if (!adapter) { - DBG_871X(KERN_ERR "%s: adapter is NULL!\n", __func__); - return false; - } - - sddev = adapter_to_dvobj(adapter); - psdio_data = &sddev->intf_data; - func = psdio_data->func; - - if (size) { - sdio_claim_host(func); - recvbuf = sd_recv_rxfifo(adapter, size); - - if (recvbuf) { - sd_rxhandler(adapter, recvbuf); - res = true; - } else { - res = false; - } - sdio_release_host(func); - } - DBG_871X("-%s-\n", __func__); - return res; -} -#endif /* CONFIG_WOWLAN */ |