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