Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / net / tulip / de4x5.c
1 /*  de4x5.c: A DIGITAL DC21x4x DECchip and DE425/DE434/DE435/DE450/DE500
2              ethernet driver for Linux.
3
4     Copyright 1994, 1995 Digital Equipment Corporation.
5
6     Testing resources for this driver have been made available
7     in part by NASA Ames Research Center (mjacob@nas.nasa.gov).
8
9     The author may be reached at davies@maniac.ultranet.com.
10
11     This program is free software; you can redistribute  it and/or modify it
12     under  the terms of  the GNU General  Public License as published by the
13     Free Software Foundation;  either version 2 of the  License, or (at your
14     option) any later version.
15
16     THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR   IMPLIED
17     WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
18     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
19     NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT,  INDIRECT,
20     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21     NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
22     USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23     ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
24     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27     You should have received a copy of the  GNU General Public License along
28     with this program; if not, write  to the Free Software Foundation, Inc.,
29     675 Mass Ave, Cambridge, MA 02139, USA.
30
31     Originally,   this  driver  was    written  for the  Digital   Equipment
32     Corporation series of EtherWORKS ethernet cards:
33
34         DE425 TP/COAX EISA
35         DE434 TP PCI
36         DE435 TP/COAX/AUI PCI
37         DE450 TP/COAX/AUI PCI
38         DE500 10/100 PCI Fasternet
39
40     but it  will  now attempt  to  support all  cards which   conform to the
41     Digital Semiconductor   SROM   Specification.    The  driver   currently
42     recognises the following chips:
43
44         DC21040  (no SROM)
45         DC21041[A]
46         DC21140[A]
47         DC21142
48         DC21143
49
50     So far the driver is known to work with the following cards:
51
52         KINGSTON
53         Linksys
54         ZNYX342
55         SMC8432
56         SMC9332 (w/new SROM)
57         ZNYX31[45]
58         ZNYX346 10/100 4 port (can act as a 10/100 bridge!)
59
60     The driver has been tested on a relatively busy network using the DE425,
61     DE434, DE435 and DE500 cards and benchmarked with 'ttcp': it transferred
62     16M of data to a DECstation 5000/200 as follows:
63
64                 TCP           UDP
65              TX     RX     TX     RX
66     DE425   1030k  997k   1170k  1128k
67     DE434   1063k  995k   1170k  1125k
68     DE435   1063k  995k   1170k  1125k
69     DE500   1063k  998k   1170k  1125k  in 10Mb/s mode
70
71     All  values are typical (in   kBytes/sec) from a  sample  of 4 for  each
72     measurement. Their error is +/-20k on a quiet (private) network and also
73     depend on what load the CPU has.
74
75     =========================================================================
76     This driver  has been written substantially  from  scratch, although its
77     inheritance of style and stack interface from 'ewrk3.c' and in turn from
78     Donald Becker's 'lance.c' should be obvious. With the module autoload of
79     every  usable DECchip board,  I  pinched Donald's 'next_module' field to
80     link my modules together.
81
82     Up to 15 EISA cards can be supported under this driver, limited primarily
83     by the available IRQ lines.  I have  checked different configurations of
84     multiple depca, EtherWORKS 3 cards and de4x5 cards and  have not found a
85     problem yet (provided you have at least depca.c v0.38) ...
86
87     PCI support has been added  to allow the driver  to work with the DE434,
88     DE435, DE450 and DE500 cards. The I/O accesses are a bit of a kludge due
89     to the differences in the EISA and PCI CSR address offsets from the base
90     address.
91
92     The ability to load this  driver as a loadable  module has been included
93     and used extensively  during the driver development  (to save those long
94     reboot sequences).  Loadable module support  under PCI and EISA has been
95     achieved by letting the driver autoprobe as if it were compiled into the
96     kernel. Do make sure  you're not sharing  interrupts with anything  that
97     cannot accommodate  interrupt  sharing!
98
99     To utilise this ability, you have to do 8 things:
100
101     0) have a copy of the loadable modules code installed on your system.
102     1) copy de4x5.c from the  /linux/drivers/net directory to your favourite
103     temporary directory.
104     2) for fixed  autoprobes (not  recommended),  edit the source code  near
105     line 5594 to reflect the I/O address  you're using, or assign these when
106     loading by:
107
108                    insmod de4x5 io=0xghh           where g = bus number
109                                                         hh = device number
110
111        NB: autoprobing for modules is now supported by default. You may just
112            use:
113
114                    insmod de4x5
115
116            to load all available boards. For a specific board, still use
117            the 'io=?' above.
118     3) compile  de4x5.c, but include -DMODULE in  the command line to ensure
119     that the correct bits are compiled (see end of source code).
120     4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
121     kernel with the de4x5 configuration turned off and reboot.
122     5) insmod de4x5 [io=0xghh]
123     6) run the net startup bits for your new eth?? interface(s) manually
124     (usually /etc/rc.inet[12] at boot time).
125     7) enjoy!
126
127     To unload a module, turn off the associated interface(s)
128     'ifconfig eth?? down' then 'rmmod de4x5'.
129
130     Automedia detection is included so that in  principal you can disconnect
131     from, e.g.  TP, reconnect  to BNC  and  things will still work  (after a
132     pause whilst the   driver figures out   where its media went).  My tests
133     using ping showed that it appears to work....
134
135     By  default,  the driver will  now   autodetect any  DECchip based card.
136     Should you have a need to restrict the driver to DIGITAL only cards, you
137     can compile with a  DEC_ONLY define, or if  loading as a module, use the
138     'dec_only=1'  parameter.
139
140     I've changed the timing routines to  use the kernel timer and scheduling
141     functions  so that the  hangs  and other assorted problems that occurred
142     while autosensing the  media  should be gone.  A  bonus  for the DC21040
143     auto  media sense algorithm is  that it can now  use one that is more in
144     line with the  rest (the DC21040  chip doesn't  have a hardware  timer).
145     The downside is the 1 'jiffies' (10ms) resolution.
146
147     IEEE 802.3u MII interface code has  been added in anticipation that some
148     products may use it in the future.
149
150     The SMC9332 card  has a non-compliant SROM  which needs fixing -  I have
151     patched this  driver to detect it  because the SROM format used complies
152     to a previous DEC-STD format.
153
154     I have removed the buffer copies needed for receive on Intels.  I cannot
155     remove them for   Alphas since  the  Tulip hardware   only does longword
156     aligned  DMA transfers  and  the  Alphas get   alignment traps with  non
157     longword aligned data copies (which makes them really slow). No comment.
158
159     I  have added SROM decoding  routines to make this  driver work with any
160     card that  supports the Digital  Semiconductor SROM spec. This will help
161     all  cards running the dc2114x  series chips in particular.  Cards using
162     the dc2104x  chips should run correctly with  the basic  driver.  I'm in
163     debt to <mjacob@feral.com> for the  testing and feedback that helped get
164     this feature working.  So far we have  tested KINGSTON, SMC8432, SMC9332
165     (with the latest SROM complying  with the SROM spec  V3: their first was
166     broken), ZNYX342  and  LinkSys. ZYNX314 (dual  21041  MAC) and  ZNYX 315
167     (quad 21041 MAC)  cards also  appear  to work despite their  incorrectly
168     wired IRQs.
169
170     I have added a temporary fix for interrupt problems when some SCSI cards
171     share the same interrupt as the DECchip based  cards. The problem occurs
172     because  the SCSI card wants to  grab the interrupt  as a fast interrupt
173     (runs the   service routine with interrupts turned   off) vs.  this card
174     which really needs to run the service routine with interrupts turned on.
175     This driver will  now   add the interrupt service   routine  as  a  fast
176     interrupt if it   is bounced from the   slow interrupt.  THIS IS NOT   A
177     RECOMMENDED WAY TO RUN THE DRIVER  and has been done  for a limited time
178     until  people   sort  out their  compatibility    issues and the  kernel
179     interrupt  service code  is  fixed.   YOU  SHOULD SEPARATE OUT  THE FAST
180     INTERRUPT CARDS FROM THE SLOW INTERRUPT CARDS to ensure that they do not
181     run on the same interrupt. PCMCIA/CardBus is another can of worms...
182
183     Finally, I think  I have really  fixed  the module  loading problem with
184     more than one DECchip based  card.  As a  side effect, I don't mess with
185     the  device structure any  more which means that  if more than 1 card in
186     2.0.x is    installed (4  in   2.1.x),  the  user   will have   to  edit
187     linux/drivers/net/Space.c  to make room for  them. Hence, module loading
188     is  the preferred way to use   this driver, since  it  doesn't have this
189     limitation.
190
191     Where SROM media  detection is used and  full duplex is specified in the
192     SROM,  the feature is  ignored unless  lp->params.fdx  is set at compile
193     time  OR during  a   module load  (insmod  de4x5   args='eth??:fdx' [see
194     below]).  This is because there  is no way  to automatically detect full
195     duplex   links  except through   autonegotiation.    When I  include the
196     autonegotiation feature in  the SROM autoconf  code, this detection will
197     occur automatically for that case.
198
199     Command  line arguments are  now  allowed, similar  to passing arguments
200     through LILO. This will allow a per adapter board  set up of full duplex
201     and media. The only lexical constraints  are: the board name (dev->name)
202     appears in the list before its  parameters.  The list of parameters ends
203     either at the end of the parameter list or with another board name.  The
204     following parameters are allowed:
205
206             fdx        for full duplex
207             autosense  to set the media/speed; with the following
208                        sub-parameters:
209                        TP, TP_NW, BNC, AUI, BNC_AUI, 100Mb, 10Mb, AUTO
210
211     Case sensitivity is important  for  the sub-parameters. They *must*   be
212     upper case. Examples:
213
214         insmod de4x5 args='eth1:fdx autosense=BNC eth0:autosense=100Mb'.
215
216     For a compiled in driver, at or above line 548, place e.g.
217         #define DE4X5_PARM "eth0:fdx autosense=AUI eth2:autosense=TP"
218
219     Yes,  I know full duplex isn't  permissible on BNC  or AUI; they're just
220     examples. By default, full duplex is turned off and  AUTO is the default
221     autosense setting.  In reality, I expect only  the full duplex option to
222     be used. Note the use of single quotes in the two examples above and the
223     lack of commas to separate items. ALSO, you must get the requested media
224     correct in relation to what the adapter SROM says it has. There's no way
225     to  determine this in  advance other than by  trial and error and common
226     sense, e.g. call a BNC connectored port 'BNC', not '10Mb'.
227
228     Changed the bus probing.  EISA used to be  done first,  followed by PCI.
229     Most people probably don't even know  what a de425 is today and the EISA
230     probe has messed  up some SCSI cards  in the past,  so now PCI is always
231     probed  first  followed by  EISA if  a) the architecture allows EISA and
232     either  b) there have been no PCI cards detected or  c) an EISA probe is
233     forced by  the user.  To force  a probe  include  "force_eisa"  in  your
234     insmod "args" line;  for built-in kernels either change the driver to do
235     this  automatically  or include  #define DE4X5_FORCE_EISA  on or  before
236     line 1040 in the driver.
237
238     TO DO:
239     ------
240
241     Revision History
242     ----------------
243
244     Version   Date        Description
245
246       0.1     17-Nov-94   Initial writing. ALPHA code release.
247       0.2     13-Jan-95   Added PCI support for DE435's.
248       0.21    19-Jan-95   Added auto media detection.
249       0.22    10-Feb-95   Fix interrupt handler call <chris@cosy.sbg.ac.at>.
250                           Fix recognition bug reported by <bkm@star.rl.ac.uk>.
251                           Add request/release_region code.
252                           Add loadable modules support for PCI.
253                           Clean up loadable modules support.
254       0.23    28-Feb-95   Added DC21041 and DC21140 support.
255                           Fix missed frame counter value and initialisation.
256                           Fixed EISA probe.
257       0.24    11-Apr-95   Change delay routine to use <linux/udelay>.
258                           Change TX_BUFFS_AVAIL macro.
259                           Change media autodetection to allow manual setting.
260                           Completed DE500 (DC21140) support.
261       0.241   18-Apr-95   Interim release without DE500 Autosense Algorithm.
262       0.242   10-May-95   Minor changes.
263       0.30    12-Jun-95   Timer fix for DC21140.
264                           Portability changes.
265                           Add ALPHA changes from <jestabro@ant.tay1.dec.com>.
266                           Add DE500 semi automatic autosense.
267                           Add Link Fail interrupt TP failure detection.
268                           Add timer based link change detection.
269                           Plugged a memory leak in de4x5_queue_pkt().
270       0.31    13-Jun-95   Fixed PCI stuff for 1.3.1.
271       0.32    26-Jun-95   Added verify_area() calls in de4x5_ioctl() from a
272                           suggestion by <heiko@colossus.escape.de>.
273       0.33     8-Aug-95   Add shared interrupt support (not released yet).
274       0.331   21-Aug-95   Fix de4x5_open() with fast CPUs.
275                           Fix de4x5_interrupt().
276                           Fix dc21140_autoconf() mess.
277                           No shared interrupt support.
278       0.332   11-Sep-95   Added MII management interface routines.
279       0.40     5-Mar-96   Fix setup frame timeout <maartenb@hpkuipc.cern.ch>.
280                           Add kernel timer code (h/w is too flaky).
281                           Add MII based PHY autosense.
282                           Add new multicasting code.
283                           Add new autosense algorithms for media/mode
284                           selection using kernel scheduling/timing.
285                           Re-formatted.
286                           Made changes suggested by <jeff@router.patch.net>:
287                             Change driver to detect all DECchip based cards
288                             with DEC_ONLY restriction a special case.
289                             Changed driver to autoprobe as a module. No irq
290                             checking is done now - assume BIOS is good!
291                           Added SMC9332 detection <manabe@Roy.dsl.tutics.ac.jp>
292       0.41    21-Mar-96   Don't check for get_hw_addr checksum unless DEC card
293                           only <niles@axp745gsfc.nasa.gov>
294                           Fix for multiple PCI cards reported by <jos@xos.nl>
295                           Duh, put the IRQF_SHARED flag into request_interrupt().
296                           Fix SMC ethernet address in enet_det[].
297                           Print chip name instead of "UNKNOWN" during boot.
298       0.42    26-Apr-96   Fix MII write TA bit error.
299                           Fix bug in dc21040 and dc21041 autosense code.
300                           Remove buffer copies on receive for Intels.
301                           Change sk_buff handling during media disconnects to
302                            eliminate DUP packets.
303                           Add dynamic TX thresholding.
304                           Change all chips to use perfect multicast filtering.
305                           Fix alloc_device() bug <jari@markkus2.fimr.fi>
306       0.43   21-Jun-96    Fix unconnected media TX retry bug.
307                           Add Accton to the list of broken cards.
308                           Fix TX under-run bug for non DC21140 chips.
309                           Fix boot command probe bug in alloc_device() as
310                            reported by <koen.gadeyne@barco.com> and
311                            <orava@nether.tky.hut.fi>.
312                           Add cache locks to prevent a race condition as
313                            reported by <csd@microplex.com> and
314                            <baba@beckman.uiuc.edu>.
315                           Upgraded alloc_device() code.
316       0.431  28-Jun-96    Fix potential bug in queue_pkt() from discussion
317                           with <csd@microplex.com>
318       0.44   13-Aug-96    Fix RX overflow bug in 2114[023] chips.
319                           Fix EISA probe bugs reported by <os2@kpi.kharkov.ua>
320                           and <michael@compurex.com>.
321       0.441   9-Sep-96    Change dc21041_autoconf() to probe quiet BNC media
322                            with a loopback packet.
323       0.442   9-Sep-96    Include AUI in dc21041 media printout. Bug reported
324                            by <bhat@mundook.cs.mu.OZ.AU>
325       0.45    8-Dec-96    Include endian functions for PPC use, from work
326                            by <cort@cs.nmt.edu> and <g.thomas@opengroup.org>.
327       0.451  28-Dec-96    Added fix to allow autoprobe for modules after
328                            suggestion from <mjacob@feral.com>.
329       0.5    30-Jan-97    Added SROM decoding functions.
330                           Updated debug flags.
331                           Fix sleep/wakeup calls for PCI cards, bug reported
332                            by <cross@gweep.lkg.dec.com>.
333                           Added multi-MAC, one SROM feature from discussion
334                            with <mjacob@feral.com>.
335                           Added full module autoprobe capability.
336                           Added attempt to use an SMC9332 with broken SROM.
337                           Added fix for ZYNX multi-mac cards that didn't
338                            get their IRQs wired correctly.
339       0.51   13-Feb-97    Added endian fixes for the SROM accesses from
340                            <paubert@iram.es>
341                           Fix init_connection() to remove extra device reset.
342                           Fix MAC/PHY reset ordering in dc21140m_autoconf().
343                           Fix initialisation problem with lp->timeout in
344                            typeX_infoblock() from <paubert@iram.es>.
345                           Fix MII PHY reset problem from work done by
346                            <paubert@iram.es>.
347       0.52   26-Apr-97    Some changes may not credit the right people -
348                            a disk crash meant I lost some mail.
349                           Change RX interrupt routine to drop rather than
350                            defer packets to avoid hang reported by
351                            <g.thomas@opengroup.org>.
352                           Fix srom_exec() to return for COMPACT and type 1
353                            infoblocks.
354                           Added DC21142 and DC21143 functions.
355                           Added byte counters from <phil@tazenda.demon.co.uk>
356                           Added IRQF_DISABLED temporary fix from
357                            <mjacob@feral.com>.
358       0.53   12-Nov-97    Fix the *_probe() to include 'eth??' name during
359                            module load: bug reported by
360                            <Piete.Brooks@cl.cam.ac.uk>
361                           Fix multi-MAC, one SROM, to work with 2114x chips:
362                            bug reported by <cmetz@inner.net>.
363                           Make above search independent of BIOS device scan
364                            direction.
365                           Completed DC2114[23] autosense functions.
366       0.531  21-Dec-97    Fix DE500-XA 100Mb/s bug reported by
367                            <robin@intercore.com
368                           Fix type1_infoblock() bug introduced in 0.53, from
369                            problem reports by
370                            <parmee@postecss.ncrfran.france.ncr.com> and
371                            <jo@ice.dillingen.baynet.de>.
372                           Added argument list to set up each board from either
373                            a module's command line or a compiled in #define.
374                           Added generic MII PHY functionality to deal with
375                            newer PHY chips.
376                           Fix the mess in 2.1.67.
377       0.532   5-Jan-98    Fix bug in mii_get_phy() reported by
378                            <redhat@cococo.net>.
379                           Fix bug in pci_probe() for 64 bit systems reported
380                            by <belliott@accessone.com>.
381       0.533   9-Jan-98    Fix more 64 bit bugs reported by <jal@cs.brown.edu>.
382       0.534  24-Jan-98    Fix last (?) endian bug from <geert@linux-m68k.org>
383       0.535  21-Feb-98    Fix Ethernet Address PROM reset bug for DC21040.
384       0.536  21-Mar-98    Change pci_probe() to use the pci_dev structure.
385                           **Incompatible with 2.0.x from here.**
386       0.540   5-Jul-98    Atomicize assertion of dev->interrupt for SMP
387                            from <lma@varesearch.com>
388                           Add TP, AUI and BNC cases to 21140m_autoconf() for
389                            case where a 21140 under SROM control uses, e.g. AUI
390                            from problem report by <delchini@lpnp09.in2p3.fr>
391                           Add MII parallel detection to 2114x_autoconf() for
392                            case where no autonegotiation partner exists from
393                            problem report by <mlapsley@ndirect.co.uk>.
394                           Add ability to force connection type directly even
395                            when using SROM control from problem report by
396                            <earl@exis.net>.
397                           Updated the PCI interface to conform with the latest
398                            version. I hope nothing is broken...
399                           Add TX done interrupt modification from suggestion
400                            by <Austin.Donnelly@cl.cam.ac.uk>.
401                           Fix is_anc_capable() bug reported by
402                            <Austin.Donnelly@cl.cam.ac.uk>.
403                           Fix type[13]_infoblock() bug: during MII search, PHY
404                            lp->rst not run because lp->ibn not initialised -
405                            from report & fix by <paubert@iram.es>.
406                           Fix probe bug with EISA & PCI cards present from
407                            report by <eirik@netcom.com>.
408       0.541  24-Aug-98    Fix compiler problems associated with i386-string
409                            ops from multiple bug reports and temporary fix
410                            from <paubert@iram.es>.
411                           Fix pci_probe() to correctly emulate the old
412                            pcibios_find_class() function.
413                           Add an_exception() for old ZYNX346 and fix compile
414                            warning on PPC & SPARC, from <ecd@skynet.be>.
415                           Fix lastPCI to correctly work with compiled in
416                            kernels and modules from bug report by
417                            <Zlatko.Calusic@CARNet.hr> et al.
418       0.542  15-Sep-98    Fix dc2114x_autoconf() to stop multiple messages
419                            when media is unconnected.
420                           Change dev->interrupt to lp->interrupt to ensure
421                            alignment for Alpha's and avoid their unaligned
422                            access traps. This flag is merely for log messages:
423                            should do something more definitive though...
424       0.543  30-Dec-98    Add SMP spin locking.
425       0.544   8-May-99    Fix for buggy SROM in Motorola embedded boards using
426                            a 21143 by <mmporter@home.com>.
427                           Change PCI/EISA bus probing order.
428       0.545  28-Nov-99    Further Moto SROM bug fix from
429                            <mporter@eng.mcd.mot.com>
430                           Remove double checking for DEBUG_RX in de4x5_dbg_rx()
431                            from report by <geert@linux-m68k.org>
432       0.546  22-Feb-01    Fixes Alpha XP1000 oops.  The srom_search function
433                            was causing a page fault when initializing the
434                            variable 'pb', on a non de4x5 PCI device, in this
435                            case a PCI bridge (DEC chip 21152). The value of
436                            'pb' is now only initialized if a de4x5 chip is
437                            present.
438                            <france@handhelds.org>
439       0.547  08-Nov-01    Use library crc32 functions by <Matt_Domsch@dell.com>
440       0.548  30-Aug-03    Big 2.6 cleanup. Ported to PCI/EISA probing and
441                            generic DMA APIs. Fixed DE425 support on Alpha.
442                            <maz@wild-wind.fr.eu.org>
443     =========================================================================
444 */
445
446 #include <linux/module.h>
447 #include <linux/kernel.h>
448 #include <linux/string.h>
449 #include <linux/interrupt.h>
450 #include <linux/ptrace.h>
451 #include <linux/errno.h>
452 #include <linux/ioport.h>
453 #include <linux/pci.h>
454 #include <linux/eisa.h>
455 #include <linux/delay.h>
456 #include <linux/init.h>
457 #include <linux/spinlock.h>
458 #include <linux/crc32.h>
459 #include <linux/netdevice.h>
460 #include <linux/etherdevice.h>
461 #include <linux/skbuff.h>
462 #include <linux/time.h>
463 #include <linux/types.h>
464 #include <linux/unistd.h>
465 #include <linux/ctype.h>
466 #include <linux/dma-mapping.h>
467 #include <linux/moduleparam.h>
468 #include <linux/bitops.h>
469 #include <linux/gfp.h>
470
471 #include <asm/io.h>
472 #include <asm/dma.h>
473 #include <asm/byteorder.h>
474 #include <asm/unaligned.h>
475 #include <asm/uaccess.h>
476 #ifdef CONFIG_PPC_PMAC
477 #include <asm/machdep.h>
478 #endif /* CONFIG_PPC_PMAC */
479
480 #include "de4x5.h"
481
482 static const char version[] __devinitconst =
483         KERN_INFO "de4x5.c:V0.546 2001/02/22 davies@maniac.ultranet.com\n";
484
485 #define c_char const char
486
487 /*
488 ** MII Information
489 */
490 struct phy_table {
491     int reset;              /* Hard reset required?                         */
492     int id;                 /* IEEE OUI                                     */
493     int ta;                 /* One cycle TA time - 802.3u is confusing here */
494     struct {                /* Non autonegotiation (parallel) speed det.    */
495         int reg;
496         int mask;
497         int value;
498     } spd;
499 };
500
501 struct mii_phy {
502     int reset;              /* Hard reset required?                      */
503     int id;                 /* IEEE OUI                                  */
504     int ta;                 /* One cycle TA time                         */
505     struct {                /* Non autonegotiation (parallel) speed det. */
506         int reg;
507         int mask;
508         int value;
509     } spd;
510     int addr;               /* MII address for the PHY                   */
511     u_char  *gep;           /* Start of GEP sequence block in SROM       */
512     u_char  *rst;           /* Start of reset sequence in SROM           */
513     u_int mc;               /* Media Capabilities                        */
514     u_int ana;              /* NWay Advertisement                        */
515     u_int fdx;              /* Full DupleX capabilities for each media   */
516     u_int ttm;              /* Transmit Threshold Mode for each media    */
517     u_int mci;              /* 21142 MII Connector Interrupt info        */
518 };
519
520 #define DE4X5_MAX_PHY 8     /* Allow up to 8 attached PHY devices per board */
521
522 struct sia_phy {
523     u_char mc;              /* Media Code                                */
524     u_char ext;             /* csr13-15 valid when set                   */
525     int csr13;              /* SIA Connectivity Register                 */
526     int csr14;              /* SIA TX/RX Register                        */
527     int csr15;              /* SIA General Register                      */
528     int gepc;               /* SIA GEP Control Information               */
529     int gep;                /* SIA GEP Data                              */
530 };
531
532 /*
533 ** Define the know universe of PHY devices that can be
534 ** recognised by this driver.
535 */
536 static struct phy_table phy_info[] = {
537     {0, NATIONAL_TX, 1, {0x19, 0x40, 0x00}},       /* National TX      */
538     {1, BROADCOM_T4, 1, {0x10, 0x02, 0x02}},       /* Broadcom T4      */
539     {0, SEEQ_T4    , 1, {0x12, 0x10, 0x10}},       /* SEEQ T4          */
540     {0, CYPRESS_T4 , 1, {0x05, 0x20, 0x20}},       /* Cypress T4       */
541     {0, 0x7810     , 1, {0x14, 0x0800, 0x0800}}    /* Level One LTX970 */
542 };
543
544 /*
545 ** These GENERIC values assumes that the PHY devices follow 802.3u and
546 ** allow parallel detection to set the link partner ability register.
547 ** Detection of 100Base-TX [H/F Duplex] and 100Base-T4 is supported.
548 */
549 #define GENERIC_REG   0x05      /* Autoneg. Link Partner Advertisement Reg. */
550 #define GENERIC_MASK  MII_ANLPA_100M /* All 100Mb/s Technologies            */
551 #define GENERIC_VALUE MII_ANLPA_100M /* 100B-TX, 100B-TX FDX, 100B-T4       */
552
553 /*
554 ** Define special SROM detection cases
555 */
556 static c_char enet_det[][ETH_ALEN] = {
557     {0x00, 0x00, 0xc0, 0x00, 0x00, 0x00},
558     {0x00, 0x00, 0xe8, 0x00, 0x00, 0x00}
559 };
560
561 #define SMC    1
562 #define ACCTON 2
563
564 /*
565 ** SROM Repair definitions. If a broken SROM is detected a card may
566 ** use this information to help figure out what to do. This is a
567 ** "stab in the dark" and so far for SMC9332's only.
568 */
569 static c_char srom_repair_info[][100] = {
570     {0x00,0x1e,0x00,0x00,0x00,0x08,             /* SMC9332 */
571      0x1f,0x01,0x8f,0x01,0x00,0x01,0x00,0x02,
572      0x01,0x00,0x00,0x78,0xe0,0x01,0x00,0x50,
573      0x00,0x18,}
574 };
575
576
577 #ifdef DE4X5_DEBUG
578 static int de4x5_debug = DE4X5_DEBUG;
579 #else
580 /*static int de4x5_debug = (DEBUG_MII | DEBUG_SROM | DEBUG_PCICFG | DEBUG_MEDIA | DEBUG_VERSION);*/
581 static int de4x5_debug = (DEBUG_MEDIA | DEBUG_VERSION);
582 #endif
583
584 /*
585 ** Allow per adapter set up. For modules this is simply a command line
586 ** parameter, e.g.:
587 ** insmod de4x5 args='eth1:fdx autosense=BNC eth0:autosense=100Mb'.
588 **
589 ** For a compiled in driver, place e.g.
590 **     #define DE4X5_PARM "eth0:fdx autosense=AUI eth2:autosense=TP"
591 ** here
592 */
593 #ifdef DE4X5_PARM
594 static char *args = DE4X5_PARM;
595 #else
596 static char *args;
597 #endif
598
599 struct parameters {
600     bool fdx;
601     int autosense;
602 };
603
604 #define DE4X5_AUTOSENSE_MS 250      /* msec autosense tick (DE500) */
605
606 #define DE4X5_NDA 0xffe0            /* No Device (I/O) Address */
607
608 /*
609 ** Ethernet PROM defines
610 */
611 #define PROBE_LENGTH    32
612 #define ETH_PROM_SIG    0xAA5500FFUL
613
614 /*
615 ** Ethernet Info
616 */
617 #define PKT_BUF_SZ      1536            /* Buffer size for each Tx/Rx buffer */
618 #define IEEE802_3_SZ    1518            /* Packet + CRC */
619 #define MAX_PKT_SZ      1514            /* Maximum ethernet packet length */
620 #define MAX_DAT_SZ      1500            /* Maximum ethernet data length */
621 #define MIN_DAT_SZ      1               /* Minimum ethernet data length */
622 #define PKT_HDR_LEN     14              /* Addresses and data length info */
623 #define FAKE_FRAME_LEN  (MAX_PKT_SZ + 1)
624 #define QUEUE_PKT_TIMEOUT (3*HZ)        /* 3 second timeout */
625
626
627 /*
628 ** EISA bus defines
629 */
630 #define DE4X5_EISA_IO_PORTS   0x0c00    /* I/O port base address, slot 0 */
631 #define DE4X5_EISA_TOTAL_SIZE 0x100     /* I/O address extent */
632
633 #define EISA_ALLOWED_IRQ_LIST  {5, 9, 10, 11}
634
635 #define DE4X5_SIGNATURE {"DE425","DE434","DE435","DE450","DE500"}
636 #define DE4X5_NAME_LENGTH 8
637
638 static c_char *de4x5_signatures[] = DE4X5_SIGNATURE;
639
640 /*
641 ** Ethernet PROM defines for DC21040
642 */
643 #define PROBE_LENGTH    32
644 #define ETH_PROM_SIG    0xAA5500FFUL
645
646 /*
647 ** PCI Bus defines
648 */
649 #define PCI_MAX_BUS_NUM      8
650 #define DE4X5_PCI_TOTAL_SIZE 0x80       /* I/O address extent */
651 #define DE4X5_CLASS_CODE     0x00020000 /* Network controller, Ethernet */
652
653 /*
654 ** Memory Alignment. Each descriptor is 4 longwords long. To force a
655 ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
656 ** DESC_ALIGN. ALIGN aligns the start address of the private memory area
657 ** and hence the RX descriptor ring's first entry.
658 */
659 #define DE4X5_ALIGN4      ((u_long)4 - 1)     /* 1 longword align */
660 #define DE4X5_ALIGN8      ((u_long)8 - 1)     /* 2 longword align */
661 #define DE4X5_ALIGN16     ((u_long)16 - 1)    /* 4 longword align */
662 #define DE4X5_ALIGN32     ((u_long)32 - 1)    /* 8 longword align */
663 #define DE4X5_ALIGN64     ((u_long)64 - 1)    /* 16 longword align */
664 #define DE4X5_ALIGN128    ((u_long)128 - 1)   /* 32 longword align */
665
666 #define DE4X5_ALIGN         DE4X5_ALIGN32           /* Keep the DC21040 happy... */
667 #define DE4X5_CACHE_ALIGN   CAL_16LONG
668 #define DESC_SKIP_LEN DSL_0             /* Must agree with DESC_ALIGN */
669 /*#define DESC_ALIGN    u32 dummy[4];  / * Must agree with DESC_SKIP_LEN */
670 #define DESC_ALIGN
671
672 #ifndef DEC_ONLY                        /* See README.de4x5 for using this */
673 static int dec_only;
674 #else
675 static int dec_only = 1;
676 #endif
677
678 /*
679 ** DE4X5 IRQ ENABLE/DISABLE
680 */
681 #define ENABLE_IRQs { \
682     imr |= lp->irq_en;\
683     outl(imr, DE4X5_IMR);               /* Enable the IRQs */\
684 }
685
686 #define DISABLE_IRQs {\
687     imr = inl(DE4X5_IMR);\
688     imr &= ~lp->irq_en;\
689     outl(imr, DE4X5_IMR);               /* Disable the IRQs */\
690 }
691
692 #define UNMASK_IRQs {\
693     imr |= lp->irq_mask;\
694     outl(imr, DE4X5_IMR);               /* Unmask the IRQs */\
695 }
696
697 #define MASK_IRQs {\
698     imr = inl(DE4X5_IMR);\
699     imr &= ~lp->irq_mask;\
700     outl(imr, DE4X5_IMR);               /* Mask the IRQs */\
701 }
702
703 /*
704 ** DE4X5 START/STOP
705 */
706 #define START_DE4X5 {\
707     omr = inl(DE4X5_OMR);\
708     omr |= OMR_ST | OMR_SR;\
709     outl(omr, DE4X5_OMR);               /* Enable the TX and/or RX */\
710 }
711
712 #define STOP_DE4X5 {\
713     omr = inl(DE4X5_OMR);\
714     omr &= ~(OMR_ST|OMR_SR);\
715     outl(omr, DE4X5_OMR);               /* Disable the TX and/or RX */ \
716 }
717
718 /*
719 ** DE4X5 SIA RESET
720 */
721 #define RESET_SIA outl(0, DE4X5_SICR);  /* Reset SIA connectivity regs */
722
723 /*
724 ** DE500 AUTOSENSE TIMER INTERVAL (MILLISECS)
725 */
726 #define DE4X5_AUTOSENSE_MS  250
727
728 /*
729 ** SROM Structure
730 */
731 struct de4x5_srom {
732     char sub_vendor_id[2];
733     char sub_system_id[2];
734     char reserved[12];
735     char id_block_crc;
736     char reserved2;
737     char version;
738     char num_controllers;
739     char ieee_addr[6];
740     char info[100];
741     short chksum;
742 };
743 #define SUB_VENDOR_ID 0x500a
744
745 /*
746 ** DE4X5 Descriptors. Make sure that all the RX buffers are contiguous
747 ** and have sizes of both a power of 2 and a multiple of 4.
748 ** A size of 256 bytes for each buffer could be chosen because over 90% of
749 ** all packets in our network are <256 bytes long and 64 longword alignment
750 ** is possible. 1536 showed better 'ttcp' performance. Take your pick. 32 TX
751 ** descriptors are needed for machines with an ALPHA CPU.
752 */
753 #define NUM_RX_DESC 8                   /* Number of RX descriptors   */
754 #define NUM_TX_DESC 32                  /* Number of TX descriptors   */
755 #define RX_BUFF_SZ  1536                /* Power of 2 for kmalloc and */
756                                         /* Multiple of 4 for DC21040  */
757                                         /* Allows 512 byte alignment  */
758 struct de4x5_desc {
759     volatile __le32 status;
760     __le32 des1;
761     __le32 buf;
762     __le32 next;
763     DESC_ALIGN
764 };
765
766 /*
767 ** The DE4X5 private structure
768 */
769 #define DE4X5_PKT_STAT_SZ 16
770 #define DE4X5_PKT_BIN_SZ  128            /* Should be >=100 unless you
771                                             increase DE4X5_PKT_STAT_SZ */
772
773 struct pkt_stats {
774         u_int bins[DE4X5_PKT_STAT_SZ];      /* Private stats counters       */
775         u_int unicast;
776         u_int multicast;
777         u_int broadcast;
778         u_int excessive_collisions;
779         u_int tx_underruns;
780         u_int excessive_underruns;
781         u_int rx_runt_frames;
782         u_int rx_collision;
783         u_int rx_dribble;
784         u_int rx_overflow;
785 };
786
787 struct de4x5_private {
788     char adapter_name[80];                  /* Adapter name                 */
789     u_long interrupt;                       /* Aligned ISR flag             */
790     struct de4x5_desc *rx_ring;             /* RX descriptor ring           */
791     struct de4x5_desc *tx_ring;             /* TX descriptor ring           */
792     struct sk_buff *tx_skb[NUM_TX_DESC];    /* TX skb for freeing when sent */
793     struct sk_buff *rx_skb[NUM_RX_DESC];    /* RX skb's                     */
794     int rx_new, rx_old;                     /* RX descriptor ring pointers  */
795     int tx_new, tx_old;                     /* TX descriptor ring pointers  */
796     char setup_frame[SETUP_FRAME_LEN];      /* Holds MCA and PA info.       */
797     char frame[64];                         /* Min sized packet for loopback*/
798     spinlock_t lock;                        /* Adapter specific spinlock    */
799     struct net_device_stats stats;          /* Public stats                 */
800     struct pkt_stats pktStats;              /* Private stats counters       */
801     char rxRingSize;
802     char txRingSize;
803     int  bus;                               /* EISA or PCI                  */
804     int  bus_num;                           /* PCI Bus number               */
805     int  device;                            /* Device number on PCI bus     */
806     int  state;                             /* Adapter OPENED or CLOSED     */
807     int  chipset;                           /* DC21040, DC21041 or DC21140  */
808     s32  irq_mask;                          /* Interrupt Mask (Enable) bits */
809     s32  irq_en;                            /* Summary interrupt bits       */
810     int  media;                             /* Media (eg TP), mode (eg 100B)*/
811     int  c_media;                           /* Remember the last media conn */
812     bool fdx;                               /* media full duplex flag       */
813     int  linkOK;                            /* Link is OK                   */
814     int  autosense;                         /* Allow/disallow autosensing   */
815     bool tx_enable;                         /* Enable descriptor polling    */
816     int  setup_f;                           /* Setup frame filtering type   */
817     int  local_state;                       /* State within a 'media' state */
818     struct mii_phy phy[DE4X5_MAX_PHY];      /* List of attached PHY devices */
819     struct sia_phy sia;                     /* SIA PHY Information          */
820     int  active;                            /* Index to active PHY device   */
821     int  mii_cnt;                           /* Number of attached PHY's     */
822     int  timeout;                           /* Scheduling counter           */
823     struct timer_list timer;                /* Timer info for kernel        */
824     int tmp;                                /* Temporary global per card    */
825     struct {
826         u_long lock;                        /* Lock the cache accesses      */
827         s32 csr0;                           /* Saved Bus Mode Register      */
828         s32 csr6;                           /* Saved Operating Mode Reg.    */
829         s32 csr7;                           /* Saved IRQ Mask Register      */
830         s32 gep;                            /* Saved General Purpose Reg.   */
831         s32 gepc;                           /* Control info for GEP         */
832         s32 csr13;                          /* Saved SIA Connectivity Reg.  */
833         s32 csr14;                          /* Saved SIA TX/RX Register     */
834         s32 csr15;                          /* Saved SIA General Register   */
835         int save_cnt;                       /* Flag if state already saved  */
836         struct sk_buff_head queue;          /* Save the (re-ordered) skb's  */
837     } cache;
838     struct de4x5_srom srom;                 /* A copy of the SROM           */
839     int cfrv;                               /* Card CFRV copy */
840     int rx_ovf;                             /* Check for 'RX overflow' tag  */
841     bool useSROM;                           /* For non-DEC card use SROM    */
842     bool useMII;                            /* Infoblock using the MII      */
843     int asBitValid;                         /* Autosense bits in GEP?       */
844     int asPolarity;                         /* 0 => asserted high           */
845     int asBit;                              /* Autosense bit number in GEP  */
846     int defMedium;                          /* SROM default medium          */
847     int tcount;                             /* Last infoblock number        */
848     int infoblock_init;                     /* Initialised this infoblock?  */
849     int infoleaf_offset;                    /* SROM infoleaf for controller */
850     s32 infoblock_csr6;                     /* csr6 value in SROM infoblock */
851     int infoblock_media;                    /* infoblock media              */
852     int (*infoleaf_fn)(struct net_device *);    /* Pointer to infoleaf function */
853     u_char *rst;                            /* Pointer to Type 5 reset info */
854     u_char  ibn;                            /* Infoblock number             */
855     struct parameters params;               /* Command line/ #defined params */
856     struct device *gendev;                  /* Generic device */
857     dma_addr_t dma_rings;                   /* DMA handle for rings         */
858     int dma_size;                           /* Size of the DMA area         */
859     char *rx_bufs;                          /* rx bufs on alpha, sparc, ... */
860 };
861
862 /*
863 ** To get around certain poxy cards that don't provide an SROM
864 ** for the second and more DECchip, I have to key off the first
865 ** chip's address. I'll assume there's not a bad SROM iff:
866 **
867 **      o the chipset is the same
868 **      o the bus number is the same and > 0
869 **      o the sum of all the returned hw address bytes is 0 or 0x5fa
870 **
871 ** Also have to save the irq for those cards whose hardware designers
872 ** can't follow the PCI to PCI Bridge Architecture spec.
873 */
874 static struct {
875     int chipset;
876     int bus;
877     int irq;
878     u_char addr[ETH_ALEN];
879 } last = {0,};
880
881 /*
882 ** The transmit ring full condition is described by the tx_old and tx_new
883 ** pointers by:
884 **    tx_old            = tx_new    Empty ring
885 **    tx_old            = tx_new+1  Full ring
886 **    tx_old+txRingSize = tx_new+1  Full ring  (wrapped condition)
887 */
888 #define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
889                         lp->tx_old+lp->txRingSize-lp->tx_new-1:\
890                         lp->tx_old               -lp->tx_new-1)
891
892 #define TX_PKT_PENDING (lp->tx_old != lp->tx_new)
893
894 /*
895 ** Public Functions
896 */
897 static int     de4x5_open(struct net_device *dev);
898 static netdev_tx_t de4x5_queue_pkt(struct sk_buff *skb,
899                                          struct net_device *dev);
900 static irqreturn_t de4x5_interrupt(int irq, void *dev_id);
901 static int     de4x5_close(struct net_device *dev);
902 static struct  net_device_stats *de4x5_get_stats(struct net_device *dev);
903 static void    de4x5_local_stats(struct net_device *dev, char *buf, int pkt_len);
904 static void    set_multicast_list(struct net_device *dev);
905 static int     de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
906
907 /*
908 ** Private functions
909 */
910 static int     de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev);
911 static int     de4x5_init(struct net_device *dev);
912 static int     de4x5_sw_reset(struct net_device *dev);
913 static int     de4x5_rx(struct net_device *dev);
914 static int     de4x5_tx(struct net_device *dev);
915 static void    de4x5_ast(struct net_device *dev);
916 static int     de4x5_txur(struct net_device *dev);
917 static int     de4x5_rx_ovfc(struct net_device *dev);
918
919 static int     autoconf_media(struct net_device *dev);
920 static void    create_packet(struct net_device *dev, char *frame, int len);
921 static void    load_packet(struct net_device *dev, char *buf, u32 flags, struct sk_buff *skb);
922 static int     dc21040_autoconf(struct net_device *dev);
923 static int     dc21041_autoconf(struct net_device *dev);
924 static int     dc21140m_autoconf(struct net_device *dev);
925 static int     dc2114x_autoconf(struct net_device *dev);
926 static int     srom_autoconf(struct net_device *dev);
927 static int     de4x5_suspect_state(struct net_device *dev, int timeout, int prev_state, int (*fn)(struct net_device *, int), int (*asfn)(struct net_device *));
928 static int     dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeout, int next_state, int suspect_state, int (*fn)(struct net_device *, int));
929 static int     test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec);
930 static int     test_for_100Mb(struct net_device *dev, int msec);
931 static int     wait_for_link(struct net_device *dev);
932 static int     test_mii_reg(struct net_device *dev, int reg, int mask, bool pol, long msec);
933 static int     is_spd_100(struct net_device *dev);
934 static int     is_100_up(struct net_device *dev);
935 static int     is_10_up(struct net_device *dev);
936 static int     is_anc_capable(struct net_device *dev);
937 static int     ping_media(struct net_device *dev, int msec);
938 static struct sk_buff *de4x5_alloc_rx_buff(struct net_device *dev, int index, int len);
939 static void    de4x5_free_rx_buffs(struct net_device *dev);
940 static void    de4x5_free_tx_buffs(struct net_device *dev);
941 static void    de4x5_save_skbs(struct net_device *dev);
942 static void    de4x5_rst_desc_ring(struct net_device *dev);
943 static void    de4x5_cache_state(struct net_device *dev, int flag);
944 static void    de4x5_put_cache(struct net_device *dev, struct sk_buff *skb);
945 static void    de4x5_putb_cache(struct net_device *dev, struct sk_buff *skb);
946 static struct  sk_buff *de4x5_get_cache(struct net_device *dev);
947 static void    de4x5_setup_intr(struct net_device *dev);
948 static void    de4x5_init_connection(struct net_device *dev);
949 static int     de4x5_reset_phy(struct net_device *dev);
950 static void    reset_init_sia(struct net_device *dev, s32 sicr, s32 strr, s32 sigr);
951 static int     test_ans(struct net_device *dev, s32 irqs, s32 irq_mask, s32 msec);
952 static int     test_tp(struct net_device *dev, s32 msec);
953 static int     EISA_signature(char *name, struct device *device);
954 static int     PCI_signature(char *name, struct de4x5_private *lp);
955 static void    DevicePresent(struct net_device *dev, u_long iobase);
956 static void    enet_addr_rst(u_long aprom_addr);
957 static int     de4x5_bad_srom(struct de4x5_private *lp);
958 static short   srom_rd(u_long address, u_char offset);
959 static void    srom_latch(u_int command, u_long address);
960 static void    srom_command(u_int command, u_long address);
961 static void    srom_address(u_int command, u_long address, u_char offset);
962 static short   srom_data(u_int command, u_long address);
963 /*static void    srom_busy(u_int command, u_long address);*/
964 static void    sendto_srom(u_int command, u_long addr);
965 static int     getfrom_srom(u_long addr);
966 static int     srom_map_media(struct net_device *dev);
967 static int     srom_infoleaf_info(struct net_device *dev);
968 static void    srom_init(struct net_device *dev);
969 static void    srom_exec(struct net_device *dev, u_char *p);
970 static int     mii_rd(u_char phyreg, u_char phyaddr, u_long ioaddr);
971 static void    mii_wr(int data, u_char phyreg, u_char phyaddr, u_long ioaddr);
972 static int     mii_rdata(u_long ioaddr);
973 static void    mii_wdata(int data, int len, u_long ioaddr);
974 static void    mii_ta(u_long rw, u_long ioaddr);
975 static int     mii_swap(int data, int len);
976 static void    mii_address(u_char addr, u_long ioaddr);
977 static void    sendto_mii(u32 command, int data, u_long ioaddr);
978 static int     getfrom_mii(u32 command, u_long ioaddr);
979 static int     mii_get_oui(u_char phyaddr, u_long ioaddr);
980 static int     mii_get_phy(struct net_device *dev);
981 static void    SetMulticastFilter(struct net_device *dev);
982 static int     get_hw_addr(struct net_device *dev);
983 static void    srom_repair(struct net_device *dev, int card);
984 static int     test_bad_enet(struct net_device *dev, int status);
985 static int     an_exception(struct de4x5_private *lp);
986 static char    *build_setup_frame(struct net_device *dev, int mode);
987 static void    disable_ast(struct net_device *dev);
988 static long    de4x5_switch_mac_port(struct net_device *dev);
989 static int     gep_rd(struct net_device *dev);
990 static void    gep_wr(s32 data, struct net_device *dev);
991 static void    yawn(struct net_device *dev, int state);
992 static void    de4x5_parse_params(struct net_device *dev);
993 static void    de4x5_dbg_open(struct net_device *dev);
994 static void    de4x5_dbg_mii(struct net_device *dev, int k);
995 static void    de4x5_dbg_media(struct net_device *dev);
996 static void    de4x5_dbg_srom(struct de4x5_srom *p);
997 static void    de4x5_dbg_rx(struct sk_buff *skb, int len);
998 static int     de4x5_strncmp(char *a, char *b, int n);
999 static int     dc21041_infoleaf(struct net_device *dev);
1000 static int     dc21140_infoleaf(struct net_device *dev);
1001 static int     dc21142_infoleaf(struct net_device *dev);
1002 static int     dc21143_infoleaf(struct net_device *dev);
1003 static int     type0_infoblock(struct net_device *dev, u_char count, u_char *p);
1004 static int     type1_infoblock(struct net_device *dev, u_char count, u_char *p);
1005 static int     type2_infoblock(struct net_device *dev, u_char count, u_char *p);
1006 static int     type3_infoblock(struct net_device *dev, u_char count, u_char *p);
1007 static int     type4_infoblock(struct net_device *dev, u_char count, u_char *p);
1008 static int     type5_infoblock(struct net_device *dev, u_char count, u_char *p);
1009 static int     compact_infoblock(struct net_device *dev, u_char count, u_char *p);
1010
1011 /*
1012 ** Note now that module autoprobing is allowed under EISA and PCI. The
1013 ** IRQ lines will not be auto-detected; instead I'll rely on the BIOSes
1014 ** to "do the right thing".
1015 */
1016
1017 static int io=0x0;/* EDIT THIS LINE FOR YOUR CONFIGURATION IF NEEDED        */
1018
1019 module_param(io, int, 0);
1020 module_param(de4x5_debug, int, 0);
1021 module_param(dec_only, int, 0);
1022 module_param(args, charp, 0);
1023
1024 MODULE_PARM_DESC(io, "de4x5 I/O base address");
1025 MODULE_PARM_DESC(de4x5_debug, "de4x5 debug mask");
1026 MODULE_PARM_DESC(dec_only, "de4x5 probe only for Digital boards (0-1)");
1027 MODULE_PARM_DESC(args, "de4x5 full duplex and media type settings; see de4x5.c for details");
1028 MODULE_LICENSE("GPL");
1029
1030 /*
1031 ** List the SROM infoleaf functions and chipsets
1032 */
1033 struct InfoLeaf {
1034     int chipset;
1035     int (*fn)(struct net_device *);
1036 };
1037 static struct InfoLeaf infoleaf_array[] = {
1038     {DC21041, dc21041_infoleaf},
1039     {DC21140, dc21140_infoleaf},
1040     {DC21142, dc21142_infoleaf},
1041     {DC21143, dc21143_infoleaf}
1042 };
1043 #define INFOLEAF_SIZE ARRAY_SIZE(infoleaf_array)
1044
1045 /*
1046 ** List the SROM info block functions
1047 */
1048 static int (*dc_infoblock[])(struct net_device *dev, u_char, u_char *) = {
1049     type0_infoblock,
1050     type1_infoblock,
1051     type2_infoblock,
1052     type3_infoblock,
1053     type4_infoblock,
1054     type5_infoblock,
1055     compact_infoblock
1056 };
1057
1058 #define COMPACT (ARRAY_SIZE(dc_infoblock) - 1)
1059
1060 /*
1061 ** Miscellaneous defines...
1062 */
1063 #define RESET_DE4X5 {\
1064     int i;\
1065     i=inl(DE4X5_BMR);\
1066     mdelay(1);\
1067     outl(i | BMR_SWR, DE4X5_BMR);\
1068     mdelay(1);\
1069     outl(i, DE4X5_BMR);\
1070     mdelay(1);\
1071     for (i=0;i<5;i++) {inl(DE4X5_BMR); mdelay(1);}\
1072     mdelay(1);\
1073 }
1074
1075 #define PHY_HARD_RESET {\
1076     outl(GEP_HRST, DE4X5_GEP);           /* Hard RESET the PHY dev. */\
1077     mdelay(1);                           /* Assert for 1ms */\
1078     outl(0x00, DE4X5_GEP);\
1079     mdelay(2);                           /* Wait for 2ms */\
1080 }
1081
1082 static const struct net_device_ops de4x5_netdev_ops = {
1083     .ndo_open           = de4x5_open,
1084     .ndo_stop           = de4x5_close,
1085     .ndo_start_xmit     = de4x5_queue_pkt,
1086     .ndo_get_stats      = de4x5_get_stats,
1087     .ndo_set_multicast_list = set_multicast_list,
1088     .ndo_do_ioctl       = de4x5_ioctl,
1089     .ndo_change_mtu     = eth_change_mtu,
1090     .ndo_set_mac_address= eth_mac_addr,
1091     .ndo_validate_addr  = eth_validate_addr,
1092 };
1093
1094
1095 static int __devinit
1096 de4x5_hw_init(struct net_device *dev, u_long iobase, struct device *gendev)
1097 {
1098     char name[DE4X5_NAME_LENGTH + 1];
1099     struct de4x5_private *lp = netdev_priv(dev);
1100     struct pci_dev *pdev = NULL;
1101     int i, status=0;
1102
1103     dev_set_drvdata(gendev, dev);
1104
1105     /* Ensure we're not sleeping */
1106     if (lp->bus == EISA) {
1107         outb(WAKEUP, PCI_CFPM);
1108     } else {
1109         pdev = to_pci_dev (gendev);
1110         pci_write_config_byte(pdev, PCI_CFDA_PSM, WAKEUP);
1111     }
1112     mdelay(10);
1113
1114     RESET_DE4X5;
1115
1116     if ((inl(DE4X5_STS) & (STS_TS | STS_RS)) != 0) {
1117         return -ENXIO;                       /* Hardware could not reset */
1118     }
1119
1120     /*
1121     ** Now find out what kind of DC21040/DC21041/DC21140 board we have.
1122     */
1123     lp->useSROM = false;
1124     if (lp->bus == PCI) {
1125         PCI_signature(name, lp);
1126     } else {
1127         EISA_signature(name, gendev);
1128     }
1129
1130     if (*name == '\0') {                     /* Not found a board signature */
1131         return -ENXIO;
1132     }
1133
1134     dev->base_addr = iobase;
1135     printk ("%s: %s at 0x%04lx", dev_name(gendev), name, iobase);
1136
1137     status = get_hw_addr(dev);
1138     printk(", h/w address %pM\n", dev->dev_addr);
1139
1140     if (status != 0) {
1141         printk("      which has an Ethernet PROM CRC error.\n");
1142         return -ENXIO;
1143     } else {
1144         skb_queue_head_init(&lp->cache.queue);
1145         lp->cache.gepc = GEP_INIT;
1146         lp->asBit = GEP_SLNK;
1147         lp->asPolarity = GEP_SLNK;
1148         lp->asBitValid = ~0;
1149         lp->timeout = -1;
1150         lp->gendev = gendev;
1151         spin_lock_init(&lp->lock);
1152         init_timer(&lp->timer);
1153         lp->timer.function = (void (*)(unsigned long))de4x5_ast;
1154         lp->timer.data = (unsigned long)dev;
1155         de4x5_parse_params(dev);
1156
1157         /*
1158         ** Choose correct autosensing in case someone messed up
1159         */
1160         lp->autosense = lp->params.autosense;
1161         if (lp->chipset != DC21140) {
1162             if ((lp->chipset==DC21040) && (lp->params.autosense&TP_NW)) {
1163                 lp->params.autosense = TP;
1164             }
1165             if ((lp->chipset==DC21041) && (lp->params.autosense&BNC_AUI)) {
1166                 lp->params.autosense = BNC;
1167             }
1168         }
1169         lp->fdx = lp->params.fdx;
1170         sprintf(lp->adapter_name,"%s (%s)", name, dev_name(gendev));
1171
1172         lp->dma_size = (NUM_RX_DESC + NUM_TX_DESC) * sizeof(struct de4x5_desc);
1173 #if defined(__alpha__) || defined(__powerpc__) || defined(CONFIG_SPARC) || defined(DE4X5_DO_MEMCPY)
1174         lp->dma_size += RX_BUFF_SZ * NUM_RX_DESC + DE4X5_ALIGN;
1175 #endif
1176         lp->rx_ring = dma_alloc_coherent(gendev, lp->dma_size,
1177                                          &lp->dma_rings, GFP_ATOMIC);
1178         if (lp->rx_ring == NULL) {
1179             return -ENOMEM;
1180         }
1181
1182         lp->tx_ring = lp->rx_ring + NUM_RX_DESC;
1183
1184         /*
1185         ** Set up the RX descriptor ring (Intels)
1186         ** Allocate contiguous receive buffers, long word aligned (Alphas)
1187         */
1188 #if !defined(__alpha__) && !defined(__powerpc__) && !defined(CONFIG_SPARC) && !defined(DE4X5_DO_MEMCPY)
1189         for (i=0; i<NUM_RX_DESC; i++) {
1190             lp->rx_ring[i].status = 0;
1191             lp->rx_ring[i].des1 = cpu_to_le32(RX_BUFF_SZ);
1192             lp->rx_ring[i].buf = 0;
1193             lp->rx_ring[i].next = 0;
1194             lp->rx_skb[i] = (struct sk_buff *) 1;     /* Dummy entry */
1195         }
1196
1197 #else
1198         {
1199                 dma_addr_t dma_rx_bufs;
1200
1201                 dma_rx_bufs = lp->dma_rings + (NUM_RX_DESC + NUM_TX_DESC)
1202                         * sizeof(struct de4x5_desc);
1203                 dma_rx_bufs = (dma_rx_bufs + DE4X5_ALIGN) & ~DE4X5_ALIGN;
1204                 lp->rx_bufs = (char *)(((long)(lp->rx_ring + NUM_RX_DESC
1205                         + NUM_TX_DESC) + DE4X5_ALIGN) & ~DE4X5_ALIGN);
1206                 for (i=0; i<NUM_RX_DESC; i++) {
1207                         lp->rx_ring[i].status = 0;
1208                         lp->rx_ring[i].des1 = cpu_to_le32(RX_BUFF_SZ);
1209                         lp->rx_ring[i].buf =
1210                                 cpu_to_le32(dma_rx_bufs+i*RX_BUFF_SZ);
1211                         lp->rx_ring[i].next = 0;
1212                         lp->rx_skb[i] = (struct sk_buff *) 1; /* Dummy entry */
1213                 }
1214
1215         }
1216 #endif
1217
1218         barrier();
1219
1220         lp->rxRingSize = NUM_RX_DESC;
1221         lp->txRingSize = NUM_TX_DESC;
1222
1223         /* Write the end of list marker to the descriptor lists */
1224         lp->rx_ring[lp->rxRingSize - 1].des1 |= cpu_to_le32(RD_RER);
1225         lp->tx_ring[lp->txRingSize - 1].des1 |= cpu_to_le32(TD_TER);
1226
1227         /* Tell the adapter where the TX/RX rings are located. */
1228         outl(lp->dma_rings, DE4X5_RRBA);
1229         outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc),
1230              DE4X5_TRBA);
1231
1232         /* Initialise the IRQ mask and Enable/Disable */
1233         lp->irq_mask = IMR_RIM | IMR_TIM | IMR_TUM | IMR_UNM;
1234         lp->irq_en   = IMR_NIM | IMR_AIM;
1235
1236         /* Create a loopback packet frame for later media probing */
1237         create_packet(dev, lp->frame, sizeof(lp->frame));
1238
1239         /* Check if the RX overflow bug needs testing for */
1240         i = lp->cfrv & 0x000000fe;
1241         if ((lp->chipset == DC21140) && (i == 0x20)) {
1242             lp->rx_ovf = 1;
1243         }
1244
1245         /* Initialise the SROM pointers if possible */
1246         if (lp->useSROM) {
1247             lp->state = INITIALISED;
1248             if (srom_infoleaf_info(dev)) {
1249                 dma_free_coherent (gendev, lp->dma_size,
1250                                lp->rx_ring, lp->dma_rings);
1251                 return -ENXIO;
1252             }
1253             srom_init(dev);
1254         }
1255
1256         lp->state = CLOSED;
1257
1258         /*
1259         ** Check for an MII interface
1260         */
1261         if ((lp->chipset != DC21040) && (lp->chipset != DC21041)) {
1262             mii_get_phy(dev);
1263         }
1264
1265         printk("      and requires IRQ%d (provided by %s).\n", dev->irq,
1266                ((lp->bus == PCI) ? "PCI BIOS" : "EISA CNFG"));
1267     }
1268
1269     if (de4x5_debug & DEBUG_VERSION) {
1270         printk(version);
1271     }
1272
1273     /* The DE4X5-specific entries in the device structure. */
1274     SET_NETDEV_DEV(dev, gendev);
1275     dev->netdev_ops = &de4x5_netdev_ops;
1276     dev->mem_start = 0;
1277
1278     /* Fill in the generic fields of the device structure. */
1279     if ((status = register_netdev (dev))) {
1280             dma_free_coherent (gendev, lp->dma_size,
1281                                lp->rx_ring, lp->dma_rings);
1282             return status;
1283     }
1284
1285     /* Let the adapter sleep to save power */
1286     yawn(dev, SLEEP);
1287
1288     return status;
1289 }
1290
1291
1292 static int
1293 de4x5_open(struct net_device *dev)
1294 {
1295     struct de4x5_private *lp = netdev_priv(dev);
1296     u_long iobase = dev->base_addr;
1297     int i, status = 0;
1298     s32 omr;
1299
1300     /* Allocate the RX buffers */
1301     for (i=0; i<lp->rxRingSize; i++) {
1302         if (de4x5_alloc_rx_buff(dev, i, 0) == NULL) {
1303             de4x5_free_rx_buffs(dev);
1304             return -EAGAIN;
1305         }
1306     }
1307
1308     /*
1309     ** Wake up the adapter
1310     */
1311     yawn(dev, WAKEUP);
1312
1313     /*
1314     ** Re-initialize the DE4X5...
1315     */
1316     status = de4x5_init(dev);
1317     spin_lock_init(&lp->lock);
1318     lp->state = OPEN;
1319     de4x5_dbg_open(dev);
1320
1321     if (request_irq(dev->irq, de4x5_interrupt, IRQF_SHARED,
1322                                                      lp->adapter_name, dev)) {
1323         printk("de4x5_open(): Requested IRQ%d is busy - attemping FAST/SHARE...", dev->irq);
1324         if (request_irq(dev->irq, de4x5_interrupt, IRQF_DISABLED | IRQF_SHARED,
1325                                                      lp->adapter_name, dev)) {
1326             printk("\n              Cannot get IRQ- reconfigure your hardware.\n");
1327             disable_ast(dev);
1328             de4x5_free_rx_buffs(dev);
1329             de4x5_free_tx_buffs(dev);
1330             yawn(dev, SLEEP);
1331             lp->state = CLOSED;
1332             return -EAGAIN;
1333         } else {
1334             printk("\n              Succeeded, but you should reconfigure your hardware to avoid this.\n");
1335             printk("WARNING: there may be IRQ related problems in heavily loaded systems.\n");
1336         }
1337     }
1338
1339     lp->interrupt = UNMASK_INTERRUPTS;
1340     dev->trans_start = jiffies; /* prevent tx timeout */
1341
1342     START_DE4X5;
1343
1344     de4x5_setup_intr(dev);
1345
1346     if (de4x5_debug & DEBUG_OPEN) {
1347         printk("\tsts:  0x%08x\n", inl(DE4X5_STS));
1348         printk("\tbmr:  0x%08x\n", inl(DE4X5_BMR));
1349         printk("\timr:  0x%08x\n", inl(DE4X5_IMR));
1350         printk("\tomr:  0x%08x\n", inl(DE4X5_OMR));
1351         printk("\tsisr: 0x%08x\n", inl(DE4X5_SISR));
1352         printk("\tsicr: 0x%08x\n", inl(DE4X5_SICR));
1353         printk("\tstrr: 0x%08x\n", inl(DE4X5_STRR));
1354         printk("\tsigr: 0x%08x\n", inl(DE4X5_SIGR));
1355     }
1356
1357     return status;
1358 }
1359
1360 /*
1361 ** Initialize the DE4X5 operating conditions. NB: a chip problem with the
1362 ** DC21140 requires using perfect filtering mode for that chip. Since I can't
1363 ** see why I'd want > 14 multicast addresses, I have changed all chips to use
1364 ** the perfect filtering mode. Keep the DMA burst length at 8: there seems
1365 ** to be data corruption problems if it is larger (UDP errors seen from a
1366 ** ttcp source).
1367 */
1368 static int
1369 de4x5_init(struct net_device *dev)
1370 {
1371     /* Lock out other processes whilst setting up the hardware */
1372     netif_stop_queue(dev);
1373
1374     de4x5_sw_reset(dev);
1375
1376     /* Autoconfigure the connected port */
1377     autoconf_media(dev);
1378
1379     return 0;
1380 }
1381
1382 static int
1383 de4x5_sw_reset(struct net_device *dev)
1384 {
1385     struct de4x5_private *lp = netdev_priv(dev);
1386     u_long iobase = dev->base_addr;
1387     int i, j, status = 0;
1388     s32 bmr, omr;
1389
1390     /* Select the MII or SRL port now and RESET the MAC */
1391     if (!lp->useSROM) {
1392         if (lp->phy[lp->active].id != 0) {
1393             lp->infoblock_csr6 = OMR_SDP | OMR_PS | OMR_HBD;
1394         } else {
1395             lp->infoblock_csr6 = OMR_SDP | OMR_TTM;
1396         }
1397         de4x5_switch_mac_port(dev);
1398     }
1399
1400     /*
1401     ** Set the programmable burst length to 8 longwords for all the DC21140
1402     ** Fasternet chips and 4 longwords for all others: DMA errors result
1403     ** without these values. Cache align 16 long.
1404     */
1405     bmr = (lp->chipset==DC21140 ? PBL_8 : PBL_4) | DESC_SKIP_LEN | DE4X5_CACHE_ALIGN;
1406     bmr |= ((lp->chipset & ~0x00ff)==DC2114x ? BMR_RML : 0);
1407     outl(bmr, DE4X5_BMR);
1408
1409     omr = inl(DE4X5_OMR) & ~OMR_PR;             /* Turn off promiscuous mode */
1410     if (lp->chipset == DC21140) {
1411         omr |= (OMR_SDP | OMR_SB);
1412     }
1413     lp->setup_f = PERFECT;
1414     outl(lp->dma_rings, DE4X5_RRBA);
1415     outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc),
1416          DE4X5_TRBA);
1417
1418     lp->rx_new = lp->rx_old = 0;
1419     lp->tx_new = lp->tx_old = 0;
1420
1421     for (i = 0; i < lp->rxRingSize; i++) {
1422         lp->rx_ring[i].status = cpu_to_le32(R_OWN);
1423     }
1424
1425     for (i = 0; i < lp->txRingSize; i++) {
1426         lp->tx_ring[i].status = cpu_to_le32(0);
1427     }
1428
1429     barrier();
1430
1431     /* Build the setup frame depending on filtering mode */
1432     SetMulticastFilter(dev);
1433
1434     load_packet(dev, lp->setup_frame, PERFECT_F|TD_SET|SETUP_FRAME_LEN, (struct sk_buff *)1);
1435     outl(omr|OMR_ST, DE4X5_OMR);
1436
1437     /* Poll for setup frame completion (adapter interrupts are disabled now) */
1438
1439     for (j=0, i=0;(i<500) && (j==0);i++) {       /* Up to 500ms delay */
1440         mdelay(1);
1441         if ((s32)le32_to_cpu(lp->tx_ring[lp->tx_new].status) >= 0) j=1;
1442     }
1443     outl(omr, DE4X5_OMR);                        /* Stop everything! */
1444
1445     if (j == 0) {
1446         printk("%s: Setup frame timed out, status %08x\n", dev->name,
1447                inl(DE4X5_STS));
1448         status = -EIO;
1449     }
1450
1451     lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
1452     lp->tx_old = lp->tx_new;
1453
1454     return status;
1455 }
1456
1457 /*
1458 ** Writes a socket buffer address to the next available transmit descriptor.
1459 */
1460 static netdev_tx_t
1461 de4x5_queue_pkt(struct sk_buff *skb, struct net_device *dev)
1462 {
1463     struct de4x5_private *lp = netdev_priv(dev);
1464     u_long iobase = dev->base_addr;
1465     u_long flags = 0;
1466
1467     netif_stop_queue(dev);
1468     if (!lp->tx_enable)                   /* Cannot send for now */
1469         return NETDEV_TX_LOCKED;
1470
1471     /*
1472     ** Clean out the TX ring asynchronously to interrupts - sometimes the
1473     ** interrupts are lost by delayed descriptor status updates relative to
1474     ** the irq assertion, especially with a busy PCI bus.
1475     */
1476     spin_lock_irqsave(&lp->lock, flags);
1477     de4x5_tx(dev);
1478     spin_unlock_irqrestore(&lp->lock, flags);
1479
1480     /* Test if cache is already locked - requeue skb if so */
1481     if (test_and_set_bit(0, (void *)&lp->cache.lock) && !lp->interrupt)
1482         return NETDEV_TX_LOCKED;
1483
1484     /* Transmit descriptor ring full or stale skb */
1485     if (netif_queue_stopped(dev) || (u_long) lp->tx_skb[lp->tx_new] > 1) {
1486         if (lp->interrupt) {
1487             de4x5_putb_cache(dev, skb);          /* Requeue the buffer */
1488         } else {
1489             de4x5_put_cache(dev, skb);
1490         }
1491         if (de4x5_debug & DEBUG_TX) {
1492             printk("%s: transmit busy, lost media or stale skb found:\n  STS:%08x\n  tbusy:%d\n  IMR:%08x\n  OMR:%08x\n Stale skb: %s\n",dev->name, inl(DE4X5_STS), netif_queue_stopped(dev), inl(DE4X5_IMR), inl(DE4X5_OMR), ((u_long) lp->tx_skb[lp->tx_new] > 1) ? "YES" : "NO");
1493         }
1494     } else if (skb->len > 0) {
1495         /* If we already have stuff queued locally, use that first */
1496         if (!skb_queue_empty(&lp->cache.queue) && !lp->interrupt) {
1497             de4x5_put_cache(dev, skb);
1498             skb = de4x5_get_cache(dev);
1499         }
1500
1501         while (skb && !netif_queue_stopped(dev) &&
1502                (u_long) lp->tx_skb[lp->tx_new] <= 1) {
1503             spin_lock_irqsave(&lp->lock, flags);
1504             netif_stop_queue(dev);
1505             load_packet(dev, skb->data, TD_IC | TD_LS | TD_FS | skb->len, skb);
1506             lp->stats.tx_bytes += skb->len;
1507             outl(POLL_DEMAND, DE4X5_TPD);/* Start the TX */
1508
1509             lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
1510
1511             if (TX_BUFFS_AVAIL) {
1512                 netif_start_queue(dev);         /* Another pkt may be queued */
1513             }
1514             skb = de4x5_get_cache(dev);
1515             spin_unlock_irqrestore(&lp->lock, flags);
1516         }
1517         if (skb) de4x5_putb_cache(dev, skb);
1518     }
1519
1520     lp->cache.lock = 0;
1521
1522     return NETDEV_TX_OK;
1523 }
1524
1525 /*
1526 ** The DE4X5 interrupt handler.
1527 **
1528 ** I/O Read/Writes through intermediate PCI bridges are never 'posted',
1529 ** so that the asserted interrupt always has some real data to work with -
1530 ** if these I/O accesses are ever changed to memory accesses, ensure the
1531 ** STS write is read immediately to complete the transaction if the adapter
1532 ** is not on bus 0. Lost interrupts can still occur when the PCI bus load
1533 ** is high and descriptor status bits cannot be set before the associated
1534 ** interrupt is asserted and this routine entered.
1535 */
1536 static irqreturn_t
1537 de4x5_interrupt(int irq, void *dev_id)
1538 {
1539     struct net_device *dev = dev_id;
1540     struct de4x5_private *lp;
1541     s32 imr, omr, sts, limit;
1542     u_long iobase;
1543     unsigned int handled = 0;
1544
1545     lp = netdev_priv(dev);
1546     spin_lock(&lp->lock);
1547     iobase = dev->base_addr;
1548
1549     DISABLE_IRQs;                        /* Ensure non re-entrancy */
1550
1551     if (test_and_set_bit(MASK_INTERRUPTS, (void*) &lp->interrupt))
1552         printk("%s: Re-entering the interrupt handler.\n", dev->name);
1553
1554     synchronize_irq(dev->irq);
1555
1556     for (limit=0; limit<8; limit++) {
1557         sts = inl(DE4X5_STS);            /* Read IRQ status */
1558         outl(sts, DE4X5_STS);            /* Reset the board interrupts */
1559
1560         if (!(sts & lp->irq_mask)) break;/* All done */
1561         handled = 1;
1562
1563         if (sts & (STS_RI | STS_RU))     /* Rx interrupt (packet[s] arrived) */
1564           de4x5_rx(dev);
1565
1566         if (sts & (STS_TI | STS_TU))     /* Tx interrupt (packet sent) */
1567           de4x5_tx(dev);
1568
1569         if (sts & STS_LNF) {             /* TP Link has failed */
1570             lp->irq_mask &= ~IMR_LFM;
1571         }
1572
1573         if (sts & STS_UNF) {             /* Transmit underrun */
1574             de4x5_txur(dev);
1575         }
1576
1577         if (sts & STS_SE) {              /* Bus Error */
1578             STOP_DE4X5;
1579             printk("%s: Fatal bus error occurred, sts=%#8x, device stopped.\n",
1580                    dev->name, sts);
1581             spin_unlock(&lp->lock);
1582             return IRQ_HANDLED;
1583         }
1584     }
1585
1586     /* Load the TX ring with any locally stored packets */
1587     if (!test_and_set_bit(0, (void *)&lp->cache.lock)) {
1588         while (!skb_queue_empty(&lp->cache.queue) && !netif_queue_stopped(dev) && lp->tx_enable) {
1589             de4x5_queue_pkt(de4x5_get_cache(dev), dev);
1590         }
1591         lp->cache.lock = 0;
1592     }
1593
1594     lp->interrupt = UNMASK_INTERRUPTS;
1595     ENABLE_IRQs;
1596     spin_unlock(&lp->lock);
1597
1598     return IRQ_RETVAL(handled);
1599 }
1600
1601 static int
1602 de4x5_rx(struct net_device *dev)
1603 {
1604     struct de4x5_private *lp = netdev_priv(dev);
1605     u_long iobase = dev->base_addr;
1606     int entry;
1607     s32 status;
1608
1609     for (entry=lp->rx_new; (s32)le32_to_cpu(lp->rx_ring[entry].status)>=0;
1610                                                             entry=lp->rx_new) {
1611         status = (s32)le32_to_cpu(lp->rx_ring[entry].status);
1612
1613         if (lp->rx_ovf) {
1614             if (inl(DE4X5_MFC) & MFC_FOCM) {
1615                 de4x5_rx_ovfc(dev);
1616                 break;
1617             }
1618         }
1619
1620         if (status & RD_FS) {                 /* Remember the start of frame */
1621             lp->rx_old = entry;
1622         }
1623
1624         if (status & RD_LS) {                 /* Valid frame status */
1625             if (lp->tx_enable) lp->linkOK++;
1626             if (status & RD_ES) {             /* There was an error. */
1627                 lp->stats.rx_errors++;        /* Update the error stats. */
1628                 if (status & (RD_RF | RD_TL)) lp->stats.rx_frame_errors++;
1629                 if (status & RD_CE)           lp->stats.rx_crc_errors++;
1630                 if (status & RD_OF)           lp->stats.rx_fifo_errors++;
1631                 if (status & RD_TL)           lp->stats.rx_length_errors++;
1632                 if (status & RD_RF)           lp->pktStats.rx_runt_frames++;
1633                 if (status & RD_CS)           lp->pktStats.rx_collision++;
1634                 if (status & RD_DB)           lp->pktStats.rx_dribble++;
1635                 if (status & RD_OF)           lp->pktStats.rx_overflow++;
1636             } else {                          /* A valid frame received */
1637                 struct sk_buff *skb;
1638                 short pkt_len = (short)(le32_to_cpu(lp->rx_ring[entry].status)
1639                                                                     >> 16) - 4;
1640
1641                 if ((skb = de4x5_alloc_rx_buff(dev, entry, pkt_len)) == NULL) {
1642                     printk("%s: Insufficient memory; nuking packet.\n",
1643                                                                     dev->name);
1644                     lp->stats.rx_dropped++;
1645                 } else {
1646                     de4x5_dbg_rx(skb, pkt_len);
1647
1648                     /* Push up the protocol stack */
1649                     skb->protocol=eth_type_trans(skb,dev);
1650                     de4x5_local_stats(dev, skb->data, pkt_len);
1651                     netif_rx(skb);
1652
1653                     /* Update stats */
1654                     lp->stats.rx_packets++;
1655                     lp->stats.rx_bytes += pkt_len;
1656                 }
1657             }
1658
1659             /* Change buffer ownership for this frame, back to the adapter */
1660             for (;lp->rx_old!=entry;lp->rx_old=(lp->rx_old + 1)%lp->rxRingSize) {
1661                 lp->rx_ring[lp->rx_old].status = cpu_to_le32(R_OWN);
1662                 barrier();
1663             }
1664             lp->rx_ring[entry].status = cpu_to_le32(R_OWN);
1665             barrier();
1666         }
1667
1668         /*
1669         ** Update entry information
1670         */
1671         lp->rx_new = (lp->rx_new + 1) % lp->rxRingSize;
1672     }
1673
1674     return 0;
1675 }
1676
1677 static inline void
1678 de4x5_free_tx_buff(struct de4x5_private *lp, int entry)
1679 {
1680     dma_unmap_single(lp->gendev, le32_to_cpu(lp->tx_ring[entry].buf),
1681                      le32_to_cpu(lp->tx_ring[entry].des1) & TD_TBS1,
1682                      DMA_TO_DEVICE);
1683     if ((u_long) lp->tx_skb[entry] > 1)
1684         dev_kfree_skb_irq(lp->tx_skb[entry]);
1685     lp->tx_skb[entry] = NULL;
1686 }
1687
1688 /*
1689 ** Buffer sent - check for TX buffer errors.
1690 */
1691 static int
1692 de4x5_tx(struct net_device *dev)
1693 {
1694     struct de4x5_private *lp = netdev_priv(dev);
1695     u_long iobase = dev->base_addr;
1696     int entry;
1697     s32 status;
1698
1699     for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
1700         status = (s32)le32_to_cpu(lp->tx_ring[entry].status);
1701         if (status < 0) {                     /* Buffer not sent yet */
1702             break;
1703         } else if (status != 0x7fffffff) {    /* Not setup frame */
1704             if (status & TD_ES) {             /* An error happened */
1705                 lp->stats.tx_errors++;
1706                 if (status & TD_NC) lp->stats.tx_carrier_errors++;
1707                 if (status & TD_LC) lp->stats.tx_window_errors++;
1708                 if (status & TD_UF) lp->stats.tx_fifo_errors++;
1709                 if (status & TD_EC) lp->pktStats.excessive_collisions++;
1710                 if (status & TD_DE) lp->stats.tx_aborted_errors++;
1711
1712                 if (TX_PKT_PENDING) {
1713                     outl(POLL_DEMAND, DE4X5_TPD);/* Restart a stalled TX */
1714                 }
1715             } else {                      /* Packet sent */
1716                 lp->stats.tx_packets++;
1717                 if (lp->tx_enable) lp->linkOK++;
1718             }
1719             /* Update the collision counter */
1720             lp->stats.collisions += ((status & TD_EC) ? 16 :
1721                                                       ((status & TD_CC) >> 3));
1722
1723             /* Free the buffer. */
1724             if (lp->tx_skb[entry] != NULL)
1725                 de4x5_free_tx_buff(lp, entry);
1726         }
1727
1728         /* Update all the pointers */
1729         lp->tx_old = (lp->tx_old + 1) % lp->txRingSize;
1730     }
1731
1732     /* Any resources available? */
1733     if (TX_BUFFS_AVAIL && netif_queue_stopped(dev)) {
1734         if (lp->interrupt)
1735             netif_wake_queue(dev);
1736         else
1737             netif_start_queue(dev);
1738     }
1739
1740     return 0;
1741 }
1742
1743 static void
1744 de4x5_ast(struct net_device *dev)
1745 {
1746         struct de4x5_private *lp = netdev_priv(dev);
1747         int next_tick = DE4X5_AUTOSENSE_MS;
1748         int dt;
1749
1750         if (lp->useSROM)
1751                 next_tick = srom_autoconf(dev);
1752         else if (lp->chipset == DC21140)
1753                 next_tick = dc21140m_autoconf(dev);
1754         else if (lp->chipset == DC21041)
1755                 next_tick = dc21041_autoconf(dev);
1756         else if (lp->chipset == DC21040)
1757                 next_tick = dc21040_autoconf(dev);
1758         lp->linkOK = 0;
1759
1760         dt = (next_tick * HZ) / 1000;
1761
1762         if (!dt)
1763                 dt = 1;
1764
1765         mod_timer(&lp->timer, jiffies + dt);
1766 }
1767
1768 static int
1769 de4x5_txur(struct net_device *dev)
1770 {
1771     struct de4x5_private *lp = netdev_priv(dev);
1772     u_long iobase = dev->base_addr;
1773     int omr;
1774
1775     omr = inl(DE4X5_OMR);
1776     if (!(omr & OMR_SF) || (lp->chipset==DC21041) || (lp->chipset==DC21040)) {
1777         omr &= ~(OMR_ST|OMR_SR);
1778         outl(omr, DE4X5_OMR);
1779         while (inl(DE4X5_STS) & STS_TS);
1780         if ((omr & OMR_TR) < OMR_TR) {
1781             omr += 0x4000;
1782         } else {
1783             omr |= OMR_SF;
1784         }
1785         outl(omr | OMR_ST | OMR_SR, DE4X5_OMR);
1786     }
1787
1788     return 0;
1789 }
1790
1791 static int
1792 de4x5_rx_ovfc(struct net_device *dev)
1793 {
1794     struct de4x5_private *lp = netdev_priv(dev);
1795     u_long iobase = dev->base_addr;
1796     int omr;
1797
1798     omr = inl(DE4X5_OMR);
1799     outl(omr & ~OMR_SR, DE4X5_OMR);
1800     while (inl(DE4X5_STS) & STS_RS);
1801
1802     for (; (s32)le32_to_cpu(lp->rx_ring[lp->rx_new].status)>=0;) {
1803         lp->rx_ring[lp->rx_new].status = cpu_to_le32(R_OWN);
1804         lp->rx_new = (lp->rx_new + 1) % lp->rxRingSize;
1805     }
1806
1807     outl(omr, DE4X5_OMR);
1808
1809     return 0;
1810 }
1811
1812 static int
1813 de4x5_close(struct net_device *dev)
1814 {
1815     struct de4x5_private *lp = netdev_priv(dev);
1816     u_long iobase = dev->base_addr;
1817     s32 imr, omr;
1818
1819     disable_ast(dev);
1820
1821     netif_stop_queue(dev);
1822
1823     if (de4x5_debug & DEBUG_CLOSE) {
1824         printk("%s: Shutting down ethercard, status was %8.8x.\n",
1825                dev->name, inl(DE4X5_STS));
1826     }
1827
1828     /*
1829     ** We stop the DE4X5 here... mask interrupts and stop TX & RX
1830     */
1831     DISABLE_IRQs;
1832     STOP_DE4X5;
1833
1834     /* Free the associated irq */
1835     free_irq(dev->irq, dev);
1836     lp->state = CLOSED;
1837
1838     /* Free any socket buffers */
1839     de4x5_free_rx_buffs(dev);
1840     de4x5_free_tx_buffs(dev);
1841
1842     /* Put the adapter to sleep to save power */
1843     yawn(dev, SLEEP);
1844
1845     return 0;
1846 }
1847
1848 static struct net_device_stats *
1849 de4x5_get_stats(struct net_device *dev)
1850 {
1851     struct de4x5_private *lp = netdev_priv(dev);
1852     u_long iobase = dev->base_addr;
1853
1854     lp->stats.rx_missed_errors = (int)(inl(DE4X5_MFC) & (MFC_OVFL | MFC_CNTR));
1855
1856     return &lp->stats;
1857 }
1858
1859 static void
1860 de4x5_local_stats(struct net_device *dev, char *buf, int pkt_len)
1861 {
1862     struct de4x5_private *lp = netdev_priv(dev);
1863     int i;
1864
1865     for (i=1; i<DE4X5_PKT_STAT_SZ-1; i++) {
1866         if (pkt_len < (i*DE4X5_PKT_BIN_SZ)) {
1867             lp->pktStats.bins[i]++;
1868             i = DE4X5_PKT_STAT_SZ;
1869         }
1870     }
1871     if (buf[0] & 0x01) {          /* Multicast/Broadcast */
1872         if ((*(s32 *)&buf[0] == -1) && (*(s16 *)&buf[4] == -1)) {
1873             lp->pktStats.broadcast++;
1874         } else {
1875             lp->pktStats.multicast++;
1876         }
1877     } else if ((*(s32 *)&buf[0] == *(s32 *)&dev->dev_addr[0]) &&
1878                (*(s16 *)&buf[4] == *(s16 *)&dev->dev_addr[4])) {
1879         lp->pktStats.unicast++;
1880     }
1881
1882     lp->pktStats.bins[0]++;       /* Duplicates stats.rx_packets */
1883     if (lp->pktStats.bins[0] == 0) { /* Reset counters */
1884         memset((char *)&lp->pktStats, 0, sizeof(lp->pktStats));
1885     }
1886 }
1887
1888 /*
1889 ** Removes the TD_IC flag from previous descriptor to improve TX performance.
1890 ** If the flag is changed on a descriptor that is being read by the hardware,
1891 ** I assume PCI transaction ordering will mean you are either successful or
1892 ** just miss asserting the change to the hardware. Anyway you're messing with
1893 ** a descriptor you don't own, but this shouldn't kill the chip provided
1894 ** the descriptor register is read only to the hardware.
1895 */
1896 static void
1897 load_packet(struct net_device *dev, char *buf, u32 flags, struct sk_buff *skb)
1898 {
1899     struct de4x5_private *lp = netdev_priv(dev);
1900     int entry = (lp->tx_new ? lp->tx_new-1 : lp->txRingSize-1);
1901     dma_addr_t buf_dma = dma_map_single(lp->gendev, buf, flags & TD_TBS1, DMA_TO_DEVICE);
1902
1903     lp->tx_ring[lp->tx_new].buf = cpu_to_le32(buf_dma);
1904     lp->tx_ring[lp->tx_new].des1 &= cpu_to_le32(TD_TER);
1905     lp->tx_ring[lp->tx_new].des1 |= cpu_to_le32(flags);
1906     lp->tx_skb[lp->tx_new] = skb;
1907     lp->tx_ring[entry].des1 &= cpu_to_le32(~TD_IC);
1908     barrier();
1909
1910     lp->tx_ring[lp->tx_new].status = cpu_to_le32(T_OWN);
1911     barrier();
1912 }
1913
1914 /*
1915 ** Set or clear the multicast filter for this adaptor.
1916 */
1917 static void
1918 set_multicast_list(struct net_device *dev)
1919 {
1920     struct de4x5_private *lp = netdev_priv(dev);
1921     u_long iobase = dev->base_addr;
1922
1923     /* First, double check that the adapter is open */
1924     if (lp->state == OPEN) {
1925         if (dev->flags & IFF_PROMISC) {         /* set promiscuous mode */
1926             u32 omr;
1927             omr = inl(DE4X5_OMR);
1928             omr |= OMR_PR;
1929             outl(omr, DE4X5_OMR);
1930         } else {
1931             SetMulticastFilter(dev);
1932             load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET |
1933                                                         SETUP_FRAME_LEN, (struct sk_buff *)1);
1934
1935             lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
1936             outl(POLL_DEMAND, DE4X5_TPD);       /* Start the TX */
1937             dev->trans_start = jiffies; /* prevent tx timeout */
1938         }
1939     }
1940 }
1941
1942 /*
1943 ** Calculate the hash code and update the logical address filter
1944 ** from a list of ethernet multicast addresses.
1945 ** Little endian crc one liner from Matt Thomas, DEC.
1946 */
1947 static void
1948 SetMulticastFilter(struct net_device *dev)
1949 {
1950     struct de4x5_private *lp = netdev_priv(dev);
1951     struct netdev_hw_addr *ha;
1952     u_long iobase = dev->base_addr;
1953     int i, bit, byte;
1954     u16 hashcode;
1955     u32 omr, crc;
1956     char *pa;
1957     unsigned char *addrs;
1958
1959     omr = inl(DE4X5_OMR);
1960     omr &= ~(OMR_PR | OMR_PM);
1961     pa = build_setup_frame(dev, ALL);        /* Build the basic frame */
1962
1963     if ((dev->flags & IFF_ALLMULTI) || (netdev_mc_count(dev) > 14)) {
1964         omr |= OMR_PM;                       /* Pass all multicasts */
1965     } else if (lp->setup_f == HASH_PERF) {   /* Hash Filtering */
1966         netdev_for_each_mc_addr(ha, dev) {
1967             addrs = ha->addr;
1968             if ((*addrs & 0x01) == 1) {      /* multicast address? */
1969                 crc = ether_crc_le(ETH_ALEN, addrs);
1970                 hashcode = crc & HASH_BITS;  /* hashcode is 9 LSb of CRC */
1971
1972                 byte = hashcode >> 3;        /* bit[3-8] -> byte in filter */
1973                 bit = 1 << (hashcode & 0x07);/* bit[0-2] -> bit in byte */
1974
1975                 byte <<= 1;                  /* calc offset into setup frame */
1976                 if (byte & 0x02) {
1977                     byte -= 1;
1978                 }
1979                 lp->setup_frame[byte] |= bit;
1980             }
1981         }
1982     } else {                                 /* Perfect filtering */
1983         netdev_for_each_mc_addr(ha, dev) {
1984             addrs = ha->addr;
1985             for (i=0; i<ETH_ALEN; i++) {
1986                 *(pa + (i&1)) = *addrs++;
1987                 if (i & 0x01) pa += 4;
1988             }
1989         }
1990     }
1991     outl(omr, DE4X5_OMR);
1992 }
1993
1994 #ifdef CONFIG_EISA
1995
1996 static u_char de4x5_irq[] = EISA_ALLOWED_IRQ_LIST;
1997
1998 static int __devinit de4x5_eisa_probe (struct device *gendev)
1999 {
2000         struct eisa_device *edev;
2001         u_long iobase;
2002         u_char irq, regval;
2003         u_short vendor;
2004         u32 cfid;
2005         int status, device;
2006         struct net_device *dev;
2007         struct de4x5_private *lp;
2008
2009         edev = to_eisa_device (gendev);
2010         iobase = edev->base_addr;
2011
2012         if (!request_region (iobase, DE4X5_EISA_TOTAL_SIZE, "de4x5"))
2013                 return -EBUSY;
2014
2015         if (!request_region (iobase + DE4X5_EISA_IO_PORTS,
2016                              DE4X5_EISA_TOTAL_SIZE, "de4x5")) {
2017                 status = -EBUSY;
2018                 goto release_reg_1;
2019         }
2020
2021         if (!(dev = alloc_etherdev (sizeof (struct de4x5_private)))) {
2022                 status = -ENOMEM;
2023                 goto release_reg_2;
2024         }
2025         lp = netdev_priv(dev);
2026
2027         cfid = (u32) inl(PCI_CFID);
2028         lp->cfrv = (u_short) inl(PCI_CFRV);
2029         device = (cfid >> 8) & 0x00ffff00;
2030         vendor = (u_short) cfid;
2031
2032         /* Read the EISA Configuration Registers */
2033         regval = inb(EISA_REG0) & (ER0_INTL | ER0_INTT);
2034 #ifdef CONFIG_ALPHA
2035         /* Looks like the Jensen firmware (rev 2.2) doesn't really
2036          * care about the EISA configuration, and thus doesn't
2037          * configure the PLX bridge properly. Oh well... Simply mimic
2038          * the EISA config file to sort it out. */
2039
2040         /* EISA REG1: Assert DecChip 21040 HW Reset */
2041         outb (ER1_IAM | 1, EISA_REG1);
2042         mdelay (1);
2043
2044         /* EISA REG1: Deassert DecChip 21040 HW Reset */
2045         outb (ER1_IAM, EISA_REG1);
2046         mdelay (1);
2047
2048         /* EISA REG3: R/W Burst Transfer Enable */
2049         outb (ER3_BWE | ER3_BRE, EISA_REG3);
2050
2051         /* 32_bit slave/master, Preempt Time=23 bclks, Unlatched Interrupt */
2052         outb (ER0_BSW | ER0_BMW | ER0_EPT | regval, EISA_REG0);
2053 #endif
2054         irq = de4x5_irq[(regval >> 1) & 0x03];
2055
2056         if (is_DC2114x) {
2057             device = ((lp->cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
2058         }
2059         lp->chipset = device;
2060         lp->bus = EISA;
2061
2062         /* Write the PCI Configuration Registers */
2063         outl(PCI_COMMAND_IO | PCI_COMMAND_MASTER, PCI_CFCS);
2064         outl(0x00006000, PCI_CFLT);
2065         outl(iobase, PCI_CBIO);
2066
2067         DevicePresent(dev, EISA_APROM);
2068
2069         dev->irq = irq;
2070
2071         if (!(status = de4x5_hw_init (dev, iobase, gendev))) {
2072                 return 0;
2073         }
2074
2075         free_netdev (dev);
2076  release_reg_2:
2077         release_region (iobase + DE4X5_EISA_IO_PORTS, DE4X5_EISA_TOTAL_SIZE);
2078  release_reg_1:
2079         release_region (iobase, DE4X5_EISA_TOTAL_SIZE);
2080
2081         return status;
2082 }
2083
2084 static int __devexit de4x5_eisa_remove (struct device *device)
2085 {
2086         struct net_device *dev;
2087         u_long iobase;
2088
2089         dev = dev_get_drvdata(device);
2090         iobase = dev->base_addr;
2091
2092         unregister_netdev (dev);
2093         free_netdev (dev);
2094         release_region (iobase + DE4X5_EISA_IO_PORTS, DE4X5_EISA_TOTAL_SIZE);
2095         release_region (iobase, DE4X5_EISA_TOTAL_SIZE);
2096
2097         return 0;
2098 }
2099
2100 static const struct eisa_device_id de4x5_eisa_ids[] __devinitconst = {
2101         { "DEC4250", 0 },       /* 0 is the board name index... */
2102         { "" }
2103 };
2104 MODULE_DEVICE_TABLE(eisa, de4x5_eisa_ids);
2105
2106 static struct eisa_driver de4x5_eisa_driver = {
2107         .id_table = de4x5_eisa_ids,
2108         .driver   = {
2109                 .name    = "de4x5",
2110                 .probe   = de4x5_eisa_probe,
2111                 .remove  = __devexit_p (de4x5_eisa_remove),
2112         }
2113 };
2114 MODULE_DEVICE_TABLE(eisa, de4x5_eisa_ids);
2115 #endif
2116
2117 #ifdef CONFIG_PCI
2118
2119 /*
2120 ** This function searches the current bus (which is >0) for a DECchip with an
2121 ** SROM, so that in multiport cards that have one SROM shared between multiple
2122 ** DECchips, we can find the base SROM irrespective of the BIOS scan direction.
2123 ** For single port cards this is a time waster...
2124 */
2125 static void __devinit
2126 srom_search(struct net_device *dev, struct pci_dev *pdev)
2127 {
2128     u_char pb;
2129     u_short vendor, status;
2130     u_int irq = 0, device;
2131     u_long iobase = 0;                     /* Clear upper 32 bits in Alphas */
2132     int i, j;
2133     struct de4x5_private *lp = netdev_priv(dev);
2134     struct list_head *walk;
2135
2136     list_for_each(walk, &pdev->bus_list) {
2137         struct pci_dev *this_dev = pci_dev_b(walk);
2138
2139         /* Skip the pci_bus list entry */
2140         if (list_entry(walk, struct pci_bus, devices) == pdev->bus) continue;
2141
2142         vendor = this_dev->vendor;
2143         device = this_dev->device << 8;
2144         if (!(is_DC21040 || is_DC21041 || is_DC21140 || is_DC2114x)) continue;
2145
2146         /* Get the chip configuration revision register */
2147         pb = this_dev->bus->number;
2148
2149         /* Set the device number information */
2150         lp->device = PCI_SLOT(this_dev->devfn);
2151         lp->bus_num = pb;
2152
2153         /* Set the chipset information */
2154         if (is_DC2114x) {
2155             device = ((this_dev->revision & CFRV_RN) < DC2114x_BRK
2156                       ? DC21142 : DC21143);
2157         }
2158         lp->chipset = device;
2159
2160         /* Get the board I/O address (64 bits on sparc64) */
2161         iobase = pci_resource_start(this_dev, 0);
2162
2163         /* Fetch the IRQ to be used */
2164         irq = this_dev->irq;
2165         if ((irq == 0) || (irq == 0xff) || ((int)irq == -1)) continue;
2166
2167         /* Check if I/O accesses are enabled */
2168         pci_read_config_word(this_dev, PCI_COMMAND, &status);
2169         if (!(status & PCI_COMMAND_IO)) continue;
2170
2171         /* Search for a valid SROM attached to this DECchip */
2172         DevicePresent(dev, DE4X5_APROM);
2173         for (j=0, i=0; i<ETH_ALEN; i++) {
2174             j += (u_char) *((u_char *)&lp->srom + SROM_HWADD + i);
2175         }
2176         if (j != 0 && j != 6 * 0xff) {
2177             last.chipset = device;
2178             last.bus = pb;
2179             last.irq = irq;
2180             for (i=0; i<ETH_ALEN; i++) {
2181                 last.addr[i] = (u_char)*((u_char *)&lp->srom + SROM_HWADD + i);
2182             }
2183             return;
2184         }
2185     }
2186 }
2187
2188 /*
2189 ** PCI bus I/O device probe
2190 ** NB: PCI I/O accesses and Bus Mastering are enabled by the PCI BIOS, not
2191 ** the driver. Some PCI BIOS's, pre V2.1, need the slot + features to be
2192 ** enabled by the user first in the set up utility. Hence we just check for
2193 ** enabled features and silently ignore the card if they're not.
2194 **
2195 ** STOP PRESS: Some BIOS's __require__ the driver to enable the bus mastering
2196 ** bit. Here, check for I/O accesses and then set BM. If you put the card in
2197 ** a non BM slot, you're on your own (and complain to the PC vendor that your
2198 ** PC doesn't conform to the PCI standard)!
2199 **
2200 ** This function is only compatible with the *latest* 2.1.x kernels. For 2.0.x
2201 ** kernels use the V0.535[n] drivers.
2202 */
2203
2204 static int __devinit de4x5_pci_probe (struct pci_dev *pdev,
2205                                    const struct pci_device_id *ent)
2206 {
2207         u_char pb, pbus = 0, dev_num, dnum = 0, timer;
2208         u_short vendor, status;
2209         u_int irq = 0, device;
2210         u_long iobase = 0;      /* Clear upper 32 bits in Alphas */
2211         int error;
2212         struct net_device *dev;
2213         struct de4x5_private *lp;
2214
2215         dev_num = PCI_SLOT(pdev->devfn);
2216         pb = pdev->bus->number;
2217
2218         if (io) { /* probe a single PCI device */
2219                 pbus = (u_short)(io >> 8);
2220                 dnum = (u_short)(io & 0xff);
2221                 if ((pbus != pb) || (dnum != dev_num))
2222                         return -ENODEV;
2223         }
2224
2225         vendor = pdev->vendor;
2226         device = pdev->device << 8;
2227         if (!(is_DC21040 || is_DC21041 || is_DC21140 || is_DC2114x))
2228                 return -ENODEV;
2229
2230         /* Ok, the device seems to be for us. */
2231         if ((error = pci_enable_device (pdev)))
2232                 return error;
2233
2234         if (!(dev = alloc_etherdev (sizeof (struct de4x5_private)))) {
2235                 error = -ENOMEM;
2236                 goto disable_dev;
2237         }
2238
2239         lp = netdev_priv(dev);
2240         lp->bus = PCI;
2241         lp->bus_num = 0;
2242
2243         /* Search for an SROM on this bus */
2244         if (lp->bus_num != pb) {
2245             lp->bus_num = pb;
2246             srom_search(dev, pdev);
2247         }
2248
2249         /* Get the chip configuration revision register */
2250         lp->cfrv = pdev->revision;
2251
2252         /* Set the device number information */
2253         lp->device = dev_num;
2254         lp->bus_num = pb;
2255
2256         /* Set the chipset information */
2257         if (is_DC2114x) {
2258             device = ((lp->cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
2259         }
2260         lp->chipset = device;
2261
2262         /* Get the board I/O address (64 bits on sparc64) */
2263         iobase = pci_resource_start(pdev, 0);
2264
2265         /* Fetch the IRQ to be used */
2266         irq = pdev->irq;
2267         if ((irq == 0) || (irq == 0xff) || ((int)irq == -1)) {
2268                 error = -ENODEV;
2269                 goto free_dev;
2270         }
2271
2272         /* Check if I/O accesses and Bus Mastering are enabled */
2273         pci_read_config_word(pdev, PCI_COMMAND, &status);
2274 #ifdef __powerpc__
2275         if (!(status & PCI_COMMAND_IO)) {
2276             status |= PCI_COMMAND_IO;
2277             pci_write_config_word(pdev, PCI_COMMAND, status);
2278             pci_read_config_word(pdev, PCI_COMMAND, &status);
2279         }
2280 #endif /* __powerpc__ */
2281         if (!(status & PCI_COMMAND_IO)) {
2282                 error = -ENODEV;
2283                 goto free_dev;
2284         }
2285
2286         if (!(status & PCI_COMMAND_MASTER)) {
2287             status |= PCI_COMMAND_MASTER;
2288             pci_write_config_word(pdev, PCI_COMMAND, status);
2289             pci_read_config_word(pdev, PCI_COMMAND, &status);
2290         }
2291         if (!(status & PCI_COMMAND_MASTER)) {
2292                 error = -ENODEV;
2293                 goto free_dev;
2294         }
2295
2296         /* Check the latency timer for values >= 0x60 */
2297         pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &timer);
2298         if (timer < 0x60) {
2299             pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x60);
2300         }
2301
2302         DevicePresent(dev, DE4X5_APROM);
2303
2304         if (!request_region (iobase, DE4X5_PCI_TOTAL_SIZE, "de4x5")) {
2305                 error = -EBUSY;
2306                 goto free_dev;
2307         }
2308
2309         dev->irq = irq;
2310
2311         if ((error = de4x5_hw_init(dev, iobase, &pdev->dev))) {
2312                 goto release;
2313         }
2314
2315         return 0;
2316
2317  release:
2318         release_region (iobase, DE4X5_PCI_TOTAL_SIZE);
2319  free_dev:
2320         free_netdev (dev);
2321  disable_dev:
2322         pci_disable_device (pdev);
2323         return error;
2324 }
2325
2326 static void __devexit de4x5_pci_remove (struct pci_dev *pdev)
2327 {
2328         struct net_device *dev;
2329         u_long iobase;
2330
2331         dev = dev_get_drvdata(&pdev->dev);
2332         iobase = dev->base_addr;
2333
2334         unregister_netdev (dev);
2335         free_netdev (dev);
2336         release_region (iobase, DE4X5_PCI_TOTAL_SIZE);
2337         pci_disable_device (pdev);
2338 }
2339
2340 static struct pci_device_id de4x5_pci_tbl[] = {
2341         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP,
2342           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
2343         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_PLUS,
2344           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
2345         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST,
2346           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
2347         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142,
2348           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
2349         { },
2350 };
2351
2352 static struct pci_driver de4x5_pci_driver = {
2353         .name           = "de4x5",
2354         .id_table       = de4x5_pci_tbl,
2355         .probe          = de4x5_pci_probe,
2356         .remove         = __devexit_p (de4x5_pci_remove),
2357 };
2358
2359 #endif
2360
2361 /*
2362 ** Auto configure the media here rather than setting the port at compile
2363 ** time. This routine is called by de4x5_init() and when a loss of media is
2364 ** detected (excessive collisions, loss of carrier, no carrier or link fail
2365 ** [TP] or no recent receive activity) to check whether the user has been
2366 ** sneaky and changed the port on us.
2367 */
2368 static int
2369 autoconf_media(struct net_device *dev)
2370 {
2371         struct de4x5_private *lp = netdev_priv(dev);
2372         u_long iobase = dev->base_addr;
2373
2374         disable_ast(dev);
2375
2376         lp->c_media = AUTO;                     /* Bogus last media */
2377         inl(DE4X5_MFC);                         /* Zero the lost frames counter */
2378         lp->media = INIT;
2379         lp->tcount = 0;
2380
2381         de4x5_ast(dev);
2382
2383         return lp->media;
2384 }
2385
2386 /*
2387 ** Autoconfigure the media when using the DC21040. AUI cannot be distinguished
2388 ** from BNC as the port has a jumper to set thick or thin wire. When set for
2389 ** BNC, the BNC port will indicate activity if it's not terminated correctly.
2390 ** The only way to test for that is to place a loopback packet onto the
2391 ** network and watch for errors. Since we're messing with the interrupt mask
2392 ** register, disable the board interrupts and do not allow any more packets to
2393 ** be queued to the hardware. Re-enable everything only when the media is
2394 ** found.
2395 ** I may have to "age out" locally queued packets so that the higher layer
2396 ** timeouts don't effectively duplicate packets on the network.
2397 */
2398 static int
2399 dc21040_autoconf(struct net_device *dev)
2400 {
2401     struct de4x5_private *lp = netdev_priv(dev);
2402     u_long iobase = dev->base_addr;
2403     int next_tick = DE4X5_AUTOSENSE_MS;
2404     s32 imr;
2405
2406     switch (lp->media) {
2407     case INIT:
2408         DISABLE_IRQs;
2409         lp->tx_enable = false;
2410         lp->timeout = -1;
2411         de4x5_save_skbs(dev);
2412         if ((lp->autosense == AUTO) || (lp->autosense == TP)) {
2413             lp->media = TP;
2414         } else if ((lp->autosense == BNC) || (lp->autosense == AUI) || (lp->autosense == BNC_AUI)) {
2415             lp->media = BNC_AUI;
2416         } else if (lp->autosense == EXT_SIA) {
2417             lp->media = EXT_SIA;
2418         } else {
2419             lp->media = NC;
2420         }
2421         lp->local_state = 0;
2422         next_tick = dc21040_autoconf(dev);
2423         break;
2424
2425     case TP:
2426         next_tick = dc21040_state(dev, 0x8f01, 0xffff, 0x0000, 3000, BNC_AUI,
2427                                                          TP_SUSPECT, test_tp);
2428         break;
2429
2430     case TP_SUSPECT:
2431         next_tick = de4x5_suspect_state(dev, 1000, TP, test_tp, dc21040_autoconf);
2432         break;
2433
2434     case BNC:
2435     case AUI:
2436     case BNC_AUI:
2437         next_tick = dc21040_state(dev, 0x8f09, 0x0705, 0x0006, 3000, EXT_SIA,
2438                                                   BNC_AUI_SUSPECT, ping_media);
2439         break;
2440
2441     case BNC_AUI_SUSPECT:
2442         next_tick = de4x5_suspect_state(dev, 1000, BNC_AUI, ping_media, dc21040_autoconf);
2443         break;
2444
2445     case EXT_SIA:
2446         next_tick = dc21040_state(dev, 0x3041, 0x0000, 0x0006, 3000,
2447                                               NC, EXT_SIA_SUSPECT, ping_media);
2448         break;
2449
2450     case EXT_SIA_SUSPECT:
2451         next_tick = de4x5_suspect_state(dev, 1000, EXT_SIA, ping_media, dc21040_autoconf);
2452         break;
2453
2454     case NC:
2455         /* default to TP for all */
2456         reset_init_sia(dev, 0x8f01, 0xffff, 0x0000);
2457         if (lp->media != lp->c_media) {
2458             de4x5_dbg_media(dev);
2459             lp->c_media = lp->media;
2460         }
2461         lp->media = INIT;
2462         lp->tx_enable = false;
2463         break;
2464     }
2465
2466     return next_tick;
2467 }
2468
2469 static int
2470 dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeout,
2471               int next_state, int suspect_state,
2472               int (*fn)(struct net_device *, int))
2473 {
2474     struct de4x5_private *lp = netdev_priv(dev);
2475     int next_tick = DE4X5_AUTOSENSE_MS;
2476     int linkBad;
2477
2478     switch (lp->local_state) {
2479     case 0:
2480         reset_init_sia(dev, csr13, csr14, csr15);
2481         lp->local_state++;
2482         next_tick = 500;
2483         break;
2484
2485     case 1:
2486         if (!lp->tx_enable) {
2487             linkBad = fn(dev, timeout);
2488             if (linkBad < 0) {
2489                 next_tick = linkBad & ~TIMER_CB;
2490             } else {
2491                 if (linkBad && (lp->autosense == AUTO)) {
2492                     lp->local_state = 0;
2493                     lp->media = next_state;
2494                 } else {
2495                     de4x5_init_connection(dev);
2496                 }
2497             }
2498         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2499             lp->media = suspect_state;
2500             next_tick = 3000;
2501         }
2502         break;
2503     }
2504
2505     return next_tick;
2506 }
2507
2508 static int
2509 de4x5_suspect_state(struct net_device *dev, int timeout, int prev_state,
2510                       int (*fn)(struct net_device *, int),
2511                       int (*asfn)(struct net_device *))
2512 {
2513     struct de4x5_private *lp = netdev_priv(dev);
2514     int next_tick = DE4X5_AUTOSENSE_MS;
2515     int linkBad;
2516
2517     switch (lp->local_state) {
2518     case 1:
2519         if (lp->linkOK) {
2520             lp->media = prev_state;
2521         } else {
2522             lp->local_state++;
2523             next_tick = asfn(dev);
2524         }
2525         break;
2526
2527     case 2:
2528         linkBad = fn(dev, timeout);
2529         if (linkBad < 0) {
2530             next_tick = linkBad & ~TIMER_CB;
2531         } else if (!linkBad) {
2532             lp->local_state--;
2533             lp->media = prev_state;
2534         } else {
2535             lp->media = INIT;
2536             lp->tcount++;
2537         }
2538     }
2539
2540     return next_tick;
2541 }
2542
2543 /*
2544 ** Autoconfigure the media when using the DC21041. AUI needs to be tested
2545 ** before BNC, because the BNC port will indicate activity if it's not
2546 ** terminated correctly. The only way to test for that is to place a loopback
2547 ** packet onto the network and watch for errors. Since we're messing with
2548 ** the interrupt mask register, disable the board interrupts and do not allow
2549 ** any more packets to be queued to the hardware. Re-enable everything only
2550 ** when the media is found.
2551 */
2552 static int
2553 dc21041_autoconf(struct net_device *dev)
2554 {
2555     struct de4x5_private *lp = netdev_priv(dev);
2556     u_long iobase = dev->base_addr;
2557     s32 sts, irqs, irq_mask, imr, omr;
2558     int next_tick = DE4X5_AUTOSENSE_MS;
2559
2560     switch (lp->media) {
2561     case INIT:
2562         DISABLE_IRQs;
2563         lp->tx_enable = false;
2564         lp->timeout = -1;
2565         de4x5_save_skbs(dev);          /* Save non transmitted skb's */
2566         if ((lp->autosense == AUTO) || (lp->autosense == TP_NW)) {
2567             lp->media = TP;            /* On chip auto negotiation is broken */
2568         } else if (lp->autosense == TP) {
2569             lp->media = TP;
2570         } else if (lp->autosense == BNC) {
2571             lp->media = BNC;
2572         } else if (lp->autosense == AUI) {
2573             lp->media = AUI;
2574         } else {
2575             lp->media = NC;
2576         }
2577         lp->local_state = 0;
2578         next_tick = dc21041_autoconf(dev);
2579         break;
2580
2581     case TP_NW:
2582         if (lp->timeout < 0) {
2583             omr = inl(DE4X5_OMR);/* Set up full duplex for the autonegotiate */
2584             outl(omr | OMR_FDX, DE4X5_OMR);
2585         }
2586         irqs = STS_LNF | STS_LNP;
2587         irq_mask = IMR_LFM | IMR_LPM;
2588         sts = test_media(dev, irqs, irq_mask, 0xef01, 0xffff, 0x0008, 2400);
2589         if (sts < 0) {
2590             next_tick = sts & ~TIMER_CB;
2591         } else {
2592             if (sts & STS_LNP) {
2593                 lp->media = ANS;
2594             } else {
2595                 lp->media = AUI;
2596             }
2597             next_tick = dc21041_autoconf(dev);
2598         }
2599         break;
2600
2601     case ANS:
2602         if (!lp->tx_enable) {
2603             irqs = STS_LNP;
2604             irq_mask = IMR_LPM;
2605             sts = test_ans(dev, irqs, irq_mask, 3000);
2606             if (sts < 0) {
2607                 next_tick = sts & ~TIMER_CB;
2608             } else {
2609                 if (!(sts & STS_LNP) && (lp->autosense == AUTO)) {
2610                     lp->media = TP;
2611                     next_tick = dc21041_autoconf(dev);
2612                 } else {
2613                     lp->local_state = 1;
2614                     de4x5_init_connection(dev);
2615                 }
2616             }
2617         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2618             lp->media = ANS_SUSPECT;
2619             next_tick = 3000;
2620         }
2621         break;
2622
2623     case ANS_SUSPECT:
2624         next_tick = de4x5_suspect_state(dev, 1000, ANS, test_tp, dc21041_autoconf);
2625         break;
2626
2627     case TP:
2628         if (!lp->tx_enable) {
2629             if (lp->timeout < 0) {
2630                 omr = inl(DE4X5_OMR);          /* Set up half duplex for TP */
2631                 outl(omr & ~OMR_FDX, DE4X5_OMR);
2632             }
2633             irqs = STS_LNF | STS_LNP;
2634             irq_mask = IMR_LFM | IMR_LPM;
2635             sts = test_media(dev,irqs, irq_mask, 0xef01, 0xff3f, 0x0008, 2400);
2636             if (sts < 0) {
2637                 next_tick = sts & ~TIMER_CB;
2638             } else {
2639                 if (!(sts & STS_LNP) && (lp->autosense == AUTO)) {
2640                     if (inl(DE4X5_SISR) & SISR_NRA) {
2641                         lp->media = AUI;       /* Non selected port activity */
2642                     } else {
2643                         lp->media = BNC;
2644                     }
2645                     next_tick = dc21041_autoconf(dev);
2646                 } else {
2647                     lp->local_state = 1;
2648                     de4x5_init_connection(dev);
2649                 }
2650             }
2651         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2652             lp->media = TP_SUSPECT;
2653             next_tick = 3000;
2654         }
2655         break;
2656
2657     case TP_SUSPECT:
2658         next_tick = de4x5_suspect_state(dev, 1000, TP, test_tp, dc21041_autoconf);
2659         break;
2660
2661     case AUI:
2662         if (!lp->tx_enable) {
2663             if (lp->timeout < 0) {
2664                 omr = inl(DE4X5_OMR);          /* Set up half duplex for AUI */
2665                 outl(omr & ~OMR_FDX, DE4X5_OMR);
2666             }
2667             irqs = 0;
2668             irq_mask = 0;
2669             sts = test_media(dev,irqs, irq_mask, 0xef09, 0xf73d, 0x000e, 1000);
2670             if (sts < 0) {
2671                 next_tick = sts & ~TIMER_CB;
2672             } else {
2673                 if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
2674                     lp->media = BNC;
2675                     next_tick = dc21041_autoconf(dev);
2676                 } else {
2677                     lp->local_state = 1;
2678                     de4x5_init_connection(dev);
2679                 }
2680             }
2681         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2682             lp->media = AUI_SUSPECT;
2683             next_tick = 3000;
2684         }
2685         break;
2686
2687     case AUI_SUSPECT:
2688         next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc21041_autoconf);
2689         break;
2690
2691     case BNC:
2692         switch (lp->local_state) {
2693         case 0:
2694             if (lp->timeout < 0) {
2695                 omr = inl(DE4X5_OMR);          /* Set up half duplex for BNC */
2696                 outl(omr & ~OMR_FDX, DE4X5_OMR);
2697             }
2698             irqs = 0;
2699             irq_mask = 0;
2700             sts = test_media(dev,irqs, irq_mask, 0xef09, 0xf73d, 0x0006, 1000);
2701             if (sts < 0) {
2702                 next_tick = sts & ~TIMER_CB;
2703             } else {
2704                 lp->local_state++;             /* Ensure media connected */
2705                 next_tick = dc21041_autoconf(dev);
2706             }
2707             break;
2708
2709         case 1:
2710             if (!lp->tx_enable) {
2711                 if ((sts = ping_media(dev, 3000)) < 0) {
2712                     next_tick = sts & ~TIMER_CB;
2713                 } else {
2714                     if (sts) {
2715                         lp->local_state = 0;
2716                         lp->media = NC;
2717                     } else {
2718                         de4x5_init_connection(dev);
2719                     }
2720                 }
2721             } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2722                 lp->media = BNC_SUSPECT;
2723                 next_tick = 3000;
2724             }
2725             break;
2726         }
2727         break;
2728
2729     case BNC_SUSPECT:
2730         next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc21041_autoconf);
2731         break;
2732
2733     case NC:
2734         omr = inl(DE4X5_OMR);    /* Set up full duplex for the autonegotiate */
2735         outl(omr | OMR_FDX, DE4X5_OMR);
2736         reset_init_sia(dev, 0xef01, 0xffff, 0x0008);/* Initialise the SIA */
2737         if (lp->media != lp->c_media) {
2738             de4x5_dbg_media(dev);
2739             lp->c_media = lp->media;
2740         }
2741         lp->media = INIT;
2742         lp->tx_enable = false;
2743         break;
2744     }
2745
2746     return next_tick;
2747 }
2748
2749 /*
2750 ** Some autonegotiation chips are broken in that they do not return the
2751 ** acknowledge bit (anlpa & MII_ANLPA_ACK) in the link partner advertisement
2752 ** register, except at the first power up negotiation.
2753 */
2754 static int
2755 dc21140m_autoconf(struct net_device *dev)
2756 {
2757     struct de4x5_private *lp = netdev_priv(dev);
2758     int ana, anlpa, cap, cr, slnk, sr;
2759     int next_tick = DE4X5_AUTOSENSE_MS;
2760     u_long imr, omr, iobase = dev->base_addr;
2761
2762     switch(lp->media) {
2763     case INIT:
2764         if (lp->timeout < 0) {
2765             DISABLE_IRQs;
2766             lp->tx_enable = false;
2767             lp->linkOK = 0;
2768             de4x5_save_skbs(dev);          /* Save non transmitted skb's */
2769         }
2770         if ((next_tick = de4x5_reset_phy(dev)) < 0) {
2771             next_tick &= ~TIMER_CB;
2772         } else {
2773             if (lp->useSROM) {
2774                 if (srom_map_media(dev) < 0) {
2775                     lp->tcount++;
2776                     return next_tick;
2777                 }
2778                 srom_exec(dev, lp->phy[lp->active].gep);
2779                 if (lp->infoblock_media == ANS) {
2780                     ana = lp->phy[lp->active].ana | MII_ANA_CSMA;
2781                     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2782                 }
2783             } else {
2784                 lp->tmp = MII_SR_ASSC;     /* Fake out the MII speed set */
2785                 SET_10Mb;
2786                 if (lp->autosense == _100Mb) {
2787                     lp->media = _100Mb;
2788                 } else if (lp->autosense == _10Mb) {
2789                     lp->media = _10Mb;
2790                 } else if ((lp->autosense == AUTO) &&
2791                                     ((sr=is_anc_capable(dev)) & MII_SR_ANC)) {
2792                     ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA);
2793                     ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM);
2794                     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2795                     lp->media = ANS;
2796                 } else if (lp->autosense == AUTO) {
2797                     lp->media = SPD_DET;
2798                 } else if (is_spd_100(dev) && is_100_up(dev)) {
2799                     lp->media = _100Mb;
2800                 } else {
2801                     lp->media = NC;
2802                 }
2803             }
2804             lp->local_state = 0;
2805             next_tick = dc21140m_autoconf(dev);
2806         }
2807         break;
2808
2809     case ANS:
2810         switch (lp->local_state) {
2811         case 0:
2812             if (lp->timeout < 0) {
2813                 mii_wr(MII_CR_ASSE | MII_CR_RAN, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
2814             }
2815             cr = test_mii_reg(dev, MII_CR, MII_CR_RAN, false, 500);
2816             if (cr < 0) {
2817                 next_tick = cr & ~TIMER_CB;
2818             } else {
2819                 if (cr) {
2820                     lp->local_state = 0;
2821                     lp->media = SPD_DET;
2822                 } else {
2823                     lp->local_state++;
2824                 }
2825                 next_tick = dc21140m_autoconf(dev);
2826             }
2827             break;
2828
2829         case 1:
2830             if ((sr=test_mii_reg(dev, MII_SR, MII_SR_ASSC, true, 2000)) < 0) {
2831                 next_tick = sr & ~TIMER_CB;
2832             } else {
2833                 lp->media = SPD_DET;
2834                 lp->local_state = 0;
2835                 if (sr) {                         /* Success! */
2836                     lp->tmp = MII_SR_ASSC;
2837                     anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII);
2838                     ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2839                     if (!(anlpa & MII_ANLPA_RF) &&
2840                          (cap = anlpa & MII_ANLPA_TAF & ana)) {
2841                         if (cap & MII_ANA_100M) {
2842                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) != 0;
2843                             lp->media = _100Mb;
2844                         } else if (cap & MII_ANA_10M) {
2845                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_10M) != 0;
2846
2847                             lp->media = _10Mb;
2848                         }
2849                     }
2850                 }                       /* Auto Negotiation failed to finish */
2851                 next_tick = dc21140m_autoconf(dev);
2852             }                           /* Auto Negotiation failed to start */
2853             break;
2854         }
2855         break;
2856
2857     case SPD_DET:                              /* Choose 10Mb/s or 100Mb/s */
2858         if (lp->timeout < 0) {
2859             lp->tmp = (lp->phy[lp->active].id ? MII_SR_LKS :
2860                                                   (~gep_rd(dev) & GEP_LNP));
2861             SET_100Mb_PDET;
2862         }
2863         if ((slnk = test_for_100Mb(dev, 6500)) < 0) {
2864             next_tick = slnk & ~TIMER_CB;
2865         } else {
2866             if (is_spd_100(dev) && is_100_up(dev)) {
2867                 lp->media = _100Mb;
2868             } else if ((!is_spd_100(dev) && (is_10_up(dev) & lp->tmp))) {
2869                 lp->media = _10Mb;
2870             } else {
2871                 lp->media = NC;
2872             }
2873             next_tick = dc21140m_autoconf(dev);
2874         }
2875         break;
2876
2877     case _100Mb:                               /* Set 100Mb/s */
2878         next_tick = 3000;
2879         if (!lp->tx_enable) {
2880             SET_100Mb;
2881             de4x5_init_connection(dev);
2882         } else {
2883             if (!lp->linkOK && (lp->autosense == AUTO)) {
2884                 if (!is_100_up(dev) || (!lp->useSROM && !is_spd_100(dev))) {
2885                     lp->media = INIT;
2886                     lp->tcount++;
2887                     next_tick = DE4X5_AUTOSENSE_MS;
2888                 }
2889             }
2890         }
2891         break;
2892
2893     case BNC:
2894     case AUI:
2895     case _10Mb:                                /* Set 10Mb/s */
2896         next_tick = 3000;
2897         if (!lp->tx_enable) {
2898             SET_10Mb;
2899             de4x5_init_connection(dev);
2900         } else {
2901             if (!lp->linkOK && (lp->autosense == AUTO)) {
2902                 if (!is_10_up(dev) || (!lp->useSROM && is_spd_100(dev))) {
2903                     lp->media = INIT;
2904                     lp->tcount++;
2905                     next_tick = DE4X5_AUTOSENSE_MS;
2906                 }
2907             }
2908         }
2909         break;
2910
2911     case NC:
2912         if (lp->media != lp->c_media) {
2913             de4x5_dbg_media(dev);
2914             lp->c_media = lp->media;
2915         }
2916         lp->media = INIT;
2917         lp->tx_enable = false;
2918         break;
2919     }
2920
2921     return next_tick;
2922 }
2923
2924 /*
2925 ** This routine may be merged into dc21140m_autoconf() sometime as I'm
2926 ** changing how I figure out the media - but trying to keep it backwards
2927 ** compatible with the de500-xa and de500-aa.
2928 ** Whether it's BNC, AUI, SYM or MII is sorted out in the infoblock
2929 ** functions and set during de4x5_mac_port() and/or de4x5_reset_phy().
2930 ** This routine just has to figure out whether 10Mb/s or 100Mb/s is
2931 ** active.
2932 ** When autonegotiation is working, the ANS part searches the SROM for
2933 ** the highest common speed (TP) link that both can run and if that can
2934 ** be full duplex. That infoblock is executed and then the link speed set.
2935 **
2936 ** Only _10Mb and _100Mb are tested here.
2937 */
2938 static int
2939 dc2114x_autoconf(struct net_device *dev)
2940 {
2941     struct de4x5_private *lp = netdev_priv(dev);
2942     u_long iobase = dev->base_addr;
2943     s32 cr, anlpa, ana, cap, irqs, irq_mask, imr, omr, slnk, sr, sts;
2944     int next_tick = DE4X5_AUTOSENSE_MS;
2945
2946     switch (lp->media) {
2947     case INIT:
2948         if (lp->timeout < 0) {
2949             DISABLE_IRQs;
2950             lp->tx_enable = false;
2951             lp->linkOK = 0;
2952             lp->timeout = -1;
2953             de4x5_save_skbs(dev);            /* Save non transmitted skb's */
2954             if (lp->params.autosense & ~AUTO) {
2955                 srom_map_media(dev);         /* Fixed media requested      */
2956                 if (lp->media != lp->params.autosense) {
2957                     lp->tcount++;
2958                     lp->media = INIT;
2959                     return next_tick;
2960                 }
2961                 lp->media = INIT;
2962             }
2963         }
2964         if ((next_tick = de4x5_reset_phy(dev)) < 0) {
2965             next_tick &= ~TIMER_CB;
2966         } else {
2967             if (lp->autosense == _100Mb) {
2968                 lp->media = _100Mb;
2969             } else if (lp->autosense == _10Mb) {
2970                 lp->media = _10Mb;
2971             } else if (lp->autosense == TP) {
2972                 lp->media = TP;
2973             } else if (lp->autosense == BNC) {
2974                 lp->media = BNC;
2975             } else if (lp->autosense == AUI) {
2976                 lp->media = AUI;
2977             } else {
2978                 lp->media = SPD_DET;
2979                 if ((lp->infoblock_media == ANS) &&
2980                                     ((sr=is_anc_capable(dev)) & MII_SR_ANC)) {
2981                     ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA);
2982                     ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM);
2983                     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2984                     lp->media = ANS;
2985                 }
2986             }
2987             lp->local_state = 0;
2988             next_tick = dc2114x_autoconf(dev);
2989         }
2990         break;
2991
2992     case ANS:
2993         switch (lp->local_state) {
2994         case 0:
2995             if (lp->timeout < 0) {
2996                 mii_wr(MII_CR_ASSE | MII_CR_RAN, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
2997             }
2998             cr = test_mii_reg(dev, MII_CR, MII_CR_RAN, false, 500);
2999             if (cr < 0) {
3000                 next_tick = cr & ~TIMER_CB;
3001             } else {
3002                 if (cr) {
3003                     lp->local_state = 0;
3004                     lp->media = SPD_DET;
3005                 } else {
3006                     lp->local_state++;
3007                 }
3008                 next_tick = dc2114x_autoconf(dev);
3009             }
3010             break;
3011
3012         case 1:
3013             sr = test_mii_reg(dev, MII_SR, MII_SR_ASSC, true, 2000);
3014             if (sr < 0) {
3015                 next_tick = sr & ~TIMER_CB;
3016             } else {
3017                 lp->media = SPD_DET;
3018                 lp->local_state = 0;
3019                 if (sr) {                         /* Success! */
3020                     lp->tmp = MII_SR_ASSC;
3021                     anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII);
3022                     ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
3023                     if (!(anlpa & MII_ANLPA_RF) &&
3024                          (cap = anlpa & MII_ANLPA_TAF & ana)) {
3025                         if (cap & MII_ANA_100M) {
3026                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) != 0;
3027                             lp->media = _100Mb;
3028                         } else if (cap & MII_ANA_10M) {
3029                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_10M) != 0;
3030                             lp->media = _10Mb;
3031                         }
3032                     }
3033                 }                       /* Auto Negotiation failed to finish */
3034                 next_tick = dc2114x_autoconf(dev);
3035             }                           /* Auto Negotiation failed to start  */
3036             break;
3037         }
3038         break;
3039
3040     case AUI:
3041         if (!lp->tx_enable) {
3042             if (lp->timeout < 0) {
3043                 omr = inl(DE4X5_OMR);   /* Set up half duplex for AUI        */
3044                 outl(omr & ~OMR_FDX, DE4X5_OMR);
3045             }
3046             irqs = 0;
3047             irq_mask = 0;
3048             sts = test_media(dev,irqs, irq_mask, 0, 0, 0, 1000);
3049             if (sts < 0) {
3050                 next_tick = sts & ~TIMER_CB;
3051             } else {
3052                 if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
3053                     lp->media = BNC;
3054                     next_tick = dc2114x_autoconf(dev);
3055                 } else {
3056                     lp->local_state = 1;
3057                     de4x5_init_connection(dev);
3058                 }
3059             }
3060         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
3061             lp->media = AUI_SUSPECT;
3062             next_tick = 3000;
3063         }
3064         break;
3065
3066     case AUI_SUSPECT:
3067         next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc2114x_autoconf);
3068         break;
3069
3070     case BNC:
3071         switch (lp->local_state) {
3072         case 0:
3073             if (lp->timeout < 0) {
3074                 omr = inl(DE4X5_OMR);          /* Set up half duplex for BNC */
3075                 outl(omr & ~OMR_FDX, DE4X5_OMR);
3076             }
3077             irqs = 0;
3078             irq_mask = 0;
3079             sts = test_media(dev,irqs, irq_mask, 0, 0, 0, 1000);
3080             if (sts < 0) {
3081                 next_tick = sts & ~TIMER_CB;
3082             } else {
3083                 lp->local_state++;             /* Ensure media connected */
3084                 next_tick = dc2114x_autoconf(dev);
3085             }
3086             break;
3087
3088         case 1:
3089             if (!lp->tx_enable) {
3090                 if ((sts = ping_media(dev, 3000)) < 0) {
3091                     next_tick = sts & ~TIMER_CB;
3092                 } else {
3093                     if (sts) {
3094                         lp->local_state = 0;
3095                         lp->tcount++;
3096                         lp->media = INIT;
3097                     } else {
3098                         de4x5_init_connection(dev);
3099                     }
3100                 }
3101             } else if (!lp->linkOK && (lp->autosense == AUTO)) {
3102                 lp->media = BNC_SUSPECT;
3103                 next_tick = 3000;
3104             }
3105             break;
3106         }
3107         break;
3108
3109     case BNC_SUSPECT:
3110         next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc2114x_autoconf);
3111         break;
3112
3113     case SPD_DET:                              /* Choose 10Mb/s or 100Mb/s */
3114           if (srom_map_media(dev) < 0) {
3115               lp->tcount++;
3116               lp->media = INIT;
3117               return next_tick;
3118           }
3119           if (lp->media == _100Mb) {
3120               if ((slnk = test_for_100Mb(dev, 6500)) < 0) {
3121                   lp->media = SPD_DET;
3122                   return slnk & ~TIMER_CB;
3123               }
3124           } else {
3125               if (wait_for_link(dev) < 0) {
3126                   lp->media = SPD_DET;
3127                   return PDET_LINK_WAIT;
3128               }
3129           }
3130           if (lp->media == ANS) {           /* Do MII parallel detection */
3131               if (is_spd_100(dev)) {
3132                   lp->media = _100Mb;
3133               } else {
3134                   lp->media = _10Mb;
3135               }
3136               next_tick = dc2114x_autoconf(dev);
3137           } else if (((lp->media == _100Mb) && is_100_up(dev)) ||
3138                      (((lp->media == _10Mb) || (lp->media == TP) ||
3139                        (lp->media == BNC)   || (lp->media == AUI)) &&
3140                       is_10_up(dev))) {
3141               next_tick = dc2114x_autoconf(dev);
3142           } else {
3143               lp->tcount++;
3144               lp->media = INIT;
3145           }
3146           break;
3147
3148     case _10Mb:
3149         next_tick = 3000;
3150         if (!lp->tx_enable) {
3151             SET_10Mb;
3152             de4x5_init_connection(dev);
3153         } else {
3154             if (!lp->linkOK && (lp->autosense == AUTO)) {
3155                 if (!is_10_up(dev) || (!lp->useSROM && is_spd_100(dev))) {
3156                     lp->media = INIT;
3157                     lp->tcount++;
3158                     next_tick = DE4X5_AUTOSENSE_MS;
3159                 }
3160             }
3161         }
3162         break;
3163
3164     case _100Mb:
3165         next_tick = 3000;
3166         if (!lp->tx_enable) {
3167             SET_100Mb;
3168             de4x5_init_connection(dev);
3169         } else {
3170             if (!lp->linkOK && (lp->autosense == AUTO)) {
3171                 if (!is_100_up(dev) || (!lp->useSROM && !is_spd_100(dev))) {
3172                     lp->media = INIT;
3173                     lp->tcount++;
3174                     next_tick = DE4X5_AUTOSENSE_MS;
3175                 }
3176             }
3177         }
3178         break;
3179
3180     default:
3181         lp->tcount++;
3182 printk("Huh?: media:%02x\n", lp->media);
3183         lp->media = INIT;
3184         break;
3185     }
3186
3187     return next_tick;
3188 }
3189
3190 static int
3191 srom_autoconf(struct net_device *dev)
3192 {
3193     struct de4x5_private *lp = netdev_priv(dev);
3194
3195     return lp->infoleaf_fn(dev);
3196 }
3197
3198 /*
3199 ** This mapping keeps the original media codes and FDX flag unchanged.
3200 ** While it isn't strictly necessary, it helps me for the moment...
3201 ** The early return avoids a media state / SROM media space clash.
3202 */
3203 static int
3204 srom_map_media(struct net_device *dev)
3205 {
3206     struct de4x5_private *lp = netdev_priv(dev);
3207
3208     lp->fdx = false;
3209     if (lp->infoblock_media == lp->media)
3210       return 0;
3211
3212     switch(lp->infoblock_media) {
3213       case SROM_10BASETF:
3214         if (!lp->params.fdx) return -1;
3215         lp->fdx = true;
3216       case SROM_10BASET:
3217         if (lp->params.fdx && !lp->fdx) return -1;
3218         if ((lp->chipset == DC21140) || ((lp->chipset & ~0x00ff) == DC2114x)) {
3219             lp->media = _10Mb;
3220         } else {
3221             lp->media = TP;
3222         }
3223         break;
3224
3225       case SROM_10BASE2:
3226         lp->media = BNC;
3227         break;
3228
3229       case SROM_10BASE5:
3230         lp->media = AUI;
3231         break;
3232
3233       case SROM_100BASETF:
3234         if (!lp->params.fdx) return -1;
3235         lp->fdx = true;
3236       case SROM_100BASET:
3237         if (lp->params.fdx && !lp->fdx) return -1;
3238         lp->media = _100Mb;
3239         break;
3240
3241       case SROM_100BASET4:
3242         lp->media = _100Mb;
3243         break;
3244
3245       case SROM_100BASEFF:
3246         if (!lp->params.fdx) return -1;
3247         lp->fdx = true;
3248       case SROM_100BASEF:
3249         if (lp->params.fdx && !lp->fdx) return -1;
3250         lp->media = _100Mb;
3251         break;
3252
3253       case ANS:
3254         lp->media = ANS;
3255         lp->fdx = lp->params.fdx;
3256         break;
3257
3258       default:
3259         printk("%s: Bad media code [%d] detected in SROM!\n", dev->name,
3260                                                           lp->infoblock_media);
3261         return -1;
3262         break;
3263     }
3264
3265     return 0;
3266 }
3267
3268 static void
3269 de4x5_init_connection(struct net_device *dev)
3270 {
3271     struct de4x5_private *lp = netdev_priv(dev);
3272     u_long iobase = dev->base_addr;
3273     u_long flags = 0;
3274
3275     if (lp->media != lp->c_media) {
3276         de4x5_dbg_media(dev);
3277         lp->c_media = lp->media;          /* Stop scrolling media messages */
3278     }
3279
3280     spin_lock_irqsave(&lp->lock, flags);
3281     de4x5_rst_desc_ring(dev);
3282     de4x5_setup_intr(dev);
3283     lp->tx_enable = true;
3284     spin_unlock_irqrestore(&lp->lock, flags);
3285     outl(POLL_DEMAND, DE4X5_TPD);
3286
3287     netif_wake_queue(dev);
3288 }
3289
3290 /*
3291 ** General PHY reset function. Some MII devices don't reset correctly
3292 ** since their MII address pins can float at voltages that are dependent
3293 ** on the signal pin use. Do a double reset to ensure a reset.
3294 */
3295 static int
3296 de4x5_reset_phy(struct net_device *dev)
3297 {
3298     struct de4x5_private *lp = netdev_priv(dev);
3299     u_long iobase = dev->base_addr;
3300     int next_tick = 0;
3301
3302     if ((lp->useSROM) || (lp->phy[lp->active].id)) {
3303         if (lp->timeout < 0) {
3304             if (lp->useSROM) {
3305                 if (lp->phy[lp->active].rst) {
3306                     srom_exec(dev, lp->phy[lp->active].rst);
3307                     srom_exec(dev, lp->phy[lp->active].rst);
3308                 } else if (lp->rst) {          /* Type 5 infoblock reset */
3309                     srom_exec(dev, lp->rst);
3310                     srom_exec(dev, lp->rst);
3311                 }
3312             } else {
3313                 PHY_HARD_RESET;
3314             }
3315             if (lp->useMII) {
3316                 mii_wr(MII_CR_RST, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
3317             }
3318         }
3319         if (lp->useMII) {
3320             next_tick = test_mii_reg(dev, MII_CR, MII_CR_RST, false, 500);
3321         }
3322     } else if (lp->chipset == DC21140) {
3323         PHY_HARD_RESET;
3324     }
3325
3326     return next_tick;
3327 }
3328
3329 static int
3330 test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec)
3331 {
3332     struct de4x5_private *lp = netdev_priv(dev);
3333     u_long iobase = dev->base_addr;
3334     s32 sts, csr12;
3335
3336     if (lp->timeout < 0) {
3337         lp->timeout = msec/100;
3338         if (!lp->useSROM) {      /* Already done if by SROM, else dc2104[01] */
3339             reset_init_sia(dev, csr13, csr14, csr15);
3340         }
3341
3342         /* set up the interrupt mask */
3343         outl(irq_mask, DE4X5_IMR);
3344
3345         /* clear all pending interrupts */
3346         sts = inl(DE4X5_STS);
3347         outl(sts, DE4X5_STS);
3348
3349         /* clear csr12 NRA and SRA bits */
3350         if ((lp->chipset == DC21041) || lp->useSROM) {
3351             csr12 = inl(DE4X5_SISR);
3352             outl(csr12, DE4X5_SISR);
3353         }
3354     }
3355
3356     sts = inl(DE4X5_STS) & ~TIMER_CB;
3357
3358     if (!(sts & irqs) && --lp->timeout) {
3359         sts = 100 | TIMER_CB;
3360     } else {
3361         lp->timeout = -1;
3362     }
3363
3364     return sts;
3365 }
3366
3367 static int
3368 test_tp(struct net_device *dev, s32 msec)
3369 {
3370     struct de4x5_private *lp = netdev_priv(dev);
3371     u_long iobase = dev->base_addr;
3372     int sisr;
3373
3374     if (lp->timeout < 0) {
3375         lp->timeout = msec/100;
3376     }
3377
3378     sisr = (inl(DE4X5_SISR) & ~TIMER_CB) & (SISR_LKF | SISR_NCR);
3379
3380     if (sisr && --lp->timeout) {
3381         sisr = 100 | TIMER_CB;
3382     } else {
3383         lp->timeout = -1;
3384     }
3385
3386     return sisr;
3387 }
3388
3389 /*
3390 ** Samples the 100Mb Link State Signal. The sample interval is important
3391 ** because too fast a rate can give erroneous results and confuse the
3392 ** speed sense algorithm.
3393 */
3394 #define SAMPLE_INTERVAL 500  /* ms */
3395 #define SAMPLE_DELAY    2000 /* ms */
3396 static int
3397 test_for_100Mb(struct net_device *dev, int msec)
3398 {
3399     struct de4x5_private *lp = netdev_priv(dev);
3400     int gep = 0, ret = ((lp->chipset & ~0x00ff)==DC2114x? -1 :GEP_SLNK);
3401
3402     if (lp->timeout < 0) {
3403         if ((msec/SAMPLE_INTERVAL) <= 0) return 0;
3404         if (msec > SAMPLE_DELAY) {
3405             lp->timeout = (msec - SAMPLE_DELAY)/SAMPLE_INTERVAL;
3406             gep = SAMPLE_DELAY | TIMER_CB;
3407             return gep;
3408         } else {
3409             lp->timeout = msec/SAMPLE_INTERVAL;
3410         }
3411     }
3412
3413     if (lp->phy[lp->active].id || lp->useSROM) {
3414         gep = is_100_up(dev) | is_spd_100(dev);
3415     } else {
3416         gep = (~gep_rd(dev) & (GEP_SLNK | GEP_LNP));
3417     }
3418     if (!(gep & ret) && --lp->timeout) {
3419         gep = SAMPLE_INTERVAL | TIMER_CB;
3420     } else {
3421         lp->timeout = -1;
3422     }
3423
3424     return gep;
3425 }
3426
3427 static int
3428 wait_for_link(struct net_device *dev)
3429 {
3430     struct de4x5_private *lp = netdev_priv(dev);
3431
3432     if (lp->timeout < 0) {
3433         lp->timeout = 1;
3434     }
3435
3436     if (lp->timeout--) {
3437         return TIMER_CB;
3438     } else {
3439         lp->timeout = -1;
3440     }
3441
3442     return 0;
3443 }
3444
3445 /*
3446 **
3447 **
3448 */
3449 static int
3450 test_mii_reg(struct net_device *dev, int reg, int mask, bool pol, long msec)
3451 {
3452     struct de4x5_private *lp = netdev_priv(dev);
3453     int test;
3454     u_long iobase = dev->base_addr;
3455
3456     if (lp->timeout < 0) {
3457         lp->timeout = msec/100;
3458     }
3459
3460     reg = mii_rd((u_char)reg, lp->phy[lp->active].addr, DE4X5_MII) & mask;
3461     test = (reg ^ (pol ? ~0 : 0)) & mask;
3462
3463     if (test && --lp->timeout) {
3464         reg = 100 | TIMER_CB;
3465     } else {
3466         lp->timeout = -1;
3467     }
3468
3469     return reg;
3470 }
3471
3472 static int
3473 is_spd_100(struct net_device *dev)
3474 {
3475     struct de4x5_private *lp = netdev_priv(dev);
3476     u_long iobase = dev->base_addr;
3477     int spd;
3478
3479     if (lp->useMII) {
3480         spd = mii_rd(lp->phy[lp->active].spd.reg, lp->phy[lp->active].addr, DE4X5_MII);
3481         spd = ~(spd ^ lp->phy[lp->active].spd.value);
3482         spd &= lp->phy[lp->active].spd.mask;
3483     } else if (!lp->useSROM) {                      /* de500-xa */
3484         spd = ((~gep_rd(dev)) & GEP_SLNK);
3485     } else {
3486         if ((lp->ibn == 2) || !lp->asBitValid)
3487             return (lp->chipset == DC21143) ? (~inl(DE4X5_SISR)&SISR_LS100) : 0;
3488
3489         spd = (lp->asBitValid & (lp->asPolarity ^ (gep_rd(dev) & lp->asBit))) |
3490                   (lp->linkOK & ~lp->asBitValid);
3491     }
3492
3493     return spd;
3494 }
3495
3496 static int
3497 is_100_up(struct net_device *dev)
3498 {
3499     struct de4x5_private *lp = netdev_priv(dev);
3500     u_long iobase = dev->base_addr;
3501
3502     if (lp->useMII) {
3503         /* Double read for sticky bits & temporary drops */
3504         mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
3505         return mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII) & MII_SR_LKS;
3506     } else if (!lp->useSROM) {                       /* de500-xa */
3507         return (~gep_rd(dev)) & GEP_SLNK;
3508     } else {
3509         if ((lp->ibn == 2) || !lp->asBitValid)
3510             return (lp->chipset == DC21143) ? (~inl(DE4X5_SISR)&SISR_LS100) : 0;
3511
3512         return (lp->asBitValid&(lp->asPolarity^(gep_rd(dev)&lp->asBit))) |
3513                 (lp->linkOK & ~lp->asBitValid);
3514     }
3515 }
3516
3517 static int
3518 is_10_up(struct net_device *dev)
3519 {
3520     struct de4x5_private *lp = netdev_priv(dev);
3521     u_long iobase = dev->base_addr;
3522
3523     if (lp->useMII) {
3524         /* Double read for sticky bits & temporary drops */
3525         mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
3526         return mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII) & MII_SR_LKS;
3527     } else if (!lp->useSROM) {                       /* de500-xa */
3528         return (~gep_rd(dev)) & GEP_LNP;
3529     } else {
3530         if ((lp->ibn == 2) || !lp->asBitValid)
3531             return ((lp->chipset & ~0x00ff) == DC2114x) ?
3532                     (~inl(DE4X5_SISR)&SISR_LS10):
3533                     0;
3534
3535         return  (lp->asBitValid&(lp->asPolarity^(gep_rd(dev)&lp->asBit))) |
3536                 (lp->linkOK & ~lp->asBitValid);
3537     }
3538 }
3539
3540 static int
3541 is_anc_capable(struct net_device *dev)
3542 {
3543     struct de4x5_private *lp = netdev_priv(dev);
3544     u_long iobase = dev->base_addr;
3545
3546     if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) {
3547         return mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
3548     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
3549         return (inl(DE4X5_SISR) & SISR_LPN) >> 12;
3550     } else {
3551         return 0;
3552     }
3553 }
3554
3555 /*
3556 ** Send a packet onto the media and watch for send errors that indicate the
3557 ** media is bad or unconnected.
3558 */
3559 static int
3560 ping_media(struct net_device *dev, int msec)
3561 {
3562     struct de4x5_private *lp = netdev_priv(dev);
3563     u_long iobase = dev->base_addr;
3564     int sisr;
3565
3566     if (lp->timeout < 0) {
3567         lp->timeout = msec/100;
3568
3569         lp->tmp = lp->tx_new;                /* Remember the ring position */
3570         load_packet(dev, lp->frame, TD_LS | TD_FS | sizeof(lp->frame), (struct sk_buff *)1);
3571         lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
3572         outl(POLL_DEMAND, DE4X5_TPD);
3573     }
3574
3575     sisr = inl(DE4X5_SISR);
3576
3577     if ((!(sisr & SISR_NCR)) &&
3578         ((s32)le32_to_cpu(lp->tx_ring[lp->tmp].status) < 0) &&
3579          (--lp->timeout)) {
3580         sisr = 100 | TIMER_CB;
3581     } else {
3582         if ((!(sisr & SISR_NCR)) &&
3583             !(le32_to_cpu(lp->tx_ring[lp->tmp].status) & (T_OWN | TD_ES)) &&
3584             lp->timeout) {
3585             sisr = 0;
3586         } else {
3587             sisr = 1;
3588         }
3589         lp->timeout = -1;
3590     }
3591
3592     return sisr;
3593 }
3594
3595 /*
3596 ** This function does 2 things: on Intels it kmalloc's another buffer to
3597 ** replace the one about to be passed up. On Alpha's it kmallocs a buffer
3598 ** into which the packet is copied.
3599 */
3600 static struct sk_buff *
3601 de4x5_alloc_rx_buff(struct net_device *dev, int index, int len)
3602 {
3603     struct de4x5_private *lp = netdev_priv(dev);
3604     struct sk_buff *p;
3605
3606 #if !defined(__alpha__) && !defined(__powerpc__) && !defined(CONFIG_SPARC) && !defined(DE4X5_DO_MEMCPY)
3607     struct sk_buff *ret;
3608     u_long i=0, tmp;
3609
3610     p = dev_alloc_skb(IEEE802_3_SZ + DE4X5_ALIGN + 2);
3611     if (!p) return NULL;
3612
3613     tmp = virt_to_bus(p->data);
3614     i = ((tmp + DE4X5_ALIGN) & ~DE4X5_ALIGN) - tmp;
3615     skb_reserve(p, i);
3616     lp->rx_ring[index].buf = cpu_to_le32(tmp + i);
3617
3618     ret = lp->rx_skb[index];
3619     lp->rx_skb[index] = p;
3620
3621     if ((u_long) ret > 1) {
3622         skb_put(ret, len);
3623     }
3624
3625     return ret;
3626
3627 #else
3628     if (lp->state != OPEN) return (struct sk_buff *)1; /* Fake out the open */
3629
3630     p = dev_alloc_skb(len + 2);
3631     if (!p) return NULL;
3632
3633     skb_reserve(p, 2);                                 /* Align */
3634     if (index < lp->rx_old) {                          /* Wrapped buffer */
3635         short tlen = (lp->rxRingSize - lp->rx_old) * RX_BUFF_SZ;
3636         memcpy(skb_put(p,tlen),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,tlen);
3637         memcpy(skb_put(p,len-tlen),lp->rx_bufs,len-tlen);
3638     } else {                                           /* Linear buffer */
3639         memcpy(skb_put(p,len),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,len);
3640     }
3641
3642     return p;
3643 #endif
3644 }
3645
3646 static void
3647 de4x5_free_rx_buffs(struct net_device *dev)
3648 {
3649     struct de4x5_private *lp = netdev_priv(dev);
3650     int i;
3651
3652     for (i=0; i<lp->rxRingSize; i++) {
3653         if ((u_long) lp->rx_skb[i] > 1) {
3654             dev_kfree_skb(lp->rx_skb[i]);
3655         }
3656         lp->rx_ring[i].status = 0;
3657         lp->rx_skb[i] = (struct sk_buff *)1;    /* Dummy entry */
3658     }
3659 }
3660
3661 static void
3662 de4x5_free_tx_buffs(struct net_device *dev)
3663 {
3664     struct de4x5_private *lp = netdev_priv(dev);
3665     int i;
3666
3667     for (i=0; i<lp->txRingSize; i++) {
3668         if (lp->tx_skb[i])
3669             de4x5_free_tx_buff(lp, i);
3670         lp->tx_ring[i].status = 0;
3671     }
3672
3673     /* Unload the locally queued packets */
3674     __skb_queue_purge(&lp->cache.queue);
3675 }
3676
3677 /*
3678 ** When a user pulls a connection, the DECchip can end up in a
3679 ** 'running - waiting for end of transmission' state. This means that we
3680 ** have to perform a chip soft reset to ensure that we can synchronize
3681 ** the hardware and software and make any media probes using a loopback
3682 ** packet meaningful.
3683 */
3684 static void
3685 de4x5_save_skbs(struct net_device *dev)
3686 {
3687     struct de4x5_private *lp = netdev_priv(dev);
3688     u_long iobase = dev->base_addr;
3689     s32 omr;
3690
3691     if (!lp->cache.save_cnt) {
3692         STOP_DE4X5;
3693         de4x5_tx(dev);                          /* Flush any sent skb's */
3694         de4x5_free_tx_buffs(dev);
3695         de4x5_cache_state(dev, DE4X5_SAVE_STATE);
3696         de4x5_sw_reset(dev);
3697         de4x5_cache_state(dev, DE4X5_RESTORE_STATE);
3698         lp->cache.save_cnt++;
3699         START_DE4X5;
3700     }
3701 }
3702
3703 static void
3704 de4x5_rst_desc_ring(struct net_device *dev)
3705 {
3706     struct de4x5_private *lp = netdev_priv(dev);
3707     u_long iobase = dev->base_addr;
3708     int i;
3709     s32 omr;
3710
3711     if (lp->cache.save_cnt) {
3712         STOP_DE4X5;
3713         outl(lp->dma_rings, DE4X5_RRBA);
3714         outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc),
3715              DE4X5_TRBA);
3716
3717         lp->rx_new = lp->rx_old = 0;
3718         lp->tx_new = lp->tx_old = 0;
3719
3720         for (i = 0; i < lp->rxRingSize; i++) {
3721             lp->rx_ring[i].status = cpu_to_le32(R_OWN);
3722         }
3723
3724         for (i = 0; i < lp->txRingSize; i++) {
3725             lp->tx_ring[i].status = cpu_to_le32(0);
3726         }
3727
3728         barrier();
3729         lp->cache.save_cnt--;
3730         START_DE4X5;
3731     }
3732 }
3733
3734 static void
3735 de4x5_cache_state(struct net_device *dev, int flag)
3736 {
3737     struct de4x5_private *lp = netdev_priv(dev);
3738     u_long iobase = dev->base_addr;
3739
3740     switch(flag) {
3741       case DE4X5_SAVE_STATE:
3742         lp->cache.csr0 = inl(DE4X5_BMR);
3743         lp->cache.csr6 = (inl(DE4X5_OMR) & ~(OMR_ST | OMR_SR));
3744         lp->cache.csr7 = inl(DE4X5_IMR);
3745         break;
3746
3747       case DE4X5_RESTORE_STATE:
3748         outl(lp->cache.csr0, DE4X5_BMR);
3749         outl(lp->cache.csr6, DE4X5_OMR);
3750         outl(lp->cache.csr7, DE4X5_IMR);
3751         if (lp->chipset == DC21140) {
3752             gep_wr(lp->cache.gepc, dev);
3753             gep_wr(lp->cache.gep, dev);
3754         } else {
3755             reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14,
3756                                                               lp->cache.csr15);
3757         }
3758         break;
3759     }
3760 }
3761
3762 static void
3763 de4x5_put_cache(struct net_device *dev, struct sk_buff *skb)
3764 {
3765     struct de4x5_private *lp = netdev_priv(dev);
3766
3767     __skb_queue_tail(&lp->cache.queue, skb);
3768 }
3769
3770 static void
3771 de4x5_putb_cache(struct net_device *dev, struct sk_buff *skb)
3772 {
3773     struct de4x5_private *lp = netdev_priv(dev);
3774
3775     __skb_queue_head(&lp->cache.queue, skb);
3776 }
3777
3778 static struct sk_buff *
3779 de4x5_get_cache(struct net_device *dev)
3780 {
3781     struct de4x5_private *lp = netdev_priv(dev);
3782
3783     return __skb_dequeue(&lp->cache.queue);
3784 }
3785
3786 /*
3787 ** Check the Auto Negotiation State. Return OK when a link pass interrupt
3788 ** is received and the auto-negotiation status is NWAY OK.
3789 */
3790 static int
3791 test_ans(struct net_device *dev, s32 irqs, s32 irq_mask, s32 msec)
3792 {
3793     struct de4x5_private *lp = netdev_priv(dev);
3794     u_long iobase = dev->base_addr;
3795     s32 sts, ans;
3796
3797     if (lp->timeout < 0) {
3798         lp->timeout = msec/100;
3799         outl(irq_mask, DE4X5_IMR);
3800
3801         /* clear all pending interrupts */
3802         sts = inl(DE4X5_STS);
3803         outl(sts, DE4X5_STS);
3804     }
3805
3806     ans = inl(DE4X5_SISR) & SISR_ANS;
3807     sts = inl(DE4X5_STS) & ~TIMER_CB;
3808
3809     if (!(sts & irqs) && (ans ^ ANS_NWOK) && --lp->timeout) {
3810         sts = 100 | TIMER_CB;
3811     } else {
3812         lp->timeout = -1;
3813     }
3814
3815     return sts;
3816 }
3817
3818 static void
3819 de4x5_setup_intr(struct net_device *dev)
3820 {
3821     struct de4x5_private *lp = netdev_priv(dev);
3822     u_long iobase = dev->base_addr;
3823     s32 imr, sts;
3824
3825     if (inl(DE4X5_OMR) & OMR_SR) {   /* Only unmask if TX/RX is enabled */
3826         imr = 0;
3827         UNMASK_IRQs;
3828         sts = inl(DE4X5_STS);        /* Reset any pending (stale) interrupts */
3829         outl(sts, DE4X5_STS);
3830         ENABLE_IRQs;
3831     }
3832 }
3833
3834 /*
3835 **
3836 */
3837 static void
3838 reset_init_sia(struct net_device *dev, s32 csr13, s32 csr14, s32 csr15)
3839 {
3840     struct de4x5_private *lp = netdev_priv(dev);
3841     u_long iobase = dev->base_addr;
3842
3843     RESET_SIA;
3844     if (lp->useSROM) {
3845         if (lp->ibn == 3) {
3846             srom_exec(dev, lp->phy[lp->active].rst);
3847             srom_exec(dev, lp->phy[lp->active].gep);
3848             outl(1, DE4X5_SICR);
3849             return;
3850         } else {
3851             csr15 = lp->cache.csr15;
3852             csr14 = lp->cache.csr14;
3853             csr13 = lp->cache.csr13;
3854             outl(csr15 | lp->cache.gepc, DE4X5_SIGR);
3855             outl(csr15 | lp->cache.gep, DE4X5_SIGR);
3856         }
3857     } else {
3858         outl(csr15, DE4X5_SIGR);
3859     }
3860     outl(csr14, DE4X5_STRR);
3861     outl(csr13, DE4X5_SICR);
3862
3863     mdelay(10);
3864 }
3865
3866 /*
3867 ** Create a loopback ethernet packet
3868 */
3869 static void
3870 create_packet(struct net_device *dev, char *frame, int len)
3871 {
3872     int i;
3873     char *buf = frame;
3874
3875     for (i=0; i<ETH_ALEN; i++) {             /* Use this source address */
3876         *buf++ = dev->dev_addr[i];
3877     }
3878     for (i=0; i<ETH_ALEN; i++) {             /* Use this destination address */
3879         *buf++ = dev->dev_addr[i];
3880     }
3881
3882     *buf++ = 0;                              /* Packet length (2 bytes) */
3883     *buf++ = 1;
3884 }
3885
3886 /*
3887 ** Look for a particular board name in the EISA configuration space
3888 */
3889 static int
3890 EISA_signature(char *name, struct device *device)
3891 {
3892     int i, status = 0, siglen = ARRAY_SIZE(de4x5_signatures);
3893     struct eisa_device *edev;
3894
3895     *name = '\0';
3896     edev = to_eisa_device (device);
3897     i = edev->id.driver_data;
3898
3899     if (i >= 0 && i < siglen) {
3900             strcpy (name, de4x5_signatures[i]);
3901             status = 1;
3902     }
3903
3904     return status;                         /* return the device name string */
3905 }
3906
3907 /*
3908 ** Look for a particular board name in the PCI configuration space
3909 */
3910 static int
3911 PCI_signature(char *name, struct de4x5_private *lp)
3912 {
3913     int i, status = 0, siglen = ARRAY_SIZE(de4x5_signatures);
3914
3915     if (lp->chipset == DC21040) {
3916         strcpy(name, "DE434/5");
3917         return status;
3918     } else {                           /* Search for a DEC name in the SROM */
3919         int tmp = *((char *)&lp->srom + 19) * 3;
3920         strncpy(name, (char *)&lp->srom + 26 + tmp, 8);
3921     }
3922     name[8] = '\0';
3923     for (i=0; i<siglen; i++) {
3924         if (strstr(name,de4x5_signatures[i])!=NULL) break;
3925     }
3926     if (i == siglen) {
3927         if (dec_only) {
3928             *name = '\0';
3929         } else {                        /* Use chip name to avoid confusion */
3930             strcpy(name, (((lp->chipset == DC21040) ? "DC21040" :
3931                            ((lp->chipset == DC21041) ? "DC21041" :
3932                             ((lp->chipset == DC21140) ? "DC21140" :
3933                              ((lp->chipset == DC21142) ? "DC21142" :
3934                               ((lp->chipset == DC21143) ? "DC21143" : "UNKNOWN"
3935                              )))))));
3936         }
3937         if (lp->chipset != DC21041) {
3938             lp->useSROM = true;             /* card is not recognisably DEC */
3939         }
3940     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
3941         lp->useSROM = true;
3942     }
3943
3944     return status;
3945 }
3946
3947 /*
3948 ** Set up the Ethernet PROM counter to the start of the Ethernet address on
3949 ** the DC21040, else  read the SROM for the other chips.
3950 ** The SROM may not be present in a multi-MAC card, so first read the
3951 ** MAC address and check for a bad address. If there is a bad one then exit
3952 ** immediately with the prior srom contents intact (the h/w address will
3953 ** be fixed up later).
3954 */
3955 static void
3956 DevicePresent(struct net_device *dev, u_long aprom_addr)
3957 {
3958     int i, j=0;
3959     struct de4x5_private *lp = netdev_priv(dev);
3960
3961     if (lp->chipset == DC21040) {
3962         if (lp->bus == EISA) {
3963             enet_addr_rst(aprom_addr); /* Reset Ethernet Address ROM Pointer */
3964         } else {
3965             outl(0, aprom_addr);       /* Reset Ethernet Address ROM Pointer */
3966         }
3967     } else {                           /* Read new srom */
3968         u_short tmp;
3969         __le16 *p = (__le16 *)((char *)&lp->srom + SROM_HWADD);
3970         for (i=0; i<(ETH_ALEN>>1); i++) {
3971             tmp = srom_rd(aprom_addr, (SROM_HWADD>>1) + i);
3972             j += tmp;   /* for check for 0:0:0:0:0:0 or ff:ff:ff:ff:ff:ff */
3973             *p = cpu_to_le16(tmp);
3974         }
3975         if (j == 0 || j == 3 * 0xffff) {
3976                 /* could get 0 only from all-0 and 3 * 0xffff only from all-1 */
3977                 return;
3978         }
3979
3980         p = (__le16 *)&lp->srom;
3981         for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) {
3982             tmp = srom_rd(aprom_addr, i);
3983             *p++ = cpu_to_le16(tmp);
3984         }
3985         de4x5_dbg_srom((struct de4x5_srom *)&lp->srom);
3986     }
3987 }
3988
3989 /*
3990 ** Since the write on the Enet PROM register doesn't seem to reset the PROM
3991 ** pointer correctly (at least on my DE425 EISA card), this routine should do
3992 ** it...from depca.c.
3993 */
3994 static void
3995 enet_addr_rst(u_long aprom_addr)
3996 {
3997     union {
3998         struct {
3999             u32 a;
4000             u32 b;
4001         } llsig;
4002         char Sig[sizeof(u32) << 1];
4003     } dev;
4004     short sigLength=0;
4005     s8 data;
4006     int i, j;
4007
4008     dev.llsig.a = ETH_PROM_SIG;
4009     dev.llsig.b = ETH_PROM_SIG;
4010     sigLength = sizeof(u32) << 1;
4011
4012     for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) {
4013         data = inb(aprom_addr);
4014         if (dev.Sig[j] == data) {    /* track signature */
4015             j++;
4016         } else {                     /* lost signature; begin search again */
4017             if (data == dev.Sig[0]) {  /* rare case.... */
4018                 j=1;
4019             } else {
4020                 j=0;
4021             }
4022         }
4023     }
4024 }
4025
4026 /*
4027 ** For the bad status case and no SROM, then add one to the previous
4028 ** address. However, need to add one backwards in case we have 0xff
4029 ** as one or more of the bytes. Only the last 3 bytes should be checked
4030 ** as the first three are invariant - assigned to an organisation.
4031 */
4032 static int
4033 get_hw_addr(struct net_device *dev)
4034 {
4035     u_long iobase = dev->base_addr;
4036     int broken, i, k, tmp, status = 0;
4037     u_short j,chksum;
4038     struct de4x5_private *lp = netdev_priv(dev);
4039
4040     broken = de4x5_bad_srom(lp);
4041
4042     for (i=0,k=0,j=0;j<3;j++) {
4043         k <<= 1;
4044         if (k > 0xffff) k-=0xffff;
4045
4046         if (lp->bus == PCI) {
4047             if (lp->chipset == DC21040) {
4048                 while ((tmp = inl(DE4X5_APROM)) < 0);
4049                 k += (u_char) tmp;
4050                 dev->dev_addr[i++] = (u_char) tmp;
4051                 while ((tmp = inl(DE4X5_APROM)) < 0);
4052                 k += (u_short) (tmp << 8);
4053                 dev->dev_addr[i++] = (u_char) tmp;
4054             } else if (!broken) {
4055                 dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
4056                 dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
4057             } else if ((broken == SMC) || (broken == ACCTON)) {
4058                 dev->dev_addr[i] = *((u_char *)&lp->srom + i); i++;
4059                 dev->dev_addr[i] = *((u_char *)&lp->srom + i); i++;
4060             }
4061         } else {
4062             k += (u_char) (tmp = inb(EISA_APROM));
4063             dev->dev_addr[i++] = (u_char) tmp;
4064             k += (u_short) ((tmp = inb(EISA_APROM)) << 8);
4065             dev->dev_addr[i++] = (u_char) tmp;
4066         }
4067
4068         if (k > 0xffff) k-=0xffff;
4069     }
4070     if (k == 0xffff) k=0;
4071
4072     if (lp->bus == PCI) {
4073         if (lp->chipset == DC21040) {
4074             while ((tmp = inl(DE4X5_APROM)) < 0);
4075             chksum = (u_char) tmp;
4076             while ((tmp = inl(DE4X5_APROM)) < 0);
4077             chksum |= (u_short) (tmp << 8);
4078             if ((k != chksum) && (dec_only)) status = -1;
4079         }
4080     } else {
4081         chksum = (u_char) inb(EISA_APROM);
4082         chksum |= (u_short) (inb(EISA_APROM) << 8);
4083         if ((k != chksum) && (dec_only)) status = -1;
4084     }
4085
4086     /* If possible, try to fix a broken card - SMC only so far */
4087     srom_repair(dev, broken);
4088
4089 #ifdef CONFIG_PPC_PMAC
4090     /*
4091     ** If the address starts with 00 a0, we have to bit-reverse
4092     ** each byte of the address.
4093     */
4094     if ( machine_is(powermac) &&
4095          (dev->dev_addr[0] == 0) &&
4096          (dev->dev_addr[1] == 0xa0) )
4097     {
4098             for (i = 0; i < ETH_ALEN; ++i)
4099             {
4100                     int x = dev->dev_addr[i];
4101                     x = ((x & 0xf) << 4) + ((x & 0xf0) >> 4);
4102                     x = ((x & 0x33) << 2) + ((x & 0xcc) >> 2);
4103                     dev->dev_addr[i] = ((x & 0x55) << 1) + ((x & 0xaa) >> 1);
4104             }
4105     }
4106 #endif /* CONFIG_PPC_PMAC */
4107
4108     /* Test for a bad enet address */
4109     status = test_bad_enet(dev, status);
4110
4111     return status;
4112 }
4113
4114 /*
4115 ** Test for enet addresses in the first 32 bytes. The built-in strncmp
4116 ** didn't seem to work here...?
4117 */
4118 static int
4119 de4x5_bad_srom(struct de4x5_private *lp)
4120 {
4121     int i, status = 0;
4122
4123     for (i = 0; i < ARRAY_SIZE(enet_det); i++) {
4124         if (!de4x5_strncmp((char *)&lp->srom, (char *)&enet_det[i], 3) &&
4125             !de4x5_strncmp((char *)&lp->srom+0x10, (char *)&enet_det[i], 3)) {
4126             if (i == 0) {
4127                 status = SMC;
4128             } else if (i == 1) {
4129                 status = ACCTON;
4130             }
4131             break;
4132         }
4133     }
4134
4135     return status;
4136 }
4137
4138 static int
4139 de4x5_strncmp(char *a, char *b, int n)
4140 {
4141     int ret=0;
4142
4143     for (;n && !ret; n--) {
4144         ret = *a++ - *b++;
4145     }
4146
4147     return ret;
4148 }
4149
4150 static void
4151 srom_repair(struct net_device *dev, int card)
4152 {
4153     struct de4x5_private *lp = netdev_priv(dev);
4154
4155     switch(card) {
4156       case SMC:
4157         memset((char *)&lp->srom, 0, sizeof(struct de4x5_srom));
4158         memcpy(lp->srom.ieee_addr, (char *)dev->dev_addr, ETH_ALEN);
4159         memcpy(lp->srom.info, (char *)&srom_repair_info[SMC-1], 100);
4160         lp->useSROM = true;
4161         break;
4162     }
4163 }
4164
4165 /*
4166 ** Assume that the irq's do not follow the PCI spec - this is seems
4167 ** to be true so far (2 for 2).
4168 */
4169 static int
4170 test_bad_enet(struct net_device *dev, int status)
4171 {
4172     struct de4x5_private *lp = netdev_priv(dev);
4173     int i, tmp;
4174
4175     for (tmp=0,i=0; i<ETH_ALEN; i++) tmp += (u_char)dev->dev_addr[i];
4176     if ((tmp == 0) || (tmp == 0x5fa)) {
4177         if ((lp->chipset == last.chipset) &&
4178             (lp->bus_num == last.bus) && (lp->bus_num > 0)) {
4179             for (i=0; i<ETH_ALEN; i++) dev->dev_addr[i] = last.addr[i];
4180             for (i=ETH_ALEN-1; i>2; --i) {
4181                 dev->dev_addr[i] += 1;
4182                 if (dev->dev_addr[i] != 0) break;
4183             }
4184             for (i=0; i<ETH_ALEN; i++) last.addr[i] = dev->dev_addr[i];
4185             if (!an_exception(lp)) {
4186                 dev->irq = last.irq;
4187             }
4188
4189             status = 0;
4190         }
4191     } else if (!status) {
4192         last.chipset = lp->chipset;
4193         last.bus = lp->bus_num;
4194         last.irq = dev->irq;
4195         for (i=0; i<ETH_ALEN; i++) last.addr[i] = dev->dev_addr[i];
4196     }
4197
4198     return status;
4199 }
4200
4201 /*
4202 ** List of board exceptions with correctly wired IRQs
4203 */
4204 static int
4205 an_exception(struct de4x5_private *lp)
4206 {
4207     if ((*(u_short *)lp->srom.sub_vendor_id == 0x00c0) &&
4208         (*(u_short *)lp->srom.sub_system_id == 0x95e0)) {
4209         return -1;
4210     }
4211
4212     return 0;
4213 }
4214
4215 /*
4216 ** SROM Read
4217 */
4218 static short
4219 srom_rd(u_long addr, u_char offset)
4220 {
4221     sendto_srom(SROM_RD | SROM_SR, addr);
4222
4223     srom_latch(SROM_RD | SROM_SR | DT_CS, addr);
4224     srom_command(SROM_RD | SROM_SR | DT_IN | DT_CS, addr);
4225     srom_address(SROM_RD | SROM_SR | DT_CS, addr, offset);
4226
4227     return srom_data(SROM_RD | SROM_SR | DT_CS, addr);
4228 }
4229
4230 static void
4231 srom_latch(u_int command, u_long addr)
4232 {
4233     sendto_srom(command, addr);
4234     sendto_srom(command | DT_CLK, addr);
4235     sendto_srom(command, addr);
4236 }
4237
4238 static void
4239 srom_command(u_int command, u_long addr)
4240 {
4241     srom_latch(command, addr);
4242     srom_latch(command, addr);
4243     srom_latch((command & 0x0000ff00) | DT_CS, addr);
4244 }
4245
4246 static void
4247 srom_address(u_int command, u_long addr, u_char offset)
4248 {
4249     int i, a;
4250
4251     a = offset << 2;
4252     for (i=0; i<6; i++, a <<= 1) {
4253         srom_latch(command | ((a & 0x80) ? DT_IN : 0), addr);
4254     }
4255     udelay(1);
4256
4257     i = (getfrom_srom(addr) >> 3) & 0x01;
4258 }
4259
4260 static short
4261 srom_data(u_int command, u_long addr)
4262 {
4263     int i;
4264     short word = 0;
4265     s32 tmp;
4266
4267     for (i=0; i<16; i++) {
4268         sendto_srom(command  | DT_CLK, addr);
4269         tmp = getfrom_srom(addr);
4270         sendto_srom(command, addr);
4271
4272         word = (word << 1) | ((tmp >> 3) & 0x01);
4273     }
4274
4275     sendto_srom(command & 0x0000ff00, addr);
4276
4277     return word;
4278 }
4279
4280 /*
4281 static void
4282 srom_busy(u_int command, u_long addr)
4283 {
4284    sendto_srom((command & 0x0000ff00) | DT_CS, addr);
4285
4286    while (!((getfrom_srom(addr) >> 3) & 0x01)) {
4287        mdelay(1);
4288    }
4289
4290    sendto_srom(command & 0x0000ff00, addr);
4291 }
4292 */
4293
4294 static void
4295 sendto_srom(u_int command, u_long addr)
4296 {
4297     outl(command, addr);
4298     udelay(1);
4299 }
4300
4301 static int
4302 getfrom_srom(u_long addr)
4303 {
4304     s32 tmp;
4305
4306     tmp = inl(addr);
4307     udelay(1);
4308
4309     return tmp;
4310 }
4311
4312 static int
4313 srom_infoleaf_info(struct net_device *dev)
4314 {
4315     struct de4x5_private *lp = netdev_priv(dev);
4316     int i, count;
4317     u_char *p;
4318
4319     /* Find the infoleaf decoder function that matches this chipset */
4320     for (i=0; i<INFOLEAF_SIZE; i++) {
4321         if (lp->chipset == infoleaf_array[i].chipset) break;
4322     }
4323     if (i == INFOLEAF_SIZE) {
4324         lp->useSROM = false;
4325         printk("%s: Cannot find correct chipset for SROM decoding!\n",
4326                                                                   dev->name);
4327         return -ENXIO;
4328     }
4329
4330     lp->infoleaf_fn = infoleaf_array[i].fn;
4331
4332     /* Find the information offset that this function should use */
4333     count = *((u_char *)&lp->srom + 19);
4334     p  = (u_char *)&lp->srom + 26;
4335
4336     if (count > 1) {
4337         for (i=count; i; --i, p+=3) {
4338             if (lp->device == *p) break;
4339         }
4340         if (i == 0) {
4341             lp->useSROM = false;
4342             printk("%s: Cannot find correct PCI device [%d] for SROM decoding!\n",
4343                                                        dev->name, lp->device);
4344             return -ENXIO;
4345         }
4346     }
4347
4348         lp->infoleaf_offset = get_unaligned_le16(p + 1);
4349
4350     return 0;
4351 }
4352
4353 /*
4354 ** This routine loads any type 1 or 3 MII info into the mii device
4355 ** struct and executes any type 5 code to reset PHY devices for this
4356 ** controller.
4357 ** The info for the MII devices will be valid since the index used
4358 ** will follow the discovery process from MII address 1-31 then 0.
4359 */
4360 static void
4361 srom_init(struct net_device *dev)
4362 {
4363     struct de4x5_private *lp = netdev_priv(dev);
4364     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4365     u_char count;
4366
4367     p+=2;
4368     if (lp->chipset == DC21140) {
4369         lp->cache.gepc = (*p++ | GEP_CTRL);
4370         gep_wr(lp->cache.gepc, dev);
4371     }
4372
4373     /* Block count */
4374     count = *p++;
4375
4376     /* Jump the infoblocks to find types */
4377     for (;count; --count) {
4378         if (*p < 128) {
4379             p += COMPACT_LEN;
4380         } else if (*(p+1) == 5) {
4381             type5_infoblock(dev, 1, p);
4382             p += ((*p & BLOCK_LEN) + 1);
4383         } else if (*(p+1) == 4) {
4384             p += ((*p & BLOCK_LEN) + 1);
4385         } else if (*(p+1) == 3) {
4386             type3_infoblock(dev, 1, p);
4387             p += ((*p & BLOCK_LEN) + 1);
4388         } else if (*(p+1) == 2) {
4389             p += ((*p & BLOCK_LEN) + 1);
4390         } else if (*(p+1) == 1) {
4391             type1_infoblock(dev, 1, p);
4392             p += ((*p & BLOCK_LEN) + 1);
4393         } else {
4394             p += ((*p & BLOCK_LEN) + 1);
4395         }
4396     }
4397 }
4398
4399 /*
4400 ** A generic routine that writes GEP control, data and reset information
4401 ** to the GEP register (21140) or csr15 GEP portion (2114[23]).
4402 */
4403 static void
4404 srom_exec(struct net_device *dev, u_char *p)
4405 {
4406     struct de4x5_private *lp = netdev_priv(dev);
4407     u_long iobase = dev->base_addr;
4408     u_char count = (p ? *p++ : 0);
4409     u_short *w = (u_short *)p;
4410
4411     if (((lp->ibn != 1) && (lp->ibn != 3) && (lp->ibn != 5)) || !count) return;
4412
4413     if (lp->chipset != DC21140) RESET_SIA;
4414
4415     while (count--) {
4416         gep_wr(((lp->chipset==DC21140) && (lp->ibn!=5) ?
4417                                                    *p++ : get_unaligned_le16(w++)), dev);
4418         mdelay(2);                          /* 2ms per action */
4419     }
4420
4421     if (lp->chipset != DC21140) {
4422         outl(lp->cache.csr14, DE4X5_STRR);
4423         outl(lp->cache.csr13, DE4X5_SICR);
4424     }
4425 }
4426
4427 /*
4428 ** Basically this function is a NOP since it will never be called,
4429 ** unless I implement the DC21041 SROM functions. There's no need
4430 ** since the existing code will be satisfactory for all boards.
4431 */
4432 static int
4433 dc21041_infoleaf(struct net_device *dev)
4434 {
4435     return DE4X5_AUTOSENSE_MS;
4436 }
4437
4438 static int
4439 dc21140_infoleaf(struct net_device *dev)
4440 {
4441     struct de4x5_private *lp = netdev_priv(dev);
4442     u_char count = 0;
4443     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4444     int next_tick = DE4X5_AUTOSENSE_MS;
4445
4446     /* Read the connection type */
4447     p+=2;
4448
4449     /* GEP control */
4450     lp->cache.gepc = (*p++ | GEP_CTRL);
4451
4452     /* Block count */
4453     count = *p++;
4454
4455     /* Recursively figure out the info blocks */
4456     if (*p < 128) {
4457         next_tick = dc_infoblock[COMPACT](dev, count, p);
4458     } else {
4459         next_tick = dc_infoblock[*(p+1)](dev, count, p);
4460     }
4461
4462     if (lp->tcount == count) {
4463         lp->media = NC;
4464         if (lp->media != lp->c_media) {
4465             de4x5_dbg_media(dev);
4466             lp->c_media = lp->media;
4467         }
4468         lp->media = INIT;
4469         lp->tcount = 0;
4470         lp->tx_enable = false;
4471     }
4472
4473     return next_tick & ~TIMER_CB;
4474 }
4475
4476 static int
4477 dc21142_infoleaf(struct net_device *dev)
4478 {
4479     struct de4x5_private *lp = netdev_priv(dev);
4480     u_char count = 0;
4481     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4482     int next_tick = DE4X5_AUTOSENSE_MS;
4483
4484     /* Read the connection type */
4485     p+=2;
4486
4487     /* Block count */
4488     count = *p++;
4489
4490     /* Recursively figure out the info blocks */
4491     if (*p < 128) {
4492         next_tick = dc_infoblock[COMPACT](dev, count, p);
4493     } else {
4494         next_tick = dc_infoblock[*(p+1)](dev, count, p);
4495     }
4496
4497     if (lp->tcount == count) {
4498         lp->media = NC;
4499         if (lp->media != lp->c_media) {
4500             de4x5_dbg_media(dev);
4501             lp->c_media = lp->media;
4502         }
4503         lp->media = INIT;
4504         lp->tcount = 0;
4505         lp->tx_enable = false;
4506     }
4507
4508     return next_tick & ~TIMER_CB;
4509 }
4510
4511 static int
4512 dc21143_infoleaf(struct net_device *dev)
4513 {
4514     struct de4x5_private *lp = netdev_priv(dev);
4515     u_char count = 0;
4516     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4517     int next_tick = DE4X5_AUTOSENSE_MS;
4518
4519     /* Read the connection type */
4520     p+=2;
4521
4522     /* Block count */
4523     count = *p++;
4524
4525     /* Recursively figure out the info blocks */
4526     if (*p < 128) {
4527         next_tick = dc_infoblock[COMPACT](dev, count, p);
4528     } else {
4529         next_tick = dc_infoblock[*(p+1)](dev, count, p);
4530     }
4531     if (lp->tcount == count) {
4532         lp->media = NC;
4533         if (lp->media != lp->c_media) {
4534             de4x5_dbg_media(dev);
4535             lp->c_media = lp->media;
4536         }
4537         lp->media = INIT;
4538         lp->tcount = 0;
4539         lp->tx_enable = false;
4540     }
4541
4542     return next_tick & ~TIMER_CB;
4543 }
4544
4545 /*
4546 ** The compact infoblock is only designed for DC21140[A] chips, so
4547 ** we'll reuse the dc21140m_autoconf function. Non MII media only.
4548 */
4549 static int
4550 compact_infoblock(struct net_device *dev, u_char count, u_char *p)
4551 {
4552     struct de4x5_private *lp = netdev_priv(dev);
4553     u_char flags, csr6;
4554
4555     /* Recursively figure out the info blocks */
4556     if (--count > lp->tcount) {
4557         if (*(p+COMPACT_LEN) < 128) {
4558             return dc_infoblock[COMPACT](dev, count, p+COMPACT_LEN);
4559         } else {
4560             return dc_infoblock[*(p+COMPACT_LEN+1)](dev, count, p+COMPACT_LEN);
4561         }
4562     }
4563
4564     if ((lp->media == INIT) && (lp->timeout < 0)) {
4565         lp->ibn = COMPACT;
4566         lp->active = 0;
4567         gep_wr(lp->cache.gepc, dev);
4568         lp->infoblock_media = (*p++) & COMPACT_MC;
4569         lp->cache.gep = *p++;
4570         csr6 = *p++;
4571         flags = *p++;
4572
4573         lp->asBitValid = (flags & 0x80) ? 0 : -1;
4574         lp->defMedium = (flags & 0x40) ? -1 : 0;
4575         lp->asBit = 1 << ((csr6 >> 1) & 0x07);
4576         lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
4577         lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
4578         lp->useMII = false;
4579
4580         de4x5_switch_mac_port(dev);
4581     }
4582
4583     return dc21140m_autoconf(dev);
4584 }
4585
4586 /*
4587 ** This block describes non MII media for the DC21140[A] only.
4588 */
4589 static int
4590 type0_infoblock(struct net_device *dev, u_char count, u_char *p)
4591 {
4592     struct de4x5_private *lp = netdev_priv(dev);
4593     u_char flags, csr6, len = (*p & BLOCK_LEN)+1;
4594
4595     /* Recursively figure out the info blocks */
4596     if (--count > lp->tcount) {
4597         if (*(p+len) < 128) {
4598             return dc_infoblock[COMPACT](dev, count, p+len);
4599         } else {
4600             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4601         }
4602     }
4603
4604     if ((lp->media == INIT) && (lp->timeout < 0)) {
4605         lp->ibn = 0;
4606         lp->active = 0;
4607         gep_wr(lp->cache.gepc, dev);
4608         p+=2;
4609         lp->infoblock_media = (*p++) & BLOCK0_MC;
4610         lp->cache.gep = *p++;
4611         csr6 = *p++;
4612         flags = *p++;
4613
4614         lp->asBitValid = (flags & 0x80) ? 0 : -1;
4615         lp->defMedium = (flags & 0x40) ? -1 : 0;
4616         lp->asBit = 1 << ((csr6 >> 1) & 0x07);
4617         lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
4618         lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
4619         lp->useMII = false;
4620
4621         de4x5_switch_mac_port(dev);
4622     }
4623
4624     return dc21140m_autoconf(dev);
4625 }
4626
4627 /* These functions are under construction! */
4628
4629 static int
4630 type1_infoblock(struct net_device *dev, u_char count, u_char *p)
4631 {
4632     struct de4x5_private *lp = netdev_priv(dev);
4633     u_char len = (*p & BLOCK_LEN)+1;
4634
4635     /* Recursively figure out the info blocks */
4636     if (--count > lp->tcount) {
4637         if (*(p+len) < 128) {
4638             return dc_infoblock[COMPACT](dev, count, p+len);
4639         } else {
4640             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4641         }
4642     }
4643
4644     p += 2;
4645     if (lp->state == INITIALISED) {
4646         lp->ibn = 1;
4647         lp->active = *p++;
4648         lp->phy[lp->active].gep = (*p ? p : NULL); p += (*p + 1);
4649         lp->phy[lp->active].rst = (*p ? p : NULL); p += (*p + 1);
4650         lp->phy[lp->active].mc  = get_unaligned_le16(p); p += 2;
4651         lp->phy[lp->active].ana = get_unaligned_le16(p); p += 2;
4652         lp->phy[lp->active].fdx = get_unaligned_le16(p); p += 2;
4653         lp->phy[lp->active].ttm = get_unaligned_le16(p);
4654         return 0;
4655     } else if ((lp->media == INIT) && (lp->timeout < 0)) {
4656         lp->ibn = 1;
4657         lp->active = *p;
4658         lp->infoblock_csr6 = OMR_MII_100;
4659         lp->useMII = true;
4660         lp->infoblock_media = ANS;
4661
4662         de4x5_switch_mac_port(dev);
4663     }
4664
4665     return dc21140m_autoconf(dev);
4666 }
4667
4668 static int
4669 type2_infoblock(struct net_device *dev, u_char count, u_char *p)
4670 {
4671     struct de4x5_private *lp = netdev_priv(dev);
4672     u_char len = (*p & BLOCK_LEN)+1;
4673
4674     /* Recursively figure out the info blocks */
4675     if (--count > lp->tcount) {
4676         if (*(p+len) < 128) {
4677             return dc_infoblock[COMPACT](dev, count, p+len);
4678         } else {
4679             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4680         }
4681     }
4682
4683     if ((lp->media == INIT) && (lp->timeout < 0)) {
4684         lp->ibn = 2;
4685         lp->active = 0;
4686         p += 2;
4687         lp->infoblock_media = (*p) & MEDIA_CODE;
4688
4689         if ((*p++) & EXT_FIELD) {
4690             lp->cache.csr13 = get_unaligned_le16(p); p += 2;
4691             lp->cache.csr14 = get_unaligned_le16(p); p += 2;
4692             lp->cache.csr15 = get_unaligned_le16(p); p += 2;
4693         } else {
4694             lp->cache.csr13 = CSR13;
4695             lp->cache.csr14 = CSR14;
4696             lp->cache.csr15 = CSR15;
4697         }
4698         lp->cache.gepc = ((s32)(get_unaligned_le16(p)) << 16); p += 2;
4699         lp->cache.gep  = ((s32)(get_unaligned_le16(p)) << 16);
4700         lp->infoblock_csr6 = OMR_SIA;
4701         lp->useMII = false;
4702
4703         de4x5_switch_mac_port(dev);
4704     }
4705
4706     return dc2114x_autoconf(dev);
4707 }
4708
4709 static int
4710 type3_infoblock(struct net_device *dev, u_char count, u_char *p)
4711 {
4712     struct de4x5_private *lp = netdev_priv(dev);
4713     u_char len = (*p & BLOCK_LEN)+1;
4714
4715     /* Recursively figure out the info blocks */
4716     if (--count > lp->tcount) {
4717         if (*(p+len) < 128) {
4718             return dc_infoblock[COMPACT](dev, count, p+len);
4719         } else {
4720             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4721         }
4722     }
4723
4724     p += 2;
4725     if (lp->state == INITIALISED) {
4726         lp->ibn = 3;
4727         lp->active = *p++;
4728         if (MOTO_SROM_BUG) lp->active = 0;
4729         lp->phy[lp->active].gep = (*p ? p : NULL); p += (2 * (*p) + 1);
4730         lp->phy[lp->active].rst = (*p ? p : NULL); p += (2 * (*p) + 1);
4731         lp->phy[lp->active].mc  = get_unaligned_le16(p); p += 2;
4732         lp->phy[lp->active].ana = get_unaligned_le16(p); p += 2;
4733         lp->phy[lp->active].fdx = get_unaligned_le16(p); p += 2;
4734         lp->phy[lp->active].ttm = get_unaligned_le16(p); p += 2;
4735         lp->phy[lp->active].mci = *p;
4736         return 0;
4737     } else if ((lp->media == INIT) && (lp->timeout < 0)) {
4738         lp->ibn = 3;
4739         lp->active = *p;
4740         if (MOTO_SROM_BUG) lp->active = 0;
4741         lp->infoblock_csr6 = OMR_MII_100;
4742         lp->useMII = true;
4743         lp->infoblock_media = ANS;
4744
4745         de4x5_switch_mac_port(dev);
4746     }
4747
4748     return dc2114x_autoconf(dev);
4749 }
4750
4751 static int
4752 type4_infoblock(struct net_device *dev, u_char count, u_char *p)
4753 {
4754     struct de4x5_private *lp = netdev_priv(dev);
4755     u_char flags, csr6, len = (*p & BLOCK_LEN)+1;
4756
4757     /* Recursively figure out the info blocks */
4758     if (--count > lp->tcount) {
4759         if (*(p+len) < 128) {
4760             return dc_infoblock[COMPACT](dev, count, p+len);
4761         } else {
4762             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4763         }
4764     }
4765
4766     if ((lp->media == INIT) && (lp->timeout < 0)) {
4767         lp->ibn = 4;
4768         lp->active = 0;
4769         p+=2;
4770         lp->infoblock_media = (*p++) & MEDIA_CODE;
4771         lp->cache.csr13 = CSR13;              /* Hard coded defaults */
4772         lp->cache.csr14 = CSR14;
4773         lp->cache.csr15 = CSR15;
4774         lp->cache.gepc = ((s32)(get_unaligned_le16(p)) << 16); p += 2;
4775         lp->cache.gep  = ((s32)(get_unaligned_le16(p)) << 16); p += 2;
4776         csr6 = *p++;
4777         flags = *p++;
4778
4779         lp->asBitValid = (flags & 0x80) ? 0 : -1;
4780         lp->defMedium = (flags & 0x40) ? -1 : 0;
4781         lp->asBit = 1 << ((csr6 >> 1) & 0x07);
4782         lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
4783         lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
4784         lp->useMII = false;
4785
4786         de4x5_switch_mac_port(dev);
4787     }
4788
4789     return dc2114x_autoconf(dev);
4790 }
4791
4792 /*
4793 ** This block type provides information for resetting external devices
4794 ** (chips) through the General Purpose Register.
4795 */
4796 static int
4797 type5_infoblock(struct net_device *dev, u_char count, u_char *p)
4798 {
4799     struct de4x5_private *lp = netdev_priv(dev);
4800     u_char len = (*p & BLOCK_LEN)+1;
4801
4802     /* Recursively figure out the info blocks */
4803     if (--count > lp->tcount) {
4804         if (*(p+len) < 128) {
4805             return dc_infoblock[COMPACT](dev, count, p+len);
4806         } else {
4807             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4808         }
4809     }
4810
4811     /* Must be initializing to run this code */
4812     if ((lp->state == INITIALISED) || (lp->media == INIT)) {
4813         p+=2;
4814         lp->rst = p;
4815         srom_exec(dev, lp->rst);
4816     }
4817
4818     return DE4X5_AUTOSENSE_MS;
4819 }
4820
4821 /*
4822 ** MII Read/Write
4823 */
4824
4825 static int
4826 mii_rd(u_char phyreg, u_char phyaddr, u_long ioaddr)
4827 {
4828     mii_wdata(MII_PREAMBLE,  2, ioaddr);   /* Start of 34 bit preamble...    */
4829     mii_wdata(MII_PREAMBLE, 32, ioaddr);   /* ...continued                   */
4830     mii_wdata(MII_STRD, 4, ioaddr);        /* SFD and Read operation         */
4831     mii_address(phyaddr, ioaddr);          /* PHY address to be accessed     */
4832     mii_address(phyreg, ioaddr);           /* PHY Register to read           */
4833     mii_ta(MII_STRD, ioaddr);              /* Turn around time - 2 MDC       */
4834
4835     return mii_rdata(ioaddr);              /* Read data                      */
4836 }
4837
4838 static void
4839 mii_wr(int data, u_char phyreg, u_char phyaddr, u_long ioaddr)
4840 {
4841     mii_wdata(MII_PREAMBLE,  2, ioaddr);   /* Start of 34 bit preamble...    */
4842     mii_wdata(MII_PREAMBLE, 32, ioaddr);   /* ...continued                   */
4843     mii_wdata(MII_STWR, 4, ioaddr);        /* SFD and Write operation        */
4844     mii_address(phyaddr, ioaddr);          /* PHY address to be accessed     */
4845     mii_address(phyreg, ioaddr);           /* PHY Register to write          */
4846     mii_ta(MII_STWR, ioaddr);              /* Turn around time - 2 MDC       */
4847     data = mii_swap(data, 16);             /* Swap data bit ordering         */
4848     mii_wdata(data, 16, ioaddr);           /* Write data                     */
4849 }
4850
4851 static int
4852 mii_rdata(u_long ioaddr)
4853 {
4854     int i;
4855     s32 tmp = 0;
4856
4857     for (i=0; i<16; i++) {
4858         tmp <<= 1;
4859         tmp |= getfrom_mii(MII_MRD | MII_RD, ioaddr);
4860     }
4861
4862     return tmp;
4863 }
4864
4865 static void
4866 mii_wdata(int data, int len, u_long ioaddr)
4867 {
4868     int i;
4869
4870     for (i=0; i<len; i++) {
4871         sendto_mii(MII_MWR | MII_WR, data, ioaddr);
4872         data >>= 1;
4873     }
4874 }
4875
4876 static void
4877 mii_address(u_char addr, u_long ioaddr)
4878 {
4879     int i;
4880
4881     addr = mii_swap(addr, 5);
4882     for (i=0; i<5; i++) {
4883         sendto_mii(MII_MWR | MII_WR, addr, ioaddr);
4884         addr >>= 1;
4885     }
4886 }
4887
4888 static void
4889 mii_ta(u_long rw, u_long ioaddr)
4890 {
4891     if (rw == MII_STWR) {
4892         sendto_mii(MII_MWR | MII_WR, 1, ioaddr);
4893         sendto_mii(MII_MWR | MII_WR, 0, ioaddr);
4894     } else {
4895         getfrom_mii(MII_MRD | MII_RD, ioaddr);        /* Tri-state MDIO */
4896     }
4897 }
4898
4899 static int
4900 mii_swap(int data, int len)
4901 {
4902     int i, tmp = 0;
4903
4904     for (i=0; i<len; i++) {
4905         tmp <<= 1;
4906         tmp |= (data & 1);
4907         data >>= 1;
4908     }
4909
4910     return tmp;
4911 }
4912
4913 static void
4914 sendto_mii(u32 command, int data, u_long ioaddr)
4915 {
4916     u32 j;
4917
4918     j = (data & 1) << 17;
4919     outl(command | j, ioaddr);
4920     udelay(1);
4921     outl(command | MII_MDC | j, ioaddr);
4922     udelay(1);
4923 }
4924
4925 static int
4926 getfrom_mii(u32 command, u_long ioaddr)
4927 {
4928     outl(command, ioaddr);
4929     udelay(1);
4930     outl(command | MII_MDC, ioaddr);
4931     udelay(1);
4932
4933     return (inl(ioaddr) >> 19) & 1;
4934 }
4935
4936 /*
4937 ** Here's 3 ways to calculate the OUI from the ID registers.
4938 */
4939 static int
4940 mii_get_oui(u_char phyaddr, u_long ioaddr)
4941 {
4942 /*
4943     union {
4944         u_short reg;
4945         u_char breg[2];
4946     } a;
4947     int i, r2, r3, ret=0;*/
4948     int r2, r3;
4949
4950     /* Read r2 and r3 */
4951     r2 = mii_rd(MII_ID0, phyaddr, ioaddr);
4952     r3 = mii_rd(MII_ID1, phyaddr, ioaddr);
4953                                                 /* SEEQ and Cypress way * /
4954     / * Shuffle r2 and r3 * /
4955     a.reg=0;
4956     r3 = ((r3>>10)|(r2<<6))&0x0ff;
4957     r2 = ((r2>>2)&0x3fff);
4958
4959     / * Bit reverse r3 * /
4960     for (i=0;i<8;i++) {
4961         ret<<=1;
4962         ret |= (r3&1);
4963         r3>>=1;
4964     }
4965
4966     / * Bit reverse r2 * /
4967     for (i=0;i<16;i++) {
4968         a.reg<<=1;
4969         a.reg |= (r2&1);
4970         r2>>=1;
4971     }
4972
4973     / * Swap r2 bytes * /
4974     i=a.breg[0];
4975     a.breg[0]=a.breg[1];
4976     a.breg[1]=i;
4977
4978     return (a.reg<<8)|ret; */                 /* SEEQ and Cypress way */
4979 /*    return (r2<<6)|(u_int)(r3>>10); */      /* NATIONAL and BROADCOM way */
4980     return r2;                                  /* (I did it) My way */
4981 }
4982
4983 /*
4984 ** The SROM spec forces us to search addresses [1-31 0]. Bummer.
4985 */
4986 static int
4987 mii_get_phy(struct net_device *dev)
4988 {
4989     struct de4x5_private *lp = netdev_priv(dev);
4990     u_long iobase = dev->base_addr;
4991     int i, j, k, n, limit=ARRAY_SIZE(phy_info);
4992     int id;
4993
4994     lp->active = 0;
4995     lp->useMII = true;
4996
4997     /* Search the MII address space for possible PHY devices */
4998     for (n=0, lp->mii_cnt=0, i=1; !((i==1) && (n==1)); i=(i+1)%DE4X5_MAX_MII) {
4999         lp->phy[lp->active].addr = i;
5000         if (i==0) n++;                             /* Count cycles */
5001         while (de4x5_reset_phy(dev)<0) udelay(100);/* Wait for reset */
5002         id = mii_get_oui(i, DE4X5_MII);
5003         if ((id == 0) || (id == 65535)) continue;  /* Valid ID? */
5004         for (j=0; j<limit; j++) {                  /* Search PHY table */
5005             if (id != phy_info[j].id) continue;    /* ID match? */
5006             for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
5007             if (k < DE4X5_MAX_PHY) {
5008                 memcpy((char *)&lp->phy[k],
5009                        (char *)&phy_info[j], sizeof(struct phy_table));
5010                 lp->phy[k].addr = i;
5011                 lp->mii_cnt++;
5012                 lp->active++;
5013             } else {
5014                 goto purgatory;                    /* Stop the search */
5015             }
5016             break;
5017         }
5018         if ((j == limit) && (i < DE4X5_MAX_MII)) {
5019             for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
5020             lp->phy[k].addr = i;
5021             lp->phy[k].id = id;
5022             lp->phy[k].spd.reg = GENERIC_REG;      /* ANLPA register         */
5023             lp->phy[k].spd.mask = GENERIC_MASK;    /* 100Mb/s technologies   */
5024             lp->phy[k].spd.value = GENERIC_VALUE;  /* TX & T4, H/F Duplex    */
5025             lp->mii_cnt++;
5026             lp->active++;
5027             printk("%s: Using generic MII device control. If the board doesn't operate,\nplease mail the following dump to the author:\n", dev->name);
5028             j = de4x5_debug;
5029             de4x5_debug |= DEBUG_MII;
5030             de4x5_dbg_mii(dev, k);
5031             de4x5_debug = j;
5032             printk("\n");
5033         }
5034     }
5035   purgatory:
5036     lp->active = 0;
5037     if (lp->phy[0].id) {                           /* Reset the PHY devices */
5038         for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++) { /*For each PHY*/
5039             mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII);
5040             while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST);
5041
5042             de4x5_dbg_mii(dev, k);
5043         }
5044     }
5045     if (!lp->mii_cnt) lp->useMII = false;
5046
5047     return lp->mii_cnt;
5048 }
5049
5050 static char *
5051 build_setup_frame(struct net_device *dev, int mode)
5052 {
5053     struct de4x5_private *lp = netdev_priv(dev);
5054     int i;
5055     char *pa = lp->setup_frame;
5056
5057     /* Initialise the setup frame */
5058     if (mode == ALL) {
5059         memset(lp->setup_frame, 0, SETUP_FRAME_LEN);
5060     }
5061
5062     if (lp->setup_f == HASH_PERF) {
5063         for (pa=lp->setup_frame+IMPERF_PA_OFFSET, i=0; i<ETH_ALEN; i++) {
5064             *(pa + i) = dev->dev_addr[i];                 /* Host address */
5065             if (i & 0x01) pa += 2;
5066         }
5067         *(lp->setup_frame + (HASH_TABLE_LEN >> 3) - 3) = 0x80;
5068     } else {
5069         for (i=0; i<ETH_ALEN; i++) { /* Host address */
5070             *(pa + (i&1)) = dev->dev_addr[i];
5071             if (i & 0x01) pa += 4;
5072         }
5073         for (i=0; i<ETH_ALEN; i++) { /* Broadcast address */
5074             *(pa + (i&1)) = (char) 0xff;
5075             if (i & 0x01) pa += 4;
5076         }
5077     }
5078
5079     return pa;                     /* Points to the next entry */
5080 }
5081
5082 static void
5083 disable_ast(struct net_device *dev)
5084 {
5085         struct de4x5_private *lp = netdev_priv(dev);
5086         del_timer_sync(&lp->timer);
5087 }
5088
5089 static long
5090 de4x5_switch_mac_port(struct net_device *dev)
5091 {
5092     struct de4x5_private *lp = netdev_priv(dev);
5093     u_long iobase = dev->base_addr;
5094     s32 omr;
5095
5096     STOP_DE4X5;
5097
5098     /* Assert the OMR_PS bit in CSR6 */
5099     omr = (inl(DE4X5_OMR) & ~(OMR_PS | OMR_HBD | OMR_TTM | OMR_PCS | OMR_SCR |
5100                                                                      OMR_FDX));
5101     omr |= lp->infoblock_csr6;
5102     if (omr & OMR_PS) omr |= OMR_HBD;
5103     outl(omr, DE4X5_OMR);
5104
5105     /* Soft Reset */
5106     RESET_DE4X5;
5107
5108     /* Restore the GEP - especially for COMPACT and Type 0 Infoblocks */
5109     if (lp->chipset == DC21140) {
5110         gep_wr(lp->cache.gepc, dev);
5111         gep_wr(lp->cache.gep, dev);
5112     } else if ((lp->chipset & ~0x0ff) == DC2114x) {
5113         reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14, lp->cache.csr15);
5114     }
5115
5116     /* Restore CSR6 */
5117     outl(omr, DE4X5_OMR);
5118
5119     /* Reset CSR8 */
5120     inl(DE4X5_MFC);
5121
5122     return omr;
5123 }
5124
5125 static void
5126 gep_wr(s32 data, struct net_device *dev)
5127 {
5128     struct de4x5_private *lp = netdev_priv(dev);
5129     u_long iobase = dev->base_addr;
5130
5131     if (lp->chipset == DC21140) {
5132         outl(data, DE4X5_GEP);
5133     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
5134         outl((data<<16) | lp->cache.csr15, DE4X5_SIGR);
5135     }
5136 }
5137
5138 static int
5139 gep_rd(struct net_device *dev)
5140 {
5141     struct de4x5_private *lp = netdev_priv(dev);
5142     u_long iobase = dev->base_addr;
5143
5144     if (lp->chipset == DC21140) {
5145         return inl(DE4X5_GEP);
5146     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
5147         return inl(DE4X5_SIGR) & 0x000fffff;
5148     }
5149
5150     return 0;
5151 }
5152
5153 static void
5154 yawn(struct net_device *dev, int state)
5155 {
5156     struct de4x5_private *lp = netdev_priv(dev);
5157     u_long iobase = dev->base_addr;
5158
5159     if ((lp->chipset == DC21040) || (lp->chipset == DC21140)) return;
5160
5161     if(lp->bus == EISA) {
5162         switch(state) {
5163           case WAKEUP:
5164             outb(WAKEUP, PCI_CFPM);
5165             mdelay(10);
5166             break;
5167
5168           case SNOOZE:
5169             outb(SNOOZE, PCI_CFPM);
5170             break;
5171
5172           case SLEEP:
5173             outl(0, DE4X5_SICR);
5174             outb(SLEEP, PCI_CFPM);
5175             break;
5176         }
5177     } else {
5178         struct pci_dev *pdev = to_pci_dev (lp->gendev);
5179         switch(state) {
5180           case WAKEUP:
5181             pci_write_config_byte(pdev, PCI_CFDA_PSM, WAKEUP);
5182             mdelay(10);
5183             break;
5184
5185           case SNOOZE:
5186             pci_write_config_byte(pdev, PCI_CFDA_PSM, SNOOZE);
5187             break;
5188
5189           case SLEEP:
5190             outl(0, DE4X5_SICR);
5191             pci_write_config_byte(pdev, PCI_CFDA_PSM, SLEEP);
5192             break;
5193         }
5194     }
5195 }
5196
5197 static void
5198 de4x5_parse_params(struct net_device *dev)
5199 {
5200     struct de4x5_private *lp = netdev_priv(dev);
5201     char *p, *q, t;
5202
5203     lp->params.fdx = 0;
5204     lp->params.autosense = AUTO;
5205
5206     if (args == NULL) return;
5207
5208     if ((p = strstr(args, dev->name))) {
5209         if (!(q = strstr(p+strlen(dev->name), "eth"))) q = p + strlen(p);
5210         t = *q;
5211         *q = '\0';
5212
5213         if (strstr(p, "fdx") || strstr(p, "FDX")) lp->params.fdx = 1;
5214
5215         if (strstr(p, "autosense") || strstr(p, "AUTOSENSE")) {
5216             if (strstr(p, "TP")) {
5217                 lp->params.autosense = TP;
5218             } else if (strstr(p, "TP_NW")) {
5219                 lp->params.autosense = TP_NW;
5220             } else if (strstr(p, "BNC")) {
5221                 lp->params.autosense = BNC;
5222             } else if (strstr(p, "AUI")) {
5223                 lp->params.autosense = AUI;
5224             } else if (strstr(p, "BNC_AUI")) {
5225                 lp->params.autosense = BNC;
5226             } else if (strstr(p, "10Mb")) {
5227                 lp->params.autosense = _10Mb;
5228             } else if (strstr(p, "100Mb")) {
5229                 lp->params.autosense = _100Mb;
5230             } else if (strstr(p, "AUTO")) {
5231                 lp->params.autosense = AUTO;
5232             }
5233         }
5234         *q = t;
5235     }
5236 }
5237
5238 static void
5239 de4x5_dbg_open(struct net_device *dev)
5240 {
5241     struct de4x5_private *lp = netdev_priv(dev);
5242     int i;
5243
5244     if (de4x5_debug & DEBUG_OPEN) {
5245         printk("%s: de4x5 opening with irq %d\n",dev->name,dev->irq);
5246         printk("\tphysical address: ");
5247         for (i=0;i<6;i++) {
5248             printk("%2.2x:",(short)dev->dev_addr[i]);
5249         }
5250         printk("\n");
5251         printk("Descriptor head addresses:\n");
5252         printk("\t0x%8.8lx  0x%8.8lx\n",(u_long)lp->rx_ring,(u_long)lp->tx_ring);
5253         printk("Descriptor addresses:\nRX: ");
5254         for (i=0;i<lp->rxRingSize-1;i++){
5255             if (i < 3) {
5256                 printk("0x%8.8lx  ",(u_long)&lp->rx_ring[i].status);
5257             }
5258         }
5259         printk("...0x%8.8lx\n",(u_long)&lp->rx_ring[i].status);
5260         printk("TX: ");
5261         for (i=0;i<lp->txRingSize-1;i++){
5262             if (i < 3) {
5263                 printk("0x%8.8lx  ", (u_long)&lp->tx_ring[i].status);
5264             }
5265         }
5266         printk("...0x%8.8lx\n", (u_long)&lp->tx_ring[i].status);
5267         printk("Descriptor buffers:\nRX: ");
5268         for (i=0;i<lp->rxRingSize-1;i++){
5269             if (i < 3) {
5270                 printk("0x%8.8x  ",le32_to_cpu(lp->rx_ring[i].buf));
5271             }
5272         }
5273         printk("...0x%8.8x\n",le32_to_cpu(lp->rx_ring[i].buf));
5274         printk("TX: ");
5275         for (i=0;i<lp->txRingSize-1;i++){
5276             if (i < 3) {
5277                 printk("0x%8.8x  ", le32_to_cpu(lp->tx_ring[i].buf));
5278             }
5279         }
5280         printk("...0x%8.8x\n", le32_to_cpu(lp->tx_ring[i].buf));
5281         printk("Ring size:\nRX: %d\nTX: %d\n",
5282                (short)lp->rxRingSize,
5283                (short)lp->txRingSize);
5284     }
5285 }
5286
5287 static void
5288 de4x5_dbg_mii(struct net_device *dev, int k)
5289 {
5290     struct de4x5_private *lp = netdev_priv(dev);
5291     u_long iobase = dev->base_addr;
5292
5293     if (de4x5_debug & DEBUG_MII) {
5294         printk("\nMII device address: %d\n", lp->phy[k].addr);
5295         printk("MII CR:  %x\n",mii_rd(MII_CR,lp->phy[k].addr,DE4X5_MII));
5296         printk("MII SR:  %x\n",mii_rd(MII_SR,lp->phy[k].addr,DE4X5_MII));
5297         printk("MII ID0: %x\n",mii_rd(MII_ID0,lp->phy[k].addr,DE4X5_MII));
5298         printk("MII ID1: %x\n",mii_rd(MII_ID1,lp->phy[k].addr,DE4X5_MII));
5299         if (lp->phy[k].id != BROADCOM_T4) {
5300             printk("MII ANA: %x\n",mii_rd(0x04,lp->phy[k].addr,DE4X5_MII));
5301             printk("MII ANC: %x\n",mii_rd(0x05,lp->phy[k].addr,DE4X5_MII));
5302         }
5303         printk("MII 16:  %x\n",mii_rd(0x10,lp->phy[k].addr,DE4X5_MII));
5304         if (lp->phy[k].id != BROADCOM_T4) {
5305             printk("MII 17:  %x\n",mii_rd(0x11,lp->phy[k].addr,DE4X5_MII));
5306             printk("MII 18:  %x\n",mii_rd(0x12,lp->phy[k].addr,DE4X5_MII));
5307         } else {
5308             printk("MII 20:  %x\n",mii_rd(0x14,lp->phy[k].addr,DE4X5_MII));
5309         }
5310     }
5311 }
5312
5313 static void
5314 de4x5_dbg_media(struct net_device *dev)
5315 {
5316     struct de4x5_private *lp = netdev_priv(dev);
5317
5318     if (lp->media != lp->c_media) {
5319         if (de4x5_debug & DEBUG_MEDIA) {
5320             printk("%s: media is %s%s\n", dev->name,
5321                    (lp->media == NC  ? "unconnected, link down or incompatible connection" :
5322                     (lp->media == TP  ? "TP" :
5323                      (lp->media == ANS ? "TP/Nway" :
5324                       (lp->media == BNC ? "BNC" :
5325                        (lp->media == AUI ? "AUI" :
5326                         (lp->media == BNC_AUI ? "BNC/AUI" :
5327                          (lp->media == EXT_SIA ? "EXT SIA" :
5328                           (lp->media == _100Mb  ? "100Mb/s" :
5329                            (lp->media == _10Mb   ? "10Mb/s" :
5330                             "???"
5331                             ))))))))), (lp->fdx?" full duplex.":"."));
5332         }
5333         lp->c_media = lp->media;
5334     }
5335 }
5336
5337 static void
5338 de4x5_dbg_srom(struct de4x5_srom *p)
5339 {
5340     int i;
5341
5342     if (de4x5_debug & DEBUG_SROM) {
5343         printk("Sub-system Vendor ID: %04x\n", *((u_short *)p->sub_vendor_id));
5344         printk("Sub-system ID:        %04x\n", *((u_short *)p->sub_system_id));
5345         printk("ID Block CRC:         %02x\n", (u_char)(p->id_block_crc));
5346         printk("SROM version:         %02x\n", (u_char)(p->version));
5347         printk("# controllers:        %02x\n", (u_char)(p->num_controllers));
5348
5349         printk("Hardware Address:     %pM\n", p->ieee_addr);
5350         printk("CRC checksum:         %04x\n", (u_short)(p->chksum));
5351         for (i=0; i<64; i++) {
5352             printk("%3d %04x\n", i<<1, (u_short)*((u_short *)p+i));
5353         }
5354     }
5355 }
5356
5357 static void
5358 de4x5_dbg_rx(struct sk_buff *skb, int len)
5359 {
5360     int i, j;
5361
5362     if (de4x5_debug & DEBUG_RX) {
5363         printk("R: %pM <- %pM len/SAP:%02x%02x [%d]\n",
5364                skb->data, &skb->data[6],
5365                (u_char)skb->data[12],
5366                (u_char)skb->data[13],
5367                len);
5368         for (j=0; len>0;j+=16, len-=16) {
5369           printk("    %03x: ",j);
5370           for (i=0; i<16 && i<len; i++) {
5371             printk("%02x ",(u_char)skb->data[i+j]);
5372           }
5373           printk("\n");
5374         }
5375     }
5376 }
5377
5378 /*
5379 ** Perform IOCTL call functions here. Some are privileged operations and the
5380 ** effective uid is checked in those cases. In the normal course of events
5381 ** this function is only used for my testing.
5382 */
5383 static int
5384 de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5385 {
5386     struct de4x5_private *lp = netdev_priv(dev);
5387     struct de4x5_ioctl *ioc = (struct de4x5_ioctl *) &rq->ifr_ifru;
5388     u_long iobase = dev->base_addr;
5389     int i, j, status = 0;
5390     s32 omr;
5391     union {
5392         u8  addr[144];
5393         u16 sval[72];
5394         u32 lval[36];
5395     } tmp;
5396     u_long flags = 0;
5397
5398     switch(ioc->cmd) {
5399     case DE4X5_GET_HWADDR:           /* Get the hardware address */
5400         ioc->len = ETH_ALEN;
5401         for (i=0; i<ETH_ALEN; i++) {
5402             tmp.addr[i] = dev->dev_addr[i];
5403         }
5404         if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
5405         break;
5406
5407     case DE4X5_SET_HWADDR:           /* Set the hardware address */
5408         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5409         if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN)) return -EFAULT;
5410         if (netif_queue_stopped(dev))
5411                 return -EBUSY;
5412         netif_stop_queue(dev);
5413         for (i=0; i<ETH_ALEN; i++) {
5414             dev->dev_addr[i] = tmp.addr[i];
5415         }
5416         build_setup_frame(dev, PHYS_ADDR_ONLY);
5417         /* Set up the descriptor and give ownership to the card */
5418         load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET |
5419                                                        SETUP_FRAME_LEN, (struct sk_buff *)1);
5420         lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
5421         outl(POLL_DEMAND, DE4X5_TPD);                /* Start the TX */
5422         netif_wake_queue(dev);                      /* Unlock the TX ring */
5423         break;
5424
5425     case DE4X5_SAY_BOO:              /* Say "Boo!" to the kernel log file */
5426         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5427         printk("%s: Boo!\n", dev->name);
5428         break;
5429
5430     case DE4X5_MCA_EN:               /* Enable pass all multicast addressing */
5431         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5432         omr = inl(DE4X5_OMR);
5433         omr |= OMR_PM;
5434         outl(omr, DE4X5_OMR);
5435         break;
5436
5437     case DE4X5_GET_STATS:            /* Get the driver statistics */
5438     {
5439         struct pkt_stats statbuf;
5440         ioc->len = sizeof(statbuf);
5441         spin_lock_irqsave(&lp->lock, flags);
5442         memcpy(&statbuf, &lp->pktStats, ioc->len);
5443         spin_unlock_irqrestore(&lp->lock, flags);
5444         if (copy_to_user(ioc->data, &statbuf, ioc->len))
5445                 return -EFAULT;
5446         break;
5447     }
5448     case DE4X5_CLR_STATS:            /* Zero out the driver statistics */
5449         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5450         spin_lock_irqsave(&lp->lock, flags);
5451         memset(&lp->pktStats, 0, sizeof(lp->pktStats));
5452         spin_unlock_irqrestore(&lp->lock, flags);
5453         break;
5454
5455     case DE4X5_GET_OMR:              /* Get the OMR Register contents */
5456         tmp.addr[0] = inl(DE4X5_OMR);
5457         if (copy_to_user(ioc->data, tmp.addr, 1)) return -EFAULT;
5458         break;
5459
5460     case DE4X5_SET_OMR:              /* Set the OMR Register contents */
5461         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5462         if (copy_from_user(tmp.addr, ioc->data, 1)) return -EFAULT;
5463         outl(tmp.addr[0], DE4X5_OMR);
5464         break;
5465
5466     case DE4X5_GET_REG:              /* Get the DE4X5 Registers */
5467         j = 0;
5468         tmp.lval[0] = inl(DE4X5_STS); j+=4;
5469         tmp.lval[1] = inl(DE4X5_BMR); j+=4;
5470         tmp.lval[2] = inl(DE4X5_IMR); j+=4;
5471         tmp.lval[3] = inl(DE4X5_OMR); j+=4;
5472         tmp.lval[4] = inl(DE4X5_SISR); j+=4;
5473         tmp.lval[5] = inl(DE4X5_SICR); j+=4;
5474         tmp.lval[6] = inl(DE4X5_STRR); j+=4;
5475         tmp.lval[7] = inl(DE4X5_SIGR); j+=4;
5476         ioc->len = j;
5477         if (copy_to_user(ioc->data, tmp.lval, ioc->len))
5478                 return -EFAULT;
5479         break;
5480
5481 #define DE4X5_DUMP              0x0f /* Dump the DE4X5 Status */
5482 /*
5483       case DE4X5_DUMP:
5484         j = 0;
5485         tmp.addr[j++] = dev->irq;
5486         for (i=0; i<ETH_ALEN; i++) {
5487             tmp.addr[j++] = dev->dev_addr[i];
5488         }
5489         tmp.addr[j++] = lp->rxRingSize;
5490         tmp.lval[j>>2] = (long)lp->rx_ring; j+=4;
5491         tmp.lval[j>>2] = (long)lp->tx_ring; j+=4;
5492
5493         for (i=0;i<lp->rxRingSize-1;i++){
5494             if (i < 3) {
5495                 tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
5496             }
5497         }
5498         tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
5499         for (i=0;i<lp->txRingSize-1;i++){
5500             if (i < 3) {
5501                 tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
5502             }
5503         }
5504         tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
5505
5506         for (i=0;i<lp->rxRingSize-1;i++){
5507             if (i < 3) {
5508                 tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4;
5509             }
5510         }
5511         tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4;
5512         for (i=0;i<lp->txRingSize-1;i++){
5513             if (i < 3) {
5514                 tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4;
5515             }
5516         }
5517         tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4;
5518
5519         for (i=0;i<lp->rxRingSize;i++){
5520             tmp.lval[j>>2] = le32_to_cpu(lp->rx_ring[i].status); j+=4;
5521         }
5522         for (i=0;i<lp->txRingSize;i++){
5523             tmp.lval[j>>2] = le32_to_cpu(lp->tx_ring[i].status); j+=4;
5524         }
5525
5526         tmp.lval[j>>2] = inl(DE4X5_BMR);  j+=4;
5527         tmp.lval[j>>2] = inl(DE4X5_TPD);  j+=4;
5528         tmp.lval[j>>2] = inl(DE4X5_RPD);  j+=4;
5529         tmp.lval[j>>2] = inl(DE4X5_RRBA); j+=4;
5530         tmp.lval[j>>2] = inl(DE4X5_TRBA); j+=4;
5531         tmp.lval[j>>2] = inl(DE4X5_STS);  j+=4;
5532         tmp.lval[j>>2] = inl(DE4X5_OMR);  j+=4;
5533         tmp.lval[j>>2] = inl(DE4X5_IMR);  j+=4;
5534         tmp.lval[j>>2] = lp->chipset; j+=4;
5535         if (lp->chipset == DC21140) {
5536             tmp.lval[j>>2] = gep_rd(dev);  j+=4;
5537         } else {
5538             tmp.lval[j>>2] = inl(DE4X5_SISR); j+=4;
5539             tmp.lval[j>>2] = inl(DE4X5_SICR); j+=4;
5540             tmp.lval[j>>2] = inl(DE4X5_STRR); j+=4;
5541             tmp.lval[j>>2] = inl(DE4X5_SIGR); j+=4;
5542         }
5543         tmp.lval[j>>2] = lp->phy[lp->active].id; j+=4;
5544         if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) {
5545             tmp.lval[j>>2] = lp->active; j+=4;
5546             tmp.lval[j>>2]=mii_rd(MII_CR,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5547             tmp.lval[j>>2]=mii_rd(MII_SR,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5548             tmp.lval[j>>2]=mii_rd(MII_ID0,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5549             tmp.lval[j>>2]=mii_rd(MII_ID1,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5550             if (lp->phy[lp->active].id != BROADCOM_T4) {
5551                 tmp.lval[j>>2]=mii_rd(MII_ANA,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5552                 tmp.lval[j>>2]=mii_rd(MII_ANLPA,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5553             }
5554             tmp.lval[j>>2]=mii_rd(0x10,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5555             if (lp->phy[lp->active].id != BROADCOM_T4) {
5556                 tmp.lval[j>>2]=mii_rd(0x11,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5557                 tmp.lval[j>>2]=mii_rd(0x12,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5558             } else {
5559                 tmp.lval[j>>2]=mii_rd(0x14,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5560             }
5561         }
5562
5563         tmp.addr[j++] = lp->txRingSize;
5564         tmp.addr[j++] = netif_queue_stopped(dev);
5565
5566         ioc->len = j;
5567         if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
5568         break;
5569
5570 */
5571     default:
5572         return -EOPNOTSUPP;
5573     }
5574
5575     return status;
5576 }
5577
5578 static int __init de4x5_module_init (void)
5579 {
5580         int err = 0;
5581
5582 #ifdef CONFIG_PCI
5583         err = pci_register_driver(&de4x5_pci_driver);
5584 #endif
5585 #ifdef CONFIG_EISA
5586         err |= eisa_driver_register (&de4x5_eisa_driver);
5587 #endif
5588
5589         return err;
5590 }
5591
5592 static void __exit de4x5_module_exit (void)
5593 {
5594 #ifdef CONFIG_PCI
5595         pci_unregister_driver (&de4x5_pci_driver);
5596 #endif
5597 #ifdef CONFIG_EISA
5598         eisa_driver_unregister (&de4x5_eisa_driver);
5599 #endif
5600 }
5601
5602 module_init (de4x5_module_init);
5603 module_exit (de4x5_module_exit);