📄 de4x5.c
字号:
/* de4x5.c: A DIGITAL DC21x4x DECchip and DE425/DE434/DE435/DE450/DE500 ethernet driver for Linux. Copyright 1994, 1995 Digital Equipment Corporation. Testing resources for this driver have been made available in part by NASA Ames Research Center (mjacob@nas.nasa.gov). The author may be reached at davies@maniac.ultranet.com. This program 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. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 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., 675 Mass Ave, Cambridge, MA 02139, USA. Originally, this driver was written for the Digital Equipment Corporation series of EtherWORKS ethernet cards: DE425 TP/COAX EISA DE434 TP PCI DE435 TP/COAX/AUI PCI DE450 TP/COAX/AUI PCI DE500 10/100 PCI Fasternet but it will now attempt to support all cards which conform to the Digital Semiconductor SROM Specification. The driver currently recognises the following chips: DC21040 (no SROM) DC21041[A] DC21140[A] DC21142 DC21143 So far the driver is known to work with the following cards: KINGSTON Linksys ZNYX342 SMC8432 SMC9332 (w/new SROM) ZNYX31[45] ZNYX346 10/100 4 port (can act as a 10/100 bridge!) The driver has been tested on a relatively busy network using the DE425, DE434, DE435 and DE500 cards and benchmarked with 'ttcp': it transferred 16M of data to a DECstation 5000/200 as follows: TCP UDP TX RX TX RX DE425 1030k 997k 1170k 1128k DE434 1063k 995k 1170k 1125k DE435 1063k 995k 1170k 1125k DE500 1063k 998k 1170k 1125k in 10Mb/s mode All values are typical (in kBytes/sec) from a sample of 4 for each measurement. Their error is +/-20k on a quiet (private) network and also depend on what load the CPU has. ========================================================================= This driver has been written substantially from scratch, although its inheritance of style and stack interface from 'ewrk3.c' and in turn from Donald Becker's 'lance.c' should be obvious. With the module autoload of every usable DECchip board, I pinched Donald's 'next_module' field to link my modules together. Upto 15 EISA cards can be supported under this driver, limited primarily by the available IRQ lines. I have checked different configurations of multiple depca, EtherWORKS 3 cards and de4x5 cards and have not found a problem yet (provided you have at least depca.c v0.38) ... PCI support has been added to allow the driver to work with the DE434, DE435, DE450 and DE500 cards. The I/O accesses are a bit of a kludge due to the differences in the EISA and PCI CSR address offsets from the base address. The ability to load this driver as a loadable module has been included and used extensively during the driver development (to save those long reboot sequences). Loadable module support under PCI and EISA has been achieved by letting the driver autoprobe as if it were compiled into the kernel. Do make sure you're not sharing interrupts with anything that cannot accommodate interrupt sharing! To utilise this ability, you have to do 8 things: 0) have a copy of the loadable modules code installed on your system. 1) copy de4x5.c from the /linux/drivers/net directory to your favourite temporary directory. 2) for fixed autoprobes (not recommended), edit the source code near line 5594 to reflect the I/O address you're using, or assign these when loading by: insmod de4x5 io=0xghh where g = bus number hh = device number NB: autoprobing for modules is now supported by default. You may just use: insmod de4x5 to load all available boards. For a specific board, still use the 'io=?' above. 3) compile de4x5.c, but include -DMODULE in the command line to ensure that the correct bits are compiled (see end of source code). 4) if you are wanting to add a new card, goto 5. Otherwise, recompile a kernel with the de4x5 configuration turned off and reboot. 5) insmod de4x5 [io=0xghh] 6) run the net startup bits for your new eth?? interface(s) manually (usually /etc/rc.inet[12] at boot time). 7) enjoy! To unload a module, turn off the associated interface(s) 'ifconfig eth?? down' then 'rmmod de4x5'. Automedia detection is included so that in principal you can disconnect from, e.g. TP, reconnect to BNC and things will still work (after a pause whilst the driver figures out where its media went). My tests using ping showed that it appears to work.... By default, the driver will now autodetect any DECchip based card. Should you have a need to restrict the driver to DIGITAL only cards, you can compile with a DEC_ONLY define, or if loading as a module, use the 'dec_only=1' parameter. I've changed the timing routines to use the kernel timer and scheduling functions so that the hangs and other assorted problems that occurred while autosensing the media should be gone. A bonus for the DC21040 auto media sense algorithm is that it can now use one that is more in line with the rest (the DC21040 chip doesn't have a hardware timer). The downside is the 1 'jiffies' (10ms) resolution. IEEE 802.3u MII interface code has been added in anticipation that some products may use it in the future. The SMC9332 card has a non-compliant SROM which needs fixing - I have patched this driver to detect it because the SROM format used complies to a previous DEC-STD format. I have removed the buffer copies needed for receive on Intels. I cannot remove them for Alphas since the Tulip hardware only does longword aligned DMA transfers and the Alphas get alignment traps with non longword aligned data copies (which makes them really slow). No comment. I have added SROM decoding routines to make this driver work with any card that supports the Digital Semiconductor SROM spec. This will help all cards running the dc2114x series chips in particular. Cards using the dc2104x chips should run correctly with the basic driver. I'm in debt to <mjacob@feral.com> for the testing and feedback that helped get this feature working. So far we have tested KINGSTON, SMC8432, SMC9332 (with the latest SROM complying with the SROM spec V3: their first was broken), ZNYX342 and LinkSys. ZYNX314 (dual 21041 MAC) and ZNYX 315 (quad 21041 MAC) cards also appear to work despite their incorrectly wired IRQs. I have added a temporary fix for interrupt problems when some SCSI cards share the same interrupt as the DECchip based cards. The problem occurs because the SCSI card wants to grab the interrupt as a fast interrupt (runs the service routine with interrupts turned off) vs. this card which really needs to run the service routine with interrupts turned on. This driver will now add the interrupt service routine as a fast interrupt if it is bounced from the slow interrupt. THIS IS NOT A RECOMMENDED WAY TO RUN THE DRIVER and has been done for a limited time until people sort out their compatibility issues and the kernel interrupt service code is fixed. YOU SHOULD SEPARATE OUT THE FAST INTERRUPT CARDS FROM THE SLOW INTERRUPT CARDS to ensure that they do not run on the same interrupt. PCMCIA/CardBus is another can of worms... Finally, I think I have really fixed the module loading problem with more than one DECchip based card. As a side effect, I don't mess with the device structure any more which means that if more than 1 card in 2.0.x is installed (4 in 2.1.x), the user will have to edit linux/drivers/net/Space.c to make room for them. Hence, module loading is the preferred way to use this driver, since it doesn't have this limitation. Where SROM media detection is used and full duplex is specified in the SROM, the feature is ignored unless lp->params.fdx is set at compile time OR during a module load (insmod de4x5 args='eth??:fdx' [see below]). This is because there is no way to automatically detect full duplex links except through autonegotiation. When I include the autonegotiation feature in the SROM autoconf code, this detection will occur automatically for that case. Command line arguments are now allowed, similar to passing arguments through LILO. This will allow a per adapter board set up of full duplex and media. The only lexical constraints are: the board name (dev->name) appears in the list before its parameters. The list of parameters ends either at the end of the parameter list or with another board name. The following parameters are allowed: fdx for full duplex autosense to set the media/speed; with the following sub-parameters: TP, TP_NW, BNC, AUI, BNC_AUI, 100Mb, 10Mb, AUTO Case sensitivity is important for the sub-parameters. They *must* be upper case. Examples: insmod de4x5 args='eth1:fdx autosense=BNC eth0:autosense=100Mb'. For a compiled in driver, at or above line 548, place e.g. #define DE4X5_PARM "eth0:fdx autosense=AUI eth2:autosense=TP" Yes, I know full duplex isn't permissible on BNC or AUI; they're just examples. By default, full duplex is turned off and AUTO is the default autosense setting. In reality, I expect only the full duplex option to be used. Note the use of single quotes in the two examples above and the lack of commas to separate items. ALSO, you must get the requested media correct in relation to what the adapter SROM says it has. There's no way to determine this in advance other than by trial and error and common sense, e.g. call a BNC connectored port 'BNC', not '10Mb'. Changed the bus probing. EISA used to be done first, followed by PCI. Most people probably don't even know what a de425 is today and the EISA probe has messed up some SCSI cards in the past, so now PCI is always probed first followed by EISA if a) the architecture allows EISA and either b) there have been no PCI cards detected or c) an EISA probe is forced by the user. To force a probe include "force_eisa" in your insmod "args" line; for built-in kernels either change the driver to do this automatically or include #define DE4X5_FORCE_EISA on or before line 1040 in the driver. TO DO: ------ Revision History ---------------- Version Date Description 0.1 17-Nov-94 Initial writing. ALPHA code release. 0.2 13-Jan-95 Added PCI support for DE435's. 0.21 19-Jan-95 Added auto media detection. 0.22 10-Feb-95 Fix interrupt handler call <chris@cosy.sbg.ac.at>. Fix recognition bug reported by <bkm@star.rl.ac.uk>. Add request/release_region code. Add loadable modules support for PCI. Clean up loadable modules support. 0.23 28-Feb-95 Added DC21041 and DC21140 support. Fix missed frame counter value and initialisation. Fixed EISA probe. 0.24 11-Apr-95 Change delay routine to use <linux/udelay>. Change TX_BUFFS_AVAIL macro. Change media autodetection to allow manual setting. Completed DE500 (DC21140) support. 0.241 18-Apr-95 Interim release without DE500 Autosense Algorithm. 0.242 10-May-95 Minor changes. 0.30 12-Jun-95 Timer fix for DC21140. Portability changes. Add ALPHA changes from <jestabro@ant.tay1.dec.com>. Add DE500 semi automatic autosense. Add Link Fail interrupt TP failure detection. Add timer based link change detection. Plugged a memory leak in de4x5_queue_pkt(). 0.31 13-Jun-95 Fixed PCI stuff for 1.3.1. 0.32 26-Jun-95 Added verify_area() calls in de4x5_ioctl() from a suggestion by <heiko@colossus.escape.de>. 0.33 8-Aug-95 Add shared interrupt support (not released yet). 0.331 21-Aug-95 Fix de4x5_open() with fast CPUs. Fix de4x5_interrupt(). Fix dc21140_autoconf() mess. No shared interrupt support. 0.332 11-Sep-95 Added MII management interface routines. 0.40 5-Mar-96 Fix setup frame timeout <maartenb@hpkuipc.cern.ch>. Add kernel timer code (h/w is too flaky). Add MII based PHY autosense. Add new multicasting code. Add new autosense algorithms for media/mode selection using kernel scheduling/timing. Re-formatted. Made changes suggested by <jeff@router.patch.net>: Change driver to detect all DECchip based cards with DEC_ONLY restriction a special case. Changed driver to autoprobe as a module. No irq checking is done now - assume BIOS is good! Added SMC9332 detection <manabe@Roy.dsl.tutics.ac.jp> 0.41 21-Mar-96 Don't check for get_hw_addr checksum unless DEC card only <niles@axp745gsfc.nasa.gov> Fix for multiple PCI cards reported by <jos@xos.nl> Duh, put the SA_SHIRQ flag into request_interrupt(). Fix SMC ethernet address in enet_det[]. Print chip name instead of "UNKNOWN" during boot. 0.42 26-Apr-96 Fix MII write TA bit error. Fix bug in dc21040 and dc21041 autosense code. Remove buffer copies on receive for Intels. Change sk_buff handling during media disconnects to eliminate DUP packets. Add dynamic TX thresholding. Change all chips to use perfect multicast filtering. Fix alloc_device() bug <jari@markkus2.fimr.fi> 0.43 21-Jun-96 Fix unconnected media TX retry bug. Add Accton to the list of broken cards. Fix TX under-run bug for non DC21140 chips. Fix boot command probe bug in alloc_device() as reported by <koen.gadeyne@barco.com> and <orava@nether.tky.hut.fi>. Add cache locks to prevent a race condition as reported by <csd@microplex.com> and <baba@beckman.uiuc.edu>. Upgraded alloc_device() code. 0.431 28-Jun-96 Fix potential bug in queue_pkt() from discussion with <csd@microplex.com> 0.44 13-Aug-96 Fix RX overflow bug in 2114[023] chips. Fix EISA probe bugs reported by <os2@kpi.kharkov.ua> and <michael@compurex.com>. 0.441 9-Sep-96 Change dc21041_autoconf() to probe quiet BNC media with a loopback packet. 0.442 9-Sep-96 Include AUI in dc21041 media printout. Bug reported by <bhat@mundook.cs.mu.OZ.AU> 0.45 8-Dec-96 Include endian functions for PPC use, from work by <cort@cs.nmt.edu> and <g.thomas@opengroup.org>. 0.451 28-Dec-96 Added fix to allow autoprobe for modules after suggestion from <mjacob@feral.com>. 0.5 30-Jan-97 Added SROM decoding functions.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -