15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEtherboot - BOOTP/TFTP Bootstrap Program 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIntel EEPRO/10 NIC driver for Etherboot 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectAdapted from Linux eepro.c from kernel 2.2.17 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThis board accepts a 32 pin EEPROM (29C256), however a test with a 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project27C010 shows that this EPROM also works in the socket, but it's not clear 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthow repeatably. The two top address pins appear to be held low, thus 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthe bottom 32kB of the 27C010 is visible in the CPU's address space. 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTo be sure you could put 4 copies of the code in the 27C010, then 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectit doesn't matter whether the extra lines are held low or high, just 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthopefully not floating as CMOS chips don't like floating inputs. 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectBe careful with seating the EPROM as the socket on my board actually 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthas 34 pins, the top row of 2 are not used. 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * modify it under the terms of the GNU General Public License as 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * published by the Free Software Foundation; either version 2, or (at 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * your option) any later version. 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get some global routines like printf */ 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "etherboot.h" 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get the interface to the body of the program */ 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "nic.h" 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get our own prototype */ 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "cards.h" 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* we use timer2 for microsecond waits */ 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "timer.h" 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#undef DEBUG /* only after include files */ 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Different 82595 chips */ 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LAN595 0 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LAN595TX 1 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LAN595FX 2 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LAN595FX_10ISA 3 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SLOW_DOWN inb(0x80); 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The station (ethernet) address prefix, used for IDing the board. */ 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SA_ADDR0 0x00 /* Etherexpress Pro/10 */ 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SA_ADDR1 0xaa 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SA_ADDR2 0x00 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define GetBit(x,y) ((x & (1<<y))>>y) 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* EEPROM Word 0: */ 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PnP 0 /* Plug 'n Play enable bit */ 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_Word1 1 /* Word 1? */ 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_BusWidth 2 /* 8/16 bit */ 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_FlashAddr 3 /* Flash Address */ 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_FlashMask 0x7 /* Mask */ 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_AutoIO 6 /* */ 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_reserved0 7 /* =0! */ 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_Flash 8 /* Flash there? */ 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_AutoNeg 9 /* Auto Negotiation enabled? */ 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IO0 10 /* IO Address LSB */ 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IO0Mask 0x /*...*/ 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IO1 15 /* IO MSB */ 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* EEPROM Word 1: */ 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IntSel 0 /* Interrupt */ 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IntMask 0x7 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_LI 3 /* Link Integrity 0= enabled */ 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PC 4 /* Polarity Correction 0= enabled */ 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_TPE_AUI 5 /* PortSelection 1=TPE */ 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_Jabber 6 /* Jabber prevention 0= enabled */ 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_AutoPort 7 /* Auto Port Selection 1= Disabled */ 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_SMOUT 8 /* SMout Pin Control 0= Input */ 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PROM 9 /* Flash EPROM / PROM 0=Flash */ 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_reserved1 10 /* .. 12 =0! */ 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_AltReady 13 /* Alternate Ready, 0=normal */ 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_reserved2 14 /* =0! */ 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_Duplex 15 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Word2,3,4: */ 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IA5 0 /*bit start for individual Addr Byte 5 */ 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IA4 8 /*bit start for individual Addr Byte 5 */ 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IA3 0 /*bit start for individual Addr Byte 5 */ 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IA2 8 /*bit start for individual Addr Byte 5 */ 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IA1 0 /*bit start for individual Addr Byte 5 */ 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_IA0 8 /*bit start for individual Addr Byte 5 */ 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Word 5: */ 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_BNC_TPE 0 /* 0=TPE */ 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_BootType 1 /* 00=None, 01=IPX, 10=ODI, 11=NDIS */ 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_BootTypeMask 0x3 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_NumConn 3 /* Number of Connections 0= One or Two */ 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_FlashSock 4 /* Presence of Flash Socket 0= Present */ 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PortTPE 5 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PortBNC 6 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PortAUI 7 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_PowerMgt 10 /* 0= disabled */ 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_CP 13 /* Concurrent Processing */ 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_CPMask 0x7 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Word 6: */ 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_Stepping 0 /* Stepping info */ 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_StepMask 0x0F 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_BoardID 4 /* Manucaturer Board ID, reserved */ 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_BoardMask 0x0FFF 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Word 7: */ 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_INT_TO_IRQ 0 /* int to IRQ Mapping = 0x1EB8 for Pro/10+ */ 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_FX_INT2IRQ 0x1EB8 /* the _only_ mapping allowed for FX chips */ 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*..*/ 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_SIZE 0x40 /* total EEprom Size */ 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_Checksum 0xBABA /* initial and final value for adding checksum */ 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Card identification via EEprom: */ 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_addr_vendor 0x10 /* Word offset for EISA Vendor ID */ 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_addr_id 0x11 /* Word offset for Card ID */ 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_addr_SN 0x12 /* Serial Number */ 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_addr_CRC_8 0x14 /* CRC over last thee Bytes */ 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_vendor_intel0 0x25 /* Vendor ID Intel */ 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_vendor_intel1 0xD4 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_id_eepro10p0 0x10 /* ID for eepro/10+ */ 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ee_id_eepro10p1 0x31 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* now this section could be used by both boards: the oldies and the ee10: 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ee10 uses tx buffer before of rx buffer and the oldies the inverse. 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (aris) 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RAM_SIZE 0x8000 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_HEADER 8 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_DEFAULT_RAM 0x6000 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_RAM rcv_ram 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned rcv_ram = RCV_DEFAULT_RAM; 1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_HEADER 8 1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_RAM (RAM_SIZE - RCV_RAM) 1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_START ((rcv_start + RCV_RAM) % RAM_SIZE) 1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_LOWER_LIMIT (rcv_start >> 8) 1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_UPPER_LIMIT (((rcv_start + RCV_RAM) - 2) >> 8) 1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_LOWER_LIMIT (XMT_START >> 8) 1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_UPPER_LIMIT (((XMT_START + XMT_RAM) - 2) >> 8) 1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_START_PRO 0x00 1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_START_10 XMT_RAM 1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* by default the old driver */ 1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned rcv_start = RCV_START_PRO; 1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_DONE 0x0008 1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_OK 0x2000 1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_ERROR 0x0d81 1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_DONE_BIT 0x0080 1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CHAIN_BIT 0x8000 1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_STATUS 0x02 1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_CHAIN 0x04 1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_COUNT 0x06 1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BANK0_SELECT 0x00 1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BANK1_SELECT 0x40 1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BANK2_SELECT 0x80 1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Bank 0 registers */ 1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define COMMAND_REG 0x00 /* Register 0 */ 1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MC_SETUP 0x03 1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_CMD 0x04 1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DIAGNOSE_CMD 0x07 1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_ENABLE_CMD 0x08 1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_DISABLE_CMD 0x0a 1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define STOP_RCV_CMD 0x0b 1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RESET_CMD 0x0e 1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define POWER_DOWN_CMD 0x18 1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RESUME_XMT_CMD 0x1c 1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define SEL_RESET_CMD 0x1e 1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define STATUS_REG 0x01 /* Register 1 */ 1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_INT 0x02 1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_INT 0x04 1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EXEC_STATUS 0x30 1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ID_REG 0x02 /* Register 2 */ 1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define R_ROBIN_BITS 0xc0 /* round robin counter */ 1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ID_REG_MASK 0x2c 1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ID_REG_SIG 0x24 1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define AUTO_ENABLE 0x10 1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INT_MASK_REG 0x03 /* Register 3 */ 1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_STOP_MASK 0x01 1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_MASK 0x02 1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_MASK 0x04 1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EXEC_MASK 0x08 1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ALL_MASK 0x0f 1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IO_32_BIT 0x10 1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_BAR 0x04 /* The following are word (16-bit) registers */ 1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_STOP 0x06 1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_BAR_PRO 0x0a 2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_BAR_10 0x0b 2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned xmt_bar = XMT_BAR_PRO; 2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define HOST_ADDRESS_REG 0x0c 2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IO_PORT 0x0e 2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IO_PORT_32_BIT 0x0c 2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Bank 1 registers */ 2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define REG1 0x01 2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define WORD_WIDTH 0x02 2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INT_ENABLE 0x80 2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define INT_NO_REG 0x02 2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_LOWER_LIMIT_REG 0x08 2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_UPPER_LIMIT_REG 0x09 2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_LOWER_LIMIT_REG_PRO 0x0a 2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_UPPER_LIMIT_REG_PRO 0x0b 2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_LOWER_LIMIT_REG_10 0x0b 2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_UPPER_LIMIT_REG_10 0x0a 2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO; 2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO; 2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Bank 2 registers */ 2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_Chain_Int 0x20 /* Interrupt at the end of the transmit chain */ 2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XMT_Chain_ErrStop 0x40 /* Interrupt at the end of the chain even if there are errors */ 2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCV_Discard_BadFrame 0x80 /* Throw bad frames away, and continue to receive others */ 2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define REG2 0x02 2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PRMSC_Mode 0x01 2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define Multi_IA 0x20 2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define REG3 0x03 2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TPE_BIT 0x04 2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BNC_BIT 0x20 2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define REG13 0x0d 2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define FDX 0x00 2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define A_N_ENABLE 0x02 2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define I_ADD_REG0 0x04 2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define I_ADD_REG1 0x05 2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define I_ADD_REG2 0x06 2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define I_ADD_REG3 0x07 2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define I_ADD_REG4 0x08 2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define I_ADD_REG5 0x09 2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EEPROM_REG_PRO 0x0a 2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EEPROM_REG_10 0x0b 2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned eeprom_reg = EEPROM_REG_PRO; 2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EESK 0x01 2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECS 0x02 2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EEDI 0x04 2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EEDO 0x08 2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The horrible routine to read a word from the serial EEPROM. */ 2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* IMPORTANT - the 82595 will be set to Bank 0 after the eeprom is read */ 2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The delay between EEPROM clock transitions. */ 2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eeprom_delay() { udelay(40); } 2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EE_READ_CMD (6 << 6) 2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* do a full reset */ 2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_full_reset(ioaddr) outb(RESET_CMD, ioaddr); udelay(40); 2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* do a nice reset */ 2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_sel_reset(ioaddr) { \ 2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(SEL_RESET_CMD, ioaddr); \ 2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project SLOW_DOWN; \ 2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project SLOW_DOWN; \ 2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* clear all interrupts */ 2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_clear_int(ioaddr) outb(ALL_MASK, ioaddr + STATUS_REG) 2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* enable rx */ 2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_en_rx(ioaddr) outb(RCV_ENABLE_CMD, ioaddr) 2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* disable rx */ 2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_dis_rx(ioaddr) outb(RCV_DISABLE_CMD, ioaddr) 2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* switch bank */ 2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_sw2bank0(ioaddr) outb(BANK0_SELECT, ioaddr) 2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_sw2bank1(ioaddr) outb(BANK1_SELECT, ioaddr) 2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define eepro_sw2bank2(ioaddr) outb(BANK2_SELECT, ioaddr) 2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned int rx_start, tx_start; 2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int tx_last; 2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned tx_end; 2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int eepro = 0; 2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned short ioaddr = 0; 2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned int mem_start, mem_end = RCV_DEFAULT_RAM / 1024; 2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define udelay(n) waiton_timer2(((n)*TICKS_PER_MS)/1000) 2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectRESET - Reset adapter 2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void eepro_reset(struct nic *nic) 2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int temp_reg, i; 2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* put the card in its initial state */ 3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank2(ioaddr); /* be careful, bank2 now */ 3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project temp_reg = inb(ioaddr + eeprom_reg); 3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef DEBUG 3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("Stepping %d\n", temp_reg >> 5); 3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (temp_reg & 0x10) /* check the TurnOff Enable bit */ 3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(temp_reg & 0xEF, ioaddr + eeprom_reg); 3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; i < ETH_ALEN; i++) /* fill the MAC address */ 3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(nic->node_addr[i], ioaddr + I_ADD_REG0 + i); 3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project temp_reg = inb(ioaddr + REG1); 3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* setup Transmit Chaining and discard bad RCV frames */ 3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(temp_reg | XMT_Chain_Int | XMT_Chain_ErrStop 3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project | RCV_Discard_BadFrame, ioaddr + REG1); 3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project temp_reg = inb(ioaddr + REG2); /* match broadcast */ 3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(temp_reg | 0x14, ioaddr + REG2); 3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project temp_reg = inb(ioaddr + REG3); 3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(temp_reg & 0x3F, ioaddr + REG3); /* clear test mode */ 3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* set the receiving mode */ 3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank1(ioaddr); /* be careful, bank1 now */ 3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* initialise the RCV and XMT upper and lower limits */ 3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG); 3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG); 3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(XMT_LOWER_LIMIT, ioaddr + xmt_lower_limit_reg); 3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(XMT_UPPER_LIMIT, ioaddr + xmt_upper_limit_reg); 3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank0(ioaddr); /* Switch back to bank 0 */ 3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_clear_int(ioaddr); 3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Initialise RCV */ 3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(rx_start = (RCV_LOWER_LIMIT << 8), ioaddr + RCV_BAR); 3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(((RCV_UPPER_LIMIT << 8) | 0xFE), ioaddr + RCV_STOP); 3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Intialise XMT */ 3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw((XMT_LOWER_LIMIT << 8), ioaddr + xmt_bar); 3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sel_reset(ioaddr); 3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_start = tx_end = (XMT_LOWER_LIMIT << 8); 3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_last = 0; 3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_en_rx(ioaddr); 3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPOLL - Wait for a frame 3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int eepro_poll(struct nic *nic) 3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int rcv_car = rx_start; 3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int rcv_event, rcv_status, rcv_next_frame, rcv_size; 3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* return true if there's an ethernet packet ready to read */ 3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* nic->packet should contain data on return */ 3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* nic->packetlen should contain length of data */ 3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ((inb(ioaddr + STATUS_REG) & 0x40) == 0) 3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); 3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(0x40, ioaddr + STATUS_REG); 3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(rcv_car, ioaddr + HOST_ADDRESS_REG); 3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_event = inw(ioaddr + IO_PORT); 3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (rcv_event != RCV_DONE) 3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); 3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_status = inw(ioaddr + IO_PORT); 3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_next_frame = inw(ioaddr + IO_PORT); 3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_size = inw(ioaddr + IO_PORT); 3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("%hX %hX %d %hhX\n", rcv_status, rcv_next_frame, rcv_size, 3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project inb(ioaddr + STATUS_REG)); 3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ((rcv_status & (RX_OK|RX_ERROR)) != RX_OK) { 3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("Receive error %hX\n", rcv_status); 3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); 3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_size &= 0x3FFF; 3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project insw(ioaddr + IO_PORT, nic->packet, ((rcv_size + 3) >> 1)); 3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; i < 48; i++) { 3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("%hhX", nic->packet[i]); 3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project putchar(i % 16 == 15 ? '\n' : ' '); 3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->packetlen = rcv_size; 3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_car = rx_start + RCV_HEADER + rcv_size; 3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rx_start = rcv_next_frame; 3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (rcv_car == 0) 3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_car = ((RCV_UPPER_LIMIT << 8) | 0xff); 3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(rcv_car - 1, ioaddr + RCV_STOP); 3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (1); 3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTRANSMIT - Transmit a frame 3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void eepro_transmit( 3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct nic *nic, 3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project const char *d, /* Destination */ 3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int t, /* Type */ 3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int s, /* size */ 3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project const char *p) /* Packet */ 3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int status, tx_available, last, end, length; 3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned short type; 3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int boguscount = 20; 4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project length = s + ETH_HLEN; 4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (tx_end > tx_start) 4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_available = XMT_RAM - (tx_end - tx_start); 4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else if (tx_end < tx_start) 4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_available = tx_start - tx_end; 4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_available = XMT_RAM; 4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project last = tx_end; 4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project end = last + (((length + 3) >> 1) << 1) + XMT_HEADER; 4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (end >= (XMT_UPPER_LIMIT << 8)) { 4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project last = (XMT_LOWER_LIMIT << 8); 4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project end = last + (((length + 3) >> 1) << 1) + XMT_HEADER; 4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(last, ioaddr + HOST_ADDRESS_REG); 4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(XMT_CMD, ioaddr + IO_PORT); 4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(0, ioaddr + IO_PORT); 4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(end, ioaddr + IO_PORT); 4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(length, ioaddr + IO_PORT); 4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outsw(ioaddr + IO_PORT, d, ETH_ALEN / 2); 4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outsw(ioaddr + IO_PORT, nic->node_addr, ETH_ALEN / 2); 4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project type = htons(t); 4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outsw(ioaddr + IO_PORT, &type, sizeof(type) / 2); 4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outsw(ioaddr + IO_PORT, p, (s + 3) >> 1); 4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* A dummy read to flush the DRAM write pipeline */ 4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project status = inw(ioaddr + IO_PORT); 4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(last, ioaddr + xmt_bar); 4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(XMT_CMD, ioaddr); 4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_start = last; 4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_last = last; 4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_end = end; 4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("%d %d\n", tx_start, tx_end); 4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (boguscount > 0) { 4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (((status = inw(ioaddr + IO_PORT)) & TX_DONE_BIT) == 0) { 4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project udelay(40); 4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project boguscount--; 4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project continue; 4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if DEBUG 4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ((status & 0x2000) == 0) 4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("Transmit status %hX\n", status); 4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectDISABLE - Turn off ethernet interface 4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void eepro_disable(struct nic *nic) 4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank0(ioaddr); /* Switch to bank 0 */ 4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Flush the Tx and disable Rx */ 4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(STOP_RCV_CMD, ioaddr); 4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_start = tx_end = (XMT_LOWER_LIMIT << 8); 4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_last = 0; 4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Reset the 82595 */ 4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_full_reset(ioaddr); 4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int read_eeprom(int location) 4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned short retval = 0; 4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ee_addr = ioaddr + eeprom_reg; 4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int read_cmd = location | EE_READ_CMD; 4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ctrl_val = EECS; 4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (eepro == LAN595FX_10ISA) { 4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank1(ioaddr); 4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(0x00, ioaddr + STATUS_REG); 4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank2(ioaddr); 4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(ctrl_val, ee_addr); 4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* shift the read command bits out */ 4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 8; i >= 0; i--) { 4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project short outval = (read_cmd & (1 << i)) ? ctrl_val | EEDI : ctrl_val; 4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(outval, ee_addr); 4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(outval | EESK, ee_addr); /* EEPROM clock tick */ 4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_delay(); 4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(outval, ee_addr); /* finish EEPROM clock tick */ 4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_delay(); 4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(ctrl_val, ee_addr); 4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 16; i > 0; i--) { 4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(ctrl_val | EESK, ee_addr); 4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_delay(); 4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project retval = (retval << 1) | ((inb(ee_addr) & EEDO) ? 1 : 0); 4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(ctrl_val, ee_addr); 4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_delay(); 4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* terminate the EEPROM access */ 4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ctrl_val &= ~EECS; 4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(ctrl_val | EESK, ee_addr); 4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_delay(); 4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(ctrl_val, ee_addr); 4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_delay(); 4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_sw2bank0(ioaddr); 4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (retval); 5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int eepro_probe1(struct nic *nic) 5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i, id, counter, l_eepro = 0; 5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project union { 5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned char caddr[ETH_ALEN]; 5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned short saddr[ETH_ALEN/2]; 5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } station_addr; 5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char *name; 5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project id = inb(ioaddr + ID_REG); 5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ((id & ID_REG_MASK) != ID_REG_SIG) 5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); 5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project counter = id & R_ROBIN_BITS; 5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (((id = inb(ioaddr + ID_REG)) & R_ROBIN_BITS) != (counter + 0x40)) 5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); 5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* yes the 82595 has been found */ 5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[2] = read_eeprom(2); 5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (station_addr.saddr[2] == 0x0000 || station_addr.saddr[2] == 0xFFFF) { 5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project l_eepro = 3; 5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro = LAN595FX_10ISA; 5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eeprom_reg= EEPROM_REG_10; 5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_start = RCV_START_10; 5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10; 5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10; 5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[2] = read_eeprom(2); 5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[1] = read_eeprom(3); 5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[0] = read_eeprom(4); 5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (l_eepro) 5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project name = "Intel EtherExpress 10 ISA"; 5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else if (read_eeprom(7) == ee_FX_INT2IRQ) { 5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project name = "Intel EtherExpress Pro/10+ ISA"; 5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project l_eepro = 2; 5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if (station_addr.saddr[0] == SA_ADDR1) { 5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project name = "Intel EtherExpress Pro/10 ISA"; 5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project l_eepro = 1; 5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project l_eepro = 0; 5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project name = "Intel 82595-based LAN card"; 5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[0] = swap16(station_addr.saddr[0]); 5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[1] = swap16(station_addr.saddr[1]); 5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project station_addr.saddr[2] = swap16(station_addr.saddr[2]); 5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; i < ETH_ALEN; i++) { 5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->node_addr[i] = station_addr.caddr[i]; 5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf("\n%s ioaddr %#hX, addr %!", name, ioaddr, nic->node_addr); 5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mem_start = RCV_LOWER_LIMIT << 8; 5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ((mem_end & 0x3F) < 3 || (mem_end & 0x3F) > 29) 5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mem_end = RCV_UPPER_LIMIT << 8; 5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else { 5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mem_end = mem_end * 1024 + (RCV_LOWER_LIMIT << 8); 5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rcv_ram = mem_end - (RCV_LOWER_LIMIT << 8); 5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printf(", Rx mem %dK, if %s\n", (mem_end - mem_start) >> 10, 5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project GetBit(read_eeprom(5), ee_BNC_TPE) ? "BNC" : "TP"); 5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (1); 5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPROBE - Look for an adapter, this routine's visible to the outside 5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *eepro_probe(struct nic *nic, unsigned short *probe_addrs) 5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned short *p; 5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* same probe list as the Linux driver */ 5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project static unsigned short ioaddrs[] = { 5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 0x300, 0x210, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0}; 5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (probe_addrs == 0 || probe_addrs[0] == 0) 5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project probe_addrs = ioaddrs; 5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (p = probe_addrs; (ioaddr = *p) != 0; p++) { 5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (eepro_probe1(nic)) 5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (*p == 0) 5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); 5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eepro_reset(nic); 5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* point to NIC specific routines */ 5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->reset = eepro_reset; 5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->poll = eepro_poll; 5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->transmit = eepro_transmit; 5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->disable = eepro_disable; 5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (nic); 5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 587