static INT32 mtk_sdio_interrupt(MTK_WCN_HIF_SDIO_CLTCTX cltCtx) { P_GLUE_INFO_T prGlueInfo = NULL; INT32 ret = 0; prGlueInfo = mtk_wcn_hif_sdio_get_drvdata(cltCtx); /* ASSERT(prGlueInfo); */ if (!prGlueInfo) { /* printk(KERN_INFO DRV_NAME"No glue info in mtk_sdio_interrupt()\n"); */ return (-HIF_SDIO_ERR_FAIL); } if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) { /* printk(KERN_INFO DRV_NAME"GLUE_FLAG_HALT skip INT\n"); */ ret = mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, WHLPCR_INT_EN_CLR); return ret; } ret = mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, WHLPCR_INT_EN_CLR); set_bit(GLUE_FLAG_INT_BIT, &prGlueInfo->u4Flag); /* when we got sdio interrupt, we wake up the tx servie thread */ #if CFG_SUPPORT_MULTITHREAD wake_up_interruptible(&prGlueInfo->waitq_hif); #else wake_up_interruptible(&prGlueInfo->waitq); #endif return ret; }
static INT32 mtk_sdio_interrupt(MTK_WCN_HIF_SDIO_CLTCTX cltCtx) { P_GLUE_INFO_T prGlueInfo = NULL; INT32 ret = 0; prGlueInfo = mtk_wcn_hif_sdio_get_drvdata(cltCtx); ASSERT(prGlueInfo); if (!prGlueInfo) { //printk(KERN_INFO DRV_NAME"No glue info in mtk_sdio_interrupt()\n"); return (-HIF_SDIO_ERR_FAIL); } if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) { //printk(KERN_INFO DRV_NAME"GLUE_FLAG_HALT skip INT\n"); ret = mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, WHLPCR_INT_EN_CLR); return ret; } /*WCNCR 00002676*/ KAL_WAKE_UNLOCK(NULL, &isr_wakelock); KAL_WAKE_LOCK_TIMEOUT(NULL, &isr_wakelock, KAL_HZ/10); ret = mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, WHLPCR_INT_EN_CLR); set_bit (GLUE_FLAG_INT_BIT, &prGlueInfo->u4Flag); /* when we got sdio interrupt, we wake up the tx servie thread*/ wake_up_interruptible(&prGlueInfo->waitq); return ret; }
/*----------------------------------------------------------------------------*/ BOOL kalDevRegWrite(IN P_GLUE_INFO_T prGlueInfo, IN UINT_32 u4Register, IN UINT_32 u4Value) { int ret = 0; ASSERT(prGlueInfo); #if MTK_WCN_HIF_SDIO ret = mtk_wcn_hif_sdio_writel(prGlueInfo->rHifInfo.cltCtx, u4Register, u4Value); #else if (!in_interrupt) { sdio_claim_host(prGlueInfo->rHifInfo.func); } sdio_writel(prGlueInfo->rHifInfo.func, u4Value, u4Register, &ret); if (!in_interrupt) { sdio_release_host(prGlueInfo->rHifInfo.func); } #endif if (ret) { kalSendAeeWarning(HIF_SDIO_ERR_TITLE_STR, HIF_SDIO_ERR_DESC_STR "sdio_writel() reports error: %x", ret); DBGLOG(HAL, ERROR, ("sdio_writel() reports error: %x", ret)); } return (ret) ? FALSE : TRUE; } /* end of kalDevRegWrite() */
// IRQ Handler static INT32 mt6620_irq_handler(MTK_WCN_HIF_SDIO_CLTCTX cltCtx) { down(&mt6620_sem); // disabling interrupt mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, 0x2); mt6620_t.irq_en = 0; // marking mt6620_t.irq.irq = 1; up(&mt6620_sem); return 0; }
static INT32 mtk_sdio_interrupt(MTK_WCN_HIF_SDIO_CLTCTX cltCtx) { P_GLUE_INFO_T prGlueInfo = NULL; INT32 ret = 0; struct sdio_func* func; func = hif_sdio_ctx_to_func_wapper(cltCtx); sdio_release_host(func); prGlueInfo = mtk_wcn_hif_sdio_get_drvdata(cltCtx); ASSERT(prGlueInfo); if (!prGlueInfo) { //printk(KERN_INFO DRV_NAME"No glue info in mtk_sdio_interrupt()\n"); return (-HIF_SDIO_ERR_FAIL); } if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) { //printk(KERN_INFO DRV_NAME"GLUE_FLAG_HALT skip INT\n"); ret = mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, WHLPCR_INT_EN_CLR); return ret; } ret = mtk_wcn_hif_sdio_writel(cltCtx, MCR_WHLPCR, WHLPCR_INT_EN_CLR); set_bit (GLUE_FLAG_INT_BIT, &prGlueInfo->u4Flag); /* when we got sdio interrupt, we wake up the tx servie thread*/ wake_up_interruptible(&prGlueInfo->waitq); sdio_claim_host(func); return ret; }