예제 #1
0
static irqreturn_t
ramips_eth_irq(int irq, void *dev)
{
	struct raeth_priv *re = netdev_priv(dev);
	unsigned int status;

	status = ramips_fe_trr(RAETH_REG_FE_INT_STATUS);
	status &= ramips_fe_trr(RAETH_REG_FE_INT_ENABLE);

	if (!status)
		return IRQ_NONE;

	ramips_fe_twr(status, RAETH_REG_FE_INT_STATUS);

	if (status & RX_DLY_INT) {
		ramips_fe_int_disable(RX_DLY_INT);
		tasklet_schedule(&re->rx_tasklet);
	}

	if (status & TX_DLY_INT) {
		ramips_fe_int_disable(TX_DLY_INT);
		tasklet_schedule(&re->tx_housekeeping_tasklet);
	}

	raeth_debugfs_update_int_stats(re, status);

	return IRQ_HANDLED;
}
예제 #2
0
static irqreturn_t
ramips_eth_irq(int irq, void *dev)
{
    struct raeth_priv *priv = netdev_priv(dev);
    unsigned long fe_int = ramips_fe_rr(RAMIPS_FE_INT_STATUS);

    ramips_fe_wr(0xFFFFFFFF, RAMIPS_FE_INT_STATUS);

    if (fe_int & RAMIPS_RX_DLY_INT) {
        ramips_fe_int_disable(RAMIPS_RX_DLY_INT);
        tasklet_schedule(&priv->rx_tasklet);
    }

    if (fe_int & RAMIPS_TX_DLY_INT) {
        ramips_fe_int_disable(RAMIPS_TX_DLY_INT);
        tasklet_schedule(&priv->tx_housekeeping_tasklet);
    }

    return IRQ_HANDLED;
}