15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Etherboot: depca.h merged, comments from Linux driver retained */
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*  depca.c: A DIGITAL DEPCA  & EtherWORKS ethernet driver for linux.
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Written 1994, 1995 by David C. Davies.
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                      Copyright 1994 David C. Davies
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		                   and
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			 United States Government
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 (as represented by the Director, National Security Agency).
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               Copyright 1995  Digital Equipment Corporation.
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    This software may be used and distributed according to the terms of
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    the GNU Public License, incorporated herein by reference.
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    This driver is written for the Digital Equipment Corporation series
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    of DEPCA and EtherWORKS ethernet cards:
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        DEPCA       (the original)
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    	DE100
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    	DE101
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	DE200 Turbo
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	DE201 Turbo
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	DE202 Turbo (TP BNC)
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	DE210
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	DE422       (EISA)
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The  driver has been tested on DE100, DE200 and DE202 cards  in  a
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    relatively busy network. The DE422 has been tested a little.
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    This  driver will NOT work   for the DE203,  DE204  and DE205 series  of
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    cards,  since they have  a  new custom ASIC in   place of the AMD  LANCE
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    chip.  See the 'ewrk3.c'   driver in the  Linux  source tree for running
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    those cards.
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    I have benchmarked the driver with a  DE100 at 595kB/s to (542kB/s from)
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    a DECstation 5000/200.
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The author may be reached at davies@maniac.ultranet.com
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    =========================================================================
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The  driver was originally based  on   the 'lance.c' driver from  Donald
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Becker   which  is included with  the  standard  driver distribution for
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    linux.  V0.4  is  a complete  re-write  with only  the kernel  interface
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    remaining from the original code.
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    1) Lance.c code in /linux/drivers/net/
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       AMD, 1992 [(800) 222-9323].
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       AMD, Pub. #17881, May 1993.
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       AMD, Pub. #16907, May 1992
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       Digital Equipment Corporation, 1989
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    driver.
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The original DEPCA  card requires that the  ethernet ROM address counter
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    be enabled to count and has an 8 bit NICSR.  The ROM counter enabling is
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    only  done when a  0x08 is read as the  first address octet (to minimise
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    the chances  of writing over some  other hardware's  I/O register).  The
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    NICSR accesses   have been changed  to  byte accesses  for all the cards
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    supported by this driver, since there is only one  useful bit in the MSB
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    (remote boot timeout) and it  is not used.  Also, there  is a maximum of
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    only 48kB network  RAM for this  card.  My thanks  to Torbjorn Lindh for
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    help debugging all this (and holding my feet to  the fire until I got it
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    right).
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The DE200  series  boards have  on-board 64kB  RAM for  use  as a shared
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    memory network  buffer. Only the DE100  cards make use  of a  2kB buffer
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mode which has not  been implemented in  this driver (only the 32kB  and
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    64kB modes are supported [16kB/48kB for the original DEPCA]).
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    At the most only 2 DEPCA cards can  be supported on  the ISA bus because
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    there is only provision  for two I/O base addresses  on each card (0x300
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    and 0x200). The I/O address is detected by searching for a byte sequence
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    in the Ethernet station address PROM at the expected I/O address for the
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Ethernet  PROM.   The shared memory  base   address  is 'autoprobed'  by
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    looking  for the self  test PROM  and detecting the  card name.   When a
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    second  DEPCA is  detected,  information  is   placed in the   base_addr
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    variable of the  next device structure (which  is created if necessary),
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    thus  enabling ethif_probe  initialization  for the device.  More than 2
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    EISA cards can  be  supported, but  care will  be  needed assigning  the
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    shared memory to ensure that each slot has the  correct IRQ, I/O address
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    and shared memory address assigned.
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ************************************************************************
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    NOTE: If you are using two  ISA DEPCAs, it is  important that you assign
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    the base memory addresses correctly.   The  driver autoprobes I/O  0x300
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    then 0x200.  The  base memory address for  the first device must be less
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    than that of the second so that the auto probe will correctly assign the
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    I/O and memory addresses on the same card.  I can't think of a way to do
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    this unambiguously at the moment, since there is nothing on the cards to
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tie I/O and memory information together.
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    I am unable  to  test  2 cards   together for now,    so this  code   is
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unchecked. All reports, good or bad, are welcome.
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ************************************************************************
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The board IRQ   setting must be  at an  unused IRQ which  is auto-probed
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    using Donald Becker's autoprobe routines. DEPCA and DE100 board IRQs are
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {2,3,4,5,7}, whereas the  DE200 is at {5,9,10,11,15}.  Note that IRQ2 is
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    really IRQ9 in machines with 16 IRQ lines.
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    No 16MB memory  limitation should exist with this  driver as DMA is  not
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    used and the common memory area is in low memory on the network card (my
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current system has 20MB and I've not had problems yet).
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The ability to load this driver as a loadable module has been added. To
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    utilise this ability, you have to do <8 things:
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    0) have a copy of the loadable modules code installed on your system.
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    1) copy depca.c from the  /linux/drivers/net directory to your favourite
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    temporary directory.
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    2) if you wish, edit the  source code near  line 1530 to reflect the I/O
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    address and IRQ you're using (see also 5).
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    3) compile  depca.c, but include -DMODULE in  the command line to ensure
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    that the correct bits are compiled (see end of source code).
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    kernel with the depca configuration turned off and reboot.
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    5) insmod depca.o [irq=7] [io=0x200] [mem=0xd0000] [adapter_name=DE100]
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       [Alan Cox: Changed the code to allow command line irq/io assignments]
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       [Dave Davies: Changed the code to allow command line mem/name
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                                                assignments]
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    6) run the net startup bits for your eth?? interface manually
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    (usually /etc/rc.inet[12] at boot time).
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    7) enjoy!
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Note that autoprobing is not allowed in loadable modules - the system is
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    already up and running and you're messing with interrupts.
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    To unload a module, turn off the associated interface
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    'ifconfig eth?? down' then 'rmmod depca'.
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    To assign a base memory address for the shared memory  when running as a
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    loadable module, see 5 above.  To include the adapter  name (if you have
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    no PROM  but know the card name)  also see 5  above. Note that this last
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    option  will not work  with kernel  built-in  depca's.
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    The shared memory assignment for a loadable module  makes sense to avoid
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    the 'memory autoprobe' picking the wrong shared memory  (for the case of
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    2 depca's in a PC).
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ************************************************************************
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Support for MCA EtherWORKS cards added 11-3-98.
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Verified to work with up to 2 DE212 cards in a system (although not
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      fully stress-tested).
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Currently known bugs/limitations:
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Note:  with the MCA stuff as a module, it trusts the MCA configuration,
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           not the command line for IRQ and memory address.  You can
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           specify them if you want, but it will throw your values out.
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           You still have to pass the IO address it was configured as
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           though.
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ************************************************************************
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    TO DO:
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ------
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Revision History
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ----------------
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    Version   Date        Description
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.1     25-jan-94   Initial writing.
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.2     27-jan-94   Added LANCE TX hardware buffer chaining.
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.3      1-feb-94   Added multiple DEPCA support.
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.31     4-feb-94   Added DE202 recognition.
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.32    19-feb-94   Tidy up. Improve multi-DEPCA support.
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.33    25-feb-94   Fix DEPCA ethernet ROM counter enable.
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          Add jabber packet fix from murf@perftech.com
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  and becker@super.org
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.34     7-mar-94   Fix DEPCA max network memory RAM & NICSR access.
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.35     8-mar-94   Added DE201 recognition. Tidied up.
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.351   30-apr-94   Added EISA support. Added DE422 recognition.
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.36    16-may-94   DE422 fix released.
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.37    22-jul-94   Added MODULE support
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.38    15-aug-94   Added DBR ROM switch in depca_close().
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          Multi DEPCA bug fix.
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.38axp 15-sep-94   Special version for Alpha AXP Linux V1.0.
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.381   12-dec-94   Added DE101 recognition, fix multicast bug.
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.382    9-feb-95   Fix recognition bug reported by <bkm@star.rl.ac.uk>.
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.383   22-feb-95   Fix for conflict with VESA SCSI reported by
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          <stromain@alf.dec.com>
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.384   17-mar-95   Fix a ring full bug reported by <bkm@star.rl.ac.uk>
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.385    3-apr-95   Fix a recognition bug reported by
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                                                <ryan.niemi@lastfrontier.com>
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.386   21-apr-95   Fix the last fix...sorry, must be galloping senility
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.40    25-May-95   Rewrite for portability & updated.
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          ALPHA support from <jestabro@amt.tay1.dec.com>
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.41    26-Jun-95   Added verify_area() calls in depca_ioctl() from
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          suggestion by <heiko@colossus.escape.de>
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.42    27-Dec-95   Add 'mem' shared memory assignment for loadable
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          modules.
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          Add 'adapter_name' for loadable modules when no PROM.
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  Both above from a suggestion by
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  <pchen@woodruffs121.residence.gatech.edu>.
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  Add new multicasting code.
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.421   22-Apr-96	  Fix alloc_device() bug <jari@markkus2.fimr.fi>
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.422   29-Apr-96	  Fix depca_hw_init() bug <jari@markkus2.fimr.fi>
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.423    7-Jun-96   Fix module load bug <kmg@barco.be>
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.43    16-Aug-96   Update alloc_device() to conform to de4x5.c
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.44     1-Sep-97   Fix *_probe() to test check_region() first - bug
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                           reported by <mmogilvi@elbert.uccs.edu>
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.45     3-Nov-98   Added support for MCA EtherWORKS (DE210/DE212) cards
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                           by <tymm@computer.org>
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.451    5-Nov-98   Fixed mca stuff cuz I'm a dummy. <tymm@computer.org>
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.5     14-Nov-98   Re-spin for 2.1.x kernels.
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      0.51    27-Jun-99   Correct received packet length for CRC from
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                           report by <worm@dkik.dk>
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    =========================================================================
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "etherboot.h"
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "nic.h"
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "cards.h"
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** I/O addresses. Note that the 2k buffer option is not supported in
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** this driver.
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_NICSR ioaddr+0x00   /* Network interface CSR */
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_RBI   ioaddr+0x02   /* RAM buffer index (2k buffer mode) */
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_DATA  ioaddr+0x04   /* LANCE registers' data port */
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_ADDR  ioaddr+0x06   /* LANCE registers' address port */
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_HBASE ioaddr+0x08   /* EISA high memory base address reg. */
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_PROM  ioaddr+0x0c   /* Ethernet address ROM data port */
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_CNFG  ioaddr+0x0c   /* EISA Configuration port */
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_RBSA  ioaddr+0x0e   /* RAM buffer starting address (2k buff.) */
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** These are LANCE registers addressable through DEPCA_ADDR
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR0       0
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR1       1
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR2       2
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR3       3
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** NETWORK INTERFACE CSR (NI_CSR) bit definitions
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TO       	0x0100	/* Time Out for remote boot */
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SHE      	0x0080  /* SHadow memory Enable */
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BS       	0x0040  /* Bank Select */
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BUF      	0x0020	/* BUFfer size (1->32k, 0->64k) */
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RBE      	0x0010	/* Remote Boot Enable (1->net boot) */
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AAC      	0x0008  /* Address ROM Address Counter (1->enable) */
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define _128KB      	0x0008  /* 128kB Network RAM (1->enable) */
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IM       	0x0004	/* Interrupt Mask (1->mask) */
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IEN      	0x0002	/* Interrupt tristate ENable (1->enable) */
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LED      	0x0001	/* LED control */
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Control and Status Register 0 (CSR0) bit definitions
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ERR     	0x8000 	/* Error summary */
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BABL    	0x4000 	/* Babble transmitter timeout error  */
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CERR    	0x2000 	/* Collision Error */
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MISS    	0x1000 	/* Missed packet */
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MERR    	0x0800 	/* Memory Error */
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RINT    	0x0400 	/* Receiver Interrupt */
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TINT    	0x0200 	/* Transmit Interrupt */
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IDON    	0x0100 	/* Initialization Done */
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INTR    	0x0080 	/* Interrupt Flag */
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INEA    	0x0040 	/* Interrupt Enable */
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RXON    	0x0020 	/* Receiver on */
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TXON    	0x0010 	/* Transmitter on */
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TDMD    	0x0008 	/* Transmit Demand */
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define STOP    	0x0004 	/* Stop */
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define STRT    	0x0002 	/* Start */
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INIT    	0x0001 	/* Initialize */
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INTM            0xff00  /* Interrupt Mask */
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INTE            0xfff0  /* Interrupt Enable */
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** CONTROL AND STATUS REGISTER 3 (CSR3)
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BSWP    	0x0004	/* Byte SWaP */
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ACON    	0x0002	/* ALE control */
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCON    	0x0001	/* Byte CONtrol */
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Initialization Block Mode Register
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PROM       	0x8000 	/* Promiscuous Mode */
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EMBA       	0x0080	/* Enable Modified Back-off Algorithm */
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INTL       	0x0040 	/* Internal Loopback */
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DRTY       	0x0020 	/* Disable Retry */
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define COLL       	0x0010 	/* Force Collision */
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DTCR       	0x0008 	/* Disable Transmit CRC */
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LOOP       	0x0004 	/* Loopback */
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DTX        	0x0002 	/* Disable the Transmitter */
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DRX        	0x0001 	/* Disable the Receiver */
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Receive Message Descriptor 1 (RMD1) bit definitions.
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_OWN       0x80000000 	/* Owner bit 0 = host, 1 = lance */
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_ERR     	0x4000 	/* Error Summary */
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_FRAM    	0x2000 	/* Framing Error */
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_OFLO    	0x1000 	/* Overflow Error */
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_CRC     	0x0800 	/* CRC Error */
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_BUFF    	0x0400 	/* Buffer Error */
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_STP     	0x0200 	/* Start of Packet */
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_ENP     	0x0100 	/* End of Packet */
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Transmit Message Descriptor 1 (TMD1) bit definitions.
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_OWN       0x80000000 	/* Owner bit 0 = host, 1 = lance */
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_ERR     	0x4000 	/* Error Summary */
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_ADD_FCS 	0x2000 	/* More the 1 retry needed to Xmit */
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_MORE    	0x1000	/* >1 retry to transmit packet */
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_ONE     	0x0800 	/* 1 try needed to transmit the packet */
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_DEF     	0x0400 	/* Deferred */
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_STP       0x02000000 	/* Start of Packet */
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_ENP       0x01000000	/* End of Packet */
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define T_FLAGS     0xff000000  /* TX Flags Field */
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Transmit Message Descriptor 3 (TMD3) bit definitions.
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMD3_BUFF    0x8000	/* BUFFer error */
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMD3_UFLO    0x4000	/* UnderFLOw error */
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMD3_RES     0x2000	/* REServed */
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMD3_LCOL    0x1000	/* Late COLlision */
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMD3_LCAR    0x0800	/* Loss of CARrier */
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMD3_RTRY    0x0400	/* ReTRY error */
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Ethernet PROM defines
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PROBE_LENGTH    32
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Set the number of Tx and Rx buffers. Ensure that the memory requested
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** here is <= to the amount of shared memory set up by the board switches.
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** The number of descriptors MUST BE A POWER OF 2.
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project**
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** total_memory = NUM_RX_DESC*(8+RX_BUFF_SZ) + NUM_TX_DESC*(8+TX_BUFF_SZ)
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NUM_RX_DESC     2               /* Number of RX descriptors */
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NUM_TX_DESC     2               /* Number of TX descriptors */
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_BUFF_SZ	1536            /* Buffer size for each Rx buffer */
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_BUFF_SZ	1536            /* Buffer size for each Tx buffer */
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** ISA Bus defines
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_IO_PORTS	{0x300, 0x200, 0}
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	DEPCA_MODEL
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	DEPCA_MODEL	DEPCA
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic enum {
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	DEPCA, DE100, DE101, DE200, DE201, DE202, DE210, DE212, DE422, unknown
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} adapter = DEPCA_MODEL;
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Name <-> Adapter mapping
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic char *adapter_name[] = {
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	"DEPCA",
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	"DE100","DE101",
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	"DE200","DE201","DE202",
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	"DE210","DE212",
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	"DE422",
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	""
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	DEPCA_RAM_BASE
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DEPCA_RAM_BASE	0xd0000
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Memory Alignment. Each descriptor is 4 longwords long. To force a
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** DESC_ALIGN. ALIGN aligns the start address of the private memory area
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** and hence the RX descriptor ring's first entry.
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ALIGN4      ((u32)4 - 1)       /* 1 longword align */
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ALIGN8      ((u32)8 - 1)       /* 2 longword (quadword) align */
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ALIGN         ALIGN8              /* Keep the LANCE happy... */
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef	long		s32;
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef	unsigned long	u32;
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef	short		s16;
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef	unsigned short	u16;
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef	char		s8;
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef	unsigned char	u8;
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** The DEPCA Rx and Tx ring descriptors.
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct depca_rx_desc {
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    volatile s32 base;
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    s16 buf_length;		/* This length is negative 2's complement! */
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    s16 msg_length;		/* This length is "normal". */
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct depca_tx_desc {
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    volatile s32 base;
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    s16 length;		        /* This length is negative 2's complement! */
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    s16 misc;                   /* Errors and TDR info */
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LA_MASK 0x0000ffff      /* LANCE address mask for mapping network RAM
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				   to LANCE memory address space */
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** The Lance initialization block, described in databook, in common memory.
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct depca_init {
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    u16 mode;	                /* Mode register */
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    u8  phys_addr[ETH_ALEN];	/* Physical ethernet address */
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    u8  mcast_table[8];	        /* Multicast Hash Table. */
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    u32 rx_ring;     	        /* Rx ring base pointer & ring length */
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    u32 tx_ring;	        /* Tx ring base pointer & ring length */
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct depca_private {
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct depca_rx_desc	*rx_ring;
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct depca_tx_desc	*tx_ring;
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct depca_init	init_block;	/* Shadow init block */
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	char			*rx_memcpy[NUM_RX_DESC];
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	char			*tx_memcpy[NUM_TX_DESC];
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u32			bus_offset;	/* ISA bus address offset */
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u32			sh_mem;		/* address of shared mem */
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u32			dma_buffs;	/* Rx & Tx buffer start */
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int			rx_cur, tx_cur;	/* Next free ring entry */
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int			txRingMask, rxRingMask;
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	s32			rx_rlen, tx_rlen;
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* log2([rt]xRingMask+1) for the descriptors */
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic Address		mem_start = DEPCA_RAM_BASE;
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic Address		mem_len, offset;
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned short	ioaddr = 0;
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct depca_private	lp;
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Miscellaneous defines...
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define STOP_DEPCA \
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outw(CSR0, DEPCA_ADDR);\
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outw(STOP, DEPCA_DATA)
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Initialize the lance Rx and Tx descriptor rings. */
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void depca_init_ring(struct nic *nic)
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	i;
4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u32	p;
4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.rx_cur = lp.tx_cur = 0;
4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Initialize the base addresses and length of each buffer in the ring */
4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0; i <= lp.rxRingMask; i++) {
4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		writel((p = lp.dma_buffs + i * RX_BUFF_SZ) | R_OWN, &lp.rx_ring[i].base);
4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		writew(-RX_BUFF_SZ, &lp.rx_ring[i].buf_length);
4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		lp.rx_memcpy[i] = (char *) (p + lp.bus_offset);
4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0; i <= lp.txRingMask; i++) {
4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		writel((p = lp.dma_buffs + (i + lp.txRingMask + 1) * TX_BUFF_SZ) & 0x00ffffff, &lp.tx_ring[i].base);
4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		lp.tx_memcpy[i] = (char *) (p + lp.bus_offset);
4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Set up the initialization block */
4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.init_block.rx_ring = ((u32) ((u32) lp.rx_ring) & LA_MASK) | lp.rx_rlen;
4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.init_block.tx_ring = ((u32) ((u32) lp.tx_ring) & LA_MASK) | lp.tx_rlen;
4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0; i < ETH_ALEN; i++)
4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		lp.init_block.phys_addr[i] = nic->node_addr[i];
4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.init_block.mode = 0x0000;	/* Enable the Tx and Rx */
4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memset(lp.init_block.mcast_table, 0, sizeof(lp.init_block.mcast_table));
4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void LoadCSRs(void)
5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(CSR1, DEPCA_ADDR);	/* initialisation block address LSW */
5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw((u16) (lp.sh_mem & LA_MASK), DEPCA_DATA);
5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(CSR2, DEPCA_ADDR);	/* initialisation block address MSW */
5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw((u16) ((lp.sh_mem & LA_MASK) >> 16), DEPCA_DATA);
5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(CSR3, DEPCA_ADDR);	/* ALE control */
5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(ACON, DEPCA_DATA);
5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(CSR0, DEPCA_ADDR);	/* Point back to CSR0 */
5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int InitRestartDepca(void)
5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int		i;
5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Copy the shadow init_block to shared memory */
5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy_toio((char *)lp.sh_mem, &lp.init_block, sizeof(struct depca_init));
5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(CSR0, DEPCA_ADDR);		/* point back to CSR0 */
5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw(INIT, DEPCA_DATA);		/* initialise DEPCA */
5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0; i < 100 && !(inw(DEPCA_DATA) & IDON); i++)
5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		;
5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (i < 100) {
5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		/* clear IDON by writing a 1, and start LANCE */
5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		outw(IDON | STRT, DEPCA_DATA);
5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	} else {
5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		printf("DEPCA not initialised\n");
5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return (1);
5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return (0);
5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectRESET - Reset adapter
5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void depca_reset(struct nic *nic)
5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	s16	nicsr;
5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	i, j;
5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	STOP_DEPCA;
5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nicsr = inb(DEPCA_NICSR);
5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outb(nicsr, DEPCA_NICSR);
5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (inw(DEPCA_DATA) != STOP)
5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		printf("depca: Cannot stop NIC\n");
5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return;
5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Initialisation block */
5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.sh_mem = mem_start;
5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem_start += sizeof(struct depca_init);
5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Tx & Rx descriptors (aligned to a quadword boundary) */
5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem_start = (mem_start + ALIGN) & ~ALIGN;
5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.rx_ring = (struct depca_rx_desc *) mem_start;
5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem_start += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.tx_ring = (struct depca_tx_desc *) mem_start;
5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem_start += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.bus_offset = mem_start & 0x00ff0000;
5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* LANCE re-mapped start address */
5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.dma_buffs = mem_start & LA_MASK;
5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Finish initialising the ring information. */
5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.rxRingMask = NUM_RX_DESC - 1;
5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.txRingMask = NUM_TX_DESC - 1;
5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Calculate Tx/Rx RLEN size for the descriptors. */
5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0, j = lp.rxRingMask; j > 0; i++) {
5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		j >>= 1;
5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.rx_rlen = (s32) (i << 29);
5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0, j = lp.txRingMask; j > 0; i++) {
5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		j >>= 1;
5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.tx_rlen = (s32) (i << 29);
5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Load the initialisation block */
5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	depca_init_ring(nic);
5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	LoadCSRs();
5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	InitRestartDepca();
5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPOLL - Wait for a frame
5875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
5885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int depca_poll(struct nic *nic)
5895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
5905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int		entry;
5915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u32		status;
5925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	entry = lp.rx_cur;
5945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if ((status = readl(&lp.rx_ring[entry].base) & R_OWN))
5955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return (0);
5965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy(nic->packet, lp.rx_memcpy[entry], nic->packetlen = lp.rx_ring[entry].msg_length);
5975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.rx_ring[entry].base |= R_OWN;
5985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.rx_cur = (++lp.rx_cur) & lp.rxRingMask;
5995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return (1);
6005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
6015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
6035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTRANSMIT - Transmit a frame
6045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
6055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void depca_transmit(
6065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct nic *nic,
6075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	const char *d,			/* Destination */
6085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned int t,			/* Type */
6095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned int s,			/* size */
6105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	const char *p)			/* Packet */
6115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
6125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int		entry, len;
6135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	char		*mem;
6145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* send the packet to destination */
6165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
6175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	** Caution: the right order is important here... dont
6185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	** setup the ownership rights until all the other
6195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	** information is in place
6205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	*/
6215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem = lp.tx_memcpy[entry = lp.tx_cur];
6225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy_toio(mem, d, ETH_ALEN);
6235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy_toio(mem + ETH_ALEN, nic->node_addr, ETH_ALEN);
6245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem[ETH_ALEN * 2] = t >> 8;
6255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem[ETH_ALEN * 2 + 1] = t;
6265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy_toio(mem + ETH_HLEN, p, s);
6275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	s += ETH_HLEN;
6285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	len = (s < ETH_ZLEN ? ETH_ZLEN : s);
6295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* clean out flags */
6305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	writel(readl(&lp.tx_ring[entry].base) & ~T_FLAGS, &lp.tx_ring[entry].base);
6315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* clears other error flags */
6325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	writew(0x0000, &lp.tx_ring[entry].misc);
6335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* packet length in buffer */
6345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	writew(-len, &lp.tx_ring[entry].length);
6355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* start and end of packet, ownership */
6365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	writel(readl(&lp.tx_ring[entry].base) | (T_STP|T_ENP|T_OWN), &lp.tx_ring[entry].base);
6375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* update current pointers */
6385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lp.tx_cur = (++lp.tx_cur) & lp.txRingMask;
6395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
6405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
6425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectDISABLE - Turn off ethernet interface
6435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
6445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void depca_disable(struct nic *nic)
6455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
6465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	STOP_DEPCA;
6475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
6485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
6505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Look for a special sequence in the Ethernet station address PROM that
6515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** is common across all DEPCA products. Note that the original DEPCA needs
6525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** its ROM address counter to be initialized and enabled. Only enable
6535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** if the first address octet is a 0x08 - this minimises the chances of
6545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** messing around with some other hardware, but it assumes that this DEPCA
6555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** card initialized itself correctly.
6565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project**
6575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Search the Ethernet address ROM for the signature. Since the ROM address
6585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** counter can start at an arbitrary point, the search must include the entire
6595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** probe sequence length plus the (length_of_the_signature - 1).
6605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** Stop the search IMMEDIATELY after the signature is found so that the
6615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** PROM address counter is correctly positioned at the start of the
6625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project** ethernet address for later read out.
6635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
6645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int depca_probe1(struct nic *nic)
6655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
6665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u8	data, nicsr;
6675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* This is only correct for little endian machines, but then
6685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   Etherboot doesn't work on anything but a PC */
6695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	u8	sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
6705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	i, j;
6715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	long	sum, chksum;
6725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	data = inb(DEPCA_PROM);		/* clear counter on DEPCA */
6745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	data = inb(DEPCA_PROM);		/* read data */
6755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (data == 0x8) {
6765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nicsr = inb(DEPCA_NICSR);
6775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nicsr |= AAC;
6785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		outb(nicsr, DEPCA_NICSR);
6795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
6805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0, j = 0; j < (int)sizeof(sig) && i < PROBE_LENGTH+((int)sizeof(sig))-1; ++i) {
6815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		data = inb(DEPCA_PROM);
6825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		if (data == sig[j])		/* track signature */
6835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			++j;
6845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		else
6855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			j = (data == sig[0]) ? 1 : 0;
6865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
6875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (j != sizeof(sig))
6885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return (0);
6895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* put the card in its initial state */
6905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	STOP_DEPCA;
6915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nicsr = ((inb(DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
6925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outb(nicsr, DEPCA_NICSR);
6935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (inw(DEPCA_DATA) != STOP)
6945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return (0);
6955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy((char *)mem_start, sig, sizeof(sig));
6965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (memcmp((char *)mem_start, sig, sizeof(sig)) != 0)
6975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return (0);
6985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0, j = 0, sum = 0; j < 3; j++) {
6995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		sum <<= 1;
7005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		if (sum > 0xFFFF)
7015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			sum -= 0xFFFF;
7025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		sum += (u8)(nic->node_addr[i++] = inb(DEPCA_PROM));
7035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		sum += (u16)((nic->node_addr[i++] = inb(DEPCA_PROM)) << 8);
7045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		if (sum > 0xFFFF)
7055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			sum -= 0xFFFF;
7065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (sum == 0xFFFF)
7085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		sum = 0;
7095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	chksum = (u8)inb(DEPCA_PROM);
7105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	chksum |= (u16)(inb(DEPCA_PROM) << 8);
7115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
7125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	offset = 0;
7135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (nicsr & BUF) {
7145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		offset = 0x8000;
7155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nicsr &= ~BS;
7165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		mem_len -= (32 << 10);
7175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (adapter != DEPCA)	/* enable shadow RAM */
7195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		outb(nicsr |= SHE, DEPCA_NICSR);
7205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf("%s base %#hX, memory [%#hX-%#hX], addr %!",
7215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		adapter_name[adapter], ioaddr, mem_start, mem_start + mem_len,
7225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nic->node_addr);
7235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (sum != chksum)
7245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		printf(" (bad checksum)");
7255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	putchar('\n');
7265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return (1);
7275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
7305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPROBE - Look for an adapter, this routine's visible to the outside
7315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
7325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *depca_probe(struct nic *nic, unsigned short *probe_addrs)
7335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	static unsigned short	base[] = DEPCA_IO_PORTS;
7355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int			i;
7365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (probe_addrs == 0 || probe_addrs[0] == 0)
7385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		probe_addrs = base;	/* Use defaults */
7395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (i = 0; (ioaddr = base[i]) != 0; ++i) {
7405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		if (depca_probe1(nic))
7415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			break;
7425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (ioaddr == 0)
7445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return (0);
7455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	depca_reset(nic);
7465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* point to NIC specific routines */
7475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nic->reset = depca_reset;
7485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nic->poll = depca_poll;
7495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nic->transmit = depca_transmit;
7505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nic->disable = depca_disable;
7515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return (nic);
7525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
753