diff options
Diffstat (limited to 'drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c')
-rwxr-xr-x | drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c | 385 |
1 files changed, 331 insertions, 54 deletions
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c index 2950a783c5aa..4a1078927f5f 100755 --- a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c +++ b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_ops_linux.c @@ -22,8 +22,6 @@ #include <linux/mmc/sdio_func.h> -#define SD_IO_TRY_CNT (8) - static bool rtw_sdio_claim_host_needed(struct sdio_func *func) { struct dvobj_priv *dvobj = sdio_get_drvdata(func); @@ -41,14 +39,27 @@ inline void rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl) sdio_data->sys_sdio_irq_thd = thd_hdl; } -u8 sd_f0_read8(PSDIO_DATA psdio, u32 addr, s32 *err) +u8 sd_f0_read8(struct intf_hdl *pintfhdl,u32 addr, s32 *err) { - u8 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u8 v=0; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -65,13 +76,25 @@ _func_exit_; return v; } -void sd_f0_write8(PSDIO_DATA psdio, u32 addr, u8 v, s32 *err) +void sd_f0_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; _func_enter_; - + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -91,14 +114,25 @@ _func_exit_; * 0 Success * others Fail */ -s32 _sd_cmd52_read(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; for (i = 0; i < cnt; i++) { @@ -119,21 +153,32 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_cmd52_read(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; - bool claim_needed; + bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_cmd52_read(psdio, addr, cnt, pdata); + err = _sd_cmd52_read(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); @@ -147,14 +192,25 @@ _func_exit_; * 0 Success * others Fail */ -s32 _sd_cmd52_write(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved)!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; for (i = 0; i < cnt; i++) { @@ -175,21 +231,32 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_cmd52_write(PSDIO_DATA psdio, u32 addr, u32 cnt, u8 *pdata) +s32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata) { - int err, i; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err=0, i; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; - err = 0; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_cmd52_write(psdio, addr, cnt, pdata); + err = _sd_cmd52_write(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); @@ -198,13 +265,25 @@ _func_exit_; return err; } -u8 _sd_read8(PSDIO_DATA psdio, u32 addr, s32 *err) +u8 _sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u8 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u8 v=0; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved)!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; v = sdio_readb(func, addr, err); @@ -217,14 +296,26 @@ _func_exit_; return v; } -u8 sd_read8(PSDIO_DATA psdio, u32 addr, s32 *err) +u8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + u8 v; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -241,14 +332,26 @@ _func_exit_; return v; } -u16 sd_read16(PSDIO_DATA psdio, u32 addr, s32 *err) +u16 sd_read16(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u16 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u16 v=0; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -265,13 +368,25 @@ _func_exit_; return v; } -u32 _sd_read32(PSDIO_DATA psdio, u32 addr, s32 *err) +u32 _sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u32 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u32 v=0; struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; v = sdio_readl(func, addr, err); @@ -288,8 +403,23 @@ _func_enter_; //sdio_claim_host(func); v = sdio_readl(func, addr, err); //sdio_release_host(func); - if (*err == 0) + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + } + else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)) + { + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + + } } if (i==SD_IO_TRY_CNT) @@ -304,14 +434,26 @@ _func_exit_; return v; } -u32 sd_read32(PSDIO_DATA psdio, u32 addr, s32 *err) +u32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err) { - u32 v; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + u32 v=0; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return v; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -333,8 +475,21 @@ _func_enter_; if (claim_needed) sdio_claim_host(func); v = sdio_readl(func, addr, err); if (claim_needed) sdio_release_host(func); - if (*err == 0) + + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + }else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){ + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + } } if (i==SD_IO_TRY_CNT) @@ -349,13 +504,26 @@ _func_exit_; return v; } -void sd_write8(PSDIO_DATA psdio, u32 addr, u8 v, s32 *err) +void sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -370,13 +538,25 @@ _func_enter_; _func_exit_; } -void sd_write16(PSDIO_DATA psdio, u32 addr, u16 v, s32 *err) +void sd_write16(struct intf_hdl *pintfhdl, u32 addr, u16 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -391,12 +571,24 @@ _func_enter_; _func_exit_; } -void _sd_write32(PSDIO_DATA psdio, u32 addr, u32 v, s32 *err) +void _sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; sdio_writel(func, v, addr, err); @@ -411,8 +603,20 @@ _func_enter_; for(i=0; i<SD_IO_TRY_CNT; i++) { sdio_writel(func, v, addr, err); - if (*err == 0) + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + }else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){ + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + } } if (i==SD_IO_TRY_CNT) @@ -425,13 +629,24 @@ _func_enter_; _func_exit_; } -void sd_write32(PSDIO_DATA psdio, u32 addr, u32 v, s32 *err) +void sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err) { + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; struct sdio_func *func; bool claim_needed; _func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved)!!!\n",__FUNCTION__); + return ; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); @@ -453,8 +668,20 @@ _func_enter_; if (claim_needed) sdio_claim_host(func); sdio_writel(func, v, addr, err); if (claim_needed) sdio_release_host(func); - if (*err == 0) + if (*err == 0){ + rtw_reset_continual_io_error(psdiodev); break; + }else{ + DBG_871X(KERN_ERR "%s: (%d) addr=0x%05x, val=0x%x, try_cnt=%d\n", __func__, *err, addr, v, i); + if(( -ESHUTDOWN == *err ) || ( -ENODEV == *err)){ + padapter->bSurpriseRemoved = _TRUE; + } + + if(rtw_inc_and_chk_continual_io_error(psdiodev) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + } } if (i==SD_IO_TRY_CNT) @@ -481,13 +708,25 @@ _func_exit_; * 0 Success * others Fail */ -s32 _sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata) { - int err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + + int err= -EPERM; struct sdio_func *func; _func_enter_; - + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; if (unlikely((cnt==1) || (cnt==2))) @@ -530,21 +769,34 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 sd_read(struct intf_hdl * pintfhdl, u32 addr, u32 cnt, void *pdata) { - s32 err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; - + s32 err= -EPERM; + +_func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_read(psdio, addr, cnt, pdata); + err = _sd_read(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); - +_func_exit_; return err; } @@ -563,14 +815,26 @@ s32 sd_read(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) * 0 Success * others Fail */ -s32 _sd_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata) { - int err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; u32 size; + s32 err=-EPERM; _func_enter_; - + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; // size = sdio_align_size(func, cnt); @@ -615,21 +879,34 @@ _func_exit_; * 0 Success * others Fail */ -s32 sd_write(PSDIO_DATA psdio, u32 addr, u32 cnt, void *pdata) +s32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata) { - s32 err; + PADAPTER padapter; + struct dvobj_priv *psdiodev; + PSDIO_DATA psdio; + struct sdio_func *func; bool claim_needed; - + s32 err=-EPERM; +_func_enter_; + padapter = pintfhdl->padapter; + psdiodev = pintfhdl->pintf_dev; + psdio = &psdiodev->intf_data; + + if(padapter->bSurpriseRemoved){ + //DBG_871X(" %s (padapter->bSurpriseRemoved )!!!\n",__FUNCTION__); + return err; + } + func = psdio->func; claim_needed = rtw_sdio_claim_host_needed(func); if (claim_needed) sdio_claim_host(func); - err = _sd_write(psdio, addr, cnt, pdata); + err = _sd_write(pintfhdl, addr, cnt, pdata); if (claim_needed) sdio_release_host(func); - +_func_exit_; return err; } |