/*- * Copyright (c) 2002-2018 The UbixOS Project. * All rights reserved. * * This was developed by Christopher W. Olsen for the UbixOS Project. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, this list of * conditions, the following disclaimer and the list of authors. * 2) Redistributions in binary form must reproduce the above copyright notice, this list of * conditions, the following disclaimer and the list of authors in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _PCI_LNC_H #define _PCI_LNC_H #include <sys/types.h> // TEMP COMMENT FRESH #define RDP 0x10 // Register Data Port 16Bit #define RDP32 0x10 // Register Data Port 32Bit #define RAP 0x12 // Register Address Port 16Bit #define RAP32 0x14 // Register Address Port 32Bit #define RESET 0x14 // Reset Port 16Bit #define RESET32 0x18 // Reset Port 32Bit #define BDP 0x16 // 16Bit #define BDP32 0x1C // 32Bit // BCR18 #define BCR18 18 #define BCR18_DWIO 0x0080 // BCR20 #define BCR20 0x0014 // Modes #define MODE_16 0 #define MODE_32 1 #define MODE_INVALID 3 // CSR0 #define CSR0 0x0000 #define CSR0_STOP 0x0004 // CSR15 #define CSR15 15 #define CSR15_DXMTFCS 0x0008 #define CSR15_DRTY 0x0020 #define CSR15_PROM 0x8000 // CSR58 #define CSR58 0x003A struct mds { uint16_t md0; uint16_t md1; short md2; uint16_t md3; }; struct hostRingEntry_old { struct mds *md; union { //struct mbuf *mbuf; char *data; } buff; }; struct hostRingEntry { uint32_t addr; uint16_t bcnt; uint8_t md[6]; uint32_t reserved; }; struct arpcom { //struct ifnet ac_if; /* network-visible interface */ uint8_t ac_enaddr[6]; /* ethernet hardware address */ int ac_multicnt; /* length of ac_multiaddrs list */ void *ac_netgraph; /* ng_ether(4) netgraph node info */ }; struct nicInfo { int ident; /* Type of card */ int ic; /* Type of ic, Am7990, Am79C960 etc. */ int memMode; int iobase; int mode; /* Mode setting at initialization */ }; struct initBlock16 { uint16_t mode; // Mode register uint8_t padr[6]; // Ethernet address uint8_t ladrf[8]; // Logical address filter (multicast) uint16_t rdra; // Low order pointer to receive ring uint16_t rlen; // High order pointer and no. rings uint16_t tdra; // Low order pointer to transmit ring uint16_t tlen; // High order pointer and no rings }; struct initBlock32 { uint16_t mode; uint8_t rlen; uint8_t tlen; uint8_t padr[6]; uint16_t res; uint8_t ladrf[8]; uint32_t rdra; uint32_t tdra; }; struct lncInfo { struct arpcom arpcom; struct nicInfo nic; struct hostRingEntry *rxRing; char *rxBuffer; struct hostRingEntry *txRing; char *txBuffer; struct initBlock32 init; unsigned int ioAddr; int nrdre; int ntdre; int bufferSize; int txPtr; int rxPtr; }; /* Functions */ void lnc_writeCSR(struct lncInfo *, uint16_t, uint16_t); void lnc_writeCSR32(struct lncInfo *, uint32_t, uint32_t); uint16_t lnc_readCSR(struct lncInfo *, uint16_t); uint32_t lnc_readCSR32(struct lncInfo *, uint32_t); void lnc_writeBCR(struct lncInfo *, uint16_t, uint16_t); void lnc_writeBCR32(struct lncInfo *, uint32_t, uint32_t); uint16_t lnc_readBCR(struct lncInfo *, uint16_t); uint32_t lnc_readBCR32(struct lncInfo *, uint32_t); void lnc_reset(struct lncInfo *); void lnc_reset32(struct lncInfo *); int lnc_probe(struct lncInfo *); int lnc_switchDWord(struct lncInfo *); int lnc_getMode(struct lncInfo *); void lnc_isr(); int lnc_driverOwnsRX(struct lncInfo *); int lnc_driverOwnsRX(struct lncInfo *); void lnc_INT(); void lnc_rxINT(); void lnc_txINT(); // OLD #define NDESC(len2) (1 << len2) #define NORMAL 0 #define MEM_SLEW 8 #define TRANSBUFSIZE 1518 #define RECVBUFSIZE 1518 #define NRDRE 3 #define NTDRE 3 #define ETHER_ADDR_LEN 6 #define NE2100_IOSIZE 24 #define PCNET_VSW 0x18 #define NE2100 2 /* mem_mode values */ #define DMA_FIXED 1 #define DMA_MBUF 2 #define SHMEM 4 /********** Chip Types **********/ #define UNKNOWN 0 /* Unknown */ #define LANCE 1 /* Am7990 */ #define C_LANCE 2 /* Am79C90 */ #define PCnet_ISA 3 /* Am79C960 */ #define PCnet_ISAplus 4 /* Am79C961 */ #define PCnet_ISA_II 5 /* Am79C961A */ #define PCnet_32 6 /* Am79C965 */ #define PCnet_PCI 7 /* Am79C970 */ #define PCnet_PCI_II 8 /* Am79C970A */ #define PCnet_FAST 9 /* Am79C971 */ #define PCnet_FASTplus 10 /* Am79C972 */ #define PCnet_Home 11 /* Am79C978 */ /******** AM7990 Specifics **************/ #define CSR1 1 #define CSR2 2 #define CSR3 3 #define CSR88 88 #define CSR89 89 #define ERR 0x8000 #define BABL 0x4000 #define CERR 0x2000 #define MISS 0x1000 #define MERR 0x0800 #define RINT 0x0400 #define TINT 0x0200 #define IDON 0x0100 #define INTR 0x0080 #define INEA 0x0040 #define RXON 0x0020 #define TXON 0x0010 #define TDMD 0x0008 #define STRT 0x0002 #define INIT 0x0001 /* CSR88-89: Chip ID masks */ #define AMD_MASK 0x003 #define PART_MASK 0xffff #define Am79C960 0x0003 #define Am79C961 0x2260 #define Am79C961A 0x2261 #define Am79C965 0x2430 #define Am79C970 0x0242 #define Am79C970A 0x2621 #define Am79C971 0x2623 #define Am79C972 0x2624 #define Am79C973 0x2625 #define Am79C978 0x2626 extern struct lncInfo *lnc; int initLNC(); int probe(struct lncInfo *lnc); int lanceProbe(struct lncInfo *lnc); int lncAttach(struct lncInfo *lnc, int unit); void lncInt(); void _lncInt(); int lnc_sendPacket(struct lncInfo *lnc, void *packet, size_t len, uInt8 *dest); #endif