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