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