static irqreturn_t sca_intr(int irq, void* dev_id) { card_t *card = dev_id; int i; u8 stat; int handled = 0; u8 page = sca_get_page(card); while((stat = sca_intr_status(card)) != 0) { handled = 1; for (i = 0; i < 2; i++) { port_t *port = get_port(card, i); if (port) { if (stat & SCA_INTR_MSCI(i)) sca_msci_intr(port); if (stat & SCA_INTR_DMAC_RX(i)) sca_rx_intr(port); if (stat & SCA_INTR_DMAC_TX(i)) sca_tx_intr(port); } } } openwin(card, page); /* Restore original page */ return IRQ_RETVAL(handled); }
static irqreturn_t sca_intr(int irq, void* dev_id, struct pt_regs *regs) { card_t *card = dev_id; int i; u8 stat; int handled = 0; #ifndef ALL_PAGES_ALWAYS_MAPPED u8 page = sca_get_page(card); #endif while((stat = sca_intr_status(card)) != 0) { handled = 1; for (i = 0; i < 2; i++) { port_t *port = get_port(card, i); if (port) { if (stat & SCA_INTR_MSCI(i)) sca_msci_intr(port); if (stat & SCA_INTR_DMAC_RX(i)) sca_rx_intr(port); if (stat & SCA_INTR_DMAC_TX(i)) sca_tx_intr(port); } } } #ifndef ALL_PAGES_ALWAYS_MAPPED openwin(card, page); /* Restore original page */ #endif return IRQ_RETVAL(handled); }
static int sca_poll(struct napi_struct *napi, int budget) { port_t *port = container_of(napi, port_t, napi); u32 isr0 = sca_inl(ISR0, port->card); int received = 0; if (isr0 & (port->chan ? 0x08000000 : 0x00080000)) sca_msci_intr(port); if (isr0 & (port->chan ? 0x00002000 : 0x00000020)) sca_tx_done(port); if (isr0 & (port->chan ? 0x00000200 : 0x00000002)) received = sca_rx_done(port, budget); if (received < budget) { napi_complete(napi); enable_intr(port); } return received; }