/** * @brief Enable EOM interrupt on cport */ static void enable_int(unsigned int cportid) { struct cport *cport; unsigned int irqn; cport = cport_handle(cportid); if (!cport) { return; } irqn = cportid_to_irqn(cportid); enable_rx_interrupt(cport); irq_attach(irqn, irq_rx_eom); up_enable_irq(irqn); }
static irqreturn_t agnx_interrupt_handler(int irq, void *dev_id) { struct ieee80211_hw *dev = dev_id; struct agnx_priv *priv = dev->priv; void __iomem *ctl = priv->ctl; irqreturn_t ret = IRQ_NONE; u32 irq_reason; spin_lock(&priv->lock); /* printk(KERN_ERR PFX "Get a interrupt %s\n", __func__); */ if (priv->init_status != AGNX_START) goto out; /* FiXME Here has no lock, Is this will lead to race? */ irq_reason = ioread32(ctl + AGNX_CIR_BLKCTL); if (!(irq_reason & 0x7)) goto out; ret = IRQ_HANDLED; priv->irq_status = ioread32(ctl + AGNX_INT_STAT); /* printk(PFX "Interrupt reason is 0x%x\n", irq_reason); */ /* Make sure the txm and txd flags don't conflict with other unknown interrupt flag, maybe is not necessary */ irq_reason &= 0xF; disable_rx_interrupt(priv); /* TODO Make sure the card finished initialized */ agnx_interrupt_ack(priv, &irq_reason); if (irq_reason & AGNX_STAT_RX) handle_rx_irq(priv); if (irq_reason & AGNX_STAT_TXD) handle_txd_irq(priv); if (irq_reason & AGNX_STAT_TXM) handle_txm_irq(priv); if (irq_reason & AGNX_STAT_X) handle_other_irq(priv); enable_rx_interrupt(priv); out: spin_unlock(&priv->lock); return ret; } /* agnx_interrupt_handler */