From: barry@ictv.com (Barry Lustig)
Subject: Re: slow ethernet performance
Organization: ICTV, Santa Clara, CA (408) 562-9200
Date: Sun, 23 Aug 1992 23:28:48 GMT

Here are some ttcp numbers for a 486 33Mhz clone with 64Kb cache and a
WD8013 Elite 16 ethernet card.  I modified the if_we driver to support
16bit transfers into and out-of the boards shared memory (for the
8013).  The changes to the driver are included at the end of this
message.

The driver mods increased performance by a factor of 2.

barry

NeXT
ttcp-t: socket
ttcp-t: connect
ttcp-t: buflen=8192, nbuf=2048, align=16384/+0, port=5001  tcp  -> nefarious
ttcp-t: 16777216 bytes in 24.13 real seconds = 679.07 KB/sec +++
ttcp-t: 16777216 bytes in 11.58 CPU seconds = 1414.54 KB/cpu sec
ttcp-t: 2048 I/O calls, msec/call = 12.06, calls/sec = 84.88
ttcp-t: 0.0user 11.5sys 0:24real 48% 0i+0d 0maxrss 0+0pf 1157+1387csw
ttcp-t: buffer address 0x1c000

PC:
ttcp-r: buflen=8192, nbuf=2048, align=16384/+0, port=5001  tcp
ttcp-r: 16777216 bytes in 24.17 real seconds = 677.87 KB/sec +++
ttcp-r: 16777216 bytes in 22.38 CPU seconds = 732.08 KB/cpu sec
ttcp-r: 2667 I/O calls, msec/call = 9.28, calls/sec = 110.34
ttcp-r: 0.0user 22.3sys 0:24real 92% 0i+0d 0maxrss 0+0pf 598+225csw
ttcp-r: buffer address 0xc000

PC:
ttcp-t: socket
ttcp-t: connect
ttcp-t: buflen=8192, nbuf=2048, align=16384/+0, port=5001  tcp  -> sinister
ttcp-t: 16777216 bytes in 31.62 real seconds = 518.15 KB/sec +++
ttcp-t: 16777216 bytes in 31.38 CPU seconds = 522.12 KB/cpu sec
ttcp-t: 2048 I/O calls, msec/call = 15.81, calls/sec = 64.77
ttcp-t: 0.0user 31.3sys 0:31real 99% 0i+0d 0maxrss 0+0pf 16+336csw
ttcp-t: buffer address 0x10000

NeXT:
ttcp-r: socket
ttcp-r: accept from 128.229.210.253
ttcp-r: buflen=8192, nbuf=2048, align=16384/+0, port=5001  tcp
ttcp-r: 16777216 bytes in 31.63 real seconds = 517.96 KB/sec +++
ttcp-r: 16777216 bytes in 14.82 CPU seconds = 1105.33 KB/cpu sec
ttcp-r: 16300 I/O calls, msec/call = 1.99, calls/sec = 515.31
ttcp-r: 0.3user 14.4sys 0:31real 46% 0i+0d 0maxrss 0+0pf 15907+488csw
ttcp-r: buffer address 0x1c000

	
===================================================================
Note:  I haven't modified the transmit side of the driver to use
multiple transmit buffers.  That will have to wait until a rainy day!

RCS file: RCS/if_we.c,v
retrieving revision 1.1
diff -c -r1.1 if_we.c
*** /tmp/,RCSt1001696	Sun Aug 23 16:54:02 1992
--- if_we.c	Sun Aug 23 16:53:25 1992
***************
*** 136,141 ****
--- 136,142 ----
  	register int i;
  	register struct we_softc *sc = &we_softc[is->id_unit];
  	union we_mem_sel wem;
+ 	union we_laar laar;
  	u_char sum;
   
  	/* reset card to force it into a known state. */
***************
*** 145,150 ****
--- 146,159 ----
  	/* wait in the case this card is reading it's EEROM */
  	DELAY(5000);
  
+ #if defined(WD8013)
+ 	/* allow the NIC to access the shared RAM 16 bits at a time */
+ 
+ 	laar.addr_l19 = 1;
+ 	laar.lan_16_en = 1;
+ 	laar.mem_16_en = 1;
+ 	outb(is->id_iobase+5, laar.laar_byte);	/* Write a 0xc1 */
+ #endif
  	/*
  	 * Here we check the card ROM, if the checksum passes, and the
  	 * type code and ethernet address check out, then we know we have
***************
*** 164,169 ****
--- 173,179 ----
              return (0);
  #endif
  /*printf("type %x ", sc->we_type);*/
+ 
  	if (sc->we_type & WD_SOFTCONFIG) {
  		int iv = inb(is->id_iobase + 1) & 4 |
  			((inb(is->id_iobase+4) & 0x60) >> 5);
***************
*** 173,178 ****
--- 183,189 ----
  		outb(is->id_iobase+4, inb(is->id_iobase+4) | 0x80);
  	}
  
+ 
  	/*
  	 * Setup card RAM area and i/o addresses
  	 * Kernel Virtual to segment C0000-DFFFF?????
***************
*** 326,332 ****
--- 337,348 ----
  	wecmd.cs_sta = 0;
  	wecmd.cs_ps = 0;
  	outb(sc->we_io_nic_addr + WD_P0_COMMAND, wecmd.cs_byte);
+ #if defined(WD8013)
+ 	/* enable 16 bit access if 8013 card */
+ 	outb(sc->we_io_nic_addr + WD_P0_DCR, WD_D_CONFIG16);
+ #else
  	outb(sc->we_io_nic_addr + WD_P0_DCR, WD_D_CONFIG);
+ #endif
  	outb(sc->we_io_nic_addr + WD_P0_RBCR0, 0);
  	outb(sc->we_io_nic_addr + WD_P0_RBCR1, 0);
  	outb(sc->we_io_nic_addr + WD_P0_RCR, WD_R_MON);
===================================================================
RCS file: RCS/if_wereg.h,v
retrieving revision 1.1
diff -c -r1.1 if_wereg.h
*** /tmp/,RCSt1001696	Sun Aug 23 16:54:03 1992
--- if_wereg.h	Sun Aug 23 16:53:30 1992
***************
*** 56,61 ****
--- 56,78 ----
  };
  
  /*
+  * LA Address Register (LAAR)
+  */
+ union we_laar {
+     struct lan_addr_reg {
+         u_char addr_l19_b:1,	/* Address Line 19 for enabling    */
+ 				/* 16 bit NIC access to shared RAM */
+ 	unused_b:5,		/* unused (or unknown) bits 	   */
+ 	lan_16_en_b:1,		/* Enables 16bit shrd RAM for LAN  */
+ 	mem_16_en_b:1;		/* Enables 16bit shrd RAM for host */
+     } laar_decode;
+ #define addr_l19	laar_decode.addr_l19_b
+ #define lan_16_en	laar_decode.lan_16_en_b
+ #define mem_16_en	laar_decode.mem_16_en_b
+     u_char laar_byte;		/* entire byte			*/
+ };
+ 
+ /*
   * receive ring discriptor
   *
   * The National Semiconductor DS8390 Network interface controller uses
***************
*** 235,240 ****
--- 252,258 ----
  #define WD_D_FT1	0x40		/* Fifo Threshold Select	*/
  #define WD_D_RES	0x80		/* reserved...			*/
  #define	WD_D_CONFIG	(WD_D_FT1|WD_D_BMS)
+ #define	WD_D_CONFIG16	(WD_D_FT1|WD_D_BMS|WD_D_LAS|WD_D_WTS)
  
  /*
   * Configuration constants (interrupt mask register)
-- 
Newsgroups: comp.unix.bsd