/* Interrupt handler */ static irqreturn_t sdstd_isr(int irq, void *dev_id #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20) , struct pt_regs *ptregs #endif ) { sdioh_info_t *sd; struct sdos_info *sdos; bool ours; sd = (sdioh_info_t *)dev_id; sdos = (struct sdos_info *)sd->sdos_info; if (!sd->card_init_done) { sd_err(("%s: Hey Bogus intr...not even initted: irq %d\n", __FUNCTION__, irq)); return IRQ_RETVAL(FALSE); } else { ours = check_client_intr(sd); /* For local interrupts, wake the waiting process */ if (ours && sd->got_hcint) { sd_trace(("INTR->WAKE\n")); /* sdos = (struct sdos_info *)sd->sdos_info; */ wake_up_interruptible(&sdos->intr_wait_queue); } return IRQ_RETVAL(ours); } }
/* Interrupt handler */ static irqreturn_t sdstd_isr(int irq, void *dev_id #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20) , struct pt_regs *ptregs #endif ) { sdioh_info_t *sd; struct sdos_info *sdos; bool ours; unsigned long flags; sd = (sdioh_info_t *)dev_id; sdos = (struct sdos_info *)sd->sdos_info; if (!sd->card_init_done) { sd_err(("%s: Hey Bogus intr...not even initted: irq %d\n", __FUNCTION__, irq)); return IRQ_RETVAL(FALSE); } else { if (sdstd_3_is_retuning_int_set(sd)) { /* for 3.0 host, retuning request might come in this path */ /* * disable ISR's */ local_irq_save(flags); if (sdstd_3_check_and_set_retuning(sd)) tasklet_schedule(&sdos->tuning_tasklet); /* * enable back ISR's */ local_irq_restore(flags); /* * disable tuning isr signaling */ sdstd_3_disable_retuning_int(sd); /* * note: check_client_intr() checks for intmask also to wakeup. so be careful to use sd->intmask to disable re-tuning ISR. */ } ours = check_client_intr(sd); /* For local interrupts, wake the waiting process */ if (ours && sd->got_hcint) { sd_trace(("INTR->WAKE\n")); /* sdos = (struct sdos_info *)sd->sdos_info; */ wake_up_interruptible(&sdos->intr_wait_queue); } return IRQ_RETVAL(ours); } }