Subject: Re: Transmit interrupts, fxp driver for Intel 82557/8/9 Ethernet
To: None <current-users@netbsd.org>
From: Jason R Thorpe <thorpej@zembu.com>
List: current-users
Date: 05/10/2000 11:49:20
On Tue, May 09, 2000 at 12:43:13AM -0700, Hal Murray wrote:

 > The fxp driver doesn't use transmit interrupts.  Under normal traffic 
 > patterns this works fine.  The work gets done on the next receive 
 > interrupt, saving the CPU cycles that would have been burned by the 
 > overhead on each transmit interrupt. 

Actually, yes, the fxp driver *does* use transmit interrupts.  If you
take a look at fxp_start(), at the end of that function:

	if (sc->sc_txpending != opending) {
		.
		.
		.
		/*
		 * Cause the chip to interrupt and suspend command
		 * processing once the last packet we've enqueued
		 * has been transmitted.
		 */
		FXP_CDTX(sc, sc->sc_txlast)->cb_command |=
		    htole16(FXP_CB_COMMAND_I | FXP_CB_COMMAND_S);
		FXP_CDTXSYNC(sc, sc->sc_txlast,
		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
		.
		.
		.
	}

Note that there is no race condition here, because the command block
preceeding that one is not allowed to access it until this operation
is completed.

 > I found the place in the code where it sets up the transmit command.  
 > (That's not hard, the symbol is only used once.)  When I or-ed in 
 > the interrupt bit, things worked as expected.  (I forget to measure 
 > how much more CPU that used.) 

What version of NetBSD are you using?  The piece I quoted here is
from NetBSD-current.

 > On a pair of 400 MHz Celerons, throughput drops from 90 megabits 
 > with the window under 190K bytes to under 20 when the window is over 
 > 195K bytes. 

With the driver in NetBSD-current, I am getting 85-90Mb/s w/ the fxp
driver between similar machines, tho I'll see if I can reproduce this
problem with a > 195K window.

-- 
        -- Jason R. Thorpe <thorpej@zembu.com>