summaryrefslogtreecommitdiffstats
path: root/c/src/libchip/network/i82586var.h
blob: f250fe03d0010b977de88e0eddad4fa4451bee24 (plain) (blame)
1
2
3
4
5
6
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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
150
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
187
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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
/*  $NetBSD: i82586var.h,v 1.15 2001/01/22 22:28:45 bjh21 Exp $  */

/*-
 * Copyright (c) 1998 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Paul Kranenburg and Charles M. Hannum.
 *
 * 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 and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *        This product includes software developed by the NetBSD
 *        Foundation, Inc. and its contributors.
 * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
 */

/*-
 * Copyright (c) 1992, 1993, University of Vermont and State
 *  Agricultural College.
 * Copyright (c) 1992, 1993, Garrett A. Wollman.
 *
 * Portions:
 * Copyright (c) 1994, 1995, Rafal K. Boni
 * Copyright (c) 1990, 1991, William F. Jolitz
 * Copyright (c) 1990, The Regents of the University of California
 *
 * All rights reserved.
 *
 * 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 and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *  This product includes software developed by the University of Vermont
 *  and State Agricultural College and Garrett A. Wollman, by William F.
 *  Jolitz, and by the University of California, Berkeley, Lawrence
 *  Berkeley Laboratory, and its contributors.
 * 4. Neither the names of the Universities nor the names of the authors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 UNIVERSITY OR AUTHORS 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.
 */

/*
 * Intel 82586 Ethernet chip
 * Register, bit, and structure definitions.
 *
 * Original StarLAN driver written by Garrett Wollman with reference to the
 * Clarkson Packet Driver code for this chip written by Russ Nelson and others.
 *
 * BPF support code taken from hpdev/if_le.c, supplied with tcpdump.
 *
 * 3C507 support is loosely based on code donated to NetBSD by Rafal Boni.
 *
 * Majorly cleaned up and 3C507 code merged by Charles Hannum.
 *
 * Converted to SUN ie driver by Charles D. Cranor,
 *    October 1994, January 1995.
 * This sun version based on i386 version 1.30.
 */

#ifndef I82586_DEBUG
#define I82586_DEBUG 0
#endif

/* Debug elements */
#define IED_RINT       0x01
#define IED_TINT       0x02
#define IED_RNR        0x04
#define IED_CNA        0x08
#define IED_READFRAME  0x10
#define IED_ENQ        0x20
#define IED_XMIT       0x40
#define IED_ALL        0x7f

#define B_PER_F        3    /* recv buffers per frame */
#define  IE_RBUF_SIZE  256  /* size of each receive buffer;
                               MUST BE POWER OF TWO */
#define  NTXBUF        2    /* number of transmit commands */
#define  IE_TBUF_SIZE  ETHER_MAX_LEN  /* length of transmit buffer */

#define IE_MAXMCAST  (IE_TBUF_SIZE/6)/* must fit in transmit buffer */


#define INTR_ENTER  0    /* intr hook called on ISR entry */
#define INTR_EXIT   1    /* intr hook called on ISR exit */
#define INTR_LOOP   2    /* intr hook called on ISR loop */
#define INTR_ACK    3    /* intr hook called on ie_ack */

#define CHIP_PROBE  0    /* reset called from chip probe */
#define CARD_RESET  1    /* reset called from card reset */

#if I82586_DEBUG
#define I82586_INTS_REQ   0
#define I82586_INTS_IN    1
#define I82586_INTS_LOOPS 2
#define I82586_INTS_OUT   3
#define I82586_RX_INT     4
#define I82586_RX_DROP    5
#define I82586_RX_ERR     6
#define I82586_RX_OK      7
#define I82586_RX_START   8
#define I82586_START_TX   9
#define I82586_TX_START   10
#define I82586_TX_INT     11
#define I82586_TX_REQ     12
#define I82586_TX_EVT     13
#define I82586_TX_EMIT    14
#define I82586_TX_BAD     15
#define I82586_TX_ACTIVE  16
#define I82586_TRACE_CNT  17

#define I82586_TRACE_FLOW (10000)
#endif

/*
 * Ethernet status, per interface.
 *
 * The chip uses two types of pointers: 16 bit and 24 bit
 *   24 bit pointers cover the board's memory.
 *   16 bit pointers are offsets from the ISCP's `ie_base'
 *
 * The board's memory is represented by the bus handle `bh'. The MI
 * i82586 driver deals exclusively with offsets relative to the
 * board memory bus handle. The `ie_softc' fields below that are marked
 * `MD' are in the domain of the front-end driver; they opaque to the
 * MI driver part.
 *
 * The front-end is required to manage the SCP and ISCP structures. i.e.
 * allocate room for them on the board's memory, and arrange to point the
 * chip at the SCB stucture, the offset of which is passed to the MI
 * driver in `sc_scb'.
 *
 * The following functions provide the glue necessary to deal with
 * host and bus idiosyncracies:
 *
 *  hwreset    - board reset
 *  hwinit    - board initialization
 *  chan_attn  - get chip to look at prepared commands
 *  intrhook  - board dependent interrupt processing
 *
 *  All of the following shared-memory access function use an offset
 *  relative to the bus handle to indicate the shared memory location.
 *  The bus_{read/write}N function take or return offset into the
 *  shared memory in the host's byte-order.
 *
 *  memcopyin  - copy device memory: board to KVA
 *  memcopyout  - copy device memory: KVA to board
 *  bus_read16  - read a 16-bit i82586 pointer
        `offset' argument will be 16-bit aligned
 *  bus_write16  - write a 16-bit i82586 pointer
        `offset' argument will be 16-bit aligned
 *  bus_write24  - write a 24-bit i82586 pointer
        `offset' argument will be 32-bit aligned
 *  bus_barrier  - perform a bus barrier operation, forcing
        all outstanding reads/writes to complete
 *
 */

