Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[]> <book id="TulipUserGuide"> <bookinfo> <title>Tulip Driver User's Guide</title> <authorgroup> <author> <firstname>Jeff</firstname> <surname>Garzik</surname> <affiliation> <address> <email>jgarzik@pobox.com</email> </address> </affiliation> </author> </authorgroup> <copyright> <year>2001</year> <holder>Jeff Garzik</holder> </copyright> <legalnotice> <para> This documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. </para> <para> This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. </para> <para> You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA </para> <para> For more details see the file COPYING in the source distribution of Linux. </para> </legalnotice> </bookinfo> <toc></toc> <chapter id="intro"> <title>Introduction</title> <para> The Tulip Ethernet Card Driver is maintained by Jeff Garzik (<email>jgarzik@pobox.com</email>). </para> <para> The Tulip driver was developed by Donald Becker and changed by Jeff Garzik, Takashi Manabe and a cast of thousands. </para> <para> For 2.4.x and later kernels, the Linux Tulip driver is available at <ULink URL="http://sourceforge.net/projects/tulip/">http://sourceforge.net/projects/tulip/</ULink> </para> <para> 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. </para> <para> The original author may be reached as becker@scyld.com, or C/O Scyld Computing Corporation, 410 Severn Ave., Suite 210, Annapolis MD 21403 </para> <para> Additional information on Donald Becker's tulip.c is available at <ULink URL="http://www.scyld.com/network/tulip.html">http://www.scyld.com/network/tulip.html</ULink> </para> </chapter> <chapter id="drvr-compat"> <title>Driver Compatibility</title> <para> This device driver is designed for the DECchip "Tulip", Digital's single-chip ethernet controllers for PCI (now owned by Intel). 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. </para> <para> 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. </para> </chapter> <chapter id="board-settings"> <title>Board-specific Settings</title> <para> 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. </para> <para> 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. </para> </chapter> <chapter id="driver-operation"> <title>Driver Operation</title> <sect1><title>Ring buffers</title> <para> 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. </para> <para> 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. </para> </sect1> <sect1><title>Synchronization</title> <para> 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. </para> <para> 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. </para> <para> 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. </para> </sect1> </chapter> <chapter id="errata"> <title>Errata</title> <para> 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? </para> <para> 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. </para> <para> 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. </para> </chapter> <chapter id="changelog"> <title>Driver Change History</title> <sect1><title>Version 0.9.14 (February 20, 2001)</title> <itemizedlist> <listitem><para>Fix PNIC problems (Manfred Spraul)</para></listitem> <listitem><para>Add new PCI id for Accton comet</para></listitem> <listitem><para>Support Davicom tulips</para></listitem> <listitem><para>Fix oops in eeprom parsing</para></listitem> <listitem><para>Enable workarounds for early PCI chipsets</para></listitem> <listitem><para>IA64, hppa csr0 support</para></listitem> <listitem><para>Support media types 5, 6</para></listitem> <listitem><para>Interpret a bit more of the 21142 SROM extended media type 3</para></listitem> <listitem><para>Add missing delay in eeprom reading</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.11 (November 3, 2000)</title> <itemizedlist> <listitem><para>Eliminate extra bus accesses when sharing interrupts (prumpf)</para></listitem> <listitem><para>Barrier following ownership descriptor bit flip (prumpf)</para></listitem> <listitem><para>Endianness fixes for >14 addresses in setup frames (prumpf)</para></listitem> <listitem><para>Report link beat to kernel/userspace via netif_carrier_*. (kuznet)</para></listitem> <listitem><para>Better spinlocking in set_rx_mode.</para></listitem> <listitem><para>Fix I/O resource request failure error messages (DaveM catch)</para></listitem> <listitem><para>Handle DMA allocation failure.</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.10 (September 6, 2000)</title> <itemizedlist> <listitem><para>Simple interrupt mitigation (via jamal)</para></listitem> <listitem><para>More PCI ids</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.9 (August 11, 2000)</title> <itemizedlist> <listitem><para>More PCI ids</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.8 (July 13, 2000)</title> <itemizedlist> <listitem><para>Correct signed/unsigned comparison for dummy frame index</para></listitem> <listitem><para>Remove outdated references to struct enet_statistics</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.7 (June 17, 2000)</title> <itemizedlist> <listitem><para>Timer cleanups (Andrew Morton)</para></listitem> <listitem><para>Alpha compile fix (somebody?)</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.6 (May 31, 2000)</title> <itemizedlist> <listitem><para>Revert 21143-related support flag patch</para></listitem> <listitem><para>Add HPPA/media-table debugging printk</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.5 (May 30, 2000)</title> <itemizedlist> <listitem><para>HPPA support (willy@puffingroup)</para></listitem> <listitem><para>CSR6 bits and tulip.h cleanup (Chris Smith)</para></listitem> <listitem><para>Improve debugging messages a bit</para></listitem> <listitem><para>Add delay after CSR13 write in t21142_start_nway</para></listitem> <listitem><para>Remove unused ETHER_STATS code</para></listitem> <listitem><para>Convert 'extern inline' to 'static inline' in tulip.h (Chris Smith)</para></listitem> <listitem><para>Update DS21143 support flags in tulip_chip_info[]</para></listitem> <listitem><para>Use spin_lock_irq, not _irqsave/restore, in tulip_start_xmit()</para></listitem> <listitem><para>Add locking to set_rx_mode()</para></listitem> <listitem><para>Fix race with chip setting DescOwned bit (Hal Murray)</para></listitem> <listitem><para>Request 100% of PIO and MMIO resource space assigned to card</para></listitem> <listitem><para>Remove error message from pci_enable_device failure</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.4.3 (April 14, 2000)</title> <itemizedlist> <listitem><para>mod_timer fix (Hal Murray)</para></listitem> <listitem><para>PNIC2 resuscitation (Chris Smith)</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.4.2 (March 21, 2000)</title> <itemizedlist> <listitem><para>Fix 21041 CSR7, CSR13/14/15 handling</para></listitem> <listitem><para>Merge some PCI ids from tulip 0.91x</para></listitem> <listitem><para>Merge some HAS_xxx flags and flag settings from tulip 0.91x</para></listitem> <listitem><para>asm/io.h fix (submitted by many) and cleanup</para></listitem> <listitem><para>s/HAS_NWAY143/HAS_NWAY/</para></listitem> <listitem><para>Cleanup 21041 mode reporting</para></listitem> <listitem><para>Small code cleanups</para></listitem> </itemizedlist> </sect1> <sect1><title>Version 0.9.4.1 (March 18, 2000)</title> <itemizedlist> <listitem><para>Finish PCI DMA conversion (davem)</para></listitem> <listitem><para>Do not netif_start_queue() at end of tulip_tx_timeout() (kuznet)</para></listitem> <listitem><para>PCI DMA fix (kuznet)</para></listitem> <listitem><para>eeprom.c code cleanup</para></listitem> <listitem><para>Remove Xircom Tulip crud</para></listitem> </itemizedlist> </sect1> </chapter> </book> |