Example #1
0
/*----------------------------------------------------------------------------*/
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() */
Example #2
0
/*----------------------------------------------------------------------------*/
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
}