15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* rhine.c:Fast Ethernet driver for Linux. */
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	Adapted 09-jan-2000 by Paolo Marini (paolom@prisma-eng.it)
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        originally written by Donald Becker.
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	This software may be used and distributed according to the terms
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	of the GNU Public License (GPL), incorporated herein by reference.
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	Drivers derived from this code also fall under the GPL and must retain
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	this authorship and copyright notice.
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	Under no circumstances are the authors responsible for
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	the proper functioning of this software, nor do the authors assume any
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	responsibility for damages incurred with its use.
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	This driver is designed for the VIA VT86C100A Rhine-II PCI Fast Ethernet
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	controller.
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic const char *version = "rhine.c v1.0.0 2000-01-07\n";
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* A few user-configurable values. */
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Size of the in-memory receive ring. */
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_BUF_LEN_IDX	3	/* 0==8K, 1==16K, 2==32K, 3==64K */
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_BUF_SIZE	1536
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_BUF_SIZE	1536
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* PCI Tuning Parameters
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   Threshold is bytes transferred to chip before transmission starts. */
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_FIFO_THRESH 256	/* In bytes, rounded down to 32 byte units. */
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The following settings are log_2(bytes)-4:  0 == 16 bytes .. 6==1024. */
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_FIFO_THRESH	4	/* Rx buffer level before first PCI xfer.  */
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_DMA_BURST	4	/* Maximum PCI burst, '4' is 256 bytes */
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_DMA_BURST	4
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Operational parameters that usually are not changed. */
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Time in jiffies before concluding the transmitter is hung. */
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_TIMEOUT  ((2000*HZ)/1000)
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "etherboot.h"
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "nic.h"
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "pci.h"
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "cards.h"
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* define all ioaddr */
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byPAR0				ioaddr
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byRCR				ioaddr + 6
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byTCR				ioaddr + 7
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byCR0				ioaddr + 8
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byCR1				ioaddr + 9
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byISR0				ioaddr + 0x0c
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byISR1				ioaddr + 0x0d
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byIMR0				ioaddr + 0x0e
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byIMR1				ioaddr + 0x0f
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR0				ioaddr + 0x10
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR1				ioaddr + 0x11
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR2				ioaddr + 0x12
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR3				ioaddr + 0x13
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR4				ioaddr + 0x14
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR5				ioaddr + 0x15
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR6				ioaddr + 0x16
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMAR7				ioaddr + 0x17
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentRxDescAddr		ioaddr + 0x18
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentTxDescAddr		ioaddr + 0x1c
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentRDSE0			ioaddr + 0x20
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentRDSE1			ioaddr + 0x24
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentRDSE2			ioaddr + 0x28
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentRDSE3			ioaddr + 0x2c
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextRDSE0			ioaddr + 0x30
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextRDSE1			ioaddr + 0x34
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextRDSE2			ioaddr + 0x38
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextRDSE3			ioaddr + 0x3c
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentTDSE0			ioaddr + 0x40
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentTDSE1			ioaddr + 0x44
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentTDSE2			ioaddr + 0x48
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrentTDSE3			ioaddr + 0x4c
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextTDSE0			ioaddr + 0x50
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextTDSE1			ioaddr + 0x54
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextTDSE2			ioaddr + 0x58
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwNextTDSE3			ioaddr + 0x5c
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrRxDMAPtr			ioaddr + 0x60
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define dwCurrTxDMAPtr			ioaddr + 0x64
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMPHY				ioaddr + 0x6c
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMIISR				ioaddr + 0x6d
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byBCR0				ioaddr + 0x6e
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byBCR1				ioaddr + 0x6f
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMIICR				ioaddr + 0x70
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byMIIAD				ioaddr + 0x71
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define wMIIDATA			ioaddr + 0x72
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byEECSR				ioaddr + 0x74
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byTEST				ioaddr + 0x75
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byGPIO				ioaddr + 0x76
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byCFGA				ioaddr + 0x78
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byCFGB				ioaddr + 0x79
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byCFGC				ioaddr + 0x7a
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define byCFGD				ioaddr + 0x7b
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define wTallyCntMPA			ioaddr + 0x7c
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define wTallyCntCRC			ioaddr + 0x7d
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*---------------------  Exioaddr Definitions -------------------------*/
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the RCR register
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_RRFT2		0x80
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_RRFT1		0x40
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_RRFT0		0x20
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_PROM		0x10
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_AB			0x08
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_AM			0x04
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_AR			0x02
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RCR_SEP			0x01
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the TCR register
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TCR_RTSF		0x80
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TCR_RTFT1		0x40
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TCR_RTFT0		0x20
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TCR_OFSET		0x08
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TCR_LB1			0x04	/* loopback[1] */
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TCR_LB0			0x02	/* loopback[0] */
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CR0 register
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_RDMD		0x40	/* rx descriptor polling demand */
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_TDMD		0x20	/* tx descriptor polling demand */
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_TXON		0x10
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_RXON		0x08
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_STOP		0x04	/* stop NIC, default = 1 */
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_STRT		0x02	/* start NIC */
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR0_INIT		0x01	/* start init process */
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CR1 register
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_SFRST		0x80	/* software reset */
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_RDMD1		0x40	/* RDMD1 */
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_TDMD1		0x20	/* TDMD1 */
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_KEYPAG		0x10	/* turn on par/key */
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_DPOLL		0x08	/* disable rx/tx auto polling */
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_FDX			0x04	/* full duplex mode */
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_ETEN		0x02	/* early tx mode */
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR1_EREN		0x01	/* early rx mode */
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CR register
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_RDMD			0x0040	/* rx descriptor polling demand */
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_TDMD			0x0020	/* tx descriptor polling demand */
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_TXON			0x0010
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_RXON			0x0008
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_STOP			0x0004	/* stop NIC, default = 1 */
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_STRT			0x0002	/* start NIC */
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_INIT			0x0001	/* start init process */
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_SFRST		0x8000	/* software reset */
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_RDMD1		0x4000	/* RDMD1 */
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_TDMD1		0x2000	/* TDMD1 */
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_KEYPAG		0x1000	/* turn on par/key */
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_DPOLL		0x0800	/* disable rx/tx auto polling */
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_FDX			0x0400	/* full duplex mode */
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_ETEN			0x0200	/* early tx mode */
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CR_EREN			0x0100	/* early rx mode */
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the IMR0 register
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_CNTM		0x80
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_BEM		0x40
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_RUM		0x20
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_TUM		0x10
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_TXEM		0x08
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_RXEM		0x04
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_PTXM		0x02
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR0_PRXM		0x01
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* define imrshadow */
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMRShadow		0x5AFF
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the IMR1 register
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_INITM		0x80
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_SRCM		0x40
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_NBFM		0x10
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_PRAIM		0x08
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_RES0M		0x04
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_ETM		0x02
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define IMR1_ERM		0x01
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the ISR register
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_INITI		0x8000
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_SRCI		0x4000
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_ABTI		0x2000
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_NORBF		0x1000
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_PKTRA		0x0800
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_RES0		0x0400
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_ETI			0x0200
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_ERI			0x0100
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_CNT			0x0080
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_BE			0x0040
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_RU			0x0020
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_TU			0x0010
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_TXE			0x0008
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_RXE			0x0004
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_PTX			0x0002
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_PRX			0x0001
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the ISR0 register
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_CNT		0x80
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_BE			0x40
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_RU			0x20
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_TU			0x10
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_TXE		0x08
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_RXE		0x04
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_PTX		0x02
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR0_PRX		0x01
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the ISR1 register
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR1_INITI		0x80
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR1_SRCI		0x40
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR1_NORBF		0x10
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR1_PKTRA		0x08
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR1_ETI		0x02
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR1_ERI		0x01
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* ISR ABNORMAL CONDITION */
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ISR_ABNORMAL ISR_BE+ISR_RU+ISR_TU+ISR_CNT+ISR_NORBF+ISR_PKTRA
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the MIISR register
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIISR_MIIERR		0x08
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIISR_MRERR		0x04
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIISR_LNKFL		0x02
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIISR_SPEED		0x01
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the MIICR register
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_MAUTO		0x80
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_RCMD		0x40
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_WCMD		0x20
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_MDPM		0x10
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_MOUT		0x08
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_MDO		0x04
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_MDI		0x02
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MIICR_MDC		0x01
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the EECSR register
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_EEPR		0x80	/* eeprom programed status, 73h means programed */
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_EMBP		0x40	/* eeprom embeded programming */
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_AUTOLD		0x20	/* eeprom content reload */
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_DPM		0x10	/* eeprom direct programming */
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_CS		0x08	/* eeprom CS pin */
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_SK		0x04	/* eeprom SK pin */
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_DI		0x02	/* eeprom DI pin */
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EECSR_DO		0x01	/* eeprom DO pin */
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the BCR0 register
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR0_CRFT2		0x20
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR0_CRFT1		0x10
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR0_CRFT0		0x08
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR0_DMAL2		0x04
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR0_DMAL1		0x02
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR0_DMAL0		0x01
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the BCR1 register
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR1_CTSF		0x20
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR1_CTFT1		0x10
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR1_CTFT0		0x08
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR1_POT2		0x04
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR1_POT1		0x02
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define BCR1_POT0		0x01
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CFGA register
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGA_EELOAD		0x80	/* enable eeprom embeded and direct programming */
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGA_JUMPER		0x40
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGA_MTGPIO		0x08
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGA_T10EN		0x02
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGA_AUTO		0x01
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CFGB register
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGB_PD			0x80
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGB_POLEN		0x02
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGB_LNKEN		0x01
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CFGC register
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_M10TIO		0x80
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_M10POL		0x40
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_PHY1		0x20
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_PHY0		0x10
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_BTSEL		0x08
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_BPS2		0x04	/* bootrom select[2] */
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_BPS1		0x02	/* bootrom select[1] */
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGC_BPS0		0x01	/* bootrom select[0] */
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Bits in the CFGD register
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGD_GPIOEN		0x80
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGD_DIAG		0x40
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGD_MAGIC		0x10
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGD_CFDX		0x04
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGD_CEREN		0x02
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CFGD_CETEN		0x01
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Bits in RSR */
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_RERR		0x00000001
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_CRC			0x00000002
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_FAE			0x00000004
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_FOV			0x00000008
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_LONG		0x00000010
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_RUNT		0x00000020
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_SERR		0x00000040
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_BUFF		0x00000080
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_EDP			0x00000100
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_STP			0x00000200
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_CHN			0x00000400
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_PHY			0x00000800
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_BAR			0x00001000
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_MAR			0x00002000
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_RXOK		0x00008000
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RSR_ABNORMAL		RSR_RERR+RSR_LONG+RSR_RUNT
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Bits in TSR */
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_NCR0		0x00000001
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_NCR1		0x00000002
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_NCR2		0x00000004
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_NCR3		0x00000008
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_COLS		0x00000010
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_CDH			0x00000080
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_ABT			0x00000100
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_OWC			0x00000200
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_CRS			0x00000400
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_UDF			0x00000800
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_TBUFF		0x00001000
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_SERR		0x00002000
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_JAB			0x00004000
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_TERR		0x00008000
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_ABNORMAL		TSR_TERR+TSR_OWC+TSR_ABT+TSR_JAB+TSR_CRS
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TSR_OWN_BIT		0x80000000
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CB_DELAY_LOOP_WAIT	10	/* 10ms */
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* enabled mask value of irq */
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define W_IMR_MASK_VALUE	0x1BFF	/* initial value of IMR */
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Ethernet address filter type */
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_DIRECTED	0x0001	/* obsolete, directed address is always accepted */
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_MULTICAST	0x0002
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_ALL_MULTICAST	0x0004
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_BROADCAST	0x0008
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_PROMISCUOUS	0x0020
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_LONG		0x2000
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_RUNT		0x4000
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_TYPE_ERROR		0x8000	/* accept error packets, e.g. CRC error */
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Loopback mode */
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NIC_LB_NONE		0x00
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NIC_LB_INTERNAL		0x01
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NIC_LB_PHY		0x02	/* MII or Internal-10BaseT loopback */
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_RING_SIZE		2
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define RX_RING_SIZE		2
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PKT_BUF_SZ		1536	/* Size of each temporary Rx buffer. */
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Transmit and receive descriptors definition */
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct rhine_tx_desc
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    union VTC_tx_status_tag
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long ncro:1;
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long ncr1:1;
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long ncr2:1;
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long ncr3:1;
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long cols:1;
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reserve_1:2;
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long cdh:1;
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long abt:1;
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long owc:1;
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long crs:1;
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long udf:1;
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long tbuff:1;
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long serr:1;
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long jab:1;
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long terr:1;
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reserve_2:15;
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long own_bit:1;
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	bits;
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned long lw;
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_status;
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    union VTC_tx_ctrl_tag
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long tx_buf_size:11;
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long extend_tx_buf_size:4;
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long chn:1;
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long crc:1;
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reserve_1:4;
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long stp:1;
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long edp:1;
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long ic:1;
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reserve_2:8;
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	bits;
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned long lw;
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_ctrl;
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned long buf_addr_1:32;
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned long buf_addr_2:32;
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct rhine_rx_desc
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    union VTC_rx_status_tag
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long rerr:1;
4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long crc_error:1;
4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long fae:1;
4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long fov:1;
4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long toolong:1;
4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long runt:1;
4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long serr:1;
4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long buff:1;
4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long edp:1;
4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long stp:1;
4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long chn:1;
4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long phy:1;
4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long bar:1;
4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long mar:1;
4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reserve_1:1;
4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long rxok:1;
4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long frame_length:11;
4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reverve_2:4;
4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long own_bit:1;
4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	bits;
4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned long lw;
4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_status;
5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    union VTC_rx_ctrl_tag
5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	struct
5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long rx_buf_size:11;
5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long extend_rx_buf_size:4;
5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    unsigned long reserved_1:17;
5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	bits;
5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	unsigned long lw;
5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_ctrl;
5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned long buf_addr_1:32;
5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned long buf_addr_2:32;
5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The I/O extent. */
5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define rhine_TOTAL_SIZE 0x80
5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	HAVE_DEVLIST
5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct netdev_entry rhine_drv =
5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    { "rhine", rhine_probe, rhine_TOTAL_SIZE, NULL };
5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int rhine_debug = 1;
5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				Theory of Operation
5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectI. Board Compatibility
5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThis driver is designed for the VIA 86c100A Rhine-II PCI Fast Ethernet
5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcontroller.
5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectII. Board-specific settings
5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectBoards with this chip are functional only in a bus-master PCI slot.
5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMany operational settings are loaded from the EEPROM to the Config word at
5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectoffset 0x78.  This driver assumes that they are correct.
5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIf this driver is compiled to use PCI memory space operations the EEPROM
5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmust be configured to enable memory ops.
5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIII. Driver operation
5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIIIa. Ring buffers
5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThis driver uses two statically allocated fixed-size descriptor lists
5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectformed into rings by a branch from the final descriptor to the beginning of
5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthe list.  The ring sizes are set at compile time by RX/TX_RING_SIZE.
5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIIIb/c. Transmit/Receive Structure
5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThis driver attempts to use a zero-copy receive and transmit scheme.
5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectAlas, all data buffers are required to start on a 32 bit boundary, so
5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthe driver must often copy transmit packets into bounce buffers.
5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe driver allocates full frame size skbuffs for the Rx ring buffers at
5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectopen() time and passes the skb->data field to the chip as receive data
5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbuffers.  When an incoming frame is less than RX_COPYBREAK bytes long,
5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecta fresh skbuff is allocated and the frame is copied to the new skbuff.
5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectWhen the incoming frame is larger, the skbuff is passed directly up the
5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprotocol stack.  Buffers consumed this way are replaced by newly allocated
5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectskbuffs in the last phase of netdev_rx().
5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe RX_COPYBREAK value is chosen to trade-off the memory wasted by
5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectusing a full-sized skbuff for small frames vs. the copying costs of larger
5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectframes.  New boards are typically used in generously configured machines
5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectand the underfilled buffers have negligible impact compared to the benefit of
5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecta single allocation size, so the default value of zero results in never
5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcopying packets.  When copying is done, the cost is usually mitigated by using
5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecta combined copy/checksum routine.  Copying also preloads the cache, which is
5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmost useful with small frames.
5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectSince the VIA chips are only able to transfer data to buffers on 32 bit
5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectboundaries, the the IP header at offset 14 in an ethernet frame isn't
5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlongword aligned for further processing.  Copying these unaligned buffers
5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthas the beneficial effect of 16-byte aligning the IP header.
5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIIId. Synchronization
5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe driver runs as two independent, single-threaded flows of control.  One
5885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectis the send-packet routine, which enforces single-threaded use by the
5895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdev->tbusy flag.  The other thread is the interrupt handler, which is single
5905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthreaded by the hardware and interrupt handling software.
5915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe send packet thread has partial control over the Tx ring and 'dev->tbusy'
5935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectflag.  It sets the tbusy flag whenever it's queuing a Tx packet. If the next
5945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectqueue slot is empty, it clears the tbusy flag when finished otherwise it sets
5955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthe 'lp->tx_full' flag.
5965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe interrupt handler has exclusive control over the Rx ring and records stats
5985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfrom the Tx ring.  After reaping the stats, it marks the Tx queue entry as
5995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectempty by incrementing the dirty_tx mark. Iff the 'lp->tx_full' flag is set, it
6005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectclears both the tx_full and tbusy flags.
6015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIV. Notes
6035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIVb. References
6055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPreliminary VT86C100A manual from http://www.via.com.tw/
6075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthttp://cesdis.gsfc.nasa.gov/linux/misc/100mbps.html
6085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthttp://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
6095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectIVc. Errata
6115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe VT86C100A manual is not reliable information.
6135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe chip does not handle unaligned transmit or receive buffers, resulting
6145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectin significant performance degradation for bounce buffer copies on transmit
6155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectand unaligned IP headers on receive.
6165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectThe chip does not pad to minimum transmit length.
6175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
6195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_VENDOR_ID_FET		0x1106
6215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_DEVICE_ID_FET_3043		0x3043
6225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The rest of these values should never change. */
6245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NUM_TX_DESC	2	/* Number of Tx descriptor registers. */
6255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct rhine_private
6275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
6285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char devname[8];		/* Used only for kernel debugging. */
6295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    const char *product_name;
6305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_rx_desc *rx_ring;
6315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_tx_desc *tx_ring;
6325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char *rx_buffs[RX_RING_SIZE];
6335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char *tx_buffs[TX_RING_SIZE];
6345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* temporary Rx buffers. */
6365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int chip_id;
6385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int chip_revision;
6395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned short ioaddr;
6405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int cur_rx, cur_tx;	/* The next free and used entries */
6415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int dirty_rx, dirty_tx;
6425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* The saved address of a sent-in-place packet/buffer, for skfree(). */
6435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct sk_buff *tx_skbuff[TX_RING_SIZE];
6445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned char mc_filter[8];	/* Current multicast filter. */
6455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char phys[4];		/* MII device addresses. */
6465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int tx_full:1;	/* The Tx queue is full. */
6475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int full_duplex:1;	/* Full-duplex operation requested. */
6485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int default_port:4;	/* Last dev->if_port value. */
6495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int media2:4;	/* Secondary monitored media port. */
6505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int medialock:1;	/* Don't sense media type. */
6515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int mediasense:1;	/* Media sensing in progress. */
6525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
6535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine;
6545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct nic *rhine_probe1 (struct nic *dev, int ioaddr,
6565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				 int chip_id, int options);
6575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int QueryAuto (int);
6585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int ReadMII (int byMIIIndex, int);
6595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void WriteMII (char, char, char, int);
6605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void MIIDelay (void);
6615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void rhine_init_ring (struct nic *dev);
6625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void rhine_disable (struct nic *nic);
6635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void rhine_reset (struct nic *nic);
6645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int rhine_poll (struct nic *nic);
6655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void rhine_transmit (struct nic *nic, const char *d, unsigned int t,
6665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    unsigned int s, const char *p);
6675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Linux support functions */
6695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define virt_to_bus(x) ((unsigned long)x)
6705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define bus_to_virt(x) ((void *)x)
6715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
6735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
6745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_init_ring (struct nic *nic)
6755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
6765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
6775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i;
6785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->tx_full = 0;
6805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->cur_rx = tp->cur_tx = 0;
6815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->dirty_rx = tp->dirty_tx = 0;
6825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < RX_RING_SIZE; i++)
6845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
6855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->rx_ring[i].rx_status.bits.own_bit = 1;
6875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->rx_ring[i].rx_ctrl.bits.rx_buf_size = 1536;
6885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->rx_ring[i].buf_addr_1 = virt_to_bus (tp->rx_buffs[i]);
6905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->rx_ring[i].buf_addr_2 = virt_to_bus (&tp->rx_ring[i + 1]);
6915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* printf("[%d]buf1=%hX,buf2=%hX",i,tp->rx_ring[i].buf_addr_1,tp->rx_ring[i].buf_addr_2); */
6925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
6935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Mark the last entry as wrapping the ring. */
6945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* tp->rx_ring[i-1].rx_ctrl.bits.rx_buf_size =1518; */
6955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->rx_ring[i - 1].buf_addr_2 = virt_to_bus (&tp->rx_ring[0]);
6965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("[%d]buf1=%hX,buf2=%hX",i-1,tp->rx_ring[i-1].buf_addr_1,tp->rx_ring[i-1].buf_addr_2); */
6975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* The Tx buffer descriptor is filled in as needed, but we
6995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       do need to clear the ownership bit. */
7005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < TX_RING_SIZE; i++)
7025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
7035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->tx_ring[i].tx_status.lw = 0;
7055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->tx_ring[i].tx_ctrl.lw = 0x00e08000;
7065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->tx_ring[i].buf_addr_1 = virt_to_bus (tp->tx_buffs[i]);
7075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->tx_ring[i].buf_addr_2 = virt_to_bus (&tp->tx_ring[i + 1]);
7085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* printf("[%d]buf1=%hX,buf2=%hX",i,tp->tx_ring[i].buf_addr_1,tp->tx_ring[i].buf_addr_2); */
7095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
7105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->tx_ring[i - 1].buf_addr_2 = virt_to_bus (&tp->tx_ring[0]);
7125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf("[%d]buf1=%hX,buf2=%hX",i,tp->tx_ring[i-1].buf_addr_1,tp->tx_ring[i-1].buf_addr_2); */
7135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
7165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectQueryAuto (int ioaddr)
7175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int byMIIIndex;
7195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int MIIReturn;
7205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int advertising,mii_reg5;
7225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int negociated;
7235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIIIndex = 0x04;
7255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIReturn = ReadMII (byMIIIndex, ioaddr);
7265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	advertising=MIIReturn;
7275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIIIndex = 0x05;
7295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIReturn = ReadMII (byMIIIndex, ioaddr);
7305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mii_reg5=MIIReturn;
7315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	negociated=mii_reg5 & advertising;
7335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if ( (negociated & 0x100) || (negociated & 0x1C0) == 0x40 )
7355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return 1;
7365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	else
7375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return 0;
7385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
7425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectReadMII (int byMIIIndex, int ioaddr)
7435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int ReturnMII;
7455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char byMIIAdrbak;
7465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char byMIICRbak;
7475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char byMIItemp;
7485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIIAdrbak = inb (byMIIAD);
7505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIICRbak = inb (byMIICR);
7515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIICRbak & 0x7f, byMIICR);
7525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
7535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIIIndex, byMIIAD);
7555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
7565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (inb (byMIICR) | 0x40, byMIICR);
7585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIItemp = inb (byMIICR);
7605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIItemp = byMIItemp & 0x40;
7615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (byMIItemp != 0)
7635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
7645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	byMIItemp = inb (byMIICR);
7655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	byMIItemp = byMIItemp & 0x40;
7665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
7675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
7685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ReturnMII = inw (wMIIDATA);
7705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIIAdrbak, byMIIAD);
7725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIICRbak, byMIICR);
7735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
7745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return (ReturnMII);
7765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
7805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectWriteMII (char byMIISetByte, char byMIISetBit, char byMIIOP, int ioaddr)
7815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int ReadMIItmp;
7835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int MIIMask;
7845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char byMIIAdrbak;
7855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char byMIICRbak;
7865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    char byMIItemp;
7875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIIAdrbak = inb (byMIIAD);
7905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIICRbak = inb (byMIICR);
7925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIICRbak & 0x7f, byMIICR);
7935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
7945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIISetByte, byMIIAD);
7955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
7965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (inb (byMIICR) | 0x40, byMIICR);
7985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIItemp = inb (byMIICR);
8005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIItemp = byMIItemp & 0x40;
8015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (byMIItemp != 0)
8035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	byMIItemp = inb (byMIICR);
8055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	byMIItemp = byMIItemp & 0x40;
8065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
8085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ReadMIItmp = inw (wMIIDATA);
8105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIMask = 0x0001;
8115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIMask = MIIMask << byMIISetBit;
8125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (byMIIOP == 0)
8155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MIIMask = ~MIIMask;
8175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ReadMIItmp = ReadMIItmp & MIIMask;
8185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    else
8205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ReadMIItmp = ReadMIItmp | MIIMask;
8225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outw (ReadMIItmp, wMIIDATA);
8255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
8265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (inb (byMIICR) | 0x20, byMIICR);
8285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIItemp = inb (byMIICR);
8295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIItemp = byMIItemp & 0x20;
8305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (byMIItemp != 0)
8325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	byMIItemp = inb (byMIICR);
8345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	byMIItemp = byMIItemp & 0x20;
8355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
8375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIIAdrbak & 0x7f, byMIIAD);
8395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (byMIICRbak, byMIICR);
8405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
8415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
8435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
8455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMIIDelay (void)
8465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
8475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i;
8485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < 0x7fff; i++)
8495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	inb (0x61);
8515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	inb (0x61);
8525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	inb (0x61);
8535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	inb (0x61);
8545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
8565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *
8585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_probe (struct nic *nic, unsigned short *probeaddrs,
8595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	       struct pci_device *pci)
8605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
8615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (!pci->ioaddr)
8625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	return NULL;
8635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    nic = rhine_probe1 (nic, pci->ioaddr, 0, -1);
8645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (nic)
8665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	adjust_pci_device(pci);
8675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    nic->poll = rhine_poll;
8685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    nic->transmit = rhine_transmit;
8695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    nic->reset = rhine_reset;
8705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    nic->disable = rhine_disable;
8715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rhine_reset (nic);
8725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return nic;
8745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
8755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct nic *
8775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_probe1 (struct nic *nic, int ioaddr, int chip_id, int options)
8785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
8795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_private *tp;
8805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    static int did_version = 0;	/* Already printed version info. */
8815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i;
8825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned int timeout;
8835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int FDXFlag;
8845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int byMIIvalue, LineSpeed, MIICRbak;
8855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (rhine_debug > 0 && did_version++ == 0)
8875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf (version);
8885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Perhaps this should be read from the EEPROM? */
8895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < ETH_ALEN; i++)
8905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nic->node_addr[i] = inb (byPAR0 + i);
8915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf ("IO address %hX Ethernet Address: %!\n", ioaddr, nic->node_addr);
8925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* restart MII auto-negotiation */
8945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    WriteMII (0, 9, 1, ioaddr);
8955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf ("Analyzing Media type,this will take several seconds........");
8965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < 5; i++)
8975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* need to wait 1 millisecond - we will round it up to 50-100ms */
8995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	timeout = currticks() + 2;
9005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	for (timeout = currticks() + 2; currticks() < timeout;)
9015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    /* nothing */;
9025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (ReadMII (1, ioaddr) & 0x0020)
9035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    break;
9045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf ("OK\n");
9065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if	0
9085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* JJM : for Debug */
9095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf("MII : Address %hhX ",inb(ioaddr+0x6c));
9105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
9115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 unsigned char st1,st2,adv1,adv2,l1,l2;
9125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 st1=ReadMII(1,ioaddr)>>8;
9145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 st2=ReadMII(1,ioaddr)&0xFF;
9155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 adv1=ReadMII(4,ioaddr)>>8;
9165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 adv2=ReadMII(4,ioaddr)&0xFF;
9175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 l1=ReadMII(5,ioaddr)>>8;
9185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 l2=ReadMII(5,ioaddr)&0xFF;
9195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 printf(" status 0x%hhX%hhX, advertising 0x%hhX%hhX, link 0x%hhX%hhX\n", st1,st2,adv1,adv2,l1,l2);
9205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
9215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
9225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* query MII to know LineSpeed,duplex mode */
9245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    byMIIvalue = inb (ioaddr + 0x6d);
9255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    LineSpeed = byMIIvalue & MIISR_SPEED;
9265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (LineSpeed != 0)						//JJM
9275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf ("Linespeed=10Mbs");
9295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    else
9315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf ("Linespeed=100Mbs");
9335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    FDXFlag = QueryAuto (ioaddr);
9365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (FDXFlag == 1)
9375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf (" Fullduplex\n");
9395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw (CR_FDX, byCR0);
9405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    else
9425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf (" Halfduplex\n");
9445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* set MII 10 FULL ON */
9485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    WriteMII (17, 1, 1, ioaddr);
9495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* turn on MII link change */
9515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIICRbak = inb (byMIICR);
9525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (MIICRbak & 0x7F, byMIICR);
9535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
9545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (0x41, byMIIAD);
9555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
9565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* while((inb(byMIIAD)&0x20)==0) ; */
9585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (MIICRbak | 0x80, byMIICR);
9595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    nic->priv_data = &rhine;
9615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp = &rhine;
9625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->chip_id = chip_id;
9635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->ioaddr = ioaddr;
9645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->phys[0] = -1;
9655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* The lower four bits are the media type. */
9675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (options > 0)
9685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
9695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->full_duplex = (options & 16) ? 1 : 0;
9705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->default_port = options & 15;
9715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (tp->default_port)
9725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    tp->medialock = 1;
9735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
9745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return nic;
9755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
9765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
9785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_disable (struct nic *nic)
9795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
9805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
9815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int ioaddr = tp->ioaddr;
9825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf ("rhine disable\n");
9845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Switch to loopback mode to avoid hardware races. */
9855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    writeb(0x60 | 0x01, byTCR);
9865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Stop the chip's Tx and Rx processes. */
9875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    writew(CR_STOP, byCR0);
9885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
9895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************
9915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectETH_RESET - Reset adapter
9925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/
9935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
9945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_reset (struct nic *nic)
9955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
9965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
9975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int ioaddr = tp->ioaddr;
9985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int i, j;
9995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int FDXFlag, CRbak;
10005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int rx_ring_tmp, rx_ring_tmp1;
10015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int tx_ring_tmp, tx_ring_tmp1;
10025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int rx_bufs_tmp, rx_bufs_tmp1;
10035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int tx_bufs_tmp, tx_bufs_tmp1;
10045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef	USE_LOWMEM_BUFFER
10065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define buf1 (0x10000 - (RX_RING_SIZE * PKT_BUF_SZ + 32))
10075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define buf2 (buf1 - (RX_RING_SIZE * PKT_BUF_SZ + 32))
10085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define desc1 (buf2 - (TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32))
10095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define desc2 (desc1 - (TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32))
10105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
10115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    static char buf1[RX_RING_SIZE * PKT_BUF_SZ + 32];
10125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    static char buf2[RX_RING_SIZE * PKT_BUF_SZ + 32];
10135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    static char desc1[TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32];
10145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    static char desc2[TX_RING_SIZE * sizeof (struct rhine_tx_desc) + 32];
10155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
10165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf ("rhine_reset\n"); */
10185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Soft reset the chip. */
10195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*outb(CmdReset, ioaddr + ChipCmd); */
10205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_bufs_tmp = (int) buf1;
10225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_ring_tmp = (int) desc1;
10235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_bufs_tmp = (int) buf2;
10245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_ring_tmp = (int) desc2;
10255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* tune RD TD 32 byte alignment */
10275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_ring_tmp1 = (int) virt_to_bus ((char *) rx_ring_tmp);
10285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    j = (rx_ring_tmp1 + 32) & (~0x1f);
10295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf ("txring[%d]", j); */
10305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->rx_ring = (struct rhine_rx_desc *) bus_to_virt (j);
10315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_ring_tmp1 = (int) virt_to_bus ((char *) tx_ring_tmp);
10335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    j = (tx_ring_tmp1 + 32) & (~0x1f);
10345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->tx_ring = (struct rhine_tx_desc *) bus_to_virt (j);
10355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf ("rxring[%X]", j); */
10365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_bufs_tmp1 = (int) virt_to_bus ((char *) tx_bufs_tmp);
10395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    j = (int) (tx_bufs_tmp1 + 32) & (~0x1f);
10405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tx_bufs_tmp = (int) bus_to_virt (j);
10415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf ("txb[%X]", j); */
10425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_bufs_tmp1 = (int) virt_to_bus ((char *) rx_bufs_tmp);
10445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    j = (int) (rx_bufs_tmp1 + 32) & (~0x1f);
10455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rx_bufs_tmp = (int) bus_to_virt (j);
10465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf ("rxb[%X][%X]", rx_bufs_tmp1, j); */
10475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < RX_RING_SIZE; i++)
10495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
10505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->rx_buffs[i] = (char *) rx_bufs_tmp;
10515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* printf("r[%X]",tp->rx_buffs[i]); */
10525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rx_bufs_tmp += 1536;
10535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
10545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    for (i = 0; i < TX_RING_SIZE; i++)
10565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
10575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->tx_buffs[i] = (char *) tx_bufs_tmp;
10585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* printf("t[%X]",tp->tx_buffs[i]);  */
10595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tx_bufs_tmp += 1536;
10605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
10615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* software reset */
10635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (CR1_SFRST, byCR1);
10645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    MIIDelay ();
10655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* printf ("init ring"); */
10675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rhine_init_ring (nic);
10685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*write TD RD Descriptor to MAC */
10695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outl (virt_to_bus (tp->rx_ring), dwCurrentRxDescAddr);
10705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outl (virt_to_bus (tp->tx_ring), dwCurrentTxDescAddr);
10715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* close IMR */
10735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outw (0x0000, byIMR0);
10745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* set TCR RCR threshold */
10765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (0x06, byBCR0);
10775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (0x00, byBCR1);
10785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (0x2c, byRCR);
10795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (0x60, byTCR);
10805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Set Fulldupex */
10815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    FDXFlag = QueryAuto (ioaddr);
10825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (FDXFlag == 1)
10835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
10845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outb (CFGD_CFDX, byCFGD);
10855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	outw (CR_FDX, byCR0);
10865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
10875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* KICK NIC to WORK */
10895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    CRbak = inw (byCR0);
10905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    CRbak = CRbak & 0xFFFB;	/* not CR_STOP */
10915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outw ((CRbak | CR_STRT | CR_TXON | CR_RXON | CR_DPOLL), byCR0);
10925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*set IMR to work */
10945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outw (IMRShadow, byIMR0);
10955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
10965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int
10985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_poll (struct nic *nic)
10995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
11005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
11015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int rxstatus, good = 0;;
11025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if (tp->rx_ring[tp->cur_rx].rx_status.bits.own_bit == 0)
11045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
11055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rxstatus = tp->rx_ring[tp->cur_rx].rx_status.lw;
11065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if ((rxstatus & 0x0300) != 0x0300)
11075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
11085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    printf("rhine_poll: bad status\n");
11095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
11105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	else if (rxstatus & (RSR_ABNORMAL))
11115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
11125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    printf ("rxerr[%X]\n", rxstatus);
11135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
11145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	else
11155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    good = 1;
11165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if (good)
11185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
11195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    nic->packetlen = tp->rx_ring[tp->cur_rx].rx_status.bits.frame_length;
11205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    memcpy (nic->packet, tp->rx_buffs[tp->cur_rx], nic->packetlen);
11215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    /* printf ("Packet RXed\n"); */
11225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
11235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->rx_ring[tp->cur_rx].rx_status.bits.own_bit = 1;
11245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->cur_rx++;
11255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tp->cur_rx = tp->cur_rx % RX_RING_SIZE;
11265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
11275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return good;
11285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
11295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
11315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrhine_transmit (struct nic *nic,
11325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		const char *d, unsigned int t, unsigned int s, const char *p)
11335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
11345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    struct rhine_private *tp = (struct rhine_private *) nic->priv_data;
11355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int ioaddr = tp->ioaddr;
11365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    int entry;
11375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    unsigned char CR1bak;
11385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf ("rhine_transmit\n"); */
11405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* setup ethernet header */
11415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /* Calculate the next Tx descriptor entry. */
11445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    entry = tp->cur_tx % TX_RING_SIZE;
11455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    memcpy (tp->tx_buffs[entry], d, ETH_ALEN);	/* dst */
11475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    memcpy (tp->tx_buffs[entry] + ETH_ALEN, nic->node_addr, ETH_ALEN);	/* src */
11485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    *((char *) tp->tx_buffs[entry] + 12) = t >> 8;	/* type */
11495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    *((char *) tp->tx_buffs[entry] + 13) = t;
11505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    memcpy (tp->tx_buffs[entry] + ETH_HLEN, p, s);
11515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    s += ETH_HLEN;
11525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while (s < ETH_ZLEN)
11535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	*((char *) tp->tx_buffs[entry] + ETH_HLEN + (s++)) = 0;
11545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->tx_ring[entry].tx_ctrl.bits.tx_buf_size = ETH_HLEN + s;
11565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->tx_ring[entry].tx_status.bits.own_bit = 1;
11585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    CR1bak = inb (byCR1);
11615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    CR1bak = CR1bak | CR1_TDMD1;
11635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("tdsw=[%X]",tp->tx_ring[entry].tx_status.lw); */
11645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("tdcw=[%X]",tp->tx_ring[entry].tx_ctrl.lw); */
11655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("tdbuf1=[%X]",tp->tx_ring[entry].buf_addr_1); */
11665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("tdbuf2=[%X]",tp->tx_ring[entry].buf_addr_2); */
11675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("td1=[%X]",inl(dwCurrentTDSE0)); */
11685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("td2=[%X]",inl(dwCurrentTDSE1)); */
11695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("td3=[%X]",inl(dwCurrentTDSE2)); */
11705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*printf("td4=[%X]",inl(dwCurrentTDSE3)); */
11715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    outb (CR1bak, byCR1);
11735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tp->cur_tx++;
11745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*outw(IMRShadow,byIMR0); */
11765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE); */
11775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    /*tp->tx_skbuff[entry] = 0; */
11785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
11795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
11805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* EOF via-rhine.c */
1181