Merge branch 'for-next' of git://git2.kernel.org/pub/scm/linux/kernel/git/lowpan...
[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                 crc = ether_crc_le(ETH_ALEN, ha->addr);
1968                 hashcode = crc & HASH_BITS;  /* hashcode is 9 LSb of CRC */
1969
1970                 byte = hashcode >> 3;        /* bit[3-8] -> byte in filter */
1971                 bit = 1 << (hashcode & 0x07);/* bit[0-2] -> bit in byte */
1972
1973                 byte <<= 1;                  /* calc offset into setup frame */
1974                 if (byte & 0x02) {
1975                     byte -= 1;
1976                 }
1977                 lp->setup_frame[byte] |= bit;
1978         }
1979     } else {                                 /* Perfect filtering */
1980         netdev_for_each_mc_addr(ha, dev) {
1981             addrs = ha->addr;
1982             for (i=0; i<ETH_ALEN; i++) {
1983                 *(pa + (i&1)) = *addrs++;
1984                 if (i & 0x01) pa += 4;
1985             }
1986         }
1987     }
1988     outl(omr, DE4X5_OMR);
1989 }
1990
1991 #ifdef CONFIG_EISA
1992
1993 static u_char de4x5_irq[] = EISA_ALLOWED_IRQ_LIST;
1994
1995 static int __init de4x5_eisa_probe (struct device *gendev)
1996 {
1997         struct eisa_device *edev;
1998         u_long iobase;
1999         u_char irq, regval;
2000         u_short vendor;
2001         u32 cfid;
2002         int status, device;
2003         struct net_device *dev;
2004         struct de4x5_private *lp;
2005
2006         edev = to_eisa_device (gendev);
2007         iobase = edev->base_addr;
2008
2009         if (!request_region (iobase, DE4X5_EISA_TOTAL_SIZE, "de4x5"))
2010                 return -EBUSY;
2011
2012         if (!request_region (iobase + DE4X5_EISA_IO_PORTS,
2013                              DE4X5_EISA_TOTAL_SIZE, "de4x5")) {
2014                 status = -EBUSY;
2015                 goto release_reg_1;
2016         }
2017
2018         if (!(dev = alloc_etherdev (sizeof (struct de4x5_private)))) {
2019                 status = -ENOMEM;
2020                 goto release_reg_2;
2021         }
2022         lp = netdev_priv(dev);
2023
2024         cfid = (u32) inl(PCI_CFID);
2025         lp->cfrv = (u_short) inl(PCI_CFRV);
2026         device = (cfid >> 8) & 0x00ffff00;
2027         vendor = (u_short) cfid;
2028
2029         /* Read the EISA Configuration Registers */
2030         regval = inb(EISA_REG0) & (ER0_INTL | ER0_INTT);
2031 #ifdef CONFIG_ALPHA
2032         /* Looks like the Jensen firmware (rev 2.2) doesn't really
2033          * care about the EISA configuration, and thus doesn't
2034          * configure the PLX bridge properly. Oh well... Simply mimic
2035          * the EISA config file to sort it out. */
2036
2037         /* EISA REG1: Assert DecChip 21040 HW Reset */
2038         outb (ER1_IAM | 1, EISA_REG1);
2039         mdelay (1);
2040
2041         /* EISA REG1: Deassert DecChip 21040 HW Reset */
2042         outb (ER1_IAM, EISA_REG1);
2043         mdelay (1);
2044
2045         /* EISA REG3: R/W Burst Transfer Enable */
2046         outb (ER3_BWE | ER3_BRE, EISA_REG3);
2047
2048         /* 32_bit slave/master, Preempt Time=23 bclks, Unlatched Interrupt */
2049         outb (ER0_BSW | ER0_BMW | ER0_EPT | regval, EISA_REG0);
2050 #endif
2051         irq = de4x5_irq[(regval >> 1) & 0x03];
2052
2053         if (is_DC2114x) {
2054             device = ((lp->cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
2055         }
2056         lp->chipset = device;
2057         lp->bus = EISA;
2058
2059         /* Write the PCI Configuration Registers */
2060         outl(PCI_COMMAND_IO | PCI_COMMAND_MASTER, PCI_CFCS);
2061         outl(0x00006000, PCI_CFLT);
2062         outl(iobase, PCI_CBIO);
2063
2064         DevicePresent(dev, EISA_APROM);
2065
2066         dev->irq = irq;
2067
2068         if (!(status = de4x5_hw_init (dev, iobase, gendev))) {
2069                 return 0;
2070         }
2071
2072         free_netdev (dev);
2073  release_reg_2:
2074         release_region (iobase + DE4X5_EISA_IO_PORTS, DE4X5_EISA_TOTAL_SIZE);
2075  release_reg_1:
2076         release_region (iobase, DE4X5_EISA_TOTAL_SIZE);
2077
2078         return status;
2079 }
2080
2081 static int __devexit de4x5_eisa_remove (struct device *device)
2082 {
2083         struct net_device *dev;
2084         u_long iobase;
2085
2086         dev = dev_get_drvdata(device);
2087         iobase = dev->base_addr;
2088
2089         unregister_netdev (dev);
2090         free_netdev (dev);
2091         release_region (iobase + DE4X5_EISA_IO_PORTS, DE4X5_EISA_TOTAL_SIZE);
2092         release_region (iobase, DE4X5_EISA_TOTAL_SIZE);
2093
2094         return 0;
2095 }
2096
2097 static struct eisa_device_id de4x5_eisa_ids[] = {
2098         { "DEC4250", 0 },       /* 0 is the board name index... */
2099         { "" }
2100 };
2101 MODULE_DEVICE_TABLE(eisa, de4x5_eisa_ids);
2102
2103 static struct eisa_driver de4x5_eisa_driver = {
2104         .id_table = de4x5_eisa_ids,
2105         .driver   = {
2106                 .name    = "de4x5",
2107                 .probe   = de4x5_eisa_probe,
2108                 .remove  = __devexit_p (de4x5_eisa_remove),
2109         }
2110 };
2111 MODULE_DEVICE_TABLE(eisa, de4x5_eisa_ids);
2112 #endif
2113
2114 #ifdef CONFIG_PCI
2115
2116 /*
2117 ** This function searches the current bus (which is >0) for a DECchip with an
2118 ** SROM, so that in multiport cards that have one SROM shared between multiple
2119 ** DECchips, we can find the base SROM irrespective of the BIOS scan direction.
2120 ** For single port cards this is a time waster...
2121 */
2122 static void __devinit
2123 srom_search(struct net_device *dev, struct pci_dev *pdev)
2124 {
2125     u_char pb;
2126     u_short vendor, status;
2127     u_int irq = 0, device;
2128     u_long iobase = 0;                     /* Clear upper 32 bits in Alphas */
2129     int i, j;
2130     struct de4x5_private *lp = netdev_priv(dev);
2131     struct list_head *walk;
2132
2133     list_for_each(walk, &pdev->bus_list) {
2134         struct pci_dev *this_dev = pci_dev_b(walk);
2135
2136         /* Skip the pci_bus list entry */
2137         if (list_entry(walk, struct pci_bus, devices) == pdev->bus) continue;
2138
2139         vendor = this_dev->vendor;
2140         device = this_dev->device << 8;
2141         if (!(is_DC21040 || is_DC21041 || is_DC21140 || is_DC2114x)) continue;
2142
2143         /* Get the chip configuration revision register */
2144         pb = this_dev->bus->number;
2145
2146         /* Set the device number information */
2147         lp->device = PCI_SLOT(this_dev->devfn);
2148         lp->bus_num = pb;
2149
2150         /* Set the chipset information */
2151         if (is_DC2114x) {
2152             device = ((this_dev->revision & CFRV_RN) < DC2114x_BRK
2153                       ? DC21142 : DC21143);
2154         }
2155         lp->chipset = device;
2156
2157         /* Get the board I/O address (64 bits on sparc64) */
2158         iobase = pci_resource_start(this_dev, 0);
2159
2160         /* Fetch the IRQ to be used */
2161         irq = this_dev->irq;
2162         if ((irq == 0) || (irq == 0xff) || ((int)irq == -1)) continue;
2163
2164         /* Check if I/O accesses are enabled */
2165         pci_read_config_word(this_dev, PCI_COMMAND, &status);
2166         if (!(status & PCI_COMMAND_IO)) continue;
2167
2168         /* Search for a valid SROM attached to this DECchip */
2169         DevicePresent(dev, DE4X5_APROM);
2170         for (j=0, i=0; i<ETH_ALEN; i++) {
2171             j += (u_char) *((u_char *)&lp->srom + SROM_HWADD + i);
2172         }
2173         if (j != 0 && j != 6 * 0xff) {
2174             last.chipset = device;
2175             last.bus = pb;
2176             last.irq = irq;
2177             for (i=0; i<ETH_ALEN; i++) {
2178                 last.addr[i] = (u_char)*((u_char *)&lp->srom + SROM_HWADD + i);
2179             }
2180             return;
2181         }
2182     }
2183 }
2184
2185 /*
2186 ** PCI bus I/O device probe
2187 ** NB: PCI I/O accesses and Bus Mastering are enabled by the PCI BIOS, not
2188 ** the driver. Some PCI BIOS's, pre V2.1, need the slot + features to be
2189 ** enabled by the user first in the set up utility. Hence we just check for
2190 ** enabled features and silently ignore the card if they're not.
2191 **
2192 ** STOP PRESS: Some BIOS's __require__ the driver to enable the bus mastering
2193 ** bit. Here, check for I/O accesses and then set BM. If you put the card in
2194 ** a non BM slot, you're on your own (and complain to the PC vendor that your
2195 ** PC doesn't conform to the PCI standard)!
2196 **
2197 ** This function is only compatible with the *latest* 2.1.x kernels. For 2.0.x
2198 ** kernels use the V0.535[n] drivers.
2199 */
2200
2201 static int __devinit de4x5_pci_probe (struct pci_dev *pdev,
2202                                    const struct pci_device_id *ent)
2203 {
2204         u_char pb, pbus = 0, dev_num, dnum = 0, timer;
2205         u_short vendor, status;
2206         u_int irq = 0, device;
2207         u_long iobase = 0;      /* Clear upper 32 bits in Alphas */
2208         int error;
2209         struct net_device *dev;
2210         struct de4x5_private *lp;
2211
2212         dev_num = PCI_SLOT(pdev->devfn);
2213         pb = pdev->bus->number;
2214
2215         if (io) { /* probe a single PCI device */
2216                 pbus = (u_short)(io >> 8);
2217                 dnum = (u_short)(io & 0xff);
2218                 if ((pbus != pb) || (dnum != dev_num))
2219                         return -ENODEV;
2220         }
2221
2222         vendor = pdev->vendor;
2223         device = pdev->device << 8;
2224         if (!(is_DC21040 || is_DC21041 || is_DC21140 || is_DC2114x))
2225                 return -ENODEV;
2226
2227         /* Ok, the device seems to be for us. */
2228         if ((error = pci_enable_device (pdev)))
2229                 return error;
2230
2231         if (!(dev = alloc_etherdev (sizeof (struct de4x5_private)))) {
2232                 error = -ENOMEM;
2233                 goto disable_dev;
2234         }
2235
2236         lp = netdev_priv(dev);
2237         lp->bus = PCI;
2238         lp->bus_num = 0;
2239
2240         /* Search for an SROM on this bus */
2241         if (lp->bus_num != pb) {
2242             lp->bus_num = pb;
2243             srom_search(dev, pdev);
2244         }
2245
2246         /* Get the chip configuration revision register */
2247         lp->cfrv = pdev->revision;
2248
2249         /* Set the device number information */
2250         lp->device = dev_num;
2251         lp->bus_num = pb;
2252
2253         /* Set the chipset information */
2254         if (is_DC2114x) {
2255             device = ((lp->cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
2256         }
2257         lp->chipset = device;
2258
2259         /* Get the board I/O address (64 bits on sparc64) */
2260         iobase = pci_resource_start(pdev, 0);
2261
2262         /* Fetch the IRQ to be used */
2263         irq = pdev->irq;
2264         if ((irq == 0) || (irq == 0xff) || ((int)irq == -1)) {
2265                 error = -ENODEV;
2266                 goto free_dev;
2267         }
2268
2269         /* Check if I/O accesses and Bus Mastering are enabled */
2270         pci_read_config_word(pdev, PCI_COMMAND, &status);
2271 #ifdef __powerpc__
2272         if (!(status & PCI_COMMAND_IO)) {
2273             status |= PCI_COMMAND_IO;
2274             pci_write_config_word(pdev, PCI_COMMAND, status);
2275             pci_read_config_word(pdev, PCI_COMMAND, &status);
2276         }
2277 #endif /* __powerpc__ */
2278         if (!(status & PCI_COMMAND_IO)) {
2279                 error = -ENODEV;
2280                 goto free_dev;
2281         }
2282
2283         if (!(status & PCI_COMMAND_MASTER)) {
2284             status |= PCI_COMMAND_MASTER;
2285             pci_write_config_word(pdev, PCI_COMMAND, status);
2286             pci_read_config_word(pdev, PCI_COMMAND, &status);
2287         }
2288         if (!(status & PCI_COMMAND_MASTER)) {
2289                 error = -ENODEV;
2290                 goto free_dev;
2291         }
2292
2293         /* Check the latency timer for values >= 0x60 */
2294         pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &timer);
2295         if (timer < 0x60) {
2296             pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x60);
2297         }
2298
2299         DevicePresent(dev, DE4X5_APROM);
2300
2301         if (!request_region (iobase, DE4X5_PCI_TOTAL_SIZE, "de4x5")) {
2302                 error = -EBUSY;
2303                 goto free_dev;
2304         }
2305
2306         dev->irq = irq;
2307
2308         if ((error = de4x5_hw_init(dev, iobase, &pdev->dev))) {
2309                 goto release;
2310         }
2311
2312         return 0;
2313
2314  release:
2315         release_region (iobase, DE4X5_PCI_TOTAL_SIZE);
2316  free_dev:
2317         free_netdev (dev);
2318  disable_dev:
2319         pci_disable_device (pdev);
2320         return error;
2321 }
2322
2323 static void __devexit de4x5_pci_remove (struct pci_dev *pdev)
2324 {
2325         struct net_device *dev;
2326         u_long iobase;
2327
2328         dev = dev_get_drvdata(&pdev->dev);
2329         iobase = dev->base_addr;
2330
2331         unregister_netdev (dev);
2332         free_netdev (dev);
2333         release_region (iobase, DE4X5_PCI_TOTAL_SIZE);
2334         pci_disable_device (pdev);
2335 }
2336
2337 static struct pci_device_id de4x5_pci_tbl[] = {
2338         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP,
2339           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
2340         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_PLUS,
2341           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
2342         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST,
2343           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
2344         { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142,
2345           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
2346         { },
2347 };
2348
2349 static struct pci_driver de4x5_pci_driver = {
2350         .name           = "de4x5",
2351         .id_table       = de4x5_pci_tbl,
2352         .probe          = de4x5_pci_probe,
2353         .remove         = __devexit_p (de4x5_pci_remove),
2354 };
2355
2356 #endif
2357
2358 /*
2359 ** Auto configure the media here rather than setting the port at compile
2360 ** time. This routine is called by de4x5_init() and when a loss of media is
2361 ** detected (excessive collisions, loss of carrier, no carrier or link fail
2362 ** [TP] or no recent receive activity) to check whether the user has been
2363 ** sneaky and changed the port on us.
2364 */
2365 static int
2366 autoconf_media(struct net_device *dev)
2367 {
2368         struct de4x5_private *lp = netdev_priv(dev);
2369         u_long iobase = dev->base_addr;
2370
2371         disable_ast(dev);
2372
2373         lp->c_media = AUTO;                     /* Bogus last media */
2374         inl(DE4X5_MFC);                         /* Zero the lost frames counter */
2375         lp->media = INIT;
2376         lp->tcount = 0;
2377
2378         de4x5_ast(dev);
2379
2380         return lp->media;
2381 }
2382
2383 /*
2384 ** Autoconfigure the media when using the DC21040. AUI cannot be distinguished
2385 ** from BNC as the port has a jumper to set thick or thin wire. When set for
2386 ** BNC, the BNC port will indicate activity if it's not terminated correctly.
2387 ** The only way to test for that is to place a loopback packet onto the
2388 ** network and watch for errors. Since we're messing with the interrupt mask
2389 ** register, disable the board interrupts and do not allow any more packets to
2390 ** be queued to the hardware. Re-enable everything only when the media is
2391 ** found.
2392 ** I may have to "age out" locally queued packets so that the higher layer
2393 ** timeouts don't effectively duplicate packets on the network.
2394 */
2395 static int
2396 dc21040_autoconf(struct net_device *dev)
2397 {
2398     struct de4x5_private *lp = netdev_priv(dev);
2399     u_long iobase = dev->base_addr;
2400     int next_tick = DE4X5_AUTOSENSE_MS;
2401     s32 imr;
2402
2403     switch (lp->media) {
2404     case INIT:
2405         DISABLE_IRQs;
2406         lp->tx_enable = false;
2407         lp->timeout = -1;
2408         de4x5_save_skbs(dev);
2409         if ((lp->autosense == AUTO) || (lp->autosense == TP)) {
2410             lp->media = TP;
2411         } else if ((lp->autosense == BNC) || (lp->autosense == AUI) || (lp->autosense == BNC_AUI)) {
2412             lp->media = BNC_AUI;
2413         } else if (lp->autosense == EXT_SIA) {
2414             lp->media = EXT_SIA;
2415         } else {
2416             lp->media = NC;
2417         }
2418         lp->local_state = 0;
2419         next_tick = dc21040_autoconf(dev);
2420         break;
2421
2422     case TP:
2423         next_tick = dc21040_state(dev, 0x8f01, 0xffff, 0x0000, 3000, BNC_AUI,
2424                                                          TP_SUSPECT, test_tp);
2425         break;
2426
2427     case TP_SUSPECT:
2428         next_tick = de4x5_suspect_state(dev, 1000, TP, test_tp, dc21040_autoconf);
2429         break;
2430
2431     case BNC:
2432     case AUI:
2433     case BNC_AUI:
2434         next_tick = dc21040_state(dev, 0x8f09, 0x0705, 0x0006, 3000, EXT_SIA,
2435                                                   BNC_AUI_SUSPECT, ping_media);
2436         break;
2437
2438     case BNC_AUI_SUSPECT:
2439         next_tick = de4x5_suspect_state(dev, 1000, BNC_AUI, ping_media, dc21040_autoconf);
2440         break;
2441
2442     case EXT_SIA:
2443         next_tick = dc21040_state(dev, 0x3041, 0x0000, 0x0006, 3000,
2444                                               NC, EXT_SIA_SUSPECT, ping_media);
2445         break;
2446
2447     case EXT_SIA_SUSPECT:
2448         next_tick = de4x5_suspect_state(dev, 1000, EXT_SIA, ping_media, dc21040_autoconf);
2449         break;
2450
2451     case NC:
2452         /* default to TP for all */
2453         reset_init_sia(dev, 0x8f01, 0xffff, 0x0000);
2454         if (lp->media != lp->c_media) {
2455             de4x5_dbg_media(dev);
2456             lp->c_media = lp->media;
2457         }
2458         lp->media = INIT;
2459         lp->tx_enable = false;
2460         break;
2461     }
2462
2463     return next_tick;
2464 }
2465
2466 static int
2467 dc21040_state(struct net_device *dev, int csr13, int csr14, int csr15, int timeout,
2468               int next_state, int suspect_state,
2469               int (*fn)(struct net_device *, int))
2470 {
2471     struct de4x5_private *lp = netdev_priv(dev);
2472     int next_tick = DE4X5_AUTOSENSE_MS;
2473     int linkBad;
2474
2475     switch (lp->local_state) {
2476     case 0:
2477         reset_init_sia(dev, csr13, csr14, csr15);
2478         lp->local_state++;
2479         next_tick = 500;
2480         break;
2481
2482     case 1:
2483         if (!lp->tx_enable) {
2484             linkBad = fn(dev, timeout);
2485             if (linkBad < 0) {
2486                 next_tick = linkBad & ~TIMER_CB;
2487             } else {
2488                 if (linkBad && (lp->autosense == AUTO)) {
2489                     lp->local_state = 0;
2490                     lp->media = next_state;
2491                 } else {
2492                     de4x5_init_connection(dev);
2493                 }
2494             }
2495         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2496             lp->media = suspect_state;
2497             next_tick = 3000;
2498         }
2499         break;
2500     }
2501
2502     return next_tick;
2503 }
2504
2505 static int
2506 de4x5_suspect_state(struct net_device *dev, int timeout, int prev_state,
2507                       int (*fn)(struct net_device *, int),
2508                       int (*asfn)(struct net_device *))
2509 {
2510     struct de4x5_private *lp = netdev_priv(dev);
2511     int next_tick = DE4X5_AUTOSENSE_MS;
2512     int linkBad;
2513
2514     switch (lp->local_state) {
2515     case 1:
2516         if (lp->linkOK) {
2517             lp->media = prev_state;
2518         } else {
2519             lp->local_state++;
2520             next_tick = asfn(dev);
2521         }
2522         break;
2523
2524     case 2:
2525         linkBad = fn(dev, timeout);
2526         if (linkBad < 0) {
2527             next_tick = linkBad & ~TIMER_CB;
2528         } else if (!linkBad) {
2529             lp->local_state--;
2530             lp->media = prev_state;
2531         } else {
2532             lp->media = INIT;
2533             lp->tcount++;
2534         }
2535     }
2536
2537     return next_tick;
2538 }
2539
2540 /*
2541 ** Autoconfigure the media when using the DC21041. AUI needs to be tested
2542 ** before BNC, because the BNC port will indicate activity if it's not
2543 ** terminated correctly. The only way to test for that is to place a loopback
2544 ** packet onto the network and watch for errors. Since we're messing with
2545 ** the interrupt mask register, disable the board interrupts and do not allow
2546 ** any more packets to be queued to the hardware. Re-enable everything only
2547 ** when the media is found.
2548 */
2549 static int
2550 dc21041_autoconf(struct net_device *dev)
2551 {
2552     struct de4x5_private *lp = netdev_priv(dev);
2553     u_long iobase = dev->base_addr;
2554     s32 sts, irqs, irq_mask, imr, omr;
2555     int next_tick = DE4X5_AUTOSENSE_MS;
2556
2557     switch (lp->media) {
2558     case INIT:
2559         DISABLE_IRQs;
2560         lp->tx_enable = false;
2561         lp->timeout = -1;
2562         de4x5_save_skbs(dev);          /* Save non transmitted skb's */
2563         if ((lp->autosense == AUTO) || (lp->autosense == TP_NW)) {
2564             lp->media = TP;            /* On chip auto negotiation is broken */
2565         } else if (lp->autosense == TP) {
2566             lp->media = TP;
2567         } else if (lp->autosense == BNC) {
2568             lp->media = BNC;
2569         } else if (lp->autosense == AUI) {
2570             lp->media = AUI;
2571         } else {
2572             lp->media = NC;
2573         }
2574         lp->local_state = 0;
2575         next_tick = dc21041_autoconf(dev);
2576         break;
2577
2578     case TP_NW:
2579         if (lp->timeout < 0) {
2580             omr = inl(DE4X5_OMR);/* Set up full duplex for the autonegotiate */
2581             outl(omr | OMR_FDX, DE4X5_OMR);
2582         }
2583         irqs = STS_LNF | STS_LNP;
2584         irq_mask = IMR_LFM | IMR_LPM;
2585         sts = test_media(dev, irqs, irq_mask, 0xef01, 0xffff, 0x0008, 2400);
2586         if (sts < 0) {
2587             next_tick = sts & ~TIMER_CB;
2588         } else {
2589             if (sts & STS_LNP) {
2590                 lp->media = ANS;
2591             } else {
2592                 lp->media = AUI;
2593             }
2594             next_tick = dc21041_autoconf(dev);
2595         }
2596         break;
2597
2598     case ANS:
2599         if (!lp->tx_enable) {
2600             irqs = STS_LNP;
2601             irq_mask = IMR_LPM;
2602             sts = test_ans(dev, irqs, irq_mask, 3000);
2603             if (sts < 0) {
2604                 next_tick = sts & ~TIMER_CB;
2605             } else {
2606                 if (!(sts & STS_LNP) && (lp->autosense == AUTO)) {
2607                     lp->media = TP;
2608                     next_tick = dc21041_autoconf(dev);
2609                 } else {
2610                     lp->local_state = 1;
2611                     de4x5_init_connection(dev);
2612                 }
2613             }
2614         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2615             lp->media = ANS_SUSPECT;
2616             next_tick = 3000;
2617         }
2618         break;
2619
2620     case ANS_SUSPECT:
2621         next_tick = de4x5_suspect_state(dev, 1000, ANS, test_tp, dc21041_autoconf);
2622         break;
2623
2624     case TP:
2625         if (!lp->tx_enable) {
2626             if (lp->timeout < 0) {
2627                 omr = inl(DE4X5_OMR);          /* Set up half duplex for TP */
2628                 outl(omr & ~OMR_FDX, DE4X5_OMR);
2629             }
2630             irqs = STS_LNF | STS_LNP;
2631             irq_mask = IMR_LFM | IMR_LPM;
2632             sts = test_media(dev,irqs, irq_mask, 0xef01, 0xff3f, 0x0008, 2400);
2633             if (sts < 0) {
2634                 next_tick = sts & ~TIMER_CB;
2635             } else {
2636                 if (!(sts & STS_LNP) && (lp->autosense == AUTO)) {
2637                     if (inl(DE4X5_SISR) & SISR_NRA) {
2638                         lp->media = AUI;       /* Non selected port activity */
2639                     } else {
2640                         lp->media = BNC;
2641                     }
2642                     next_tick = dc21041_autoconf(dev);
2643                 } else {
2644                     lp->local_state = 1;
2645                     de4x5_init_connection(dev);
2646                 }
2647             }
2648         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2649             lp->media = TP_SUSPECT;
2650             next_tick = 3000;
2651         }
2652         break;
2653
2654     case TP_SUSPECT:
2655         next_tick = de4x5_suspect_state(dev, 1000, TP, test_tp, dc21041_autoconf);
2656         break;
2657
2658     case AUI:
2659         if (!lp->tx_enable) {
2660             if (lp->timeout < 0) {
2661                 omr = inl(DE4X5_OMR);          /* Set up half duplex for AUI */
2662                 outl(omr & ~OMR_FDX, DE4X5_OMR);
2663             }
2664             irqs = 0;
2665             irq_mask = 0;
2666             sts = test_media(dev,irqs, irq_mask, 0xef09, 0xf73d, 0x000e, 1000);
2667             if (sts < 0) {
2668                 next_tick = sts & ~TIMER_CB;
2669             } else {
2670                 if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
2671                     lp->media = BNC;
2672                     next_tick = dc21041_autoconf(dev);
2673                 } else {
2674                     lp->local_state = 1;
2675                     de4x5_init_connection(dev);
2676                 }
2677             }
2678         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2679             lp->media = AUI_SUSPECT;
2680             next_tick = 3000;
2681         }
2682         break;
2683
2684     case AUI_SUSPECT:
2685         next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc21041_autoconf);
2686         break;
2687
2688     case BNC:
2689         switch (lp->local_state) {
2690         case 0:
2691             if (lp->timeout < 0) {
2692                 omr = inl(DE4X5_OMR);          /* Set up half duplex for BNC */
2693                 outl(omr & ~OMR_FDX, DE4X5_OMR);
2694             }
2695             irqs = 0;
2696             irq_mask = 0;
2697             sts = test_media(dev,irqs, irq_mask, 0xef09, 0xf73d, 0x0006, 1000);
2698             if (sts < 0) {
2699                 next_tick = sts & ~TIMER_CB;
2700             } else {
2701                 lp->local_state++;             /* Ensure media connected */
2702                 next_tick = dc21041_autoconf(dev);
2703             }
2704             break;
2705
2706         case 1:
2707             if (!lp->tx_enable) {
2708                 if ((sts = ping_media(dev, 3000)) < 0) {
2709                     next_tick = sts & ~TIMER_CB;
2710                 } else {
2711                     if (sts) {
2712                         lp->local_state = 0;
2713                         lp->media = NC;
2714                     } else {
2715                         de4x5_init_connection(dev);
2716                     }
2717                 }
2718             } else if (!lp->linkOK && (lp->autosense == AUTO)) {
2719                 lp->media = BNC_SUSPECT;
2720                 next_tick = 3000;
2721             }
2722             break;
2723         }
2724         break;
2725
2726     case BNC_SUSPECT:
2727         next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc21041_autoconf);
2728         break;
2729
2730     case NC:
2731         omr = inl(DE4X5_OMR);    /* Set up full duplex for the autonegotiate */
2732         outl(omr | OMR_FDX, DE4X5_OMR);
2733         reset_init_sia(dev, 0xef01, 0xffff, 0x0008);/* Initialise the SIA */
2734         if (lp->media != lp->c_media) {
2735             de4x5_dbg_media(dev);
2736             lp->c_media = lp->media;
2737         }
2738         lp->media = INIT;
2739         lp->tx_enable = false;
2740         break;
2741     }
2742
2743     return next_tick;
2744 }
2745
2746 /*
2747 ** Some autonegotiation chips are broken in that they do not return the
2748 ** acknowledge bit (anlpa & MII_ANLPA_ACK) in the link partner advertisement
2749 ** register, except at the first power up negotiation.
2750 */
2751 static int
2752 dc21140m_autoconf(struct net_device *dev)
2753 {
2754     struct de4x5_private *lp = netdev_priv(dev);
2755     int ana, anlpa, cap, cr, slnk, sr;
2756     int next_tick = DE4X5_AUTOSENSE_MS;
2757     u_long imr, omr, iobase = dev->base_addr;
2758
2759     switch(lp->media) {
2760     case INIT:
2761         if (lp->timeout < 0) {
2762             DISABLE_IRQs;
2763             lp->tx_enable = false;
2764             lp->linkOK = 0;
2765             de4x5_save_skbs(dev);          /* Save non transmitted skb's */
2766         }
2767         if ((next_tick = de4x5_reset_phy(dev)) < 0) {
2768             next_tick &= ~TIMER_CB;
2769         } else {
2770             if (lp->useSROM) {
2771                 if (srom_map_media(dev) < 0) {
2772                     lp->tcount++;
2773                     return next_tick;
2774                 }
2775                 srom_exec(dev, lp->phy[lp->active].gep);
2776                 if (lp->infoblock_media == ANS) {
2777                     ana = lp->phy[lp->active].ana | MII_ANA_CSMA;
2778                     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2779                 }
2780             } else {
2781                 lp->tmp = MII_SR_ASSC;     /* Fake out the MII speed set */
2782                 SET_10Mb;
2783                 if (lp->autosense == _100Mb) {
2784                     lp->media = _100Mb;
2785                 } else if (lp->autosense == _10Mb) {
2786                     lp->media = _10Mb;
2787                 } else if ((lp->autosense == AUTO) &&
2788                                     ((sr=is_anc_capable(dev)) & MII_SR_ANC)) {
2789                     ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA);
2790                     ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM);
2791                     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2792                     lp->media = ANS;
2793                 } else if (lp->autosense == AUTO) {
2794                     lp->media = SPD_DET;
2795                 } else if (is_spd_100(dev) && is_100_up(dev)) {
2796                     lp->media = _100Mb;
2797                 } else {
2798                     lp->media = NC;
2799                 }
2800             }
2801             lp->local_state = 0;
2802             next_tick = dc21140m_autoconf(dev);
2803         }
2804         break;
2805
2806     case ANS:
2807         switch (lp->local_state) {
2808         case 0:
2809             if (lp->timeout < 0) {
2810                 mii_wr(MII_CR_ASSE | MII_CR_RAN, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
2811             }
2812             cr = test_mii_reg(dev, MII_CR, MII_CR_RAN, false, 500);
2813             if (cr < 0) {
2814                 next_tick = cr & ~TIMER_CB;
2815             } else {
2816                 if (cr) {
2817                     lp->local_state = 0;
2818                     lp->media = SPD_DET;
2819                 } else {
2820                     lp->local_state++;
2821                 }
2822                 next_tick = dc21140m_autoconf(dev);
2823             }
2824             break;
2825
2826         case 1:
2827             if ((sr=test_mii_reg(dev, MII_SR, MII_SR_ASSC, true, 2000)) < 0) {
2828                 next_tick = sr & ~TIMER_CB;
2829             } else {
2830                 lp->media = SPD_DET;
2831                 lp->local_state = 0;
2832                 if (sr) {                         /* Success! */
2833                     lp->tmp = MII_SR_ASSC;
2834                     anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII);
2835                     ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2836                     if (!(anlpa & MII_ANLPA_RF) &&
2837                          (cap = anlpa & MII_ANLPA_TAF & ana)) {
2838                         if (cap & MII_ANA_100M) {
2839                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) != 0;
2840                             lp->media = _100Mb;
2841                         } else if (cap & MII_ANA_10M) {
2842                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_10M) != 0;
2843
2844                             lp->media = _10Mb;
2845                         }
2846                     }
2847                 }                       /* Auto Negotiation failed to finish */
2848                 next_tick = dc21140m_autoconf(dev);
2849             }                           /* Auto Negotiation failed to start */
2850             break;
2851         }
2852         break;
2853
2854     case SPD_DET:                              /* Choose 10Mb/s or 100Mb/s */
2855         if (lp->timeout < 0) {
2856             lp->tmp = (lp->phy[lp->active].id ? MII_SR_LKS :
2857                                                   (~gep_rd(dev) & GEP_LNP));
2858             SET_100Mb_PDET;
2859         }
2860         if ((slnk = test_for_100Mb(dev, 6500)) < 0) {
2861             next_tick = slnk & ~TIMER_CB;
2862         } else {
2863             if (is_spd_100(dev) && is_100_up(dev)) {
2864                 lp->media = _100Mb;
2865             } else if ((!is_spd_100(dev) && (is_10_up(dev) & lp->tmp))) {
2866                 lp->media = _10Mb;
2867             } else {
2868                 lp->media = NC;
2869             }
2870             next_tick = dc21140m_autoconf(dev);
2871         }
2872         break;
2873
2874     case _100Mb:                               /* Set 100Mb/s */
2875         next_tick = 3000;
2876         if (!lp->tx_enable) {
2877             SET_100Mb;
2878             de4x5_init_connection(dev);
2879         } else {
2880             if (!lp->linkOK && (lp->autosense == AUTO)) {
2881                 if (!is_100_up(dev) || (!lp->useSROM && !is_spd_100(dev))) {
2882                     lp->media = INIT;
2883                     lp->tcount++;
2884                     next_tick = DE4X5_AUTOSENSE_MS;
2885                 }
2886             }
2887         }
2888         break;
2889
2890     case BNC:
2891     case AUI:
2892     case _10Mb:                                /* Set 10Mb/s */
2893         next_tick = 3000;
2894         if (!lp->tx_enable) {
2895             SET_10Mb;
2896             de4x5_init_connection(dev);
2897         } else {
2898             if (!lp->linkOK && (lp->autosense == AUTO)) {
2899                 if (!is_10_up(dev) || (!lp->useSROM && is_spd_100(dev))) {
2900                     lp->media = INIT;
2901                     lp->tcount++;
2902                     next_tick = DE4X5_AUTOSENSE_MS;
2903                 }
2904             }
2905         }
2906         break;
2907
2908     case NC:
2909         if (lp->media != lp->c_media) {
2910             de4x5_dbg_media(dev);
2911             lp->c_media = lp->media;
2912         }
2913         lp->media = INIT;
2914         lp->tx_enable = false;
2915         break;
2916     }
2917
2918     return next_tick;
2919 }
2920
2921 /*
2922 ** This routine may be merged into dc21140m_autoconf() sometime as I'm
2923 ** changing how I figure out the media - but trying to keep it backwards
2924 ** compatible with the de500-xa and de500-aa.
2925 ** Whether it's BNC, AUI, SYM or MII is sorted out in the infoblock
2926 ** functions and set during de4x5_mac_port() and/or de4x5_reset_phy().
2927 ** This routine just has to figure out whether 10Mb/s or 100Mb/s is
2928 ** active.
2929 ** When autonegotiation is working, the ANS part searches the SROM for
2930 ** the highest common speed (TP) link that both can run and if that can
2931 ** be full duplex. That infoblock is executed and then the link speed set.
2932 **
2933 ** Only _10Mb and _100Mb are tested here.
2934 */
2935 static int
2936 dc2114x_autoconf(struct net_device *dev)
2937 {
2938     struct de4x5_private *lp = netdev_priv(dev);
2939     u_long iobase = dev->base_addr;
2940     s32 cr, anlpa, ana, cap, irqs, irq_mask, imr, omr, slnk, sr, sts;
2941     int next_tick = DE4X5_AUTOSENSE_MS;
2942
2943     switch (lp->media) {
2944     case INIT:
2945         if (lp->timeout < 0) {
2946             DISABLE_IRQs;
2947             lp->tx_enable = false;
2948             lp->linkOK = 0;
2949             lp->timeout = -1;
2950             de4x5_save_skbs(dev);            /* Save non transmitted skb's */
2951             if (lp->params.autosense & ~AUTO) {
2952                 srom_map_media(dev);         /* Fixed media requested      */
2953                 if (lp->media != lp->params.autosense) {
2954                     lp->tcount++;
2955                     lp->media = INIT;
2956                     return next_tick;
2957                 }
2958                 lp->media = INIT;
2959             }
2960         }
2961         if ((next_tick = de4x5_reset_phy(dev)) < 0) {
2962             next_tick &= ~TIMER_CB;
2963         } else {
2964             if (lp->autosense == _100Mb) {
2965                 lp->media = _100Mb;
2966             } else if (lp->autosense == _10Mb) {
2967                 lp->media = _10Mb;
2968             } else if (lp->autosense == TP) {
2969                 lp->media = TP;
2970             } else if (lp->autosense == BNC) {
2971                 lp->media = BNC;
2972             } else if (lp->autosense == AUI) {
2973                 lp->media = AUI;
2974             } else {
2975                 lp->media = SPD_DET;
2976                 if ((lp->infoblock_media == ANS) &&
2977                                     ((sr=is_anc_capable(dev)) & MII_SR_ANC)) {
2978                     ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA);
2979                     ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM);
2980                     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
2981                     lp->media = ANS;
2982                 }
2983             }
2984             lp->local_state = 0;
2985             next_tick = dc2114x_autoconf(dev);
2986         }
2987         break;
2988
2989     case ANS:
2990         switch (lp->local_state) {
2991         case 0:
2992             if (lp->timeout < 0) {
2993                 mii_wr(MII_CR_ASSE | MII_CR_RAN, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
2994             }
2995             cr = test_mii_reg(dev, MII_CR, MII_CR_RAN, false, 500);
2996             if (cr < 0) {
2997                 next_tick = cr & ~TIMER_CB;
2998             } else {
2999                 if (cr) {
3000                     lp->local_state = 0;
3001                     lp->media = SPD_DET;
3002                 } else {
3003                     lp->local_state++;
3004                 }
3005                 next_tick = dc2114x_autoconf(dev);
3006             }
3007             break;
3008
3009         case 1:
3010             sr = test_mii_reg(dev, MII_SR, MII_SR_ASSC, true, 2000);
3011             if (sr < 0) {
3012                 next_tick = sr & ~TIMER_CB;
3013             } else {
3014                 lp->media = SPD_DET;
3015                 lp->local_state = 0;
3016                 if (sr) {                         /* Success! */
3017                     lp->tmp = MII_SR_ASSC;
3018                     anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII);
3019                     ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
3020                     if (!(anlpa & MII_ANLPA_RF) &&
3021                          (cap = anlpa & MII_ANLPA_TAF & ana)) {
3022                         if (cap & MII_ANA_100M) {
3023                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) != 0;
3024                             lp->media = _100Mb;
3025                         } else if (cap & MII_ANA_10M) {
3026                             lp->fdx = (ana & anlpa & MII_ANA_FDAM & MII_ANA_10M) != 0;
3027                             lp->media = _10Mb;
3028                         }
3029                     }
3030                 }                       /* Auto Negotiation failed to finish */
3031                 next_tick = dc2114x_autoconf(dev);
3032             }                           /* Auto Negotiation failed to start  */
3033             break;
3034         }
3035         break;
3036
3037     case AUI:
3038         if (!lp->tx_enable) {
3039             if (lp->timeout < 0) {
3040                 omr = inl(DE4X5_OMR);   /* Set up half duplex for AUI        */
3041                 outl(omr & ~OMR_FDX, DE4X5_OMR);
3042             }
3043             irqs = 0;
3044             irq_mask = 0;
3045             sts = test_media(dev,irqs, irq_mask, 0, 0, 0, 1000);
3046             if (sts < 0) {
3047                 next_tick = sts & ~TIMER_CB;
3048             } else {
3049                 if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
3050                     lp->media = BNC;
3051                     next_tick = dc2114x_autoconf(dev);
3052                 } else {
3053                     lp->local_state = 1;
3054                     de4x5_init_connection(dev);
3055                 }
3056             }
3057         } else if (!lp->linkOK && (lp->autosense == AUTO)) {
3058             lp->media = AUI_SUSPECT;
3059             next_tick = 3000;
3060         }
3061         break;
3062
3063     case AUI_SUSPECT:
3064         next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc2114x_autoconf);
3065         break;
3066
3067     case BNC:
3068         switch (lp->local_state) {
3069         case 0:
3070             if (lp->timeout < 0) {
3071                 omr = inl(DE4X5_OMR);          /* Set up half duplex for BNC */
3072                 outl(omr & ~OMR_FDX, DE4X5_OMR);
3073             }
3074             irqs = 0;
3075             irq_mask = 0;
3076             sts = test_media(dev,irqs, irq_mask, 0, 0, 0, 1000);
3077             if (sts < 0) {
3078                 next_tick = sts & ~TIMER_CB;
3079             } else {
3080                 lp->local_state++;             /* Ensure media connected */
3081                 next_tick = dc2114x_autoconf(dev);
3082             }
3083             break;
3084
3085         case 1:
3086             if (!lp->tx_enable) {
3087                 if ((sts = ping_media(dev, 3000)) < 0) {
3088                     next_tick = sts & ~TIMER_CB;
3089                 } else {
3090                     if (sts) {
3091                         lp->local_state = 0;
3092                         lp->tcount++;
3093                         lp->media = INIT;
3094                     } else {
3095                         de4x5_init_connection(dev);
3096                     }
3097                 }
3098             } else if (!lp->linkOK && (lp->autosense == AUTO)) {
3099                 lp->media = BNC_SUSPECT;
3100                 next_tick = 3000;
3101             }
3102             break;
3103         }
3104         break;
3105
3106     case BNC_SUSPECT:
3107         next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc2114x_autoconf);
3108         break;
3109
3110     case SPD_DET:                              /* Choose 10Mb/s or 100Mb/s */
3111           if (srom_map_media(dev) < 0) {
3112               lp->tcount++;
3113               lp->media = INIT;
3114               return next_tick;
3115           }
3116           if (lp->media == _100Mb) {
3117               if ((slnk = test_for_100Mb(dev, 6500)) < 0) {
3118                   lp->media = SPD_DET;
3119                   return slnk & ~TIMER_CB;
3120               }
3121           } else {
3122               if (wait_for_link(dev) < 0) {
3123                   lp->media = SPD_DET;
3124                   return PDET_LINK_WAIT;
3125               }
3126           }
3127           if (lp->media == ANS) {           /* Do MII parallel detection */
3128               if (is_spd_100(dev)) {
3129                   lp->media = _100Mb;
3130               } else {
3131                   lp->media = _10Mb;
3132               }
3133               next_tick = dc2114x_autoconf(dev);
3134           } else if (((lp->media == _100Mb) && is_100_up(dev)) ||
3135                      (((lp->media == _10Mb) || (lp->media == TP) ||
3136                        (lp->media == BNC)   || (lp->media == AUI)) &&
3137                       is_10_up(dev))) {
3138               next_tick = dc2114x_autoconf(dev);
3139           } else {
3140               lp->tcount++;
3141               lp->media = INIT;
3142           }
3143           break;
3144
3145     case _10Mb:
3146         next_tick = 3000;
3147         if (!lp->tx_enable) {
3148             SET_10Mb;
3149             de4x5_init_connection(dev);
3150         } else {
3151             if (!lp->linkOK && (lp->autosense == AUTO)) {
3152                 if (!is_10_up(dev) || (!lp->useSROM && is_spd_100(dev))) {
3153                     lp->media = INIT;
3154                     lp->tcount++;
3155                     next_tick = DE4X5_AUTOSENSE_MS;
3156                 }
3157             }
3158         }
3159         break;
3160
3161     case _100Mb:
3162         next_tick = 3000;
3163         if (!lp->tx_enable) {
3164             SET_100Mb;
3165             de4x5_init_connection(dev);
3166         } else {
3167             if (!lp->linkOK && (lp->autosense == AUTO)) {
3168                 if (!is_100_up(dev) || (!lp->useSROM && !is_spd_100(dev))) {
3169                     lp->media = INIT;
3170                     lp->tcount++;
3171                     next_tick = DE4X5_AUTOSENSE_MS;
3172                 }
3173             }
3174         }
3175         break;
3176
3177     default:
3178         lp->tcount++;
3179 printk("Huh?: media:%02x\n", lp->media);
3180         lp->media = INIT;
3181         break;
3182     }
3183
3184     return next_tick;
3185 }
3186
3187 static int
3188 srom_autoconf(struct net_device *dev)
3189 {
3190     struct de4x5_private *lp = netdev_priv(dev);
3191
3192     return lp->infoleaf_fn(dev);
3193 }
3194
3195 /*
3196 ** This mapping keeps the original media codes and FDX flag unchanged.
3197 ** While it isn't strictly necessary, it helps me for the moment...
3198 ** The early return avoids a media state / SROM media space clash.
3199 */
3200 static int
3201 srom_map_media(struct net_device *dev)
3202 {
3203     struct de4x5_private *lp = netdev_priv(dev);
3204
3205     lp->fdx = false;
3206     if (lp->infoblock_media == lp->media)
3207       return 0;
3208
3209     switch(lp->infoblock_media) {
3210       case SROM_10BASETF:
3211         if (!lp->params.fdx) return -1;
3212         lp->fdx = true;
3213       case SROM_10BASET:
3214         if (lp->params.fdx && !lp->fdx) return -1;
3215         if ((lp->chipset == DC21140) || ((lp->chipset & ~0x00ff) == DC2114x)) {
3216             lp->media = _10Mb;
3217         } else {
3218             lp->media = TP;
3219         }
3220         break;
3221
3222       case SROM_10BASE2:
3223         lp->media = BNC;
3224         break;
3225
3226       case SROM_10BASE5:
3227         lp->media = AUI;
3228         break;
3229
3230       case SROM_100BASETF:
3231         if (!lp->params.fdx) return -1;
3232         lp->fdx = true;
3233       case SROM_100BASET:
3234         if (lp->params.fdx && !lp->fdx) return -1;
3235         lp->media = _100Mb;
3236         break;
3237
3238       case SROM_100BASET4:
3239         lp->media = _100Mb;
3240         break;
3241
3242       case SROM_100BASEFF:
3243         if (!lp->params.fdx) return -1;
3244         lp->fdx = true;
3245       case SROM_100BASEF:
3246         if (lp->params.fdx && !lp->fdx) return -1;
3247         lp->media = _100Mb;
3248         break;
3249
3250       case ANS:
3251         lp->media = ANS;
3252         lp->fdx = lp->params.fdx;
3253         break;
3254
3255       default:
3256         printk("%s: Bad media code [%d] detected in SROM!\n", dev->name,
3257                                                           lp->infoblock_media);
3258         return -1;
3259         break;
3260     }
3261
3262     return 0;
3263 }
3264
3265 static void
3266 de4x5_init_connection(struct net_device *dev)
3267 {
3268     struct de4x5_private *lp = netdev_priv(dev);
3269     u_long iobase = dev->base_addr;
3270     u_long flags = 0;
3271
3272     if (lp->media != lp->c_media) {
3273         de4x5_dbg_media(dev);
3274         lp->c_media = lp->media;          /* Stop scrolling media messages */
3275     }
3276
3277     spin_lock_irqsave(&lp->lock, flags);
3278     de4x5_rst_desc_ring(dev);
3279     de4x5_setup_intr(dev);
3280     lp->tx_enable = true;
3281     spin_unlock_irqrestore(&lp->lock, flags);
3282     outl(POLL_DEMAND, DE4X5_TPD);
3283
3284     netif_wake_queue(dev);
3285 }
3286
3287 /*
3288 ** General PHY reset function. Some MII devices don't reset correctly
3289 ** since their MII address pins can float at voltages that are dependent
3290 ** on the signal pin use. Do a double reset to ensure a reset.
3291 */
3292 static int
3293 de4x5_reset_phy(struct net_device *dev)
3294 {
3295     struct de4x5_private *lp = netdev_priv(dev);
3296     u_long iobase = dev->base_addr;
3297     int next_tick = 0;
3298
3299     if ((lp->useSROM) || (lp->phy[lp->active].id)) {
3300         if (lp->timeout < 0) {
3301             if (lp->useSROM) {
3302                 if (lp->phy[lp->active].rst) {
3303                     srom_exec(dev, lp->phy[lp->active].rst);
3304                     srom_exec(dev, lp->phy[lp->active].rst);
3305                 } else if (lp->rst) {          /* Type 5 infoblock reset */
3306                     srom_exec(dev, lp->rst);
3307                     srom_exec(dev, lp->rst);
3308                 }
3309             } else {
3310                 PHY_HARD_RESET;
3311             }
3312             if (lp->useMII) {
3313                 mii_wr(MII_CR_RST, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
3314             }
3315         }
3316         if (lp->useMII) {
3317             next_tick = test_mii_reg(dev, MII_CR, MII_CR_RST, false, 500);
3318         }
3319     } else if (lp->chipset == DC21140) {
3320         PHY_HARD_RESET;
3321     }
3322
3323     return next_tick;
3324 }
3325
3326 static int
3327 test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec)
3328 {
3329     struct de4x5_private *lp = netdev_priv(dev);
3330     u_long iobase = dev->base_addr;
3331     s32 sts, csr12;
3332
3333     if (lp->timeout < 0) {
3334         lp->timeout = msec/100;
3335         if (!lp->useSROM) {      /* Already done if by SROM, else dc2104[01] */
3336             reset_init_sia(dev, csr13, csr14, csr15);
3337         }
3338
3339         /* set up the interrupt mask */
3340         outl(irq_mask, DE4X5_IMR);
3341
3342         /* clear all pending interrupts */
3343         sts = inl(DE4X5_STS);
3344         outl(sts, DE4X5_STS);
3345
3346         /* clear csr12 NRA and SRA bits */
3347         if ((lp->chipset == DC21041) || lp->useSROM) {
3348             csr12 = inl(DE4X5_SISR);
3349             outl(csr12, DE4X5_SISR);
3350         }
3351     }
3352
3353     sts = inl(DE4X5_STS) & ~TIMER_CB;
3354
3355     if (!(sts & irqs) && --lp->timeout) {
3356         sts = 100 | TIMER_CB;
3357     } else {
3358         lp->timeout = -1;
3359     }
3360
3361     return sts;
3362 }
3363
3364 static int
3365 test_tp(struct net_device *dev, s32 msec)
3366 {
3367     struct de4x5_private *lp = netdev_priv(dev);
3368     u_long iobase = dev->base_addr;
3369     int sisr;
3370
3371     if (lp->timeout < 0) {
3372         lp->timeout = msec/100;
3373     }
3374
3375     sisr = (inl(DE4X5_SISR) & ~TIMER_CB) & (SISR_LKF | SISR_NCR);
3376
3377     if (sisr && --lp->timeout) {
3378         sisr = 100 | TIMER_CB;
3379     } else {
3380         lp->timeout = -1;
3381     }
3382
3383     return sisr;
3384 }
3385
3386 /*
3387 ** Samples the 100Mb Link State Signal. The sample interval is important
3388 ** because too fast a rate can give erroneous results and confuse the
3389 ** speed sense algorithm.
3390 */
3391 #define SAMPLE_INTERVAL 500  /* ms */
3392 #define SAMPLE_DELAY    2000 /* ms */
3393 static int
3394 test_for_100Mb(struct net_device *dev, int msec)
3395 {
3396     struct de4x5_private *lp = netdev_priv(dev);
3397     int gep = 0, ret = ((lp->chipset & ~0x00ff)==DC2114x? -1 :GEP_SLNK);
3398
3399     if (lp->timeout < 0) {
3400         if ((msec/SAMPLE_INTERVAL) <= 0) return 0;
3401         if (msec > SAMPLE_DELAY) {
3402             lp->timeout = (msec - SAMPLE_DELAY)/SAMPLE_INTERVAL;
3403             gep = SAMPLE_DELAY | TIMER_CB;
3404             return gep;
3405         } else {
3406             lp->timeout = msec/SAMPLE_INTERVAL;
3407         }
3408     }
3409
3410     if (lp->phy[lp->active].id || lp->useSROM) {
3411         gep = is_100_up(dev) | is_spd_100(dev);
3412     } else {
3413         gep = (~gep_rd(dev) & (GEP_SLNK | GEP_LNP));
3414     }
3415     if (!(gep & ret) && --lp->timeout) {
3416         gep = SAMPLE_INTERVAL | TIMER_CB;
3417     } else {
3418         lp->timeout = -1;
3419     }
3420
3421     return gep;
3422 }
3423
3424 static int
3425 wait_for_link(struct net_device *dev)
3426 {
3427     struct de4x5_private *lp = netdev_priv(dev);
3428
3429     if (lp->timeout < 0) {
3430         lp->timeout = 1;
3431     }
3432
3433     if (lp->timeout--) {
3434         return TIMER_CB;
3435     } else {
3436         lp->timeout = -1;
3437     }
3438
3439     return 0;
3440 }
3441
3442 /*
3443 **
3444 **
3445 */
3446 static int
3447 test_mii_reg(struct net_device *dev, int reg, int mask, bool pol, long msec)
3448 {
3449     struct de4x5_private *lp = netdev_priv(dev);
3450     int test;
3451     u_long iobase = dev->base_addr;
3452
3453     if (lp->timeout < 0) {
3454         lp->timeout = msec/100;
3455     }
3456
3457     reg = mii_rd((u_char)reg, lp->phy[lp->active].addr, DE4X5_MII) & mask;
3458     test = (reg ^ (pol ? ~0 : 0)) & mask;
3459
3460     if (test && --lp->timeout) {
3461         reg = 100 | TIMER_CB;
3462     } else {
3463         lp->timeout = -1;
3464     }
3465
3466     return reg;
3467 }
3468
3469 static int
3470 is_spd_100(struct net_device *dev)
3471 {
3472     struct de4x5_private *lp = netdev_priv(dev);
3473     u_long iobase = dev->base_addr;
3474     int spd;
3475
3476     if (lp->useMII) {
3477         spd = mii_rd(lp->phy[lp->active].spd.reg, lp->phy[lp->active].addr, DE4X5_MII);
3478         spd = ~(spd ^ lp->phy[lp->active].spd.value);
3479         spd &= lp->phy[lp->active].spd.mask;
3480     } else if (!lp->useSROM) {                      /* de500-xa */
3481         spd = ((~gep_rd(dev)) & GEP_SLNK);
3482     } else {
3483         if ((lp->ibn == 2) || !lp->asBitValid)
3484             return (lp->chipset == DC21143) ? (~inl(DE4X5_SISR)&SISR_LS100) : 0;
3485
3486         spd = (lp->asBitValid & (lp->asPolarity ^ (gep_rd(dev) & lp->asBit))) |
3487                   (lp->linkOK & ~lp->asBitValid);
3488     }
3489
3490     return spd;
3491 }
3492
3493 static int
3494 is_100_up(struct net_device *dev)
3495 {
3496     struct de4x5_private *lp = netdev_priv(dev);
3497     u_long iobase = dev->base_addr;
3498
3499     if (lp->useMII) {
3500         /* Double read for sticky bits & temporary drops */
3501         mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
3502         return mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII) & MII_SR_LKS;
3503     } else if (!lp->useSROM) {                       /* de500-xa */
3504         return (~gep_rd(dev)) & GEP_SLNK;
3505     } else {
3506         if ((lp->ibn == 2) || !lp->asBitValid)
3507             return (lp->chipset == DC21143) ? (~inl(DE4X5_SISR)&SISR_LS100) : 0;
3508
3509         return (lp->asBitValid&(lp->asPolarity^(gep_rd(dev)&lp->asBit))) |
3510                 (lp->linkOK & ~lp->asBitValid);
3511     }
3512 }
3513
3514 static int
3515 is_10_up(struct net_device *dev)
3516 {
3517     struct de4x5_private *lp = netdev_priv(dev);
3518     u_long iobase = dev->base_addr;
3519
3520     if (lp->useMII) {
3521         /* Double read for sticky bits & temporary drops */
3522         mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
3523         return mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII) & MII_SR_LKS;
3524     } else if (!lp->useSROM) {                       /* de500-xa */
3525         return (~gep_rd(dev)) & GEP_LNP;
3526     } else {
3527         if ((lp->ibn == 2) || !lp->asBitValid)
3528             return ((lp->chipset & ~0x00ff) == DC2114x) ?
3529                     (~inl(DE4X5_SISR)&SISR_LS10):
3530                     0;
3531
3532         return  (lp->asBitValid&(lp->asPolarity^(gep_rd(dev)&lp->asBit))) |
3533                 (lp->linkOK & ~lp->asBitValid);
3534     }
3535 }
3536
3537 static int
3538 is_anc_capable(struct net_device *dev)
3539 {
3540     struct de4x5_private *lp = netdev_priv(dev);
3541     u_long iobase = dev->base_addr;
3542
3543     if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) {
3544         return mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
3545     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
3546         return (inl(DE4X5_SISR) & SISR_LPN) >> 12;
3547     } else {
3548         return 0;
3549     }
3550 }
3551
3552 /*
3553 ** Send a packet onto the media and watch for send errors that indicate the
3554 ** media is bad or unconnected.
3555 */
3556 static int
3557 ping_media(struct net_device *dev, int msec)
3558 {
3559     struct de4x5_private *lp = netdev_priv(dev);
3560     u_long iobase = dev->base_addr;
3561     int sisr;
3562
3563     if (lp->timeout < 0) {
3564         lp->timeout = msec/100;
3565
3566         lp->tmp = lp->tx_new;                /* Remember the ring position */
3567         load_packet(dev, lp->frame, TD_LS | TD_FS | sizeof(lp->frame), (struct sk_buff *)1);
3568         lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
3569         outl(POLL_DEMAND, DE4X5_TPD);
3570     }
3571
3572     sisr = inl(DE4X5_SISR);
3573
3574     if ((!(sisr & SISR_NCR)) &&
3575         ((s32)le32_to_cpu(lp->tx_ring[lp->tmp].status) < 0) &&
3576          (--lp->timeout)) {
3577         sisr = 100 | TIMER_CB;
3578     } else {
3579         if ((!(sisr & SISR_NCR)) &&
3580             !(le32_to_cpu(lp->tx_ring[lp->tmp].status) & (T_OWN | TD_ES)) &&
3581             lp->timeout) {
3582             sisr = 0;
3583         } else {
3584             sisr = 1;
3585         }
3586         lp->timeout = -1;
3587     }
3588
3589     return sisr;
3590 }
3591
3592 /*
3593 ** This function does 2 things: on Intels it kmalloc's another buffer to
3594 ** replace the one about to be passed up. On Alpha's it kmallocs a buffer
3595 ** into which the packet is copied.
3596 */
3597 static struct sk_buff *
3598 de4x5_alloc_rx_buff(struct net_device *dev, int index, int len)
3599 {
3600     struct de4x5_private *lp = netdev_priv(dev);
3601     struct sk_buff *p;
3602
3603 #if !defined(__alpha__) && !defined(__powerpc__) && !defined(CONFIG_SPARC) && !defined(DE4X5_DO_MEMCPY)
3604     struct sk_buff *ret;
3605     u_long i=0, tmp;
3606
3607     p = dev_alloc_skb(IEEE802_3_SZ + DE4X5_ALIGN + 2);
3608     if (!p) return NULL;
3609
3610     tmp = virt_to_bus(p->data);
3611     i = ((tmp + DE4X5_ALIGN) & ~DE4X5_ALIGN) - tmp;
3612     skb_reserve(p, i);
3613     lp->rx_ring[index].buf = cpu_to_le32(tmp + i);
3614
3615     ret = lp->rx_skb[index];
3616     lp->rx_skb[index] = p;
3617
3618     if ((u_long) ret > 1) {
3619         skb_put(ret, len);
3620     }
3621
3622     return ret;
3623
3624 #else
3625     if (lp->state != OPEN) return (struct sk_buff *)1; /* Fake out the open */
3626
3627     p = dev_alloc_skb(len + 2);
3628     if (!p) return NULL;
3629
3630     skb_reserve(p, 2);                                 /* Align */
3631     if (index < lp->rx_old) {                          /* Wrapped buffer */
3632         short tlen = (lp->rxRingSize - lp->rx_old) * RX_BUFF_SZ;
3633         memcpy(skb_put(p,tlen),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,tlen);
3634         memcpy(skb_put(p,len-tlen),lp->rx_bufs,len-tlen);
3635     } else {                                           /* Linear buffer */
3636         memcpy(skb_put(p,len),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,len);
3637     }
3638
3639     return p;
3640 #endif
3641 }
3642
3643 static void
3644 de4x5_free_rx_buffs(struct net_device *dev)
3645 {
3646     struct de4x5_private *lp = netdev_priv(dev);
3647     int i;
3648
3649     for (i=0; i<lp->rxRingSize; i++) {
3650         if ((u_long) lp->rx_skb[i] > 1) {
3651             dev_kfree_skb(lp->rx_skb[i]);
3652         }
3653         lp->rx_ring[i].status = 0;
3654         lp->rx_skb[i] = (struct sk_buff *)1;    /* Dummy entry */
3655     }
3656 }
3657
3658 static void
3659 de4x5_free_tx_buffs(struct net_device *dev)
3660 {
3661     struct de4x5_private *lp = netdev_priv(dev);
3662     int i;
3663
3664     for (i=0; i<lp->txRingSize; i++) {
3665         if (lp->tx_skb[i])
3666             de4x5_free_tx_buff(lp, i);
3667         lp->tx_ring[i].status = 0;
3668     }
3669
3670     /* Unload the locally queued packets */
3671     __skb_queue_purge(&lp->cache.queue);
3672 }
3673
3674 /*
3675 ** When a user pulls a connection, the DECchip can end up in a
3676 ** 'running - waiting for end of transmission' state. This means that we
3677 ** have to perform a chip soft reset to ensure that we can synchronize
3678 ** the hardware and software and make any media probes using a loopback
3679 ** packet meaningful.
3680 */
3681 static void
3682 de4x5_save_skbs(struct net_device *dev)
3683 {
3684     struct de4x5_private *lp = netdev_priv(dev);
3685     u_long iobase = dev->base_addr;
3686     s32 omr;
3687
3688     if (!lp->cache.save_cnt) {
3689         STOP_DE4X5;
3690         de4x5_tx(dev);                          /* Flush any sent skb's */
3691         de4x5_free_tx_buffs(dev);
3692         de4x5_cache_state(dev, DE4X5_SAVE_STATE);
3693         de4x5_sw_reset(dev);
3694         de4x5_cache_state(dev, DE4X5_RESTORE_STATE);
3695         lp->cache.save_cnt++;
3696         START_DE4X5;
3697     }
3698 }
3699
3700 static void
3701 de4x5_rst_desc_ring(struct net_device *dev)
3702 {
3703     struct de4x5_private *lp = netdev_priv(dev);
3704     u_long iobase = dev->base_addr;
3705     int i;
3706     s32 omr;
3707
3708     if (lp->cache.save_cnt) {
3709         STOP_DE4X5;
3710         outl(lp->dma_rings, DE4X5_RRBA);
3711         outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc),
3712              DE4X5_TRBA);
3713
3714         lp->rx_new = lp->rx_old = 0;
3715         lp->tx_new = lp->tx_old = 0;
3716
3717         for (i = 0; i < lp->rxRingSize; i++) {
3718             lp->rx_ring[i].status = cpu_to_le32(R_OWN);
3719         }
3720
3721         for (i = 0; i < lp->txRingSize; i++) {
3722             lp->tx_ring[i].status = cpu_to_le32(0);
3723         }
3724
3725         barrier();
3726         lp->cache.save_cnt--;
3727         START_DE4X5;
3728     }
3729 }
3730
3731 static void
3732 de4x5_cache_state(struct net_device *dev, int flag)
3733 {
3734     struct de4x5_private *lp = netdev_priv(dev);
3735     u_long iobase = dev->base_addr;
3736
3737     switch(flag) {
3738       case DE4X5_SAVE_STATE:
3739         lp->cache.csr0 = inl(DE4X5_BMR);
3740         lp->cache.csr6 = (inl(DE4X5_OMR) & ~(OMR_ST | OMR_SR));
3741         lp->cache.csr7 = inl(DE4X5_IMR);
3742         break;
3743
3744       case DE4X5_RESTORE_STATE:
3745         outl(lp->cache.csr0, DE4X5_BMR);
3746         outl(lp->cache.csr6, DE4X5_OMR);
3747         outl(lp->cache.csr7, DE4X5_IMR);
3748         if (lp->chipset == DC21140) {
3749             gep_wr(lp->cache.gepc, dev);
3750             gep_wr(lp->cache.gep, dev);
3751         } else {
3752             reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14,
3753                                                               lp->cache.csr15);
3754         }
3755         break;
3756     }
3757 }
3758
3759 static void
3760 de4x5_put_cache(struct net_device *dev, struct sk_buff *skb)
3761 {
3762     struct de4x5_private *lp = netdev_priv(dev);
3763
3764     __skb_queue_tail(&lp->cache.queue, skb);
3765 }
3766
3767 static void
3768 de4x5_putb_cache(struct net_device *dev, struct sk_buff *skb)
3769 {
3770     struct de4x5_private *lp = netdev_priv(dev);
3771
3772     __skb_queue_head(&lp->cache.queue, skb);
3773 }
3774
3775 static struct sk_buff *
3776 de4x5_get_cache(struct net_device *dev)
3777 {
3778     struct de4x5_private *lp = netdev_priv(dev);
3779
3780     return __skb_dequeue(&lp->cache.queue);
3781 }
3782
3783 /*
3784 ** Check the Auto Negotiation State. Return OK when a link pass interrupt
3785 ** is received and the auto-negotiation status is NWAY OK.
3786 */
3787 static int
3788 test_ans(struct net_device *dev, s32 irqs, s32 irq_mask, s32 msec)
3789 {
3790     struct de4x5_private *lp = netdev_priv(dev);
3791     u_long iobase = dev->base_addr;
3792     s32 sts, ans;
3793
3794     if (lp->timeout < 0) {
3795         lp->timeout = msec/100;
3796         outl(irq_mask, DE4X5_IMR);
3797
3798         /* clear all pending interrupts */
3799         sts = inl(DE4X5_STS);
3800         outl(sts, DE4X5_STS);
3801     }
3802
3803     ans = inl(DE4X5_SISR) & SISR_ANS;
3804     sts = inl(DE4X5_STS) & ~TIMER_CB;
3805
3806     if (!(sts & irqs) && (ans ^ ANS_NWOK) && --lp->timeout) {
3807         sts = 100 | TIMER_CB;
3808     } else {
3809         lp->timeout = -1;
3810     }
3811
3812     return sts;
3813 }
3814
3815 static void
3816 de4x5_setup_intr(struct net_device *dev)
3817 {
3818     struct de4x5_private *lp = netdev_priv(dev);
3819     u_long iobase = dev->base_addr;
3820     s32 imr, sts;
3821
3822     if (inl(DE4X5_OMR) & OMR_SR) {   /* Only unmask if TX/RX is enabled */
3823         imr = 0;
3824         UNMASK_IRQs;
3825         sts = inl(DE4X5_STS);        /* Reset any pending (stale) interrupts */
3826         outl(sts, DE4X5_STS);
3827         ENABLE_IRQs;
3828     }
3829 }
3830
3831 /*
3832 **
3833 */
3834 static void
3835 reset_init_sia(struct net_device *dev, s32 csr13, s32 csr14, s32 csr15)
3836 {
3837     struct de4x5_private *lp = netdev_priv(dev);
3838     u_long iobase = dev->base_addr;
3839
3840     RESET_SIA;
3841     if (lp->useSROM) {
3842         if (lp->ibn == 3) {
3843             srom_exec(dev, lp->phy[lp->active].rst);
3844             srom_exec(dev, lp->phy[lp->active].gep);
3845             outl(1, DE4X5_SICR);
3846             return;
3847         } else {
3848             csr15 = lp->cache.csr15;
3849             csr14 = lp->cache.csr14;
3850             csr13 = lp->cache.csr13;
3851             outl(csr15 | lp->cache.gepc, DE4X5_SIGR);
3852             outl(csr15 | lp->cache.gep, DE4X5_SIGR);
3853         }
3854     } else {
3855         outl(csr15, DE4X5_SIGR);
3856     }
3857     outl(csr14, DE4X5_STRR);
3858     outl(csr13, DE4X5_SICR);
3859
3860     mdelay(10);
3861 }
3862
3863 /*
3864 ** Create a loopback ethernet packet
3865 */
3866 static void
3867 create_packet(struct net_device *dev, char *frame, int len)
3868 {
3869     int i;
3870     char *buf = frame;
3871
3872     for (i=0; i<ETH_ALEN; i++) {             /* Use this source address */
3873         *buf++ = dev->dev_addr[i];
3874     }
3875     for (i=0; i<ETH_ALEN; i++) {             /* Use this destination address */
3876         *buf++ = dev->dev_addr[i];
3877     }
3878
3879     *buf++ = 0;                              /* Packet length (2 bytes) */
3880     *buf++ = 1;
3881 }
3882
3883 /*
3884 ** Look for a particular board name in the EISA configuration space
3885 */
3886 static int
3887 EISA_signature(char *name, struct device *device)
3888 {
3889     int i, status = 0, siglen = ARRAY_SIZE(de4x5_signatures);
3890     struct eisa_device *edev;
3891
3892     *name = '\0';
3893     edev = to_eisa_device (device);
3894     i = edev->id.driver_data;
3895
3896     if (i >= 0 && i < siglen) {
3897             strcpy (name, de4x5_signatures[i]);
3898             status = 1;
3899     }
3900
3901     return status;                         /* return the device name string */
3902 }
3903
3904 /*
3905 ** Look for a particular board name in the PCI configuration space
3906 */
3907 static int
3908 PCI_signature(char *name, struct de4x5_private *lp)
3909 {
3910     int i, status = 0, siglen = ARRAY_SIZE(de4x5_signatures);
3911
3912     if (lp->chipset == DC21040) {
3913         strcpy(name, "DE434/5");
3914         return status;
3915     } else {                           /* Search for a DEC name in the SROM */
3916         int tmp = *((char *)&lp->srom + 19) * 3;
3917         strncpy(name, (char *)&lp->srom + 26 + tmp, 8);
3918     }
3919     name[8] = '\0';
3920     for (i=0; i<siglen; i++) {
3921         if (strstr(name,de4x5_signatures[i])!=NULL) break;
3922     }
3923     if (i == siglen) {
3924         if (dec_only) {
3925             *name = '\0';
3926         } else {                        /* Use chip name to avoid confusion */
3927             strcpy(name, (((lp->chipset == DC21040) ? "DC21040" :
3928                            ((lp->chipset == DC21041) ? "DC21041" :
3929                             ((lp->chipset == DC21140) ? "DC21140" :
3930                              ((lp->chipset == DC21142) ? "DC21142" :
3931                               ((lp->chipset == DC21143) ? "DC21143" : "UNKNOWN"
3932                              )))))));
3933         }
3934         if (lp->chipset != DC21041) {
3935             lp->useSROM = true;             /* card is not recognisably DEC */
3936         }
3937     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
3938         lp->useSROM = true;
3939     }
3940
3941     return status;
3942 }
3943
3944 /*
3945 ** Set up the Ethernet PROM counter to the start of the Ethernet address on
3946 ** the DC21040, else  read the SROM for the other chips.
3947 ** The SROM may not be present in a multi-MAC card, so first read the
3948 ** MAC address and check for a bad address. If there is a bad one then exit
3949 ** immediately with the prior srom contents intact (the h/w address will
3950 ** be fixed up later).
3951 */
3952 static void
3953 DevicePresent(struct net_device *dev, u_long aprom_addr)
3954 {
3955     int i, j=0;
3956     struct de4x5_private *lp = netdev_priv(dev);
3957
3958     if (lp->chipset == DC21040) {
3959         if (lp->bus == EISA) {
3960             enet_addr_rst(aprom_addr); /* Reset Ethernet Address ROM Pointer */
3961         } else {
3962             outl(0, aprom_addr);       /* Reset Ethernet Address ROM Pointer */
3963         }
3964     } else {                           /* Read new srom */
3965         u_short tmp;
3966         __le16 *p = (__le16 *)((char *)&lp->srom + SROM_HWADD);
3967         for (i=0; i<(ETH_ALEN>>1); i++) {
3968             tmp = srom_rd(aprom_addr, (SROM_HWADD>>1) + i);
3969             j += tmp;   /* for check for 0:0:0:0:0:0 or ff:ff:ff:ff:ff:ff */
3970             *p = cpu_to_le16(tmp);
3971         }
3972         if (j == 0 || j == 3 * 0xffff) {
3973                 /* could get 0 only from all-0 and 3 * 0xffff only from all-1 */
3974                 return;
3975         }
3976
3977         p = (__le16 *)&lp->srom;
3978         for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) {
3979             tmp = srom_rd(aprom_addr, i);
3980             *p++ = cpu_to_le16(tmp);
3981         }
3982         de4x5_dbg_srom((struct de4x5_srom *)&lp->srom);
3983     }
3984 }
3985
3986 /*
3987 ** Since the write on the Enet PROM register doesn't seem to reset the PROM
3988 ** pointer correctly (at least on my DE425 EISA card), this routine should do
3989 ** it...from depca.c.
3990 */
3991 static void
3992 enet_addr_rst(u_long aprom_addr)
3993 {
3994     union {
3995         struct {
3996             u32 a;
3997             u32 b;
3998         } llsig;
3999         char Sig[sizeof(u32) << 1];
4000     } dev;
4001     short sigLength=0;
4002     s8 data;
4003     int i, j;
4004
4005     dev.llsig.a = ETH_PROM_SIG;
4006     dev.llsig.b = ETH_PROM_SIG;
4007     sigLength = sizeof(u32) << 1;
4008
4009     for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) {
4010         data = inb(aprom_addr);
4011         if (dev.Sig[j] == data) {    /* track signature */
4012             j++;
4013         } else {                     /* lost signature; begin search again */
4014             if (data == dev.Sig[0]) {  /* rare case.... */
4015                 j=1;
4016             } else {
4017                 j=0;
4018             }
4019         }
4020     }
4021 }
4022
4023 /*
4024 ** For the bad status case and no SROM, then add one to the previous
4025 ** address. However, need to add one backwards in case we have 0xff
4026 ** as one or more of the bytes. Only the last 3 bytes should be checked
4027 ** as the first three are invariant - assigned to an organisation.
4028 */
4029 static int
4030 get_hw_addr(struct net_device *dev)
4031 {
4032     u_long iobase = dev->base_addr;
4033     int broken, i, k, tmp, status = 0;
4034     u_short j,chksum;
4035     struct de4x5_private *lp = netdev_priv(dev);
4036
4037     broken = de4x5_bad_srom(lp);
4038
4039     for (i=0,k=0,j=0;j<3;j++) {
4040         k <<= 1;
4041         if (k > 0xffff) k-=0xffff;
4042
4043         if (lp->bus == PCI) {
4044             if (lp->chipset == DC21040) {
4045                 while ((tmp = inl(DE4X5_APROM)) < 0);
4046                 k += (u_char) tmp;
4047                 dev->dev_addr[i++] = (u_char) tmp;
4048                 while ((tmp = inl(DE4X5_APROM)) < 0);
4049                 k += (u_short) (tmp << 8);
4050                 dev->dev_addr[i++] = (u_char) tmp;
4051             } else if (!broken) {
4052                 dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
4053                 dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
4054             } else if ((broken == SMC) || (broken == ACCTON)) {
4055                 dev->dev_addr[i] = *((u_char *)&lp->srom + i); i++;
4056                 dev->dev_addr[i] = *((u_char *)&lp->srom + i); i++;
4057             }
4058         } else {
4059             k += (u_char) (tmp = inb(EISA_APROM));
4060             dev->dev_addr[i++] = (u_char) tmp;
4061             k += (u_short) ((tmp = inb(EISA_APROM)) << 8);
4062             dev->dev_addr[i++] = (u_char) tmp;
4063         }
4064
4065         if (k > 0xffff) k-=0xffff;
4066     }
4067     if (k == 0xffff) k=0;
4068
4069     if (lp->bus == PCI) {
4070         if (lp->chipset == DC21040) {
4071             while ((tmp = inl(DE4X5_APROM)) < 0);
4072             chksum = (u_char) tmp;
4073             while ((tmp = inl(DE4X5_APROM)) < 0);
4074             chksum |= (u_short) (tmp << 8);
4075             if ((k != chksum) && (dec_only)) status = -1;
4076         }
4077     } else {
4078         chksum = (u_char) inb(EISA_APROM);
4079         chksum |= (u_short) (inb(EISA_APROM) << 8);
4080         if ((k != chksum) && (dec_only)) status = -1;
4081     }
4082
4083     /* If possible, try to fix a broken card - SMC only so far */
4084     srom_repair(dev, broken);
4085
4086 #ifdef CONFIG_PPC_PMAC
4087     /*
4088     ** If the address starts with 00 a0, we have to bit-reverse
4089     ** each byte of the address.
4090     */
4091     if ( machine_is(powermac) &&
4092          (dev->dev_addr[0] == 0) &&
4093          (dev->dev_addr[1] == 0xa0) )
4094     {
4095             for (i = 0; i < ETH_ALEN; ++i)
4096             {
4097                     int x = dev->dev_addr[i];
4098                     x = ((x & 0xf) << 4) + ((x & 0xf0) >> 4);
4099                     x = ((x & 0x33) << 2) + ((x & 0xcc) >> 2);
4100                     dev->dev_addr[i] = ((x & 0x55) << 1) + ((x & 0xaa) >> 1);
4101             }
4102     }
4103 #endif /* CONFIG_PPC_PMAC */
4104
4105     /* Test for a bad enet address */
4106     status = test_bad_enet(dev, status);
4107
4108     return status;
4109 }
4110
4111 /*
4112 ** Test for enet addresses in the first 32 bytes. The built-in strncmp
4113 ** didn't seem to work here...?
4114 */
4115 static int
4116 de4x5_bad_srom(struct de4x5_private *lp)
4117 {
4118     int i, status = 0;
4119
4120     for (i = 0; i < ARRAY_SIZE(enet_det); i++) {
4121         if (!de4x5_strncmp((char *)&lp->srom, (char *)&enet_det[i], 3) &&
4122             !de4x5_strncmp((char *)&lp->srom+0x10, (char *)&enet_det[i], 3)) {
4123             if (i == 0) {
4124                 status = SMC;
4125             } else if (i == 1) {
4126                 status = ACCTON;
4127             }
4128             break;
4129         }
4130     }
4131
4132     return status;
4133 }
4134
4135 static int
4136 de4x5_strncmp(char *a, char *b, int n)
4137 {
4138     int ret=0;
4139
4140     for (;n && !ret; n--) {
4141         ret = *a++ - *b++;
4142     }
4143
4144     return ret;
4145 }
4146
4147 static void
4148 srom_repair(struct net_device *dev, int card)
4149 {
4150     struct de4x5_private *lp = netdev_priv(dev);
4151
4152     switch(card) {
4153       case SMC:
4154         memset((char *)&lp->srom, 0, sizeof(struct de4x5_srom));
4155         memcpy(lp->srom.ieee_addr, (char *)dev->dev_addr, ETH_ALEN);
4156         memcpy(lp->srom.info, (char *)&srom_repair_info[SMC-1], 100);
4157         lp->useSROM = true;
4158         break;
4159     }
4160 }
4161
4162 /*
4163 ** Assume that the irq's do not follow the PCI spec - this is seems
4164 ** to be true so far (2 for 2).
4165 */
4166 static int
4167 test_bad_enet(struct net_device *dev, int status)
4168 {
4169     struct de4x5_private *lp = netdev_priv(dev);
4170     int i, tmp;
4171
4172     for (tmp=0,i=0; i<ETH_ALEN; i++) tmp += (u_char)dev->dev_addr[i];
4173     if ((tmp == 0) || (tmp == 0x5fa)) {
4174         if ((lp->chipset == last.chipset) &&
4175             (lp->bus_num == last.bus) && (lp->bus_num > 0)) {
4176             for (i=0; i<ETH_ALEN; i++) dev->dev_addr[i] = last.addr[i];
4177             for (i=ETH_ALEN-1; i>2; --i) {
4178                 dev->dev_addr[i] += 1;
4179                 if (dev->dev_addr[i] != 0) break;
4180             }
4181             for (i=0; i<ETH_ALEN; i++) last.addr[i] = dev->dev_addr[i];
4182             if (!an_exception(lp)) {
4183                 dev->irq = last.irq;
4184             }
4185
4186             status = 0;
4187         }
4188     } else if (!status) {
4189         last.chipset = lp->chipset;
4190         last.bus = lp->bus_num;
4191         last.irq = dev->irq;
4192         for (i=0; i<ETH_ALEN; i++) last.addr[i] = dev->dev_addr[i];
4193     }
4194
4195     return status;
4196 }
4197
4198 /*
4199 ** List of board exceptions with correctly wired IRQs
4200 */
4201 static int
4202 an_exception(struct de4x5_private *lp)
4203 {
4204     if ((*(u_short *)lp->srom.sub_vendor_id == 0x00c0) &&
4205         (*(u_short *)lp->srom.sub_system_id == 0x95e0)) {
4206         return -1;
4207     }
4208
4209     return 0;
4210 }
4211
4212 /*
4213 ** SROM Read
4214 */
4215 static short
4216 srom_rd(u_long addr, u_char offset)
4217 {
4218     sendto_srom(SROM_RD | SROM_SR, addr);
4219
4220     srom_latch(SROM_RD | SROM_SR | DT_CS, addr);
4221     srom_command(SROM_RD | SROM_SR | DT_IN | DT_CS, addr);
4222     srom_address(SROM_RD | SROM_SR | DT_CS, addr, offset);
4223
4224     return srom_data(SROM_RD | SROM_SR | DT_CS, addr);
4225 }
4226
4227 static void
4228 srom_latch(u_int command, u_long addr)
4229 {
4230     sendto_srom(command, addr);
4231     sendto_srom(command | DT_CLK, addr);
4232     sendto_srom(command, addr);
4233 }
4234
4235 static void
4236 srom_command(u_int command, u_long addr)
4237 {
4238     srom_latch(command, addr);
4239     srom_latch(command, addr);
4240     srom_latch((command & 0x0000ff00) | DT_CS, addr);
4241 }
4242
4243 static void
4244 srom_address(u_int command, u_long addr, u_char offset)
4245 {
4246     int i, a;
4247
4248     a = offset << 2;
4249     for (i=0; i<6; i++, a <<= 1) {
4250         srom_latch(command | ((a & 0x80) ? DT_IN : 0), addr);
4251     }
4252     udelay(1);
4253
4254     i = (getfrom_srom(addr) >> 3) & 0x01;
4255 }
4256
4257 static short
4258 srom_data(u_int command, u_long addr)
4259 {
4260     int i;
4261     short word = 0;
4262     s32 tmp;
4263
4264     for (i=0; i<16; i++) {
4265         sendto_srom(command  | DT_CLK, addr);
4266         tmp = getfrom_srom(addr);
4267         sendto_srom(command, addr);
4268
4269         word = (word << 1) | ((tmp >> 3) & 0x01);
4270     }
4271
4272     sendto_srom(command & 0x0000ff00, addr);
4273
4274     return word;
4275 }
4276
4277 /*
4278 static void
4279 srom_busy(u_int command, u_long addr)
4280 {
4281    sendto_srom((command & 0x0000ff00) | DT_CS, addr);
4282
4283    while (!((getfrom_srom(addr) >> 3) & 0x01)) {
4284        mdelay(1);
4285    }
4286
4287    sendto_srom(command & 0x0000ff00, addr);
4288 }
4289 */
4290
4291 static void
4292 sendto_srom(u_int command, u_long addr)
4293 {
4294     outl(command, addr);
4295     udelay(1);
4296 }
4297
4298 static int
4299 getfrom_srom(u_long addr)
4300 {
4301     s32 tmp;
4302
4303     tmp = inl(addr);
4304     udelay(1);
4305
4306     return tmp;
4307 }
4308
4309 static int
4310 srom_infoleaf_info(struct net_device *dev)
4311 {
4312     struct de4x5_private *lp = netdev_priv(dev);
4313     int i, count;
4314     u_char *p;
4315
4316     /* Find the infoleaf decoder function that matches this chipset */
4317     for (i=0; i<INFOLEAF_SIZE; i++) {
4318         if (lp->chipset == infoleaf_array[i].chipset) break;
4319     }
4320     if (i == INFOLEAF_SIZE) {
4321         lp->useSROM = false;
4322         printk("%s: Cannot find correct chipset for SROM decoding!\n",
4323                                                                   dev->name);
4324         return -ENXIO;
4325     }
4326
4327     lp->infoleaf_fn = infoleaf_array[i].fn;
4328
4329     /* Find the information offset that this function should use */
4330     count = *((u_char *)&lp->srom + 19);
4331     p  = (u_char *)&lp->srom + 26;
4332
4333     if (count > 1) {
4334         for (i=count; i; --i, p+=3) {
4335             if (lp->device == *p) break;
4336         }
4337         if (i == 0) {
4338             lp->useSROM = false;
4339             printk("%s: Cannot find correct PCI device [%d] for SROM decoding!\n",
4340                                                        dev->name, lp->device);
4341             return -ENXIO;
4342         }
4343     }
4344
4345         lp->infoleaf_offset = get_unaligned_le16(p + 1);
4346
4347     return 0;
4348 }
4349
4350 /*
4351 ** This routine loads any type 1 or 3 MII info into the mii device
4352 ** struct and executes any type 5 code to reset PHY devices for this
4353 ** controller.
4354 ** The info for the MII devices will be valid since the index used
4355 ** will follow the discovery process from MII address 1-31 then 0.
4356 */
4357 static void
4358 srom_init(struct net_device *dev)
4359 {
4360     struct de4x5_private *lp = netdev_priv(dev);
4361     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4362     u_char count;
4363
4364     p+=2;
4365     if (lp->chipset == DC21140) {
4366         lp->cache.gepc = (*p++ | GEP_CTRL);
4367         gep_wr(lp->cache.gepc, dev);
4368     }
4369
4370     /* Block count */
4371     count = *p++;
4372
4373     /* Jump the infoblocks to find types */
4374     for (;count; --count) {
4375         if (*p < 128) {
4376             p += COMPACT_LEN;
4377         } else if (*(p+1) == 5) {
4378             type5_infoblock(dev, 1, p);
4379             p += ((*p & BLOCK_LEN) + 1);
4380         } else if (*(p+1) == 4) {
4381             p += ((*p & BLOCK_LEN) + 1);
4382         } else if (*(p+1) == 3) {
4383             type3_infoblock(dev, 1, p);
4384             p += ((*p & BLOCK_LEN) + 1);
4385         } else if (*(p+1) == 2) {
4386             p += ((*p & BLOCK_LEN) + 1);
4387         } else if (*(p+1) == 1) {
4388             type1_infoblock(dev, 1, p);
4389             p += ((*p & BLOCK_LEN) + 1);
4390         } else {
4391             p += ((*p & BLOCK_LEN) + 1);
4392         }
4393     }
4394 }
4395
4396 /*
4397 ** A generic routine that writes GEP control, data and reset information
4398 ** to the GEP register (21140) or csr15 GEP portion (2114[23]).
4399 */
4400 static void
4401 srom_exec(struct net_device *dev, u_char *p)
4402 {
4403     struct de4x5_private *lp = netdev_priv(dev);
4404     u_long iobase = dev->base_addr;
4405     u_char count = (p ? *p++ : 0);
4406     u_short *w = (u_short *)p;
4407
4408     if (((lp->ibn != 1) && (lp->ibn != 3) && (lp->ibn != 5)) || !count) return;
4409
4410     if (lp->chipset != DC21140) RESET_SIA;
4411
4412     while (count--) {
4413         gep_wr(((lp->chipset==DC21140) && (lp->ibn!=5) ?
4414                                                    *p++ : get_unaligned_le16(w++)), dev);
4415         mdelay(2);                          /* 2ms per action */
4416     }
4417
4418     if (lp->chipset != DC21140) {
4419         outl(lp->cache.csr14, DE4X5_STRR);
4420         outl(lp->cache.csr13, DE4X5_SICR);
4421     }
4422 }
4423
4424 /*
4425 ** Basically this function is a NOP since it will never be called,
4426 ** unless I implement the DC21041 SROM functions. There's no need
4427 ** since the existing code will be satisfactory for all boards.
4428 */
4429 static int
4430 dc21041_infoleaf(struct net_device *dev)
4431 {
4432     return DE4X5_AUTOSENSE_MS;
4433 }
4434
4435 static int
4436 dc21140_infoleaf(struct net_device *dev)
4437 {
4438     struct de4x5_private *lp = netdev_priv(dev);
4439     u_char count = 0;
4440     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4441     int next_tick = DE4X5_AUTOSENSE_MS;
4442
4443     /* Read the connection type */
4444     p+=2;
4445
4446     /* GEP control */
4447     lp->cache.gepc = (*p++ | GEP_CTRL);
4448
4449     /* Block count */
4450     count = *p++;
4451
4452     /* Recursively figure out the info blocks */
4453     if (*p < 128) {
4454         next_tick = dc_infoblock[COMPACT](dev, count, p);
4455     } else {
4456         next_tick = dc_infoblock[*(p+1)](dev, count, p);
4457     }
4458
4459     if (lp->tcount == count) {
4460         lp->media = NC;
4461         if (lp->media != lp->c_media) {
4462             de4x5_dbg_media(dev);
4463             lp->c_media = lp->media;
4464         }
4465         lp->media = INIT;
4466         lp->tcount = 0;
4467         lp->tx_enable = false;
4468     }
4469
4470     return next_tick & ~TIMER_CB;
4471 }
4472
4473 static int
4474 dc21142_infoleaf(struct net_device *dev)
4475 {
4476     struct de4x5_private *lp = netdev_priv(dev);
4477     u_char count = 0;
4478     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4479     int next_tick = DE4X5_AUTOSENSE_MS;
4480
4481     /* Read the connection type */
4482     p+=2;
4483
4484     /* Block count */
4485     count = *p++;
4486
4487     /* Recursively figure out the info blocks */
4488     if (*p < 128) {
4489         next_tick = dc_infoblock[COMPACT](dev, count, p);
4490     } else {
4491         next_tick = dc_infoblock[*(p+1)](dev, count, p);
4492     }
4493
4494     if (lp->tcount == count) {
4495         lp->media = NC;
4496         if (lp->media != lp->c_media) {
4497             de4x5_dbg_media(dev);
4498             lp->c_media = lp->media;
4499         }
4500         lp->media = INIT;
4501         lp->tcount = 0;
4502         lp->tx_enable = false;
4503     }
4504
4505     return next_tick & ~TIMER_CB;
4506 }
4507
4508 static int
4509 dc21143_infoleaf(struct net_device *dev)
4510 {
4511     struct de4x5_private *lp = netdev_priv(dev);
4512     u_char count = 0;
4513     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
4514     int next_tick = DE4X5_AUTOSENSE_MS;
4515
4516     /* Read the connection type */
4517     p+=2;
4518
4519     /* Block count */
4520     count = *p++;
4521
4522     /* Recursively figure out the info blocks */
4523     if (*p < 128) {
4524         next_tick = dc_infoblock[COMPACT](dev, count, p);
4525     } else {
4526         next_tick = dc_infoblock[*(p+1)](dev, count, p);
4527     }
4528     if (lp->tcount == count) {
4529         lp->media = NC;
4530         if (lp->media != lp->c_media) {
4531             de4x5_dbg_media(dev);
4532             lp->c_media = lp->media;
4533         }
4534         lp->media = INIT;
4535         lp->tcount = 0;
4536         lp->tx_enable = false;
4537     }
4538
4539     return next_tick & ~TIMER_CB;
4540 }
4541
4542 /*
4543 ** The compact infoblock is only designed for DC21140[A] chips, so
4544 ** we'll reuse the dc21140m_autoconf function. Non MII media only.
4545 */
4546 static int
4547 compact_infoblock(struct net_device *dev, u_char count, u_char *p)
4548 {
4549     struct de4x5_private *lp = netdev_priv(dev);
4550     u_char flags, csr6;
4551
4552     /* Recursively figure out the info blocks */
4553     if (--count > lp->tcount) {
4554         if (*(p+COMPACT_LEN) < 128) {
4555             return dc_infoblock[COMPACT](dev, count, p+COMPACT_LEN);
4556         } else {
4557             return dc_infoblock[*(p+COMPACT_LEN+1)](dev, count, p+COMPACT_LEN);
4558         }
4559     }
4560
4561     if ((lp->media == INIT) && (lp->timeout < 0)) {
4562         lp->ibn = COMPACT;
4563         lp->active = 0;
4564         gep_wr(lp->cache.gepc, dev);
4565         lp->infoblock_media = (*p++) & COMPACT_MC;
4566         lp->cache.gep = *p++;
4567         csr6 = *p++;
4568         flags = *p++;
4569
4570         lp->asBitValid = (flags & 0x80) ? 0 : -1;
4571         lp->defMedium = (flags & 0x40) ? -1 : 0;
4572         lp->asBit = 1 << ((csr6 >> 1) & 0x07);
4573         lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
4574         lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
4575         lp->useMII = false;
4576
4577         de4x5_switch_mac_port(dev);
4578     }
4579
4580     return dc21140m_autoconf(dev);
4581 }
4582
4583 /*
4584 ** This block describes non MII media for the DC21140[A] only.
4585 */
4586 static int
4587 type0_infoblock(struct net_device *dev, u_char count, u_char *p)
4588 {
4589     struct de4x5_private *lp = netdev_priv(dev);
4590     u_char flags, csr6, len = (*p & BLOCK_LEN)+1;
4591
4592     /* Recursively figure out the info blocks */
4593     if (--count > lp->tcount) {
4594         if (*(p+len) < 128) {
4595             return dc_infoblock[COMPACT](dev, count, p+len);
4596         } else {
4597             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4598         }
4599     }
4600
4601     if ((lp->media == INIT) && (lp->timeout < 0)) {
4602         lp->ibn = 0;
4603         lp->active = 0;
4604         gep_wr(lp->cache.gepc, dev);
4605         p+=2;
4606         lp->infoblock_media = (*p++) & BLOCK0_MC;
4607         lp->cache.gep = *p++;
4608         csr6 = *p++;
4609         flags = *p++;
4610
4611         lp->asBitValid = (flags & 0x80) ? 0 : -1;
4612         lp->defMedium = (flags & 0x40) ? -1 : 0;
4613         lp->asBit = 1 << ((csr6 >> 1) & 0x07);
4614         lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
4615         lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
4616         lp->useMII = false;
4617
4618         de4x5_switch_mac_port(dev);
4619     }
4620
4621     return dc21140m_autoconf(dev);
4622 }
4623
4624 /* These functions are under construction! */
4625
4626 static int
4627 type1_infoblock(struct net_device *dev, u_char count, u_char *p)
4628 {
4629     struct de4x5_private *lp = netdev_priv(dev);
4630     u_char len = (*p & BLOCK_LEN)+1;
4631
4632     /* Recursively figure out the info blocks */
4633     if (--count > lp->tcount) {
4634         if (*(p+len) < 128) {
4635             return dc_infoblock[COMPACT](dev, count, p+len);
4636         } else {
4637             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4638         }
4639     }
4640
4641     p += 2;
4642     if (lp->state == INITIALISED) {
4643         lp->ibn = 1;
4644         lp->active = *p++;
4645         lp->phy[lp->active].gep = (*p ? p : NULL); p += (*p + 1);
4646         lp->phy[lp->active].rst = (*p ? p : NULL); p += (*p + 1);
4647         lp->phy[lp->active].mc  = get_unaligned_le16(p); p += 2;
4648         lp->phy[lp->active].ana = get_unaligned_le16(p); p += 2;
4649         lp->phy[lp->active].fdx = get_unaligned_le16(p); p += 2;
4650         lp->phy[lp->active].ttm = get_unaligned_le16(p);
4651         return 0;
4652     } else if ((lp->media == INIT) && (lp->timeout < 0)) {
4653         lp->ibn = 1;
4654         lp->active = *p;
4655         lp->infoblock_csr6 = OMR_MII_100;
4656         lp->useMII = true;
4657         lp->infoblock_media = ANS;
4658
4659         de4x5_switch_mac_port(dev);
4660     }
4661
4662     return dc21140m_autoconf(dev);
4663 }
4664
4665 static int
4666 type2_infoblock(struct net_device *dev, u_char count, u_char *p)
4667 {
4668     struct de4x5_private *lp = netdev_priv(dev);
4669     u_char len = (*p & BLOCK_LEN)+1;
4670
4671     /* Recursively figure out the info blocks */
4672     if (--count > lp->tcount) {
4673         if (*(p+len) < 128) {
4674             return dc_infoblock[COMPACT](dev, count, p+len);
4675         } else {
4676             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4677         }
4678     }
4679
4680     if ((lp->media == INIT) && (lp->timeout < 0)) {
4681         lp->ibn = 2;
4682         lp->active = 0;
4683         p += 2;
4684         lp->infoblock_media = (*p) & MEDIA_CODE;
4685
4686         if ((*p++) & EXT_FIELD) {
4687             lp->cache.csr13 = get_unaligned_le16(p); p += 2;
4688             lp->cache.csr14 = get_unaligned_le16(p); p += 2;
4689             lp->cache.csr15 = get_unaligned_le16(p); p += 2;
4690         } else {
4691             lp->cache.csr13 = CSR13;
4692             lp->cache.csr14 = CSR14;
4693             lp->cache.csr15 = CSR15;
4694         }
4695         lp->cache.gepc = ((s32)(get_unaligned_le16(p)) << 16); p += 2;
4696         lp->cache.gep  = ((s32)(get_unaligned_le16(p)) << 16);
4697         lp->infoblock_csr6 = OMR_SIA;
4698         lp->useMII = false;
4699
4700         de4x5_switch_mac_port(dev);
4701     }
4702
4703     return dc2114x_autoconf(dev);
4704 }
4705
4706 static int
4707 type3_infoblock(struct net_device *dev, u_char count, u_char *p)
4708 {
4709     struct de4x5_private *lp = netdev_priv(dev);
4710     u_char len = (*p & BLOCK_LEN)+1;
4711
4712     /* Recursively figure out the info blocks */
4713     if (--count > lp->tcount) {
4714         if (*(p+len) < 128) {
4715             return dc_infoblock[COMPACT](dev, count, p+len);
4716         } else {
4717             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4718         }
4719     }
4720
4721     p += 2;
4722     if (lp->state == INITIALISED) {
4723         lp->ibn = 3;
4724         lp->active = *p++;
4725         if (MOTO_SROM_BUG) lp->active = 0;
4726         lp->phy[lp->active].gep = (*p ? p : NULL); p += (2 * (*p) + 1);
4727         lp->phy[lp->active].rst = (*p ? p : NULL); p += (2 * (*p) + 1);
4728         lp->phy[lp->active].mc  = get_unaligned_le16(p); p += 2;
4729         lp->phy[lp->active].ana = get_unaligned_le16(p); p += 2;
4730         lp->phy[lp->active].fdx = get_unaligned_le16(p); p += 2;
4731         lp->phy[lp->active].ttm = get_unaligned_le16(p); p += 2;
4732         lp->phy[lp->active].mci = *p;
4733         return 0;
4734     } else if ((lp->media == INIT) && (lp->timeout < 0)) {
4735         lp->ibn = 3;
4736         lp->active = *p;
4737         if (MOTO_SROM_BUG) lp->active = 0;
4738         lp->infoblock_csr6 = OMR_MII_100;
4739         lp->useMII = true;
4740         lp->infoblock_media = ANS;
4741
4742         de4x5_switch_mac_port(dev);
4743     }
4744
4745     return dc2114x_autoconf(dev);
4746 }
4747
4748 static int
4749 type4_infoblock(struct net_device *dev, u_char count, u_char *p)
4750 {
4751     struct de4x5_private *lp = netdev_priv(dev);
4752     u_char flags, csr6, len = (*p & BLOCK_LEN)+1;
4753
4754     /* Recursively figure out the info blocks */
4755     if (--count > lp->tcount) {
4756         if (*(p+len) < 128) {
4757             return dc_infoblock[COMPACT](dev, count, p+len);
4758         } else {
4759             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4760         }
4761     }
4762
4763     if ((lp->media == INIT) && (lp->timeout < 0)) {
4764         lp->ibn = 4;
4765         lp->active = 0;
4766         p+=2;
4767         lp->infoblock_media = (*p++) & MEDIA_CODE;
4768         lp->cache.csr13 = CSR13;              /* Hard coded defaults */
4769         lp->cache.csr14 = CSR14;
4770         lp->cache.csr15 = CSR15;
4771         lp->cache.gepc = ((s32)(get_unaligned_le16(p)) << 16); p += 2;
4772         lp->cache.gep  = ((s32)(get_unaligned_le16(p)) << 16); p += 2;
4773         csr6 = *p++;
4774         flags = *p++;
4775
4776         lp->asBitValid = (flags & 0x80) ? 0 : -1;
4777         lp->defMedium = (flags & 0x40) ? -1 : 0;
4778         lp->asBit = 1 << ((csr6 >> 1) & 0x07);
4779         lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
4780         lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
4781         lp->useMII = false;
4782
4783         de4x5_switch_mac_port(dev);
4784     }
4785
4786     return dc2114x_autoconf(dev);
4787 }
4788
4789 /*
4790 ** This block type provides information for resetting external devices
4791 ** (chips) through the General Purpose Register.
4792 */
4793 static int
4794 type5_infoblock(struct net_device *dev, u_char count, u_char *p)
4795 {
4796     struct de4x5_private *lp = netdev_priv(dev);
4797     u_char len = (*p & BLOCK_LEN)+1;
4798
4799     /* Recursively figure out the info blocks */
4800     if (--count > lp->tcount) {
4801         if (*(p+len) < 128) {
4802             return dc_infoblock[COMPACT](dev, count, p+len);
4803         } else {
4804             return dc_infoblock[*(p+len+1)](dev, count, p+len);
4805         }
4806     }
4807
4808     /* Must be initializing to run this code */
4809     if ((lp->state == INITIALISED) || (lp->media == INIT)) {
4810         p+=2;
4811         lp->rst = p;
4812         srom_exec(dev, lp->rst);
4813     }
4814
4815     return DE4X5_AUTOSENSE_MS;
4816 }
4817
4818 /*
4819 ** MII Read/Write
4820 */
4821
4822 static int
4823 mii_rd(u_char phyreg, u_char phyaddr, u_long ioaddr)
4824 {
4825     mii_wdata(MII_PREAMBLE,  2, ioaddr);   /* Start of 34 bit preamble...    */
4826     mii_wdata(MII_PREAMBLE, 32, ioaddr);   /* ...continued                   */
4827     mii_wdata(MII_STRD, 4, ioaddr);        /* SFD and Read operation         */
4828     mii_address(phyaddr, ioaddr);          /* PHY address to be accessed     */
4829     mii_address(phyreg, ioaddr);           /* PHY Register to read           */
4830     mii_ta(MII_STRD, ioaddr);              /* Turn around time - 2 MDC       */
4831
4832     return mii_rdata(ioaddr);              /* Read data                      */
4833 }
4834
4835 static void
4836 mii_wr(int data, u_char phyreg, u_char phyaddr, u_long ioaddr)
4837 {
4838     mii_wdata(MII_PREAMBLE,  2, ioaddr);   /* Start of 34 bit preamble...    */
4839     mii_wdata(MII_PREAMBLE, 32, ioaddr);   /* ...continued                   */
4840     mii_wdata(MII_STWR, 4, ioaddr);        /* SFD and Write operation        */
4841     mii_address(phyaddr, ioaddr);          /* PHY address to be accessed     */
4842     mii_address(phyreg, ioaddr);           /* PHY Register to write          */
4843     mii_ta(MII_STWR, ioaddr);              /* Turn around time - 2 MDC       */
4844     data = mii_swap(data, 16);             /* Swap data bit ordering         */
4845     mii_wdata(data, 16, ioaddr);           /* Write data                     */
4846 }
4847
4848 static int
4849 mii_rdata(u_long ioaddr)
4850 {
4851     int i;
4852     s32 tmp = 0;
4853
4854     for (i=0; i<16; i++) {
4855         tmp <<= 1;
4856         tmp |= getfrom_mii(MII_MRD | MII_RD, ioaddr);
4857     }
4858
4859     return tmp;
4860 }
4861
4862 static void
4863 mii_wdata(int data, int len, u_long ioaddr)
4864 {
4865     int i;
4866
4867     for (i=0; i<len; i++) {
4868         sendto_mii(MII_MWR | MII_WR, data, ioaddr);
4869         data >>= 1;
4870     }
4871 }
4872
4873 static void
4874 mii_address(u_char addr, u_long ioaddr)
4875 {
4876     int i;
4877
4878     addr = mii_swap(addr, 5);
4879     for (i=0; i<5; i++) {
4880         sendto_mii(MII_MWR | MII_WR, addr, ioaddr);
4881         addr >>= 1;
4882     }
4883 }
4884
4885 static void
4886 mii_ta(u_long rw, u_long ioaddr)
4887 {
4888     if (rw == MII_STWR) {
4889         sendto_mii(MII_MWR | MII_WR, 1, ioaddr);
4890         sendto_mii(MII_MWR | MII_WR, 0, ioaddr);
4891     } else {
4892         getfrom_mii(MII_MRD | MII_RD, ioaddr);        /* Tri-state MDIO */
4893     }
4894 }
4895
4896 static int
4897 mii_swap(int data, int len)
4898 {
4899     int i, tmp = 0;
4900
4901     for (i=0; i<len; i++) {
4902         tmp <<= 1;
4903         tmp |= (data & 1);
4904         data >>= 1;
4905     }
4906
4907     return tmp;
4908 }
4909
4910 static void
4911 sendto_mii(u32 command, int data, u_long ioaddr)
4912 {
4913     u32 j;
4914
4915     j = (data & 1) << 17;
4916     outl(command | j, ioaddr);
4917     udelay(1);
4918     outl(command | MII_MDC | j, ioaddr);
4919     udelay(1);
4920 }
4921
4922 static int
4923 getfrom_mii(u32 command, u_long ioaddr)
4924 {
4925     outl(command, ioaddr);
4926     udelay(1);
4927     outl(command | MII_MDC, ioaddr);
4928     udelay(1);
4929
4930     return (inl(ioaddr) >> 19) & 1;
4931 }
4932
4933 /*
4934 ** Here's 3 ways to calculate the OUI from the ID registers.
4935 */
4936 static int
4937 mii_get_oui(u_char phyaddr, u_long ioaddr)
4938 {
4939 /*
4940     union {
4941         u_short reg;
4942         u_char breg[2];
4943     } a;
4944     int i, r2, r3, ret=0;*/
4945     int r2, r3;
4946
4947     /* Read r2 and r3 */
4948     r2 = mii_rd(MII_ID0, phyaddr, ioaddr);
4949     r3 = mii_rd(MII_ID1, phyaddr, ioaddr);
4950                                                 /* SEEQ and Cypress way * /
4951     / * Shuffle r2 and r3 * /
4952     a.reg=0;
4953     r3 = ((r3>>10)|(r2<<6))&0x0ff;
4954     r2 = ((r2>>2)&0x3fff);
4955
4956     / * Bit reverse r3 * /
4957     for (i=0;i<8;i++) {
4958         ret<<=1;
4959         ret |= (r3&1);
4960         r3>>=1;
4961     }
4962
4963     / * Bit reverse r2 * /
4964     for (i=0;i<16;i++) {
4965         a.reg<<=1;
4966         a.reg |= (r2&1);
4967         r2>>=1;
4968     }
4969
4970     / * Swap r2 bytes * /
4971     i=a.breg[0];
4972     a.breg[0]=a.breg[1];
4973     a.breg[1]=i;
4974
4975     return (a.reg<<8)|ret; */                 /* SEEQ and Cypress way */
4976 /*    return (r2<<6)|(u_int)(r3>>10); */      /* NATIONAL and BROADCOM way */
4977     return r2;                                  /* (I did it) My way */
4978 }
4979
4980 /*
4981 ** The SROM spec forces us to search addresses [1-31 0]. Bummer.
4982 */
4983 static int
4984 mii_get_phy(struct net_device *dev)
4985 {
4986     struct de4x5_private *lp = netdev_priv(dev);
4987     u_long iobase = dev->base_addr;
4988     int i, j, k, n, limit=ARRAY_SIZE(phy_info);
4989     int id;
4990
4991     lp->active = 0;
4992     lp->useMII = true;
4993
4994     /* Search the MII address space for possible PHY devices */
4995     for (n=0, lp->mii_cnt=0, i=1; !((i==1) && (n==1)); i=(i+1)%DE4X5_MAX_MII) {
4996         lp->phy[lp->active].addr = i;
4997         if (i==0) n++;                             /* Count cycles */
4998         while (de4x5_reset_phy(dev)<0) udelay(100);/* Wait for reset */
4999         id = mii_get_oui(i, DE4X5_MII);
5000         if ((id == 0) || (id == 65535)) continue;  /* Valid ID? */
5001         for (j=0; j<limit; j++) {                  /* Search PHY table */
5002             if (id != phy_info[j].id) continue;    /* ID match? */
5003             for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
5004             if (k < DE4X5_MAX_PHY) {
5005                 memcpy((char *)&lp->phy[k],
5006                        (char *)&phy_info[j], sizeof(struct phy_table));
5007                 lp->phy[k].addr = i;
5008                 lp->mii_cnt++;
5009                 lp->active++;
5010             } else {
5011                 goto purgatory;                    /* Stop the search */
5012             }
5013             break;
5014         }
5015         if ((j == limit) && (i < DE4X5_MAX_MII)) {
5016             for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
5017             lp->phy[k].addr = i;
5018             lp->phy[k].id = id;
5019             lp->phy[k].spd.reg = GENERIC_REG;      /* ANLPA register         */
5020             lp->phy[k].spd.mask = GENERIC_MASK;    /* 100Mb/s technologies   */
5021             lp->phy[k].spd.value = GENERIC_VALUE;  /* TX & T4, H/F Duplex    */
5022             lp->mii_cnt++;
5023             lp->active++;
5024             printk("%s: Using generic MII device control. If the board doesn't operate,\nplease mail the following dump to the author:\n", dev->name);
5025             j = de4x5_debug;
5026             de4x5_debug |= DEBUG_MII;
5027             de4x5_dbg_mii(dev, k);
5028             de4x5_debug = j;
5029             printk("\n");
5030         }
5031     }
5032   purgatory:
5033     lp->active = 0;
5034     if (lp->phy[0].id) {                           /* Reset the PHY devices */
5035         for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++) { /*For each PHY*/
5036             mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII);
5037             while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST);
5038
5039             de4x5_dbg_mii(dev, k);
5040         }
5041     }
5042     if (!lp->mii_cnt) lp->useMII = false;
5043
5044     return lp->mii_cnt;
5045 }
5046
5047 static char *
5048 build_setup_frame(struct net_device *dev, int mode)
5049 {
5050     struct de4x5_private *lp = netdev_priv(dev);
5051     int i;
5052     char *pa = lp->setup_frame;
5053
5054     /* Initialise the setup frame */
5055     if (mode == ALL) {
5056         memset(lp->setup_frame, 0, SETUP_FRAME_LEN);
5057     }
5058
5059     if (lp->setup_f == HASH_PERF) {
5060         for (pa=lp->setup_frame+IMPERF_PA_OFFSET, i=0; i<ETH_ALEN; i++) {
5061             *(pa + i) = dev->dev_addr[i];                 /* Host address */
5062             if (i & 0x01) pa += 2;
5063         }
5064         *(lp->setup_frame + (HASH_TABLE_LEN >> 3) - 3) = 0x80;
5065     } else {
5066         for (i=0; i<ETH_ALEN; i++) { /* Host address */
5067             *(pa + (i&1)) = dev->dev_addr[i];
5068             if (i & 0x01) pa += 4;
5069         }
5070         for (i=0; i<ETH_ALEN; i++) { /* Broadcast address */
5071             *(pa + (i&1)) = (char) 0xff;
5072             if (i & 0x01) pa += 4;
5073         }
5074     }
5075
5076     return pa;                     /* Points to the next entry */
5077 }
5078
5079 static void
5080 disable_ast(struct net_device *dev)
5081 {
5082         struct de4x5_private *lp = netdev_priv(dev);
5083         del_timer_sync(&lp->timer);
5084 }
5085
5086 static long
5087 de4x5_switch_mac_port(struct net_device *dev)
5088 {
5089     struct de4x5_private *lp = netdev_priv(dev);
5090     u_long iobase = dev->base_addr;
5091     s32 omr;
5092
5093     STOP_DE4X5;
5094
5095     /* Assert the OMR_PS bit in CSR6 */
5096     omr = (inl(DE4X5_OMR) & ~(OMR_PS | OMR_HBD | OMR_TTM | OMR_PCS | OMR_SCR |
5097                                                                      OMR_FDX));
5098     omr |= lp->infoblock_csr6;
5099     if (omr & OMR_PS) omr |= OMR_HBD;
5100     outl(omr, DE4X5_OMR);
5101
5102     /* Soft Reset */
5103     RESET_DE4X5;
5104
5105     /* Restore the GEP - especially for COMPACT and Type 0 Infoblocks */
5106     if (lp->chipset == DC21140) {
5107         gep_wr(lp->cache.gepc, dev);
5108         gep_wr(lp->cache.gep, dev);
5109     } else if ((lp->chipset & ~0x0ff) == DC2114x) {
5110         reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14, lp->cache.csr15);
5111     }
5112
5113     /* Restore CSR6 */
5114     outl(omr, DE4X5_OMR);
5115
5116     /* Reset CSR8 */
5117     inl(DE4X5_MFC);
5118
5119     return omr;
5120 }
5121
5122 static void
5123 gep_wr(s32 data, struct net_device *dev)
5124 {
5125     struct de4x5_private *lp = netdev_priv(dev);
5126     u_long iobase = dev->base_addr;
5127
5128     if (lp->chipset == DC21140) {
5129         outl(data, DE4X5_GEP);
5130     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
5131         outl((data<<16) | lp->cache.csr15, DE4X5_SIGR);
5132     }
5133 }
5134
5135 static int
5136 gep_rd(struct net_device *dev)
5137 {
5138     struct de4x5_private *lp = netdev_priv(dev);
5139     u_long iobase = dev->base_addr;
5140
5141     if (lp->chipset == DC21140) {
5142         return inl(DE4X5_GEP);
5143     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
5144         return inl(DE4X5_SIGR) & 0x000fffff;
5145     }
5146
5147     return 0;
5148 }
5149
5150 static void
5151 yawn(struct net_device *dev, int state)
5152 {
5153     struct de4x5_private *lp = netdev_priv(dev);
5154     u_long iobase = dev->base_addr;
5155
5156     if ((lp->chipset == DC21040) || (lp->chipset == DC21140)) return;
5157
5158     if(lp->bus == EISA) {
5159         switch(state) {
5160           case WAKEUP:
5161             outb(WAKEUP, PCI_CFPM);
5162             mdelay(10);
5163             break;
5164
5165           case SNOOZE:
5166             outb(SNOOZE, PCI_CFPM);
5167             break;
5168
5169           case SLEEP:
5170             outl(0, DE4X5_SICR);
5171             outb(SLEEP, PCI_CFPM);
5172             break;
5173         }
5174     } else {
5175         struct pci_dev *pdev = to_pci_dev (lp->gendev);
5176         switch(state) {
5177           case WAKEUP:
5178             pci_write_config_byte(pdev, PCI_CFDA_PSM, WAKEUP);
5179             mdelay(10);
5180             break;
5181
5182           case SNOOZE:
5183             pci_write_config_byte(pdev, PCI_CFDA_PSM, SNOOZE);
5184             break;
5185
5186           case SLEEP:
5187             outl(0, DE4X5_SICR);
5188             pci_write_config_byte(pdev, PCI_CFDA_PSM, SLEEP);
5189             break;
5190         }
5191     }
5192 }
5193
5194 static void
5195 de4x5_parse_params(struct net_device *dev)
5196 {
5197     struct de4x5_private *lp = netdev_priv(dev);
5198     char *p, *q, t;
5199
5200     lp->params.fdx = 0;
5201     lp->params.autosense = AUTO;
5202
5203     if (args == NULL) return;
5204
5205     if ((p = strstr(args, dev->name))) {
5206         if (!(q = strstr(p+strlen(dev->name), "eth"))) q = p + strlen(p);
5207         t = *q;
5208         *q = '\0';
5209
5210         if (strstr(p, "fdx") || strstr(p, "FDX")) lp->params.fdx = 1;
5211
5212         if (strstr(p, "autosense") || strstr(p, "AUTOSENSE")) {
5213             if (strstr(p, "TP")) {
5214                 lp->params.autosense = TP;
5215             } else if (strstr(p, "TP_NW")) {
5216                 lp->params.autosense = TP_NW;
5217             } else if (strstr(p, "BNC")) {
5218                 lp->params.autosense = BNC;
5219             } else if (strstr(p, "AUI")) {
5220                 lp->params.autosense = AUI;
5221             } else if (strstr(p, "BNC_AUI")) {
5222                 lp->params.autosense = BNC;
5223             } else if (strstr(p, "10Mb")) {
5224                 lp->params.autosense = _10Mb;
5225             } else if (strstr(p, "100Mb")) {
5226                 lp->params.autosense = _100Mb;
5227             } else if (strstr(p, "AUTO")) {
5228                 lp->params.autosense = AUTO;
5229             }
5230         }
5231         *q = t;
5232     }
5233 }
5234
5235 static void
5236 de4x5_dbg_open(struct net_device *dev)
5237 {
5238     struct de4x5_private *lp = netdev_priv(dev);
5239     int i;
5240
5241     if (de4x5_debug & DEBUG_OPEN) {
5242         printk("%s: de4x5 opening with irq %d\n",dev->name,dev->irq);
5243         printk("\tphysical address: ");
5244         for (i=0;i<6;i++) {
5245             printk("%2.2x:",(short)dev->dev_addr[i]);
5246         }
5247         printk("\n");
5248         printk("Descriptor head addresses:\n");
5249         printk("\t0x%8.8lx  0x%8.8lx\n",(u_long)lp->rx_ring,(u_long)lp->tx_ring);
5250         printk("Descriptor addresses:\nRX: ");
5251         for (i=0;i<lp->rxRingSize-1;i++){
5252             if (i < 3) {
5253                 printk("0x%8.8lx  ",(u_long)&lp->rx_ring[i].status);
5254             }
5255         }
5256         printk("...0x%8.8lx\n",(u_long)&lp->rx_ring[i].status);
5257         printk("TX: ");
5258         for (i=0;i<lp->txRingSize-1;i++){
5259             if (i < 3) {
5260                 printk("0x%8.8lx  ", (u_long)&lp->tx_ring[i].status);
5261             }
5262         }
5263         printk("...0x%8.8lx\n", (u_long)&lp->tx_ring[i].status);
5264         printk("Descriptor buffers:\nRX: ");
5265         for (i=0;i<lp->rxRingSize-1;i++){
5266             if (i < 3) {
5267                 printk("0x%8.8x  ",le32_to_cpu(lp->rx_ring[i].buf));
5268             }
5269         }
5270         printk("...0x%8.8x\n",le32_to_cpu(lp->rx_ring[i].buf));
5271         printk("TX: ");
5272         for (i=0;i<lp->txRingSize-1;i++){
5273             if (i < 3) {
5274                 printk("0x%8.8x  ", le32_to_cpu(lp->tx_ring[i].buf));
5275             }
5276         }
5277         printk("...0x%8.8x\n", le32_to_cpu(lp->tx_ring[i].buf));
5278         printk("Ring size:\nRX: %d\nTX: %d\n",
5279                (short)lp->rxRingSize,
5280                (short)lp->txRingSize);
5281     }
5282 }
5283
5284 static void
5285 de4x5_dbg_mii(struct net_device *dev, int k)
5286 {
5287     struct de4x5_private *lp = netdev_priv(dev);
5288     u_long iobase = dev->base_addr;
5289
5290     if (de4x5_debug & DEBUG_MII) {
5291         printk("\nMII device address: %d\n", lp->phy[k].addr);
5292         printk("MII CR:  %x\n",mii_rd(MII_CR,lp->phy[k].addr,DE4X5_MII));
5293         printk("MII SR:  %x\n",mii_rd(MII_SR,lp->phy[k].addr,DE4X5_MII));
5294         printk("MII ID0: %x\n",mii_rd(MII_ID0,lp->phy[k].addr,DE4X5_MII));
5295         printk("MII ID1: %x\n",mii_rd(MII_ID1,lp->phy[k].addr,DE4X5_MII));
5296         if (lp->phy[k].id != BROADCOM_T4) {
5297             printk("MII ANA: %x\n",mii_rd(0x04,lp->phy[k].addr,DE4X5_MII));
5298             printk("MII ANC: %x\n",mii_rd(0x05,lp->phy[k].addr,DE4X5_MII));
5299         }
5300         printk("MII 16:  %x\n",mii_rd(0x10,lp->phy[k].addr,DE4X5_MII));
5301         if (lp->phy[k].id != BROADCOM_T4) {
5302             printk("MII 17:  %x\n",mii_rd(0x11,lp->phy[k].addr,DE4X5_MII));
5303             printk("MII 18:  %x\n",mii_rd(0x12,lp->phy[k].addr,DE4X5_MII));
5304         } else {
5305             printk("MII 20:  %x\n",mii_rd(0x14,lp->phy[k].addr,DE4X5_MII));
5306         }
5307     }
5308 }
5309
5310 static void
5311 de4x5_dbg_media(struct net_device *dev)
5312 {
5313     struct de4x5_private *lp = netdev_priv(dev);
5314
5315     if (lp->media != lp->c_media) {
5316         if (de4x5_debug & DEBUG_MEDIA) {
5317             printk("%s: media is %s%s\n", dev->name,
5318                    (lp->media == NC  ? "unconnected, link down or incompatible connection" :
5319                     (lp->media == TP  ? "TP" :
5320                      (lp->media == ANS ? "TP/Nway" :
5321                       (lp->media == BNC ? "BNC" :
5322                        (lp->media == AUI ? "AUI" :
5323                         (lp->media == BNC_AUI ? "BNC/AUI" :
5324                          (lp->media == EXT_SIA ? "EXT SIA" :
5325                           (lp->media == _100Mb  ? "100Mb/s" :
5326                            (lp->media == _10Mb   ? "10Mb/s" :
5327                             "???"
5328                             ))))))))), (lp->fdx?" full duplex.":"."));
5329         }
5330         lp->c_media = lp->media;
5331     }
5332 }
5333
5334 static void
5335 de4x5_dbg_srom(struct de4x5_srom *p)
5336 {
5337     int i;
5338
5339     if (de4x5_debug & DEBUG_SROM) {
5340         printk("Sub-system Vendor ID: %04x\n", *((u_short *)p->sub_vendor_id));
5341         printk("Sub-system ID:        %04x\n", *((u_short *)p->sub_system_id));
5342         printk("ID Block CRC:         %02x\n", (u_char)(p->id_block_crc));
5343         printk("SROM version:         %02x\n", (u_char)(p->version));
5344         printk("# controllers:        %02x\n", (u_char)(p->num_controllers));
5345
5346         printk("Hardware Address:     %pM\n", p->ieee_addr);
5347         printk("CRC checksum:         %04x\n", (u_short)(p->chksum));
5348         for (i=0; i<64; i++) {
5349             printk("%3d %04x\n", i<<1, (u_short)*((u_short *)p+i));
5350         }
5351     }
5352 }
5353
5354 static void
5355 de4x5_dbg_rx(struct sk_buff *skb, int len)
5356 {
5357     int i, j;
5358
5359     if (de4x5_debug & DEBUG_RX) {
5360         printk("R: %pM <- %pM len/SAP:%02x%02x [%d]\n",
5361                skb->data, &skb->data[6],
5362                (u_char)skb->data[12],
5363                (u_char)skb->data[13],
5364                len);
5365         for (j=0; len>0;j+=16, len-=16) {
5366           printk("    %03x: ",j);
5367           for (i=0; i<16 && i<len; i++) {
5368             printk("%02x ",(u_char)skb->data[i+j]);
5369           }
5370           printk("\n");
5371         }
5372     }
5373 }
5374
5375 /*
5376 ** Perform IOCTL call functions here. Some are privileged operations and the
5377 ** effective uid is checked in those cases. In the normal course of events
5378 ** this function is only used for my testing.
5379 */
5380 static int
5381 de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
5382 {
5383     struct de4x5_private *lp = netdev_priv(dev);
5384     struct de4x5_ioctl *ioc = (struct de4x5_ioctl *) &rq->ifr_ifru;
5385     u_long iobase = dev->base_addr;
5386     int i, j, status = 0;
5387     s32 omr;
5388     union {
5389         u8  addr[144];
5390         u16 sval[72];
5391         u32 lval[36];
5392     } tmp;
5393     u_long flags = 0;
5394
5395     switch(ioc->cmd) {
5396     case DE4X5_GET_HWADDR:           /* Get the hardware address */
5397         ioc->len = ETH_ALEN;
5398         for (i=0; i<ETH_ALEN; i++) {
5399             tmp.addr[i] = dev->dev_addr[i];
5400         }
5401         if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
5402         break;
5403
5404     case DE4X5_SET_HWADDR:           /* Set the hardware address */
5405         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5406         if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN)) return -EFAULT;
5407         if (netif_queue_stopped(dev))
5408                 return -EBUSY;
5409         netif_stop_queue(dev);
5410         for (i=0; i<ETH_ALEN; i++) {
5411             dev->dev_addr[i] = tmp.addr[i];
5412         }
5413         build_setup_frame(dev, PHYS_ADDR_ONLY);
5414         /* Set up the descriptor and give ownership to the card */
5415         load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET |
5416                                                        SETUP_FRAME_LEN, (struct sk_buff *)1);
5417         lp->tx_new = (lp->tx_new + 1) % lp->txRingSize;
5418         outl(POLL_DEMAND, DE4X5_TPD);                /* Start the TX */
5419         netif_wake_queue(dev);                      /* Unlock the TX ring */
5420         break;
5421
5422     case DE4X5_SAY_BOO:              /* Say "Boo!" to the kernel log file */
5423         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5424         printk("%s: Boo!\n", dev->name);
5425         break;
5426
5427     case DE4X5_MCA_EN:               /* Enable pass all multicast addressing */
5428         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5429         omr = inl(DE4X5_OMR);
5430         omr |= OMR_PM;
5431         outl(omr, DE4X5_OMR);
5432         break;
5433
5434     case DE4X5_GET_STATS:            /* Get the driver statistics */
5435     {
5436         struct pkt_stats statbuf;
5437         ioc->len = sizeof(statbuf);
5438         spin_lock_irqsave(&lp->lock, flags);
5439         memcpy(&statbuf, &lp->pktStats, ioc->len);
5440         spin_unlock_irqrestore(&lp->lock, flags);
5441         if (copy_to_user(ioc->data, &statbuf, ioc->len))
5442                 return -EFAULT;
5443         break;
5444     }
5445     case DE4X5_CLR_STATS:            /* Zero out the driver statistics */
5446         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5447         spin_lock_irqsave(&lp->lock, flags);
5448         memset(&lp->pktStats, 0, sizeof(lp->pktStats));
5449         spin_unlock_irqrestore(&lp->lock, flags);
5450         break;
5451
5452     case DE4X5_GET_OMR:              /* Get the OMR Register contents */
5453         tmp.addr[0] = inl(DE4X5_OMR);
5454         if (copy_to_user(ioc->data, tmp.addr, 1)) return -EFAULT;
5455         break;
5456
5457     case DE4X5_SET_OMR:              /* Set the OMR Register contents */
5458         if (!capable(CAP_NET_ADMIN)) return -EPERM;
5459         if (copy_from_user(tmp.addr, ioc->data, 1)) return -EFAULT;
5460         outl(tmp.addr[0], DE4X5_OMR);
5461         break;
5462
5463     case DE4X5_GET_REG:              /* Get the DE4X5 Registers */
5464         j = 0;
5465         tmp.lval[0] = inl(DE4X5_STS); j+=4;
5466         tmp.lval[1] = inl(DE4X5_BMR); j+=4;
5467         tmp.lval[2] = inl(DE4X5_IMR); j+=4;
5468         tmp.lval[3] = inl(DE4X5_OMR); j+=4;
5469         tmp.lval[4] = inl(DE4X5_SISR); j+=4;
5470         tmp.lval[5] = inl(DE4X5_SICR); j+=4;
5471         tmp.lval[6] = inl(DE4X5_STRR); j+=4;
5472         tmp.lval[7] = inl(DE4X5_SIGR); j+=4;
5473         ioc->len = j;
5474         if (copy_to_user(ioc->data, tmp.lval, ioc->len))
5475                 return -EFAULT;
5476         break;
5477
5478 #define DE4X5_DUMP              0x0f /* Dump the DE4X5 Status */
5479 /*
5480       case DE4X5_DUMP:
5481         j = 0;
5482         tmp.addr[j++] = dev->irq;
5483         for (i=0; i<ETH_ALEN; i++) {
5484             tmp.addr[j++] = dev->dev_addr[i];
5485         }
5486         tmp.addr[j++] = lp->rxRingSize;
5487         tmp.lval[j>>2] = (long)lp->rx_ring; j+=4;
5488         tmp.lval[j>>2] = (long)lp->tx_ring; j+=4;
5489
5490         for (i=0;i<lp->rxRingSize-1;i++){
5491             if (i < 3) {
5492                 tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
5493             }
5494         }
5495         tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
5496         for (i=0;i<lp->txRingSize-1;i++){
5497             if (i < 3) {
5498                 tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
5499             }
5500         }
5501         tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
5502
5503         for (i=0;i<lp->rxRingSize-1;i++){
5504             if (i < 3) {
5505                 tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4;
5506             }
5507         }
5508         tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4;
5509         for (i=0;i<lp->txRingSize-1;i++){
5510             if (i < 3) {
5511                 tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4;
5512             }
5513         }
5514         tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4;
5515
5516         for (i=0;i<lp->rxRingSize;i++){
5517             tmp.lval[j>>2] = le32_to_cpu(lp->rx_ring[i].status); j+=4;
5518         }
5519         for (i=0;i<lp->txRingSize;i++){
5520             tmp.lval[j>>2] = le32_to_cpu(lp->tx_ring[i].status); j+=4;
5521         }
5522
5523         tmp.lval[j>>2] = inl(DE4X5_BMR);  j+=4;
5524         tmp.lval[j>>2] = inl(DE4X5_TPD);  j+=4;
5525         tmp.lval[j>>2] = inl(DE4X5_RPD);  j+=4;
5526         tmp.lval[j>>2] = inl(DE4X5_RRBA); j+=4;
5527         tmp.lval[j>>2] = inl(DE4X5_TRBA); j+=4;
5528         tmp.lval[j>>2] = inl(DE4X5_STS);  j+=4;
5529         tmp.lval[j>>2] = inl(DE4X5_OMR);  j+=4;
5530         tmp.lval[j>>2] = inl(DE4X5_IMR);  j+=4;
5531         tmp.lval[j>>2] = lp->chipset; j+=4;
5532         if (lp->chipset == DC21140) {
5533             tmp.lval[j>>2] = gep_rd(dev);  j+=4;
5534         } else {
5535             tmp.lval[j>>2] = inl(DE4X5_SISR); j+=4;
5536             tmp.lval[j>>2] = inl(DE4X5_SICR); j+=4;
5537             tmp.lval[j>>2] = inl(DE4X5_STRR); j+=4;
5538             tmp.lval[j>>2] = inl(DE4X5_SIGR); j+=4;
5539         }
5540         tmp.lval[j>>2] = lp->phy[lp->active].id; j+=4;
5541         if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) {
5542             tmp.lval[j>>2] = lp->active; j+=4;
5543             tmp.lval[j>>2]=mii_rd(MII_CR,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5544             tmp.lval[j>>2]=mii_rd(MII_SR,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5545             tmp.lval[j>>2]=mii_rd(MII_ID0,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5546             tmp.lval[j>>2]=mii_rd(MII_ID1,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5547             if (lp->phy[lp->active].id != BROADCOM_T4) {
5548                 tmp.lval[j>>2]=mii_rd(MII_ANA,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5549                 tmp.lval[j>>2]=mii_rd(MII_ANLPA,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5550             }
5551             tmp.lval[j>>2]=mii_rd(0x10,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5552             if (lp->phy[lp->active].id != BROADCOM_T4) {
5553                 tmp.lval[j>>2]=mii_rd(0x11,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5554                 tmp.lval[j>>2]=mii_rd(0x12,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5555             } else {
5556                 tmp.lval[j>>2]=mii_rd(0x14,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
5557             }
5558         }
5559
5560         tmp.addr[j++] = lp->txRingSize;
5561         tmp.addr[j++] = netif_queue_stopped(dev);
5562
5563         ioc->len = j;
5564         if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
5565         break;
5566
5567 */
5568     default:
5569         return -EOPNOTSUPP;
5570     }
5571
5572     return status;
5573 }
5574
5575 static int __init de4x5_module_init (void)
5576 {
5577         int err = 0;
5578
5579 #ifdef CONFIG_PCI
5580         err = pci_register_driver(&de4x5_pci_driver);
5581 #endif
5582 #ifdef CONFIG_EISA
5583         err |= eisa_driver_register (&de4x5_eisa_driver);
5584 #endif
5585
5586         return err;
5587 }
5588
5589 static void __exit de4x5_module_exit (void)
5590 {
5591 #ifdef CONFIG_PCI
5592         pci_unregister_driver (&de4x5_pci_driver);
5593 #endif
5594 #ifdef CONFIG_EISA
5595         eisa_driver_unregister (&de4x5_eisa_driver);
5596 #endif
5597 }
5598
5599 module_init (de4x5_module_init);
5600 module_exit (de4x5_module_exit);