/*----------------------------------------------------------------------------*/ VOID sdioINTerruptCallback(IN PVOID context, IN UINT_32 u4INTerruptType) { P_GLUE_INFO_T prGlueInfo; PDEVICE_EXTENSION prDevExt; NTSTATUS rStatus; ASSERT(context); prGlueInfo = (P_GLUE_INFO_T) context; prDevExt = (PDEVICE_EXTENSION) &prGlueInfo->rHifInfo.dx; if (prGlueInfo->rHifInfo.u4ReqFlag & REQ_FLAG_HALT) { if (prDevExt->BusInterface.AcknowledgeInterrupt) rStatus = (prDevExt->BusInterface.AcknowledgeInterrupt) (prDevExt->BusInterface.Context); return; } wlanISR(prGlueInfo->prAdapter, TRUE); if (prDevExt->BusInterface.AcknowledgeInterrupt) rStatus = (prDevExt->BusInterface.AcknowledgeInterrupt) (prDevExt->BusInterface.Context); _InterlockedOr(&prGlueInfo->rHifInfo.u4ReqFlag, REQ_FLAG_INT); /* KeSetEvent(&prGlueInfo->rHifInfo.rOidReqEvent, EVENT_INCREMENT, FALSE); */ /* Set EVENT */ NdisSetEvent(&prGlueInfo->rTxReqEvent); return; } /* end of sdioINTerruptCallback() */
/*----------------------------------------------------------------------------*/ static irqreturn_t glEhpiInterruptHandler( int irq, void *dev_id ) { P_GLUE_INFO_T prGlueInfo = (P_GLUE_INFO_T) dev_id; ASSERT(prGlueInfo); if (!prGlueInfo) { return IRQ_HANDLED; } /* 1. Running for ISR */ wlanISR(prGlueInfo->prAdapter, TRUE); /* 1.1 Halt flag Checking */ if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) { return IRQ_HANDLED; } /* 2. Flag marking for interrupt */ set_bit (GLUE_FLAG_INT_BIT, &prGlueInfo->u4Flag); /* 3. wake up tx service thread */ wake_up_interruptible(&prGlueInfo->waitq); return IRQ_HANDLED; }
static void mtk_sdio_interrupt(struct sdio_func *func) { P_GLUE_INFO_T prGlueInfo = NULL; int ret = 0; prGlueInfo = sdio_get_drvdata(func); //ASSERT(prGlueInfo); if (!prGlueInfo) { //printk(KERN_INFO DRV_NAME"No glue info in mtk_sdio_interrupt()\n"); return; } if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) { sdio_writel(prGlueInfo->rHifInfo.func, WHLPCR_INT_EN_CLR, MCR_WHLPCR, &ret); //printk(KERN_INFO DRV_NAME"GLUE_FLAG_HALT skip INT\n"); return; } sdio_writel(prGlueInfo->rHifInfo.func, WHLPCR_INT_EN_CLR, MCR_WHLPCR, &ret); #if 0 wlanISR(prGlueInfo->prAdapter, TRUE); if (prGlueInfo->u4Flag & GLUE_FLAG_HALT) { /* Should stop now... skip pending interrupt */ //printk(KERN_INFO DRV_NAME"ignore pending interrupt\n"); } else { wlanIST(prGlueInfo->prAdapter); } #endif 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 }