static void bf537_demux_mac_rx_irq(unsigned int int_irq, struct irq_desc *desc) { if (bfin_read_DMA1_IRQ_STATUS() & (DMA_DONE | DMA_ERR)) bfin_handle_irq(IRQ_MAC_RX); else bfin_demux_gpio_irq(int_irq, desc); }
/* interrupt routine to handle rx and error signal */ static irqreturn_t bfin_mac_interrupt(int irq, void *dev_id) { struct net_device *dev = dev_id; int number = 0; get_one_packet: if (current_rx_ptr->status.status_word == 0) { /* no more new packet received */ if (number == 0) { if (current_rx_ptr->next->status.status_word != 0) { current_rx_ptr = current_rx_ptr->next; goto real_rx; } } bfin_write_DMA1_IRQ_STATUS(bfin_read_DMA1_IRQ_STATUS() | DMA_DONE | DMA_ERR); return IRQ_HANDLED; } real_rx: bfin_mac_rx(dev); number++; goto get_one_packet; }