From: Returning from tg3_poll() without flushing the PIO write which reenables interrupts can result in lower cpu utilization and higher throughput. So use a memory barrier, mmiowb(), instead of flushing the write with a PIO read. Signed-off-by: Arthur Kepner Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/tg3.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletion(-) diff -puN drivers/net/tg3.c~use-mmiowb-in-tg3_poll drivers/net/tg3.c --- 25/drivers/net/tg3.c~use-mmiowb-in-tg3_poll 2004-10-24 03:49:52.882216696 -0700 +++ 25-akpm/drivers/net/tg3.c 2004-10-24 03:49:52.891215328 -0700 @@ -420,6 +420,20 @@ static void tg3_enable_ints(struct tg3 * tg3_cond_int(tp); } +/* tg3_restart_ints + * similar to tg3_enable_ints, but it can return without flushing the + * PIO write which reenables interrupts + */ +static void tg3_restart_ints(struct tg3 *tp) +{ + tw32(TG3PCI_MISC_HOST_CTRL, + (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT)); + tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000); + mmiowb(); + + tg3_cond_int(tp); +} + static inline void tg3_netif_stop(struct tg3 *tp) { netif_poll_disable(tp->dev); @@ -2790,7 +2804,7 @@ static int tg3_poll(struct net_device *n if (done) { spin_lock_irqsave(&tp->lock, flags); __netif_rx_complete(netdev); - tg3_enable_ints(tp); + tg3_restart_ints(tp); spin_unlock_irqrestore(&tp->lock, flags); } _