korina: do tx at the right position
authorPhil Sutter <n0-1@freewrt.org>
Thu, 15 Jan 2009 05:50:12 +0000 (21:50 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Jan 2009 16:28:20 +0000 (08:28 -0800)
Triggering TX before the write to the DMA status mask register leads to
transferring packets with maximum payload no matter what the actual
packet size is.
While here, also trigger RX scheduling after writing the DMA status mask
register, like it was in the original driver before it was sent
upstream.

Signed-off-by: Phil Sutter <n0-1@freewrt.org>
Acked-by: Florian Fainelli <florian@openwrt.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/korina.c

index 7aa05f81fe9e319c4683311f938ad0f4bee5c479..dced5e71463a006e7efac1fd871615f96f28637b 100644 (file)
@@ -330,13 +330,13 @@ static irqreturn_t korina_rx_dma_interrupt(int irq, void *dev_id)
 
        dmas = readl(&lp->rx_dma_regs->dmas);
        if (dmas & (DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR)) {
-               netif_rx_schedule(&lp->napi);
-
                dmasm = readl(&lp->rx_dma_regs->dmasm);
                writel(dmasm | (DMA_STAT_DONE |
                                DMA_STAT_HALT | DMA_STAT_ERR),
                                &lp->rx_dma_regs->dmasm);
 
+               netif_rx_schedule(&lp->napi);
+
                if (dmas & DMA_STAT_ERR)
                        printk(KERN_ERR DRV_NAME "%s: DMA error\n", dev->name);
 
@@ -623,12 +623,12 @@ korina_tx_dma_interrupt(int irq, void *dev_id)
        dmas = readl(&lp->tx_dma_regs->dmas);
 
        if (dmas & (DMA_STAT_FINI | DMA_STAT_ERR)) {
-               korina_tx(dev);
-
                dmasm = readl(&lp->tx_dma_regs->dmasm);
                writel(dmasm | (DMA_STAT_FINI | DMA_STAT_ERR),
                                &lp->tx_dma_regs->dmasm);
 
+               korina_tx(dev);
+
                if (lp->tx_chain_status == desc_filled &&
                        (readl(&(lp->tx_dma_regs->dmandptr)) == 0)) {
                        writel(CPHYSADDR(&lp->td_ring[lp->tx_chain_head]),