7990.h 10.2 KB
Newer Older
1
/*
L
Linus Torvalds 已提交
2 3 4 5
 * 7990.h -- LANCE ethernet IC generic routines.
 * This is an attempt to separate out the bits of various ethernet
 * drivers that are common because they all use the AMD 7990 LANCE
 * (Local Area Network Controller for Ethernet) chip.
6
 *
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
 * Copyright (C) 05/1998 Peter Maydell <pmaydell@chiark.greenend.org.uk>
 *
 * Most of this stuff was obtained by looking at other LANCE drivers,
 * in particular a2065.[ch]. The AMD C-LANCE datasheet was also helpful.
 */

#ifndef _7990_H
#define _7990_H

/* The lance only has two register locations. We communicate mostly via memory. */
#define LANCE_RDP	0	/* Register Data Port */
#define LANCE_RAP	2	/* Register Address Port */

/* Transmit/receive ring definitions.
 * We allow the specific drivers to override these defaults if they want to.
 * NB: according to lance.c, increasing the number of buffers is a waste
 * of space and reduces the chance that an upper layer will be able to
 * reorder queued Tx packets based on priority. [Clearly there is a minimum
 * limit too: too small and we drop rx packets and can't tx at full speed.]
 * 4+4 seems to be the usual setting; the atarilance driver uses 3 and 5.
 */

/* Blast! This won't work. The problem is that we can't specify a default
 * setting because that would cause the lance_init_block struct to be
 * too long (and overflow the RAM on shared-memory cards like the HP LANCE.
 */
#ifndef LANCE_LOG_TX_BUFFERS
#define LANCE_LOG_TX_BUFFERS 1
#define LANCE_LOG_RX_BUFFERS 3
#endif

#define TX_RING_SIZE (1<<LANCE_LOG_TX_BUFFERS)
#define RX_RING_SIZE (1<<LANCE_LOG_RX_BUFFERS)
#define TX_RING_MOD_MASK (TX_RING_SIZE - 1)
#define RX_RING_MOD_MASK (RX_RING_SIZE - 1)
#define TX_RING_LEN_BITS ((LANCE_LOG_TX_BUFFERS) << 29)
#define RX_RING_LEN_BITS ((LANCE_LOG_RX_BUFFERS) << 29)
#define PKT_BUFF_SIZE (1544)
#define RX_BUFF_SIZE PKT_BUFF_SIZE
#define TX_BUFF_SIZE PKT_BUFF_SIZE

/* Each receive buffer is described by a receive message descriptor (RMD) */
struct lance_rx_desc {
	volatile unsigned short rmd0;        /* low address of packet */
	volatile unsigned char  rmd1_bits;   /* descriptor bits */
	volatile unsigned char  rmd1_hadr;   /* high address of packet */
	volatile short    length;    	    /* This length is 2s complement (negative)!
				     * Buffer length
				     */
	volatile unsigned short mblength;    /* Actual number of bytes received */
};
58

L
Linus Torvalds 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
/* Ditto for TMD: */
struct lance_tx_desc {
	volatile unsigned short tmd0;        /* low address of packet */
	volatile unsigned char  tmd1_bits;   /* descriptor bits */
	volatile unsigned char  tmd1_hadr;   /* high address of packet */
	volatile short    length;       	    /* Length is 2s complement (negative)! */
	volatile unsigned short misc;
};

/* There are three memory structures accessed by the LANCE:
 * the initialization block, the receive and transmit descriptor rings,
 * and the data buffers themselves. In fact we might as well put the
 * init block,the Tx and Rx rings and the buffers together in memory:
 */
struct lance_init_block {
        volatile unsigned short mode;            /* Pre-set mode (reg. 15) */
        volatile unsigned char phys_addr[6];     /* Physical ethernet address */
        volatile unsigned filter[2];             /* Multicast filter (64 bits) */

        /* Receive and transmit ring base, along with extra bits. */
        volatile unsigned short rx_ptr;          /* receive descriptor addr */
        volatile unsigned short rx_len;          /* receive len and high addr */
        volatile unsigned short tx_ptr;          /* transmit descriptor addr */
        volatile unsigned short tx_len;          /* transmit len and high addr */
83 84

