/*----------------------------------------------------------------------------*/ BOOL kalDevRegRead ( IN P_GLUE_INFO_T prGlueInfo, IN UINT_32 u4Register, OUT PUINT_32 pu4Value ) { int ret = 0; int a = 0; ASSERT(prGlueInfo); ASSERT(pu4Value); #if MTK_WCN_HIF_SDIO ret = mtk_wcn_hif_sdio_readl(prGlueInfo->rHifInfo.cltCtx, u4Register, (PUINT32) pu4Value); #else if (!in_interrupt) { sdio_claim_host(prGlueInfo->rHifInfo.func); } retry: *pu4Value = sdio_readl(prGlueInfo->rHifInfo.func, u4Register, &ret); if (ret && a < 10) { a++; printk("gwl =-==============> sdio_readl retry %d!\n", a); msleep(1); goto retry; } if (!in_interrupt) { sdio_release_host(prGlueInfo->rHifInfo.func); } #endif if (ret) { kalSendAeeWarning(HIF_SDIO_ERR_TITLE_STR, HIF_SDIO_ERR_DESC_STR "sdio_readl() reports error: %x", ret); DBGLOG(HAL, ERROR, ("sdio_readl() reports error: %x", ret)); } return (ret) ? FALSE : TRUE; } /* end of kalDevRegRead() */
/*----------------------------------------------------------------------------*/ BOOL kalDevPortRead(IN P_GLUE_INFO_T prGlueInfo, IN UINT_16 u2Port, IN UINT_32 u4Len, OUT PUINT_8 pucBuf, IN UINT_32 u4ValidOutBufSize) { P_GL_HIF_INFO_T prHifInfo = NULL; PUINT_8 pucDst = NULL; int count = u4Len; int ret = 0; int bNum = 0; #if (MTK_WCN_HIF_SDIO == 0) struct sdio_func *prSdioFunc = NULL; #endif #if DBG /* printk(KERN_INFO DRV_NAME"++kalDevPortRead++ buf:0x%p, port:0x%x, length:%d\n", pucBuf, u2Port, u4Len); */ #endif ASSERT(prGlueInfo); prHifInfo = &prGlueInfo->rHifInfo; ASSERT(pucBuf); pucDst = pucBuf; ASSERT(u4Len <= u4ValidOutBufSize); #if (MTK_WCN_HIF_SDIO == 0) prSdioFunc = prHifInfo->func; ASSERT(prSdioFunc->cur_blksize > 0); if (!in_interrupt) { sdio_claim_host(prSdioFunc); } /* Split buffer into multiple single block to workaround hifsys */ while (count >= prSdioFunc->cur_blksize) { count -= prSdioFunc->cur_blksize; bNum++; } if (count > 0 && bNum > 0) { bNum++; } if (bNum > 0) { ret = sdio_readsb(prSdioFunc, pucDst, u2Port, prSdioFunc->cur_blksize * bNum); #ifdef CONFIG_X86 /* ENE workaround */ { int tmp; sdio_writel(prSdioFunc, 0x0, SDIO_X86_WORKAROUND_WRITE_MCR, &tmp); } #endif } else { ret = sdio_readsb(prSdioFunc, pucDst, u2Port, count); } if (!in_interrupt) { sdio_release_host(prSdioFunc); } #else /* Split buffer into multiple single block to workaround hifsys */ while (count >= (prGlueInfo->rHifInfo).prFuncInfo->blk_sz) { count -= ((prGlueInfo->rHifInfo).prFuncInfo->blk_sz); bNum++; } if (count > 0 && bNum > 0) { bNum++; } if (bNum > 0) { ret = mtk_wcn_hif_sdio_read_buf(prGlueInfo->rHifInfo.cltCtx, u2Port, (PUINT32) pucDst, ((prGlueInfo->rHifInfo).prFuncInfo->blk_sz) * bNum); } else { ret = mtk_wcn_hif_sdio_read_buf(prGlueInfo->rHifInfo.cltCtx, u2Port, (PUINT32) pucDst, count); } #endif if (ret) { kalSendAeeWarning(HIF_SDIO_ERR_TITLE_STR, HIF_SDIO_ERR_DESC_STR "sdio_readsb() reports error: %x", ret); DBGLOG(HAL, ERROR, ("sdio_readsb() reports error: %x", ret)); } return (ret) ? FALSE : TRUE; } /* end of kalDevPortRead() */