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