summaryrefslogtreecommitdiff
path: root/chips/lance.h
diff options
context:
space:
mode:
Diffstat (limited to 'chips/lance.h')
-rw-r--r--chips/lance.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/chips/lance.h b/chips/lance.h
new file mode 100644
index 0000000..f799d7e
--- /dev/null
+++ b/chips/lance.h
@@ -0,0 +1,284 @@
+/*
+ * Mach Operating System
+ * Copyright (c) 1992,1991,1990,1989 Carnegie Mellon University
+ * All Rights Reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
+ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie Mellon
+ * the rights to redistribute these changes.
+ */
+/*
+ * File: if_se.h
+ * Authors: Robert V. Baron and Alessandro Forin
+ * Date: 1989
+ *
+ */
+/*
+ * AMD 7990 "Lance" Ethernet interface definitions.
+ * All structures are as seen from the Lance,
+ * both in the memory-alignment sense and in the
+ * byte-order sense. Mapping to host memory is
+ * model specific: on pmaxen there is a 16 bit gap
+ * every other 16 bits.
+ */
+
+#include <scsi/scsi_endian.h>
+
+/*
+ * Selection of one of the four Lance CSR is done in a
+ * two-step process: select which CSR first by writing
+ * into the RAP, then access the register via the RDP.
+ * Note that (a) the selection remains, and (b) all
+ * but CSR0 can only be accessed when the chip is stopped.
+ * These registers are mapped in the 'registers' I/O segment.
+ */
+#ifndef se_reg_type
+#define se_reg_type unsigned short
+#endif
+typedef volatile se_reg_type *se_reg_t;
+
+#define CSR0_SELECT 0x0 /* Valid RAP selections */
+#define CSR1_SELECT 0x1
+#define CSR2_SELECT 0x2
+#define CSR3_SELECT 0x3
+
+/*
+ * Bit definitions for the CSR0.
+ * Legend:
+ * R=Readable W=Writeable
+ * S=Set-on-write-1 C=Clear-on-write-1
+ */
+
+#define LN_CSR0_INIT 0x0001 /* (RS) Initialize */
+#define LN_CSR0_STRT 0x0002 /* (RS) Start */
+#define LN_CSR0_STOP 0x0004 /* (RS) Stop */
+#define LN_CSR0_TDMD 0x0008 /* (RS) Transmit demand */
+#define LN_CSR0_TXON 0x0010 /* (R) Transmitter enabled */
+#define LN_CSR0_RXON 0x0020 /* (R) Receiver enabled */
+#define LN_CSR0_INEA 0x0040 /* (RW) Interrupt enable */
+#define LN_CSR0_INTR 0x0080 /* (R) Interrupt pending */
+#define LN_CSR0_IDON 0x0100 /* (RC) Initialization done */
+#define LN_CSR0_TINT 0x0200 /* (RC) Transmitter interrupt */
+#define LN_CSR0_RINT 0x0400 /* (RC) Receiver interrupt */
+#define LN_CSR0_MERR 0x0800 /* (RC) Memory error during DMA */
+#define LN_CSR0_MISS 0x1000 /* (RC) No available receive buffers */
+#define LN_CSR0_CERR 0x2000 /* (RC) Signal quality (SQE) test */
+#define LN_CSR0_BABL 0x4000 /* (RC) Babble error: xmit too long */
+#define LN_CSR0_ERR 0x8000 /* (R) Error summary: any of the 4 above */
+
+#define LN_CSR0_WTC 0x7f00 /* Write-to-clear bits */
+
+/*
+ * Bit definitions for the CSR1.
+ */
+
+#define LN_CSR1_MBZ 0x0001 /* Must be zero */
+#define LN_CSR1_IADR 0xfffe /* (RW) Initialization block address (low) */
+
+/*
+ * Bit definitions for the CSR2.
+ */
+
+#define LN_CSR2_IADR 0x00ff /* (RW) Initialization block address (high) */
+#define LN_CSR2_XXXX 0xff00 /* (RW) Reserved */
+
+/*
+ * Bit definitions for the CSR3.
+ */
+
+#define LN_CSR3_BCON 0x0001 /* (RW) BM/HOLD Control */
+#define LN_CSR3_ACON 0x0002 /* (RW) ALE Control */
+#define LN_CSR3_BSWP 0x0004 /* (RW) Byte Swap */
+#define LN_CSR3_XXXX 0xfff8 /* (RW) Reserved */
+
+
+/*
+ * Initialization Block
+ *
+ * Read when the INIT command is sent to the lance.
+ */
+
+struct se_init_block {
+ unsigned short mode; /* Mode Register, see below */
+ unsigned short phys_addr_low; /* Ethernet address */
+ unsigned short phys_addr_med; /* Ethernet address */
+ unsigned short phys_addr_high; /* Ethernet address */
+ unsigned short logical_addr_filter0; /* Multicast filter */
+ unsigned short logical_addr_filter1; /* Multicast filter */
+ unsigned short logical_addr_filter2; /* Multicast filter */
+ unsigned short logical_addr_filter3; /* Multicast filter */
+ unsigned short recv_ring_pointer_lo; /* Receive Ring ptr, low */
+ BITFIELD_3(unsigned char,
+ recv_ring_pointer_hi, /* Receive Ring ptr, high */
+ reserved0 : 5,
+ recv_ring_len : 3); /* Length: log2(nbuffers) */
+ unsigned short xmit_ring_pointer_lo; /* Transmit Ring ptr, low */
+ BITFIELD_3(unsigned char,
+ xmit_ring_pointer_hi, /* Transmit Ring ptr, high */
+ reserved1 : 5,
+ xmit_ring_len : 3); /* Length: log2(nbuffers) */
+};
+
+typedef volatile struct se_init_block *se_init_block_t;
+
+/*
+ * Bit definitions for the MODE word
+ * (Normally set to 0)
+ */
+
+#define LN_MODE_DRX 0x0001 /* Disable Receiver */
+#define LN_MODE_DTX 0x0002 /* Disable Transmitter */
+#define LN_MODE_LOOP 0x0004 /* Loopback mode */
+#define LN_MODE_DTRC 0x0008 /* Disable CRC generation */
+#define LN_MODE_COLL 0x0010 /* Force collision */
+#define LN_MODE_DRTY 0x0020 /* Disable retry */
+#define LN_MODE_INTL 0x0040 /* Internal Loopback mode */
+#define LN_MODE_XXXX 0x7f80 /* Reserved */
+#define LN_MODE_PROM 0x8000 /* Promiscuous mode */
+
+/*
+ * Bit definitions for the ring pointers
+ */
+
+#define LN_RNGP_LOW 0xfffc /* longword aligned */
+
+
+/*
+ * Buffer Descriptors
+ * Legend:
+ * H-set-by-Host C-set-by-chip
+ */
+
+struct se_desc {
+ unsigned short addr_low; /* (H) Buffer pointer low */
+ BITFIELD_2(unsigned char,
+ addr_hi, /* (H) Buffer pointer high */
+ status); /* (HC) Buffer status */
+ unsigned short buffer_size; /* (H) Buffer length (bytes),*/
+ /* bits 15..12 must be ones */
+ union {
+ struct {
+ BITFIELD_2(unsigned short,
+ bcnt : 12, /* (C) Rcvd data size */
+ res : 4); /* Reads as zeroes */
+ } rcv;
+ struct {
+ BITFIELD_2(unsigned short,
+ TDR : 10, /* (C) Time Domain Reflectometry */
+ flg2 : 6); /* (C) Xmit status */
+ } xmt;
+ unsigned short bits;
+ } desc4;
+#define message_size desc4.rcv.bcnt
+#define tdr desc4.xmt.TDR
+#define status2 desc4.xmt.flg2
+};
+
+typedef volatile struct se_desc *se_desc_t;
+
+/*
+ * Bit definition for STATUS byte (receive case)
+ */
+
+#define LN_RSTATE_ENP 0x01 /* (C) End of Packet */
+#define LN_RSTATE_STP 0x02 /* (C) Start of packet */
+#define LN_RSTATE_BUFF 0x04 /* (C) Buffer error */
+#define LN_RSTATE_CRC 0x08 /* (C) CRC error */
+#define LN_RSTATE_OFLO 0x10 /* (C) SILO Overflow */
+#define LN_RSTATE_FRAM 0x20 /* (C) Framing error */
+#define LN_RSTATE_ERR 0x40 /* (C) Error summary */
+#define LN_RSTATE_OWN 0x80 /* (C) Owned by Lance Chip (if set) */
+
+
+/*
+ * Bit definition for STATUS byte (transmit case)
+ */
+
+#define LN_TSTATE_ENP 0x01 /* (H) End of Packet */
+#define LN_TSTATE_STP 0x02 /* (H) Start of packet */
+#define LN_TSTATE_DEF 0x04 /* (C) Deferred */
+#define LN_TSTATE_ONE 0x08 /* (C) Retried exactly once */
+#define LN_TSTATE_MORE 0x10 /* (C) Retried more than once */
+#define LN_TSTATE_XXXX 0x20 /* Reserved */
+#define LN_TSTATE_ERR 0x40 /* (C) Error summary (see status2) */
+#define LN_TSTATE_OWN 0x80 /* (H) Owned by Lance Chip (if set) */
+
+/*
+ * Bit definitions for STATUS2 byte (transmit case)
+ */
+
+#define LN_TSTATE2_RTRY 0x01 /* (C) Failed after 16 retransmissions */
+#define LN_TSTATE2_LCAR 0x02 /* (C) Loss of Carrier */
+#define LN_TSTATE2_LCOL 0x04 /* (C) Late collision */
+#define LN_TSTATE2_XXXX 0x08 /* Reserved */
+#define LN_TSTATE2_UFLO 0x10 /* (C) Underflow (late memory) */
+#define LN_TSTATE2_BUFF 0x20 /* (C) Buffering error (no ENP) */
+
+ /* Errors that disable the transmitter */
+#define LN_TSTATE2_DISABLE (LN_TSTATE2_UFLO|LN_TSTATE2_BUFF|LN_TSTATE2_RTRY)
+
+/*
+ * Other chip characteristics
+ */
+
+#define LN_MINBUF_CH 100 /* Minimum size of first lance buffer, if
+ chaining */
+
+#define LN_MINBUF_NOCH 60 /* Minimum size of a lance buffer, if
+ no chaining and DTCR==1 */
+
+#define LN_MINBUF_NOCH_RAW 64 /* Minimum size of a lance buffer, if
+ no chaining and DTCR==0 */
+
+/*
+ * Information for mapped ether
+ */
+typedef struct mapped_ether_info {
+ volatile unsigned int interrupt_count;
+ /* tot interrupts received */
+ volatile unsigned short saved_csr0;
+ /* copy of csr0 at last intr */
+ unsigned char rom_stride;
+ unsigned char ram_stride;
+ /* rom&ram strides */
+ unsigned buffer_size;
+ /* how much ram for lance */
+ natural_t buffer_physaddr;
+ /* where it is in phys memory */
+ unsigned wait_event;
+} *mapped_ether_info_t;
+
+#ifdef KERNEL
+extern struct se_switch {
+ vm_offset_t regspace;
+ vm_offset_t bufspace;
+ vm_offset_t ln_bufspace;
+ vm_offset_t romspace;
+ short romstride;
+ short ramstride;
+ int ramsize;
+ void (*desc_copyin)( vm_offset_t, vm_offset_t, int);
+ void (*desc_copyout)( vm_offset_t, vm_offset_t, int);
+ void (*data_copyin)( vm_offset_t, vm_offset_t, int);
+ void (*data_copyout)( vm_offset_t, vm_offset_t, int);
+ void (*bzero)( vm_offset_t, int );
+ vm_offset_t (*mapaddr)( vm_offset_t );
+ vm_size_t (*mapoffs)( vm_size_t );
+} *se_sw;
+#endif KERNEL