15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEtherboot -  BOOTP/TFTP Bootstrap Program
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectSchneider & Koch G16 NIC driver for Etherboot
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectheavily based on SK G16 driver from Linux 2.0.36
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectChanges to make it work with Etherboot by Georg Baum <Georg.Baum@gmx.de>
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*-
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 1994 by PJD Weichmann & SWS Bern, Switzerland
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This software may be used and distributed according to the terms
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * of the GNU Public License, incorporated herein by reference.
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Module         : sk_g16.c
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Version        : $Revision: 1.4 $
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Author         : Patrick J.D. Weichmann
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Date Created   : 94/05/26
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Last Updated   : $Date: 2002/01/02 21:56:40 $
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Description    : Schneider & Koch G16 Ethernet Device Driver for
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *                  Linux Kernel >= 1.1.22
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Update History :
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project-*/
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The Schneider & Koch (SK) G16 Network device driver is based
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * on the 'ni6510' driver from Michael Hipp which can be found at
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ftp://sunsite.unc.edu/pub/Linux/system/Network/drivers/nidrivers.tar.gz
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Sources: 1) ni6510.c by M. Hipp
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          2) depca.c  by D.C. Davies
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          3) skeleton.c by D. Becker
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          4) Am7990 Local Area Network Controller for Ethernet (LANCE),
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *             AMD, Pub. #05698, June 1989
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Many Thanks for helping me to get things working to:
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *                 A. Cox (A.Cox@swansea.ac.uk)
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *                 M. Hipp (mhipp@student.uni-tuebingen.de)
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *                 R. Bolz (Schneider & Koch, Germany)
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * See README.sk_g16 for details about limitations and bugs for the
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * current version.
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * To Do:
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - Support of SK_G8 and other SK Network Cards.
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - Autoset memory mapped RAM. Check for free memory and then
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          configure RAM correctly.
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - SK_close should really set card in to initial state.
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - Test if IRQ 3 is not switched off. Use autoirq() functionality.
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          (as in /drivers/net/skeleton.c)
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - Implement Multicast addressing. At minimum something like
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          in depca.c.
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - Redo the statistics part.
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - Try to find out if the board is in 8 Bit or 16 Bit slot.
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *          If in 8 Bit mode don't use IRQ 11.
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        - (Try to make it slightly faster.)
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get some global routines like printf */
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "etherboot.h"
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get the interface to the body of the program */
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "nic.h"
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* From linux/if_ether.h: */
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ETH_ZLEN	60		/* Min. octets in frame sans FCS */
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "sk_g16.h"
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Schneider & Koch Card Definitions
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * =================================
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_NAME   "SK_G16"
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 Configuration
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * --------------------
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Abbreviations
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -------------
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * RAM - used for the 16KB shared memory
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Boot_ROM, ROM - are used for referencing the BootEPROM
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_ADDR is a symbolic constant used to configure
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the behaviour of the driver and the SK_G16.
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_ADDR defines the address where the RAM will be mapped into the real
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *         host memory.
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *         valid addresses are from 0xa0000 to 0xfc000 in 16Kbyte steps.
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_ADDR         0xcc000
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * In POS3 are bits A14-A19 of the address bus. These bits can be set
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to choose the RAM address. That's why we only can choose the RAM address
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * in 16KB steps.
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define POS_ADDR       (rom_addr>>14)  /* Do not change this line */
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 I/O PORT's + IRQ's + Boot_ROM locations
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ----------------------------------------------
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * As nearly every card has also SK_G16 a specified I/O Port region and
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * only a few possible IRQ's.
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * In the Installation Guide from Schneider & Koch is listed a possible
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Interrupt IRQ2. IRQ2 is always IRQ9 in boards with two cascaded interrupt
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * controllers. So we use in SK_IRQS IRQ9.
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Don't touch any of the following #defines. */
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IO_PORTS     { 0x100, 0x180, 0x208, 0x220, 0x288, 0x320, 0x328, 0x390, 0 }
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 POS REGISTERS
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * --------------------
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 has a Programmable Option Select (POS) Register.
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The POS is composed of 8 separate registers (POS0-7) which
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * are I/O mapped on an address set by the W1 switch.
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_POS_SIZE 8           /* 8 I/O Ports are used by SK_G16 */
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_POS0     ioaddr      /* Card-ID Low (R) */
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_POS1     ioaddr+1    /* Card-ID High (R) */
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_POS2     ioaddr+2    /* Card-Enable, Boot-ROM Disable (RW) */
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_POS3     ioaddr+3    /* Base address of RAM */
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_POS4     ioaddr+4    /* IRQ */
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* POS5 - POS7 are unused */
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 MAC PREFIX
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -----------------
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Scheider & Koch manufacturer code (00:00:a5).
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This must be checked, that we are sure it is a SK card.
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_MAC0         0x00
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_MAC1         0x00
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_MAC2         0x5a
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 ID
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ---------
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If POS0,POS1 contain the following ID, then we know
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * at which I/O Port Address we are.
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IDLOW  0xfd
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IDHIGH 0x6a
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * LANCE POS Bit definitions
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -------------------------
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_ROM_RAM_ON  (POS2_CARD)
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_ROM_RAM_OFF (POS2_EPROM)
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_ROM_ON      (inb(SK_POS2) & POS2_CARD)
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_ROM_OFF     (inb(SK_POS2) | POS2_EPROM)
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RAM_ON      (inb(SK_POS2) | POS2_CARD)
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RAM_OFF     (inb(SK_POS2) & POS2_EPROM)
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define POS2_CARD  0x0001              /* 1 = SK_G16 on      0 = off */
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define POS2_EPROM 0x0002              /* 1 = Boot EPROM off 0 = on */
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 Memory mapped Registers
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ------------------------------
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IOREG        (board->ioreg) /* LANCE data registers.     */
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_PORT         (board->port)  /* Control, Status register  */
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IOCOM        (board->iocom) /* I/O Command               */
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 Status/Control Register bits
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -----------------------------------
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (C) Controlreg (S) Statusreg
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Register transfer: 0 = no transfer
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *                    1 = transferring data between LANCE and I/O reg
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IORUN        0x20
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * LANCE interrupt: 0 = LANCE interrupt occurred
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *                  1 = no LANCE interrupt occurred
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_IRQ          0x10
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RESET        0x08   /* Reset SK_CARD: 0 = RESET 1 = normal */
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RW           0x02   /* 0 = write to 1 = read from */
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_ADR          0x01   /* 0 = REG DataPort 1 = RAP Reg addr port */
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RREG         SK_RW  /* Transferdirection to read from lance */
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_WREG         0      /* Transferdirection to write to lance */
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RAP          SK_ADR /* Destination Register RAP */
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_RDATA        0      /* Destination Register REG DataPort */
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 I/O Command
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ------------------
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Any bitcombination sets the internal I/O bit (transfer will start)
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * when written to I/O Command
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SK_DOIO         0x80   /* Do Transfer */
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * LANCE RAP (Register Address Port).
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ---------------------------------
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The LANCE internal registers are selected through the RAP.
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The Registers are:
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CSR0 - Status and Control flags
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CSR1 - Low order bits of initialize block (bits 15:00)
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CSR2 - High order bits of initialize block (bits 07:00, 15:08 are reserved)
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CSR3 - Allows redefinition of the Bus Master Interface.
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        This register must be set to 0x0002, which means BSWAP = 0,
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *        ACON = 1, BCON = 0;
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR0            0x00
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR1            0x01
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR2            0x02
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CSR3            0x03
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * General Definitions
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ===================
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Set the number of Tx and Rx buffers, using Log_2(# buffers).
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * We have 16KB RAM which can be accessed by the LANCE. In the
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * memory are not only the buffers but also the ring descriptors and
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the initialize block.
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Don't change anything unless you really know what you do.
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LC_LOG_TX_BUFFERS 1               /* (2 == 2^^1) 2 Transmit buffers */
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LC_LOG_RX_BUFFERS 2               /* (8 == 2^^3) 8 Receive buffers */
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Descriptor ring sizes */
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMDNUM (1 << (LC_LOG_TX_BUFFERS)) /* 2 Transmit descriptor rings */
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RMDNUM (1 << (LC_LOG_RX_BUFFERS)) /* 8 Receive Buffers */
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Define Mask for setting RMD, TMD length in the LANCE init_block */
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TMDNUMMASK (LC_LOG_TX_BUFFERS << 29)
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RMDNUMMASK (LC_LOG_RX_BUFFERS << 29)
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Data Buffer size is set to maximum packet length.
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_BUF_SZ              1518
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The number of low I/O ports used by the ethercard.
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ETHERCARD_TOTAL_SIZE    SK_POS_SIZE
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Portreserve is there to mark the Card I/O Port region as used.
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Check_region is to check if the region at ioaddr with the size "size"
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * is free or not.
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Snarf_region allocates the I/O Port region.
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef	HAVE_PORTRESERVE
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define check_region(ioaddr1, size)              0
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define request_region(ioaddr1, size,name)       do ; while (0)
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_DEBUG
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Here you can choose what level of debugging wanted.
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If SK_DEBUG and SK_DEBUG2 are undefined, then only the
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  necessary messages will be printed.
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If SK_DEBUG is defined, there will be many debugging prints
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  which can help to find some mistakes in configuration or even
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  in the driver code.
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If SK_DEBUG2 is defined, many many messages will be printed
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  which normally you don't need. I used this to check the interrupt
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  routine.
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (If you define only SK_DEBUG2 then only the messages for
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  checking interrupts will be printed!)
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Normal way of live is:
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * For the whole thing get going let both symbolic constants
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * undefined. If you face any problems and you know what's going
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * on (you know something about the card and you can interpret some
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * hex LANCE register output) then define SK_DEBUG
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#undef  SK_DEBUG	/* debugging */
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#undef  SK_DEBUG2	/* debugging with more verbose report */
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PRINTF(x) printf x
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PRINTF(x) /**/
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG2
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PRINTF2(x) printf x
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PRINTF2(x) /**/
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * SK_G16 RAM
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The components are memory mapped and can be set in a region from
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0x00000 through 0xfc000 in 16KB steps.
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The Network components are: dual ported RAM, Prom, I/O Reg, Status-,
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Controlregister and I/O Command.
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dual ported RAM: This is the only memory region which the LANCE chip
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *      has access to. From the Lance it is addressed from 0x0000 to
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *      0x3fbf. The host accesses it normally.
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * PROM: The PROM obtains the ETHERNET-MAC-Address. It is realised as a
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       8-Bit PROM, this means only the 16 even addresses are used of the
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       32 Byte Address region. Access to a odd address results in invalid
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       data.
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * LANCE I/O Reg: The I/O Reg is build of 4 single Registers, Low-Byte Write,
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       Hi-Byte Write, Low-Byte Read, Hi-Byte Read.
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       Transfer from or to the LANCE is always in 16Bit so Low and High
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       registers are always relevant.
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       The Data from the Readregister is not the data in the Writeregister!!
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Port: Status- and Controlregister.
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       Two different registers which share the same address, Status is
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       read-only, Control is write-only.
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * I/O Command:
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       Any bitcombination written in here starts the transmission between
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *       Host and LANCE.
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef struct
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned char  ram[0x3fc0];   /* 16KB dual ported ram */
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned char  rom[0x0020];   /* 32Byte PROM containing 6Byte MAC */
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned char  res1[0x0010];  /* reserved */
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned volatile short ioreg;/* LANCE I/O Register */
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned volatile char  port; /* Statusregister and Controlregister */
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned char  iocom;         /* I/O Command Register */
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} SK_RAM;
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* struct  */
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is the structure for the dual ported ram. We
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * have exactly 16 320 Bytes. In here there must be:
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *     - Initialize Block   (starting at a word boundary)
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *     - Receive and Transmit Descriptor Rings (quadword boundary)
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *     - Data Buffers (arbitrary boundary)
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is because LANCE has on SK_G16 only access to the dual ported
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * RAM and nowhere else.
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct SK_ram
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct init_block ib;
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct tmd tmde[TMDNUM];
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rmd rmde[RMDNUM];
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char tmdbuf[TMDNUM][PKT_BUF_SZ];
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char rmdbuf[RMDNUM][PKT_BUF_SZ];
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Structure where all necessary information is for ring buffer
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * management and statistics.
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct priv
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct SK_ram *ram;  /* dual ported ram structure */
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rmd *rmdhead; /* start of receive ring descriptors */
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct tmd *tmdhead; /* start of transmit ring descriptors */
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int        rmdnum;   /* actual used ring descriptor */
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int        tmdnum;   /* actual transmit descriptor for transmitting data */
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int        tmdlast;  /* last sent descriptor used for error handling, etc */
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    void       *rmdbufs[RMDNUM]; /* pointer to the receive buffers */
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    void       *tmdbufs[TMDNUM]; /* pointer to the transmit buffers */
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* global variable declaration */
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* static variables */
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic SK_RAM *board;  /* pointer to our memory mapped board components */
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned short	ioaddr; /* base io address */
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct priv	p_data;
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Macros */
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Function Prototypes */
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Device Driver functions
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -----------------------
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * See for short explanation of each function its definitions header.
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int   SK_probe1(struct nic *nic, short ioaddr1);
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_reset(struct nic *nic);
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_poll(struct nic *nic);
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_transmit(
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *nic,
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconst char *d,			/* Destination */
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned int t,			/* Type */
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned int s,			/* size */
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconst char *p);			/* Packet */
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_disable(struct nic *nic);
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *SK_probe(struct nic *nic, unsigned short *probe_addrs);
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * LANCE Functions
4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ---------------
4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_lance_init(struct nic *nic, unsigned short mode);
4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_reset_board(void);
4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_set_RAP(int reg_number);
4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_read_reg(int reg_number);
4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_rread_reg(void);
4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_write_reg(int reg_number, int value);
4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Debugging functions
4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -------------------
4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_print_pos(struct nic *nic, char *text);
4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_print_ram(struct nic *nic);
4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectRESET - Reset adapter
5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_reset(struct nic *nic)
5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* put the card in its initial state */
5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	SK_lance_init(nic, MODE_NORMAL);
5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPOLL - Wait for a frame
5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_poll(struct nic *nic)
5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* return true if there's an ethernet packet ready to read */
5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct priv *p;         /* SK_G16 private structure */
5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct rmd *rmdp;
5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int csr0, rmdstat, packet_there;
5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF2(("## %s: At beginning of SK_poll(). CSR0: %#hX\n",
5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME, SK_read_reg(CSR0)));
5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p = nic->priv_data;
5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    csr0 = SK_read_reg(CSR0);      /* store register for checking */
5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*
5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * Acknowledge all of the current interrupt sources, disable
5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * Interrupts (INEA = 0)
5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     */
5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, csr0 & CSR0_CLRALL);
5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (csr0 & CSR0_ERR) /* LANCE Error */
5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf("%s: error: %#hX", SK_NAME, csr0);
5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        if (csr0 & CSR0_MISS)      /* No place to store packet ? */
5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        {
5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		printf(", Packet dropped.");
5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        }
5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	putchar('\n');
5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rmdp = p->rmdhead + p->rmdnum;
5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    packet_there = 0;
5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* As long as we own the next entry, check status and send
5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * it up to higher layer
5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     */
5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (!( (rmdstat = rmdp->u.s.status) & RX_OWN))
5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         * Start and end of packet must be set, because we use
5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * the ethernet maximum packet length (1518) as buffer size.
5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *
5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Because our buffers are at maximum OFLO and BUFF errors are
5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * not to be concerned (see Data sheet)
5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if ((rmdstat & (RX_STP | RX_ENP)) != (RX_STP | RX_ENP))
5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    /* Start of a frame > 1518 Bytes ? */
5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if (rmdstat & RX_STP)
5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		printf("%s: packet too long\n", SK_NAME);
5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    /*
5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project             * All other packets will be ignored until a new frame with
5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     * start (RX_STP) set follows.
5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     *
5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     * What we do is just give descriptor free for new incoming
5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     * packets.
5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     */
5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    rmdp->u.s.status = RX_OWN;      /* Relinquish ownership to LANCE */
5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	else if (rmdstat & RX_ERR)          /* Receive Error ? */
5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    printf("%s: RX error: %#hX\n", SK_NAME, (int) rmdstat);
5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    rmdp->u.s.status = RX_OWN;      /* Relinquish ownership to LANCE */
5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	else /* We have a packet which can be queued for the upper layers */
5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    int len = (rmdp->mlen & 0x0fff);  /* extract message length from receive buffer */
5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    /*
5885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project             * Copy data out of our receive descriptor into nic->packet.
5895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     *
5905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     * (rmdp->u.buffer & 0x00ffffff) -> get address of buffer and
5915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     * ignore status fields)
5925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     */
5935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    memcpy(nic->packet, (unsigned char *) (rmdp->u.buffer & 0x00ffffff), nic->packetlen = len);
5955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    packet_there = 1;
5965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    /*
5995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project             * Packet is queued and marked for processing so we
6005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     * free our descriptor
6015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     */
6025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    rmdp->u.s.status = RX_OWN;
6045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    p->rmdnum++;
6065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    p->rmdnum %= RMDNUM;
6075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    rmdp = p->rmdhead + p->rmdnum;
6095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
6105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
6115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, CSR0_INEA); /* Enable Interrupts */
6125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return (packet_there);
6135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
6145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
6165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTRANSMIT - Transmit a frame
6175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
6185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_transmit(
6195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *nic,
6205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconst char *d,			/* Destination */
6215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned int t,			/* Type */
6225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned int s,			/* size */
6235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconst char *pack)		/* Packet */
6245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
6255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* send the packet to destination */
6265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct priv *p;         /* SK_G16 private structure */
6275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct tmd *tmdp;
6285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    short len;
6295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int csr0, i, tmdstat;
6305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF2(("## %s: At beginning of SK_transmit(). CSR0: %#hX\n",
6325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME, SK_read_reg(CSR0)));
6335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p = nic->priv_data;
6345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp = p->tmdhead + p->tmdnum; /* Which descriptor for transmitting */
6355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Copy data into dual ported ram */
6375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy(&p->ram->tmdbuf[p->tmdnum][0], d, ETH_ALEN);	/* dst */
6395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy(&p->ram->tmdbuf[p->tmdnum][ETH_ALEN], nic->node_addr, ETH_ALEN); /* src */
6405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->ram->tmdbuf[p->tmdnum][ETH_ALEN + ETH_ALEN] = t >> 8;	/* type */
6415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->ram->tmdbuf[p->tmdnum][ETH_ALEN + ETH_ALEN + 1] = t;	/* type */
6425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	memcpy(&p->ram->tmdbuf[p->tmdnum][ETH_HLEN], pack, s);
6435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	s += ETH_HLEN;
6445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	while (s < ETH_ZLEN)	/* pad to min length */
6455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		p->ram->tmdbuf[p->tmdnum][s++] = 0;
6465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->ram->tmde[p->tmdnum].status2 = 0x0;
6475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Evaluate Packet length */
6495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	len = ETH_ZLEN < s ? s : ETH_ZLEN;
6505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Fill in Transmit Message Descriptor */
6525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp->blen = -len;            /* set length to transmit */
6545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
6565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Packet start and end is always set because we use the maximum
6575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * packet length as buffer length.
6585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Relinquish ownership to LANCE
6595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
6605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp->u.s.status = TX_OWN | TX_STP | TX_ENP;
6625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Start Demand Transmission */
6645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	SK_write_reg(CSR0, CSR0_TDMD | CSR0_INEA);
6655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    csr0 = SK_read_reg(CSR0);      /* store register for checking */
6675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*
6695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * Acknowledge all of the current interrupt sources, disable
6705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * Interrupts (INEA = 0)
6715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     */
6725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, csr0 & CSR0_CLRALL);
6745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (csr0 & CSR0_ERR) /* LANCE Error */
6765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
6775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf("%s: error: %#hX", SK_NAME, csr0);
6785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        if (csr0 & CSR0_MISS)      /* No place to store packet ? */
6805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        {
6815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		printf(", Packet dropped.");
6825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        }
6835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	putchar('\n');
6845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
6855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Set next buffer */
6885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->tmdlast++;
6895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->tmdlast &= TMDNUM-1;
6905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tmdstat = tmdp->u.s.status & 0xff00; /* filter out status bits 15:08 */
6925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*
6945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * We check status of transmitted packet.
6955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * see LANCE data-sheet for error explanation
6965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     */
6975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (tmdstat & TX_ERR) /* Error occurred */
6985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
6995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf("%s: TX error: %#hX %#hX\n", SK_NAME, (int) tmdstat,
7005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		(int) tmdp->status2);
7015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (tmdp->status2 & TX_TDR)    /* TDR problems? */
7035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    printf("%s: tdr-problems \n", SK_NAME);
7055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        if (tmdp->status2 & TX_UFLO)   /* Underflow error ? */
7085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        {
7095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project            /*
7105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project             * If UFLO error occurs it will turn transmitter of.
7115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project             * So we must reinit LANCE
7125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project             */
7135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project            SK_lance_init(nic, MODE_NORMAL);
7155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        }
7165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp->status2 = 0;             /* Clear error flags */
7185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
7195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, CSR0_INEA); /* Enable Interrupts */
7215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Set pointer to next transmit buffer */
7235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->tmdnum++;
7245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->tmdnum &= TMDNUM-1;
7255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
7295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectDISABLE - Turn off ethernet interface
7305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
7315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_disable(struct nic *nic)
7325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF(("## %s: At beginning of SK_disable(). CSR0: %#hX\n",
7345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME, SK_read_reg(CSR0)));
7355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF(("%s: Shutting %s down CSR0 %#hX\n", SK_NAME, SK_NAME,
7365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           (int) SK_read_reg(CSR0)));
7375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, CSR0_STOP); /* STOP the LANCE */
7395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
7425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPROBE - Look for an adapter, this routine's visible to the outside
7435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
7445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *SK_probe(struct nic *nic, unsigned short *probe_addrs)
7455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned short		*p;
7475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	static unsigned short	io_addrs[] = SK_IO_PORTS;
7485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if probe_addrs is 0, then routine can use a hardwired default */
7495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	putchar('\n');
7505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nic->priv_data = &p_data;
7515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (probe_addrs == 0)
7525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		probe_addrs = io_addrs;
7535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (p = probe_addrs; (ioaddr = *p) != 0; ++p)
7545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		long		offset1, offset0 = inb(ioaddr);
7565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		if ((offset0 == SK_IDLOW) &&
7575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		 ((offset1 = inb(ioaddr + 1)) == SK_IDHIGH))
7585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			if (SK_probe1(nic, ioaddr) >= 0)
7595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				break;
7605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if board found */
7625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (ioaddr != 0)
7635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		/* point to NIC specific routines */
7655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nic->reset = SK_reset;
7665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nic->poll = SK_poll;
7675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nic->transmit = SK_transmit;
7685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		nic->disable = SK_disable;
7695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return nic;
7705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* else */
7725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return 0;
7745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint SK_probe1(struct nic *nic, short ioaddr1)
7785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i,j;                /* Counters */
7805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int sk_addr_flag = 0;   /* SK ADDR correct? 1 - no, 0 - yes */
7815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int rom_addr;  /* used to store RAM address used for POS_ADDR */
7825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct priv *p;         /* SK_G16 private structure */
7845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (SK_ADDR & 0x3fff || SK_ADDR < 0xa0000)
7865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
7875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       /*
7885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        * Now here we could use a routine which searches for a free
7895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        * place in the ram and set SK_ADDR if found. TODO.
7905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        */
7915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project            printf("%s: SK_ADDR %#hX is not valid. Check configuration.\n",
7925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                    SK_NAME, SK_ADDR);
7935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project            return -1;
7945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
7955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rom_addr = SK_ADDR;
7975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb(SK_ROM_RAM_OFF, SK_POS2); /* Boot_ROM + RAM off */
7995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb(POS_ADDR, SK_POS3);       /* Set RAM address */
8005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb(SK_ROM_RAM_ON, SK_POS2);  /* RAM on, BOOT_ROM on */
8015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
8025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_print_pos(nic, "POS registers after ROM, RAM config");
8035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
8045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    board = (SK_RAM *) rom_addr;
8065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	PRINTF(("adr[0]: %hX, adr[1]: %hX, adr[2]: %hX\n",
8075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	board->rom[0], board->rom[2], board->rom[4]));
8085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Read in station address */
8105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0, j = 0; i < ETH_ALEN; i++, j+=2)
8115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	*(nic->node_addr+i) = board->rom[j];
8135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Check for manufacturer code */
8165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
8175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (!(*(nic->node_addr+0) == SK_MAC0 &&
8185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  *(nic->node_addr+1) == SK_MAC1 &&
8195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  *(nic->node_addr+2) == SK_MAC2) )
8205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        PRINTF(("## %s: We did not find SK_G16 at RAM location.\n",
8225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                SK_NAME));
8235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return -1;                     /* NO SK_G16 found */
8245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
8265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p = nic->priv_data;
8285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Initialize private structure */
8305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->ram = (struct SK_ram *) rom_addr; /* Set dual ported RAM addr */
8325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->tmdhead = &(p->ram)->tmde[0];     /* Set TMD head */
8335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->rmdhead = &(p->ram)->rmde[0];     /* Set RMD head */
8345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf("Schneider & Koch G16 at %#hX, mem at %#hX, HW addr: %!\n",
8365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    (unsigned int) ioaddr, (unsigned int) p->ram, nic->node_addr);
8375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Initialize buffer pointers */
8395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < TMDNUM; i++)
8415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->tmdbufs[i] = p->ram->tmdbuf[i];
8435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < RMDNUM; i++)
8465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	p->rmdbufs[i] = p->ram->rmdbuf[i];
8485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    i = 0;
8505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (!(i = SK_lance_init(nic, MODE_NORMAL)))  /* LANCE init OK? */
8525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
8555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        /*
8565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         * This debug block tries to stop LANCE,
8575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         * reinit LANCE with transmitter and receiver disabled,
8585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         * then stop again and reinit with NORMAL_MODE
8595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         */
8605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("## %s: After lance init. CSR0: %#hX\n",
8625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               SK_NAME, SK_read_reg(CSR0));
8635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        SK_write_reg(CSR0, CSR0_STOP);
8645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("## %s: LANCE stopped. CSR0: %#hX\n",
8655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               SK_NAME, SK_read_reg(CSR0));
8665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        SK_lance_init(nic, MODE_DTX | MODE_DRX);
8675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("## %s: Reinit with DTX + DRX off. CSR0: %#hX\n",
8685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               SK_NAME, SK_read_reg(CSR0));
8695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        SK_write_reg(CSR0, CSR0_STOP);
8705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("## %s: LANCE stopped. CSR0: %#hX\n",
8715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               SK_NAME, SK_read_reg(CSR0));
8725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        SK_lance_init(nic, MODE_NORMAL);
8735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("## %s: LANCE back to normal mode. CSR0: %#hX\n",
8745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               SK_NAME, SK_read_reg(CSR0));
8755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        SK_print_pos(nic, "POS regs before returning OK");
8765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif	/* SK_DEBUG */
8785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    else /* LANCE init failed */
8815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	PRINTF(("## %s: LANCE init failed: CSR0: %#hX\n",
8845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               SK_NAME, SK_read_reg(CSR0)));
8855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return -1;
8865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
8895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_print_pos(nic, "End of SK_probe1");
8905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_print_ram(nic);
8915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
8925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return 0;                            /* Initialization done */
8945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_probe1() */
8965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_lance_init(struct nic *nic, unsigned short mode)
8985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
8995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i;
9005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct priv *p = (struct priv *) nic->priv_data;
9015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct tmd  *tmdp;
9025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rmd  *rmdp;
9035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF(("## %s: At beginning of LANCE init. CSR0: %#hX\n",
9055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME, SK_read_reg(CSR0)));
9065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Reset LANCE */
9085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_reset_board();
9095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Initialize TMD's with start values */
9115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->tmdnum = 0;                   /* First descriptor for transmitting */
9125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->tmdlast = 0;                  /* First descriptor for reading stats */
9135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < TMDNUM; i++)     /* Init all TMD's */
9155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp = p->tmdhead + i;
9175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp->u.buffer = (unsigned long) p->tmdbufs[i]; /* assign buffer */
9195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Mark TMD as start and end of packet */
9215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmdp->u.s.status = TX_STP | TX_ENP;
9225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Initialize RMD's with start values */
9265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    p->rmdnum = 0;                   /* First RMD which will be used */
9285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < RMDNUM; i++)     /* Init all RMD's */
9305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rmdp = p->rmdhead + i;
9325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rmdp->u.buffer = (unsigned long) p->rmdbufs[i]; /* assign buffer */
9355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
9375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         * LANCE must be owner at beginning so that he can fill in
9385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * receiving packets, set status and release RMD
9395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
9405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rmdp->u.s.status = RX_OWN;
9425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rmdp->blen = -PKT_BUF_SZ;    /* Buffer Size in a two's complement */
9445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rmdp->mlen = 0;              /* init message length */
9465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Fill LANCE Initialize Block */
9505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    (p->ram)->ib.mode = mode;        /* Set operation mode */
9525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < ETH_ALEN; i++)   /* Set physical address */
9545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	(p->ram)->ib.paddr[i] = *(nic->node_addr+i);
9565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < 8; i++)          /* Set multicast, logical address */
9595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	(p->ram)->ib.laddr[i] = 0;   /* We do not use logical addressing */
9615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Set ring descriptor pointers and set number of descriptors */
9645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    (p->ram)->ib.rdrp = (int)  p->rmdhead | RMDNUMMASK;
9665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    (p->ram)->ib.tdrp = (int)  p->tmdhead | TMDNUMMASK;
9675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Prepare LANCE Control and Status Registers */
9695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR3, CSR3_ACON);   /* Ale Control !!!THIS MUST BE SET!!!! */
9715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*
9735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * LANCE addresses the RAM from 0x0000 to 0x3fbf and has no access to
9745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * PC Memory locations.
9755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     *
9765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * In structure SK_ram is defined that the first thing in ram
9775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * is the initialization block. So his address is for LANCE always
9785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * 0x0000
9795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     *
9805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * CSR1 contains low order bits 15:0 of initialization block address
9815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * CSR2 is built of:
9825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     *    7:0  High order bits 23:16 of initialization block address
9835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     *   15:8  reserved, must be 0
9845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     */
9855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Set initialization block address (must be on word boundary) */
9875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR1, 0);          /* Set low order bits 15:0 */
9885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR2, 0);          /* Set high order bits 23:16 */
9895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF(("## %s: After setting CSR1-3. CSR0: %#hX\n",
9925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME, SK_read_reg(CSR0)));
9935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Initialize LANCE */
9955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*
9975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * INIT = Initialize, when set, causes the LANCE to begin the
9985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     * initialization procedure and access the Init Block.
9995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     */
10005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, CSR0_INIT);
10025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Wait until LANCE finished initialization */
10045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_set_RAP(CSR0);              /* Register Address Pointer to CSR0 */
10065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; (i < 100) && !(SK_rread_reg() & CSR0_IDON); i++)
10085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	; /* Wait until init done or go ahead if problems (i>=100) */
10095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (i >= 100) /* Something is wrong ! */
10115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
10125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf("%s: can't init am7990, status: %#hX "
10135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	       "init_block: %#hX\n",
10145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		SK_NAME, (int) SK_read_reg(CSR0),
10155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		(unsigned int) &(p->ram)->ib);
10165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
10185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	SK_print_pos(nic, "LANCE INIT failed");
10195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
10205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return -1;                 /* LANCE init failed */
10225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
10235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF(("## %s: init done after %d ticks\n", SK_NAME, i));
10255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Clear Initialize done, enable Interrupts, start LANCE */
10275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_write_reg(CSR0, CSR0_IDON | CSR0_INEA | CSR0_STRT);
10295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    PRINTF(("## %s: LANCE started. CSR0: %#hX\n", SK_NAME,
10315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project            SK_read_reg(CSR0)));
10325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return 0;                      /* LANCE is up and running */
10345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_lance_init() */
10365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* LANCE access functions
10385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
10395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ! CSR1-3 can only be accessed when in CSR0 the STOP bit is set !
10405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
10415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_reset_board(void)
10435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
10445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i;
10455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	PRINTF(("## %s: At beginning of SK_reset_board.\n", SK_NAME));
10475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_PORT = 0x00;           /* Reset active */
10485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < 10 ; i++) /* Delay min 5ms */
10495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;
10505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_PORT = SK_RESET;       /* Set back to normal operation */
10515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_reset_board() */
10535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_set_RAP(int reg_number)
10555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
10565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_IOREG = reg_number;
10575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_PORT  = SK_RESET | SK_RAP | SK_WREG;
10585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_IOCOM = SK_DOIO;
10595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (SK_PORT & SK_IORUN)
10615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;
10625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_set_RAP() */
10635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_read_reg(int reg_number)
10655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
10665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_set_RAP(reg_number);
10675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_PORT  = SK_RESET | SK_RDATA | SK_RREG;
10695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_IOCOM = SK_DOIO;
10705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (SK_PORT & SK_IORUN)
10725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;
10735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return (SK_IOREG);
10745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_read_reg() */
10765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int SK_rread_reg(void)
10785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
10795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_PORT  = SK_RESET | SK_RDATA | SK_RREG;
10805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_IOCOM = SK_DOIO;
10825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (SK_PORT & SK_IORUN)
10845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;
10855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return (SK_IOREG);
10865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_rread_reg() */
10885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_write_reg(int reg_number, int value)
10905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
10915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_set_RAP(reg_number);
10925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_IOREG = value;
10945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_PORT  = SK_RESET | SK_RDATA | SK_WREG;
10955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    SK_IOCOM = SK_DOIO;
10965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (SK_PORT & SK_IORUN)
10985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;
10995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_write_reg */
11005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
11025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Debugging functions
11035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * -------------------
11045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
11055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	SK_DEBUG
11075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_print_pos(struct nic *nic, char *text)
11085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
11095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned char pos0 = inb(SK_POS0),
11115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  pos1 = inb(SK_POS1),
11125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  pos2 = inb(SK_POS2),
11135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  pos3 = inb(SK_POS3),
11145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  pos4 = inb(SK_POS4);
11155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf("## %s: %s.\n"
11185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           "##   pos0=%#hX pos1=%#hX pos2=%#hX pos3=%#hX pos4=%#hX\n",
11195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME, text, pos0, pos1, pos2, (pos3<<14), pos4);
11205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_print_pos() */
11225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void SK_print_ram(struct nic *nic)
11245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
11255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i;
11275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct priv *p = (struct priv *) nic->priv_data;
11285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf("## %s: RAM Details.\n"
11305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           "##   RAM at %#hX tmdhead: %#hX rmdhead: %#hX initblock: %#hX\n",
11315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           SK_NAME,
11325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           (unsigned int) p->ram,
11335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           (unsigned int) p->tmdhead,
11345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           (unsigned int) p->rmdhead,
11355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           (unsigned int) &(p->ram)->ib);
11365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf("##   ");
11385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for(i = 0; i < TMDNUM; i++)
11405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
11415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           if (!(i % 3)) /* Every third line do a newline */
11425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           {
11435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               printf("\n##   ");
11445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           }
11455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("tmdbufs%d: %#hX ", (i+1), (int) p->tmdbufs[i]);
11465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
11475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf("##   ");
11485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for(i = 0; i < RMDNUM; i++)
11505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
11515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project         if (!(i % 3)) /* Every third line do a newline */
11525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           {
11535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project               printf("\n##   ");
11545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project           }
11555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        printf("rmdbufs%d: %#hX ", (i+1), (int) p->rmdbufs[i]);
11565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
11575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    putchar('\n');
11585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* End of SK_print_ram() */
11605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
1161