        /* The Tx and Rx ring entries must be aligned on 8-byte boundaries.
L
Linus Torvalds 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
         * This will be true if this whole struct is 8-byte aligned.
         */
        volatile struct lance_tx_desc btx_ring[TX_RING_SIZE];
        volatile struct lance_rx_desc brx_ring[RX_RING_SIZE];

        volatile char   tx_buf [TX_RING_SIZE][TX_BUFF_SIZE];
        volatile char   rx_buf [RX_RING_SIZE][RX_BUFF_SIZE];
        /* we use this just to make the struct big enough that we can move its startaddr
         * in order to force alignment to an eight byte boundary.
         */
};

/* This is where we keep all the stuff the driver needs to know about.
 * I'm definitely unhappy about the mechanism for allowing specific
 * drivers to add things...
 */
struct lance_private
{
        char *name;
	unsigned long base;
        volatile struct lance_init_block *init_block; /* CPU address of RAM */
        volatile struct lance_init_block *lance_init_block; /* LANCE address of RAM */
107

L
Linus Torvalds 已提交
108 109
        int rx_new, tx_new;
        int rx_old, tx_old;
110

L
Linus Torvalds 已提交
111 112
        int lance_log_rx_bufs, lance_log_tx_bufs;
        int rx_ring_mod_mask, tx_ring_mod_mask;
113

L
Linus Torvalds 已提交
114 115 116 117 118
        int tpe;                                  /* TPE is selected */
        int auto_select;                          /* cable-selection is by carrier */
        unsigned short busmaster_regval;

        unsigned int irq;                         /* IRQ to register */
119 120

        /* This is because the HP LANCE is disgusting and you have to check
L
Linus Torvalds 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
         * a DIO-specific register every time you read/write the LANCE regs :-<
         * [could we get away with making these some sort of macro?]
         */
        void (*writerap)(void *, unsigned short);
        void (*writerdp)(void *, unsigned short);
        unsigned short (*readrdp)(void *);
	spinlock_t devlock;
	char tx_full;
};

/*
 *              Am7990 Control and Status Registers
 */
#define LE_CSR0         0x0000          /* LANCE Controller Status */
#define LE_CSR1         0x0001          /* IADR[15:0] (bit0==0 ie word aligned) */
#define LE_CSR2         0x0002          /* IADR[23:16] (high bits reserved) */
#define LE_CSR3         0x0003          /* Misc */

/*
 *		Bit definitions for CSR0 (LANCE Controller Status)
 */
#define LE_C0_ERR	0x8000		/* Error = BABL | CERR | MISS | MERR */
#define LE_C0_BABL	0x4000		/* Babble: Transmitted too many bits */
#define LE_C0_CERR	0x2000		/* No Heartbeat (10BASE-T) */
#define LE_C0_MISS	0x1000		/* Missed Frame (no rx buffer to put it in) */
#define LE_C0_MERR	0x0800		/* Memory Error */
#define LE_C0_RINT	0x0400		/* Receive Interrupt */
#define LE_C0_TINT	0x0200		/* Transmit Interrupt */
#define LE_C0_IDON	0x0100		/* Initialization Done */
150
#define LE_C0_INTR	0x0080		/* Interrupt Flag
L
Linus Torvalds 已提交
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
                                         = BABL | MISS | MERR | RINT | TINT | IDON */
#define LE_C0_INEA	0x0040		/* Interrupt Enable */
#define LE_C0_RXON	0x0020		/* Receive On */
#define LE_C0_TXON	0x0010		/* Transmit On */
#define LE_C0_TDMD	0x0008		/* Transmit Demand */
#define LE_C0_STOP	0x0004		/* Stop */
#define LE_C0_STRT	0x0002		/* Start */
#define LE_C0_INIT	0x0001		/* Initialize */


/*
 *		Bit definitions for CSR3
 */
#define LE_C3_BSWP	0x0004		/* Byte Swap
					   (on for big endian byte order) */
#define LE_C3_ACON	0x0002		/* ALE Control
					   (on for active low ALE) */
#define LE_C3_BCON	0x0001		/* Byte Control */


/*
 *		Mode Flags
 */