struct ie_softc {
  struct arpcom arpcom;

  /*
   * For RTEMS we run the tx and rx handlers under a task due to the 
   * network semaphore stuff.
   */

  rtems_id intr_task;
  rtems_id tx_task;

  void  *sc_iobase;  /* (MD) KVA of base of 24 bit addr space */
  void  *sc_maddr;   /* (MD) KVA of base of chip's RAM
                            (16bit addr space) */
  u_int sc_msize;    /* (MD) how much RAM we have/use */

  /* Bus glue */
  void (*hwreset) (struct ie_softc *, int);
  void (*hwinit) (struct ie_softc *);
  void (*chan_attn) (struct ie_softc *, int);
  int  (*intrhook) (struct ie_softc *, int where);

  void (*memcopyin) (struct ie_softc *, void *, int, size_t);
  void (*memcopyout) (struct ie_softc *, const void *,
                      int, size_t);
  u_int16_t (*ie_bus_read16) (struct ie_softc *, int offset);
  void  (*ie_bus_write16) (struct ie_softc *, int offset,
                           u_int16_t value);
  void  (*ie_bus_write24) (struct ie_softc *, int offset,
                           int addr);
  void  (*ie_bus_barrier) (struct ie_softc *, int offset, 
                           int length, int flags);

  /* Media management */
  int  (*sc_mediachange) (struct ie_softc *);
  /* card dependent media change */
  void (*sc_mediastatus) (struct ie_softc *, struct ifmediareq *);
  /* card dependent media status */

  /*
   * Offsets (relative to bus handle) of the i82586 SYSTEM structures.
   */
  int  scp;    /* Offset to the SCP (set by front-end) */
  int  iscp;   /* Offset to the ISCP (set by front-end) */
  int  scb;    /* Offset to SCB (set by front-end) */

  /*
   * Offset and size of a block of board memory where the buffers
   * are to be allocated from (initialized by front-end).
   */
  int  buf_area;            /* Start of descriptors and buffers */
  int  buf_area_sz;         /* Size of above */

  /*
   * The buffers & descriptors (recv and xmit)
   */
  int  rframes;           /* Offset to `nrxbuf' frame descriptors */
  int  rbds;              /* Offset to `nrxbuf' buffer descriptors */
  int  rbufs;             /* Offset to `nrxbuf' receive buffers */
#define IE_RBUF_ADDR(sc, i)  (sc->rbufs + ((i) * IE_RBUF_SIZE))
  int  rfhead, rftail;
  int  rbhead, rbtail;
  int  nframes;           /* number of frames in use */
  int  nrxbuf;            /* number of recv buffs in use */
  int  rnr_expect;        /* XXX - expect a RCVR not ready interrupt */

  int  nop_cmds;          /* Offset to NTXBUF no-op commands */
  int  xmit_cmds;         /* Offset to NTXBUF transmit commands */
  int  xbds;              /* Offset to NTXBUF buffer descriptors */
  int  xbufs;             /* Offset to NTXBUF transmit buffers */
#define IE_XBUF_ADDR(sc, i)  (sc->xbufs + ((i) * IE_TBUF_SIZE))

  int  xchead, xctail;
  int  xmit_busy;
  int  do_xmitnopchain;   /* Controls use of xmit NOP chains */
  int  xmit_req;

  /* Multicast addresses */
  char *mcast_addrs;      /* Current MC filter addresses */
  int  mcast_addrs_size;  /* Current size of MC buffer */
  int  mcast_count;       /* Current # of addrs in buffer */
  int  want_mcsetup;      /* run mcsetup at next opportunity */

  int  promisc;           /* are we in promisc mode? */
  int  async_cmd_inprogress;  /* we didn't wait for 586 to accept
                                 a command */

#if I82586_DEBUG
#define I82586_TRACE(s, e, d) \
do { rtems_interrupt_level level; rtems_interrupt_disable (level); \
     (s)->trace_flow[(s)->trace_flow_in++] = (e); \
     (s)->trace_flow[(s)->trace_flow_in++] = (unsigned int)(d); \
     if ((s)->trace_flow_in >= I82586_TRACE_FLOW) { \
       (s)->trace_flow_in = 0; \
       (s)->trace_flow_wrap = 1; \
     } \
     rtems_interrupt_enable (level); \
   } while (0)

  int          sc_debug;
  unsigned int trace_flow[I82586_TRACE_FLOW * 2];
  unsigned int trace_flow_wrap;  
#endif
  unsigned int trace_flow_in;  
};

/* Exported functions */
rtems_isr i82586_intr (rtems_vector_number , void *);
int       i82586_proberam (struct ie_softc *);
int       i82586_attach (struct rtems_bsdnet_ifconfig *config, int attaching);

/* Shortcut macros to optional (driver uses default if unspecified) callbacks */
#define xIE_BUS_BARRIER(sc, offset, length, flags)        \
do {                         \
  if ((sc)->ie_bus_barrier)             \
    ((sc)->ie_bus_barrier)((sc), (offset), (length), (flags));\
  else                   \
    bus_space_barrier((sc)->bt, (sc)->bh, (offset), (length), \
                      (flags)); \
} while (0)

#define IE_BUS_BARRIER(sc, offset, length, flags)