diff options
Diffstat (limited to 'Documentation/networking/tulip.txt')
-rw-r--r-- | Documentation/networking/tulip.txt | 244 |
1 files changed, 139 insertions, 105 deletions
diff --git a/Documentation/networking/tulip.txt b/Documentation/networking/tulip.txt index 4a83d1bf2..ecef178b0 100644 --- a/Documentation/networking/tulip.txt +++ b/Documentation/networking/tulip.txt @@ -1,110 +1,144 @@ Tulip Ethernet Card Driver + Maintained by Jeff Garzik <jgarzik@mandrakesoft.com> The Tulip driver is developed by Donald Becker and changed by -Takashi Manabe. This driver is designed to work with PCI Ethernet -cards which use the DECchip DC21x4x family. This driver hopefully -works with all of 1.2.x and 1.3.x kernels, but I tested only -with 1.2.13, 1.3.39, 1.3.49, 1.3.52, 1.3.57 and later. - -Hopefully, the de4x5.c driver will support all cards supported -by the tulip.c driver. However, the SMC's 9332dst card and some -cards do not work with the de4x5.c driver. So, if your card is -not a 9332dst, please try the de4x5.c driver first. - -Success List -============ - -+-------------------------------------+-----------+-------------+ -|vendor/card |chip |system | -+-------------------------------------+-----------+-------------+ -|SMC | | | -| EtherPower 10 PCI(8432T/8432BT) |21040/21041|Pentium | -+-------------------------------------+-----------+-------------+ -|SMC | | | -| EtherPower 10/100 PCI(9332DST) |21140 |Pentium/UDB | -+-------------------------------------+-----------+-------------+ -|DEC | | | -| EtherWorks 100/10 PCI(DE500-XA) |21140 |Pentium | -+-------------------------------------+-----------+-------------+ -|DEC | | | -| EtherWorks 10 PCI(DE450) |21041 |Pentium | -+-------------------------------------+-----------+-------------+ -|DEC | | | -| QSILVER's |21040 |UDB | -+-------------------------------------+-----------+-------------+ -|ZNYX | | | -| 312 etherarray |21040 |Pentium | -+-------------------------------------+-----------+-------------+ -|Allied Telesis | | | -| LA100PCI-T |21140 |Pentium/UDB | -+-------------------------------------+-----------+-------------+ -|Danpex ('Planet Japan' in Japan?) | | | -| EN-9400 |21040 |Pentium | -+-------------------------------------+-----------+-------------+ -|Cogent | | | -| EM110 |21140 |Pentium | -+-------------------------------------+-----------+-------------+ - -Pentium: PCI machine with Pentium CPU -UDB: Universal Desktop Box(aka Multia) with Alpha 21066 CPU - -Known bug(s) -============ -This driver's media detection is very simple and sometimes -it causes serious problem. The driver automatically switches -media when it causes timeout. If you want to specify or to fix -a media; - -- Modify TULIP_PORT in tulip.c, line 33. -- Uncomment the definition of TULIP_FIX_PORT in tulip.c, line 40. - -or - -- Use patched ifconfig command and specify 'link='. The patch - against ifconfig.c in net-tools-1.3.50-BETA6e is included in - this file. - -Thanks +Takashi Manabe and a cast of thousands. + + This driver is for the Digital "Tulip" Ethernet adapter interface. + It should work with most DEC 21*4*-based chips/ethercards, as well as + with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and ASIX. + + The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O + Center of Excellence in Space Data and Information Sciences + Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 + + Additional information available at + http://cesdis.gsfc.nasa.gov/linux/drivers/tulip.html + + Theory of Operation + +Board Compatibility +=================== + +This device driver is designed for the DECchip "Tulip", Digital's +single-chip ethernet controllers for PCI. Supported members of the family +are the 21040, 21041, 21140, 21140A, 21142, and 21143. Similar work-alike +chips from Lite-On, Macronics, ASIX, Compex and other listed below are also +supported. + +These chips are used on at least 140 unique PCI board designs. The great +number of chips and board designs supported is the reason for the +driver size and complexity. Almost of the increasing complexity is in the +board configuration and media selection code. There is very little +increasing in the operational critical path length. + +Board-specific settings +======================= + +PCI bus devices are configured by the system at boot time, so no jumpers +need to be set on the board. The system BIOS preferably should assign the +PCI INTA signal to an otherwise unused system IRQ line. + +Some boards have EEPROMs tables with default media entry. The factory default +is usually "autoselect". This should only be overridden when using +transceiver connections without link beat e.g. 10base2 or AUI, or (rarely!) +for forcing full-duplex when used with old link partners that do not do +autonegotiation. + +Driver operation +================ + +Ring buffers +------------ + +The Tulip can use either ring buffers or lists of Tx and Rx descriptors. +This driver uses statically allocated rings of Rx and Tx descriptors, set at +compile time by RX/TX_RING_SIZE. This version of the driver allocates skbuffs +for the Rx ring buffers at open() time and passes the skb->data field to the +Tulip as receive data buffers. When an incoming frame is less than +RX_COPYBREAK bytes long, a fresh skbuff is allocated and the frame is +copied to the new skbuff. When the incoming frame is larger, the skbuff is +passed directly up the protocol stack and replaced by a newly allocated +skbuff. + +The RX_COPYBREAK value is chosen to trade-off the memory wasted by +using a full-sized skbuff for small frames vs. the copying costs of larger +frames. For small frames the copying cost is negligible (esp. considering +that we are pre-loading the cache with immediately useful header +information). For large frames the copying cost is non-trivial, and the +larger copy might flush the cache of useful data. A subtle aspect of this +choice is that the Tulip only receives into longword aligned buffers, thus +the IP header at offset 14 isn't longword aligned for further processing. +Copied frames are put into the new skbuff at an offset of "+2", thus copying +has the beneficial effect of aligning the IP header and preloading the +cache. + +Synchronization +--------------- +The driver runs as two independent, single-threaded flows of control. One +is the send-packet routine, which enforces single-threaded use by the +dev->tbusy flag. The other thread is the interrupt handler, which is single +threaded by the hardware and other software. + +The send packet thread has partial control over the Tx ring and 'dev->tbusy' +flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next +queue slot is empty, it clears the tbusy flag when finished otherwise it sets +the 'tp->tx_full' flag. + +The interrupt handler has exclusive control over the Rx ring and records stats +from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so +we can't avoid the interrupt overhead by having the Tx routine reap the Tx +stats.) After reaping the stats, it marks the queue entry as empty by setting +the 'base' to zero. Iff the 'tp->tx_full' flag is set, it clears both the +tx_full and tbusy flags. + +Notes +===== + +Thanks to Duke Kamstra of SMC for long ago providing an EtherPower board. +Greg LaPolla at Linksys provided PNIC and other Linksys boards. +Znyx provided a four-port card for testing. + +References +========== + +http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html +http://www.digital.com (search for current 21*4* datasheets and "21X4 SROM") +http://www.national.com/pf/DP/DP83840A.html +http://www.asix.com.tw/pmac.htm +http://www.admtek.com.tw/ + +Errata ====== -o becker@CESDIS.gsfc.nasa.gov (author of the tulip.c driver) -o davies@wanton.lkg.dec.com (author of the de4x5.c driver) - -o siekas@mailhost.tcs.tulane.edu - -o jheiss@calvin.caltech.edu (providing information about smc8432 card) -o goto@plathome.co.jp (lending me a DE450 card) -o ted@physics.ucsb.edu -o pmheuvel@xs4all.nl -o hjl@lucon.org (EN-9400) -o niles@axp745.gsfc.nasa.gov (ZNYX312) -o pkc@scs.carleton.ca (EM110) -o and testers... - ------------------------------------------------------------------------ -*** ifconfig.c-dist Wed Jan 17 07:25:36 1996 ---- ifconfig.c Tue Apr 9 15:24:25 1996 -*************** -*** 765,770 **** ---- 766,786 ---- - continue; - } - ifr.ifr_map.irq = atoi(*spp); -+ if (ioctl(skfd, SIOCSIFMAP, &ifr) < 0) { -+ fprintf(stderr, "SIOCSIFMAP: %s\n", strerror(errno)); -+ goterr = 1; -+ } -+ spp++; -+ continue; -+ } -+ -+ if (!strcmp(*spp, "link")) { -+ if (*++spp == NULL) usage(); -+ if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) { -+ goterr = 1; -+ continue; -+ } -+ ifr.ifr_map.port = atoi(*spp); - if (ioctl(skfd, SIOCSIFMAP, &ifr) < 0) { - fprintf(stderr, "SIOCSIFMAP: %s\n", strerror(errno)); - goterr = 1; +The old DEC databooks were light on details. +The 21040 databook claims that CSR13, CSR14, and CSR15 should each be the last +register of the set CSR12-15 written. Hmmm, now how is that possible? + +The DEC SROM format is very badly designed not precisely defined, leading to +part of the media selection junkheap below. Some boards do not have EEPROM +media tables and need to be patched up. Worse, other boards use the DEC +design kit media table when it isn't correct for their board. + +We cannot use MII interrupts because there is no defined GPIO pin to attach +them. The MII transceiver status is polled using an kernel timer. + + +Source tree tour +---------------- +The following is a list of files comprising the Tulip ethernet driver in +drivers/net/tulip subdirectory. + +21142.c - 21142-specific h/w interaction +eeprom.c - EEPROM reading and parsing +interrupt.c - Interrupt handler +media.c - Media selection and MII support +pnic.c - PNIC-specific h/w interaction +timer.c - Main driver timer, and misc h/w timers +tulip.h - Private driver header +tulip_core.c - Driver core (a.k.a. where "everything else" goes) + + + +[EOF] + |