| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |     Originally,   this  driver  was    written  for the  Digital   Equipment | 
 | 2 |     Corporation series of EtherWORKS Ethernet cards: | 
 | 3 |  | 
 | 4 |         DE425 TP/COAX EISA | 
 | 5 | 	DE434 TP PCI | 
 | 6 | 	DE435 TP/COAX/AUI PCI | 
 | 7 | 	DE450 TP/COAX/AUI PCI | 
 | 8 | 	DE500 10/100 PCI Fasternet | 
 | 9 |  | 
 | 10 |     but it  will  now attempt  to  support all  cards which   conform to the | 
 | 11 |     Digital Semiconductor   SROM   Specification.    The  driver   currently | 
 | 12 |     recognises the following chips: | 
 | 13 |  | 
 | 14 |         DC21040  (no SROM)  | 
 | 15 | 	DC21041[A]   | 
 | 16 | 	DC21140[A]  | 
 | 17 | 	DC21142  | 
 | 18 | 	DC21143  | 
 | 19 |  | 
 | 20 |     So far the driver is known to work with the following cards: | 
 | 21 |  | 
 | 22 |         KINGSTON | 
 | 23 | 	Linksys | 
 | 24 | 	ZNYX342 | 
 | 25 | 	SMC8432 | 
 | 26 | 	SMC9332 (w/new SROM) | 
 | 27 | 	ZNYX31[45] | 
 | 28 | 	ZNYX346 10/100 4 port (can act as a 10/100 bridge!)  | 
 | 29 |  | 
 | 30 |     The driver has been tested on a relatively busy network using the DE425, | 
 | 31 |     DE434, DE435 and DE500 cards and benchmarked with 'ttcp': it transferred | 
 | 32 |     16M of data to a DECstation 5000/200 as follows: | 
 | 33 |  | 
 | 34 |                 TCP           UDP | 
 | 35 |              TX     RX     TX     RX | 
 | 36 |     DE425   1030k  997k   1170k  1128k | 
 | 37 |     DE434   1063k  995k   1170k  1125k | 
 | 38 |     DE435   1063k  995k   1170k  1125k | 
 | 39 |     DE500   1063k  998k   1170k  1125k  in 10Mb/s mode | 
 | 40 |  | 
 | 41 |     All  values are typical (in   kBytes/sec) from a  sample  of 4 for  each | 
 | 42 |     measurement. Their error is +/-20k on a quiet (private) network and also | 
 | 43 |     depend on what load the CPU has. | 
 | 44 |  | 
 | 45 |     ========================================================================= | 
 | 46 |  | 
 | 47 |     The ability to load this  driver as a loadable  module has been included | 
 | 48 |     and used extensively  during the driver development  (to save those long | 
 | 49 |     reboot sequences).  Loadable module support  under PCI and EISA has been | 
 | 50 |     achieved by letting the driver autoprobe as if it were compiled into the | 
 | 51 |     kernel. Do make sure  you're not sharing  interrupts with anything  that | 
 | 52 |     cannot accommodate  interrupt  sharing! | 
 | 53 |  | 
 | 54 |     To utilise this ability, you have to do 8 things: | 
 | 55 |  | 
 | 56 |     0) have a copy of the loadable modules code installed on your system. | 
 | 57 |     1) copy de4x5.c from the  /linux/drivers/net directory to your favourite | 
 | 58 |     temporary directory. | 
 | 59 |     2) for fixed  autoprobes (not  recommended),  edit the source code  near | 
 | 60 |     line 5594 to reflect the I/O address  you're using, or assign these when | 
 | 61 |     loading by: | 
 | 62 |  | 
 | 63 |                    insmod de4x5 io=0xghh           where g = bus number | 
 | 64 | 		                                        hh = device number    | 
 | 65 |  | 
 | 66 |        NB: autoprobing for modules is now supported by default. You may just | 
 | 67 |            use: | 
 | 68 |  | 
 | 69 |                    insmod de4x5 | 
 | 70 |  | 
 | 71 |            to load all available boards. For a specific board, still use | 
 | 72 | 	   the 'io=?' above. | 
 | 73 |     3) compile  de4x5.c, but include -DMODULE in  the command line to ensure | 
 | 74 |     that the correct bits are compiled (see end of source code). | 
 | 75 |     4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a | 
 | 76 |     kernel with the de4x5 configuration turned off and reboot. | 
 | 77 |     5) insmod de4x5 [io=0xghh] | 
 | 78 |     6) run the net startup bits for your new eth?? interface(s) manually  | 
 | 79 |     (usually /etc/rc.inet[12] at boot time).  | 
 | 80 |     7) enjoy! | 
 | 81 |  | 
 | 82 |     To unload a module, turn off the associated interface(s)  | 
 | 83 |     'ifconfig eth?? down' then 'rmmod de4x5'. | 
 | 84 |  | 
 | 85 |     Automedia detection is included so that in  principle you can disconnect | 
 | 86 |     from, e.g.  TP, reconnect  to BNC  and  things will still work  (after a | 
 | 87 |     pause whilst the   driver figures out   where its media went).  My tests | 
 | 88 |     using ping showed that it appears to work.... | 
 | 89 |  | 
 | 90 |     By  default,  the driver will  now   autodetect any  DECchip based card. | 
 | 91 |     Should you have a need to restrict the driver to DIGITAL only cards, you | 
 | 92 |     can compile with a  DEC_ONLY define, or if  loading as a module, use the | 
 | 93 |     'dec_only=1'  parameter.  | 
 | 94 |  | 
 | 95 |     I've changed the timing routines to  use the kernel timer and scheduling | 
 | 96 |     functions  so that the  hangs  and other assorted problems that occurred | 
 | 97 |     while autosensing the  media  should be gone.  A  bonus  for the DC21040 | 
 | 98 |     auto  media sense algorithm is  that it can now  use one that is more in | 
 | 99 |     line with the  rest (the DC21040  chip doesn't  have a hardware  timer). | 
 | 100 |     The downside is the 1 'jiffies' (10ms) resolution. | 
 | 101 |  | 
 | 102 |     IEEE 802.3u MII interface code has  been added in anticipation that some | 
 | 103 |     products may use it in the future. | 
 | 104 |  | 
 | 105 |     The SMC9332 card  has a non-compliant SROM  which needs fixing -  I have | 
 | 106 |     patched this  driver to detect it  because the SROM format used complies | 
 | 107 |     to a previous DEC-STD format. | 
 | 108 |  | 
 | 109 |     I have removed the buffer copies needed for receive on Intels.  I cannot | 
 | 110 |     remove them for   Alphas since  the  Tulip hardware   only does longword | 
 | 111 |     aligned  DMA transfers  and  the  Alphas get   alignment traps with  non | 
 | 112 |     longword aligned data copies (which makes them really slow). No comment. | 
 | 113 |  | 
 | 114 |     I  have added SROM decoding  routines to make this  driver work with any | 
 | 115 |     card that  supports the Digital  Semiconductor SROM spec. This will help | 
 | 116 |     all  cards running the dc2114x  series chips in particular.  Cards using | 
 | 117 |     the dc2104x  chips should run correctly with  the basic  driver.  I'm in | 
 | 118 |     debt to <mjacob@feral.com> for the  testing and feedback that helped get | 
 | 119 |     this feature working.  So far we have  tested KINGSTON, SMC8432, SMC9332 | 
 | 120 |     (with the latest SROM complying  with the SROM spec  V3: their first was | 
 | 121 |     broken), ZNYX342  and  LinkSys. ZNYX314 (dual  21041  MAC) and  ZNYX 315 | 
 | 122 |     (quad 21041 MAC)  cards also  appear  to work despite their  incorrectly | 
 | 123 |     wired IRQs. | 
 | 124 |  | 
 | 125 |     I have added a temporary fix for interrupt problems when some SCSI cards | 
 | 126 |     share the same interrupt as the DECchip based  cards. The problem occurs | 
 | 127 |     because  the SCSI card wants to  grab the interrupt  as a fast interrupt | 
 | 128 |     (runs the   service routine with interrupts turned   off) vs.  this card | 
 | 129 |     which really needs to run the service routine with interrupts turned on. | 
 | 130 |     This driver will  now   add the interrupt service   routine  as  a  fast | 
 | 131 |     interrupt if it   is bounced from the   slow interrupt.  THIS IS NOT   A | 
 | 132 |     RECOMMENDED WAY TO RUN THE DRIVER  and has been done  for a limited time | 
 | 133 |     until  people   sort  out their  compatibility    issues and the  kernel | 
 | 134 |     interrupt  service code  is  fixed.   YOU  SHOULD SEPARATE OUT  THE FAST | 
 | 135 |     INTERRUPT CARDS FROM THE SLOW INTERRUPT CARDS to ensure that they do not | 
 | 136 |     run on the same interrupt. PCMCIA/CardBus is another can of worms... | 
 | 137 |  | 
 | 138 |     Finally, I think  I have really  fixed  the module  loading problem with | 
 | 139 |     more than one DECchip based  card.  As a  side effect, I don't mess with | 
 | 140 |     the  device structure any  more which means that  if more than 1 card in | 
 | 141 |     2.0.x is    installed (4  in   2.1.x),  the  user   will have   to  edit | 
 | 142 |     linux/drivers/net/Space.c  to make room for  them. Hence, module loading | 
 | 143 |     is  the preferred way to use   this driver, since  it  doesn't have this | 
 | 144 |     limitation. | 
 | 145 |  | 
 | 146 |     Where SROM media  detection is used and  full duplex is specified in the | 
 | 147 |     SROM,  the feature is  ignored unless  lp->params.fdx  is set at compile | 
 | 148 |     time  OR during  a   module load  (insmod  de4x5   args='eth??:fdx' [see | 
 | 149 |     below]).  This is because there  is no way  to automatically detect full | 
 | 150 |     duplex   links  except through   autonegotiation.    When I  include the | 
 | 151 |     autonegotiation feature in  the SROM autoconf  code, this detection will | 
 | 152 |     occur automatically for that case. | 
 | 153 |  | 
 | 154 |     Command line  arguments are  now allowed, similar to  passing  arguments | 
 | 155 |     through LILO. This will allow a per adapter board set  up of full duplex | 
 | 156 |     and media. The only lexical constraints are:  the board name (dev->name) | 
 | 157 |     appears in  the list before its parameters.  The list of parameters ends | 
 | 158 |     either at the end of the parameter list or with another board name.  The | 
 | 159 |     following parameters are allowed: | 
 | 160 |  | 
 | 161 |             fdx        for full duplex | 
 | 162 | 	    autosense  to set the media/speed; with the following  | 
 | 163 | 	               sub-parameters: | 
 | 164 | 		       TP, TP_NW, BNC, AUI, BNC_AUI, 100Mb, 10Mb, AUTO | 
 | 165 |  | 
 | 166 |     Case sensitivity is important  for  the sub-parameters. They *must*   be | 
 | 167 |     upper case. Examples: | 
 | 168 |  | 
 | 169 |         insmod de4x5 args='eth1:fdx autosense=BNC eth0:autosense=100Mb'. | 
 | 170 |  | 
 | 171 |     For a compiled in driver, in linux/drivers/net/CONFIG, place e.g. | 
 | 172 | 	DE4X5_OPTS = -DDE4X5_PARM='"eth0:fdx autosense=AUI eth2:autosense=TP"'  | 
 | 173 |  | 
 | 174 |     Yes,  I know full duplex  isn't permissible on BNC  or AUI; they're just | 
 | 175 |     examples. By default, full duplex is turned  off and AUTO is the default | 
 | 176 |     autosense setting. In  reality, I expect only the  full duplex option to | 
 | 177 |     be used. Note the use of single quotes in the two examples above and the | 
 | 178 |     lack of commas to separate items. |