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);
}
예제 #2
0
/* 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;
}