#define LE_MO_PROM	0x8000		/* Promiscuous Mode */
/* these next ones 0x4000 -- 0x0080 are not available on the LANCE 7990,
 * but they are in NetBSD's am7990.h, presumably for backwards-compatible chips
 */
#define LE_MO_DRCVBC  0x4000          /* disable receive broadcast */
#define LE_MO_DRCVPA  0x2000          /* disable physical address detection */
#define LE_MO_DLNKTST 0x1000          /* disable link status */
#define LE_MO_DAPC    0x0800          /* disable automatic polarity correction */
#define LE_MO_MENDECL 0x0400          /* MENDEC loopback mode */
#define LE_MO_LRTTSEL 0x0200          /* lower RX threshold / TX mode selection */
#define LE_MO_PSEL1   0x0100          /* port selection bit1 */
#define LE_MO_PSEL0   0x0080          /* port selection bit0 */
/* and this one is from the C-LANCE data sheet... */
187
#define LE_MO_EMBA      0x0080          /* Enable Modified Backoff Algorithm
L
Linus Torvalds 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
                                           (C-LANCE, not original LANCE) */
#define LE_MO_INTL	0x0040		/* Internal Loopback */
#define LE_MO_DRTY	0x0020		/* Disable Retry */
#define LE_MO_FCOLL	0x0010		/* Force Collision */
#define LE_MO_DXMTFCS	0x0008		/* Disable Transmit CRC */
#define LE_MO_LOOP	0x0004		/* Loopback Enable */
#define LE_MO_DTX	0x0002		/* Disable Transmitter */
#define LE_MO_DRX	0x0001		/* Disable Receiver */


/*
 *		Receive Flags
 */
#define LE_R1_OWN	0x80		/* LANCE owns the descriptor */
#define LE_R1_ERR	0x40		/* Error */
#define LE_R1_FRA	0x20		/* Framing Error */
#define LE_R1_OFL	0x10		/* Overflow Error */
#define LE_R1_CRC	0x08		/* CRC Error */
#define LE_R1_BUF	0x04		/* Buffer Error */
#define LE_R1_SOP	0x02		/* Start of Packet */
#define LE_R1_EOP	0x01		/* End of Packet */
#define LE_R1_POK       0x03		/* Packet is complete: SOP + EOP */


/*
 *		Transmit Flags
 */
#define LE_T1_OWN	0x80		/* LANCE owns the descriptor */
#define LE_T1_ERR	0x40		/* Error */
#define LE_T1_RES	0x20		/* Reserved, LANCE writes this with a zero */
#define LE_T1_EMORE	0x10		/* More than one retry needed */
#define LE_T1_EONE	0x08		/* One retry needed */
#define LE_T1_EDEF	0x04		/* Deferred */
#define LE_T1_SOP	0x02		/* Start of Packet */
#define LE_T1_EOP	0x01		/* End of Packet */
#define LE_T1_POK	0x03		/* Packet is complete: SOP + EOP */

/*
 *		Error Flags
 */
#define LE_T3_BUF 	0x8000		/* Buffer Error */
#define LE_T3_UFL 	0x4000		/* Underflow Error */
#define LE_T3_LCOL 	0x1000		/* Late Collision */
#define LE_T3_CLOS 	0x0800		/* Loss of Carrier */
#define LE_T3_RTY 	0x0400		/* Retry Error */
#define LE_T3_TDR	0x03ff		/* Time Domain Reflectometry */

/* Miscellaneous useful macros */

#define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
                        lp->tx_old+lp->tx_ring_mod_mask-lp->tx_new:\
                        lp->tx_old - lp->tx_new-1)

/* The LANCE only uses 24 bit addresses. This does the obvious thing. */
#define LANCE_ADDR(x) ((int)(x) & ~0xff000000)

/* Now the prototypes we export */
extern int lance_open(struct net_device *dev);
extern int lance_close (struct net_device *dev);
extern int lance_start_xmit (struct sk_buff *skb, struct net_device *dev);
extern void lance_set_multicast (struct net_device *dev);
extern void lance_tx_timeout(struct net_device *dev);
#ifdef CONFIG_NET_POLL_CONTROLLER
extern void lance_poll(struct net_device *dev);
#endif

#endif /* ndef _7990_H */
反馈
建议
客服 返回
顶部