⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 de4x5.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
/*  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 + -