[9] | 1 | /*
|
---|
| 2 | ** File: eth.h Version 1.00, Jan. 14, 1997
|
---|
| 3 | **
|
---|
| 4 | ** Author: Giovanni Falzoni <gfalzoni@inwind.it>
|
---|
| 5 | **
|
---|
| 6 | ** Interface description for ethernet device driver
|
---|
| 7 | **
|
---|
| 8 | ** $Log: dp.h,v $
|
---|
| 9 | ** Revision 1.4 2005/09/04 18:52:16 beng
|
---|
| 10 | ** Giovanni's fixes to dpeth:
|
---|
| 11 | ** Date: Sat, 03 Sep 2005 11:05:22 +0200
|
---|
| 12 | ** Subject: Minix 3.0.8
|
---|
| 13 | **
|
---|
| 14 | ** Revision 1.3 2005/08/03 11:53:34 jnherder
|
---|
| 15 | ** Miscellaneous cleanups.
|
---|
| 16 | **
|
---|
| 17 | ** Revision 1.2 2005/08/02 15:30:35 jnherder
|
---|
| 18 | ** Various updates to support dynamically starting drivers.
|
---|
| 19 | ** Output during initialization should be suppressed. Unless an error occurs.
|
---|
| 20 | ** Note that main() can now be main(int argc, char **argv) and arguments can
|
---|
| 21 | ** be passed when bringing up the driver.
|
---|
| 22 | **
|
---|
| 23 | ** Revision 1.1 2005/06/29 10:16:46 beng
|
---|
| 24 | ** Import of dpeth 3c501/3c509b/.. ethernet driver by
|
---|
| 25 | ** Giovanni Falzoni <fgalzoni@inwind.it>.
|
---|
| 26 | **
|
---|
| 27 | ** Revision 2.0 2005/06/26 16:16:46 lsodgf0
|
---|
| 28 | ** Initial revision for Minix 3.0.6
|
---|
| 29 | **
|
---|
| 30 | ** $Id: dp.h,v 1.4 2005/09/04 18:52:16 beng Exp $
|
---|
| 31 | */
|
---|
| 32 |
|
---|
| 33 | #undef ENABLE_3C501
|
---|
| 34 | #undef ENABLE_3C503
|
---|
| 35 | #undef ENABLE_3C509
|
---|
| 36 | #undef ENABLE_NE2000
|
---|
| 37 | #undef ENABLE_WDETH
|
---|
| 38 | #undef ENABLE_DP8390
|
---|
| 39 |
|
---|
| 40 | #define ENABLE_3C501 1 /* enable 3Com Etherlink I board */
|
---|
| 41 | #define ENABLE_3C503 1 /* enable 3Com Etherlink II board */
|
---|
| 42 | #define ENABLE_3C509 1 /* enable 3Com Etherlink III board */
|
---|
| 43 | #define ENABLE_NE2000 1 /* enable Novell N2000 board */
|
---|
| 44 | #define ENABLE_WDETH 1 /* enable Western Digital WD80x3 */
|
---|
| 45 |
|
---|
| 46 | #define ENABLE_DP8390 (ENABLE_3C503|ENABLE_WDETH|ENABLE_NE2000)
|
---|
| 47 | #define HAVE_BUFFERS (ENABLE_3C501|ENABLE_3C509)
|
---|
| 48 |
|
---|
| 49 | #undef NULL
|
---|
| 50 | #define NULL ((void *)0)
|
---|
| 51 | #define NOT(x) (~(x))
|
---|
| 52 |
|
---|
| 53 | #if debug == 1
|
---|
| 54 | # define DEBUG(statm) statm
|
---|
| 55 | #else
|
---|
| 56 | # define DEBUG(statm)
|
---|
| 57 | #endif
|
---|
| 58 |
|
---|
| 59 | typedef struct _m_hdr_t { /* Buffer handling header */
|
---|
| 60 | struct _m_hdr_t *next;
|
---|
| 61 | int size;
|
---|
| 62 | } m_hdr_t;
|
---|
| 63 |
|
---|
| 64 | typedef struct _buff_t { /* Receive/Transmit buffer header */
|
---|
| 65 | struct _buff_t *next;
|
---|
| 66 | int size;
|
---|
| 67 | int client;
|
---|
| 68 | char buffer[2];
|
---|
| 69 | } buff_t;
|
---|
| 70 |
|
---|
| 71 | struct dpeth;
|
---|
| 72 | struct iovec_dat;
|
---|
| 73 | typedef void (*dp_eth_t) (struct dpeth *);
|
---|
| 74 | typedef void (*dp_send_recv_t) (struct dpeth *, int, int);
|
---|
| 75 |
|
---|
| 76 | #if ENABLE_DP8390 == 1
|
---|
| 77 | typedef void (*dp_user2nicf_t) (struct dpeth *, int, int);
|
---|
| 78 | typedef void (*dp_nic2userf_t) (struct dpeth *, int, int);
|
---|
| 79 | typedef void (*dp_getblock_t) (struct dpeth *, u16_t, int, void *);
|
---|
| 80 | #endif
|
---|
| 81 |
|
---|
| 82 | #define DE_PORT_NR 2 /* Number of devices supported */
|
---|
| 83 | #define SENDQ_NR 2 /* Size of the send queue */
|
---|
| 84 | #define IOVEC_NR 16 /* Number of IOVEC entries at a time */
|
---|
| 85 |
|
---|
| 86 | typedef struct iovec_dat {
|
---|
| 87 | iovec_t iod_iovec[IOVEC_NR];
|
---|
| 88 | int iod_iovec_s;
|
---|
| 89 | int iod_proc_nr;
|
---|
| 90 | vir_bytes iod_iovec_addr;
|
---|
| 91 | } iovec_dat_t;
|
---|
| 92 |
|
---|
| 93 | typedef struct dpeth {
|
---|
| 94 | /* The de_base_port field is the starting point of the probe. The
|
---|
| 95 | * conf routine also fills de_linmem and de_irq. If the probe routine
|
---|
| 96 | * knows the irq and/or memory address because they are hardwired in
|
---|
| 97 | * the board, the probe should modify these fields. Futhermore, the
|
---|
| 98 | * probe routine should also fill in de_initf and de_stopf fields
|
---|
| 99 | * with the appropriate function pointers and set de_prog_IO iff
|
---|
| 100 | * programmed I/O is to be used.
|
---|
| 101 | *
|
---|
| 102 | * The initf function fills the following fields. Only cards that do
|
---|
| 103 | * programmed I/O fill in the de_data_port field. In addition, the
|
---|
| 104 | * init routine has to fill in the sendq data structures. */
|
---|
| 105 |
|
---|
| 106 | /* Board hardware interface */
|
---|
| 107 | port_t de_base_port;
|
---|
| 108 | port_t de_data_port; /* For boards using Prog. I/O for xmit/recv */
|
---|
| 109 |
|
---|
| 110 | int de_irq;
|
---|
| 111 | int de_int_pending;
|
---|
| 112 | int de_hook; /* interrupt hook at kernel */
|
---|
| 113 |
|
---|
| 114 | char de_name[8];
|
---|
| 115 |
|
---|
| 116 | #define DEI_DEFAULT 0x8000
|
---|
| 117 |
|
---|
| 118 | phys_bytes de_linmem; /* For boards using shared memory */
|
---|
| 119 | unsigned short de_memsegm;
|
---|
| 120 | vir_bytes de_memoffs;
|
---|
| 121 | int de_ramsize; /* Size of on board memory */
|
---|
| 122 | int de_offset_page; /* Offset of shared memory page */
|
---|
| 123 |
|
---|
| 124 | /* Board specific functions */
|
---|
| 125 | dp_eth_t de_initf;
|
---|
| 126 | dp_eth_t de_stopf;
|
---|
| 127 | dp_eth_t de_resetf;
|
---|
| 128 | dp_eth_t de_flagsf;
|
---|
| 129 | dp_eth_t de_getstatsf;
|
---|
| 130 | dp_eth_t de_dumpstatsf;
|
---|
| 131 | dp_eth_t de_interruptf;
|
---|
| 132 | dp_send_recv_t de_recvf;
|
---|
| 133 | dp_send_recv_t de_sendf;
|
---|
| 134 |
|
---|
| 135 | ether_addr_t de_address; /* Ethernet Address */
|
---|
| 136 | eth_stat_t de_stat; /* Ethernet Statistics */
|
---|
| 137 | unsigned long bytes_Tx; /* Total bytes sent/received */
|
---|
| 138 | unsigned long bytes_Rx;
|
---|
| 139 |
|
---|
| 140 | #define SA_ADDR_LEN sizeof(ether_addr_t)
|
---|
| 141 |
|
---|
| 142 | int de_flags; /* Send/Receive mode (Configuration) */
|
---|
| 143 |
|
---|
| 144 | #define DEF_EMPTY 0x0000
|
---|
| 145 | #define DEF_READING 0x0001
|
---|
| 146 | #define DEF_RECV_BUSY 0x0002
|
---|
| 147 | #define DEF_ACK_RECV 0x0004
|
---|
| 148 | #define DEF_SENDING 0x0010
|
---|
| 149 | #define DEF_XMIT_BUSY 0x0020
|
---|
| 150 | #define DEF_ACK_SEND 0x0040
|
---|
| 151 | #define DEF_PROMISC 0x0100
|
---|
| 152 | #define DEF_MULTI 0x0200
|
---|
| 153 | #define DEF_BROAD 0x0400
|
---|
| 154 | #define DEF_ENABLED 0x2000
|
---|
| 155 | #define DEF_STOPPED 0x4000
|
---|
| 156 |
|
---|
| 157 | int de_mode; /* Status of the Interface */
|
---|
| 158 |
|
---|
| 159 | #define DEM_DISABLED 0x0000
|
---|
| 160 | #define DEM_SINK 0x0001
|
---|
| 161 | #define DEM_ENABLED 0x0002
|
---|
| 162 |
|
---|
| 163 | /* Temporary storage for RECV/SEND requests */
|
---|
| 164 | iovec_dat_t de_read_iovec;
|
---|
| 165 | iovec_dat_t de_write_iovec;
|
---|
| 166 | vir_bytes de_read_s;
|
---|
| 167 | vir_bytes de_send_s;
|
---|
| 168 | int de_client;
|
---|
| 169 | /*
|
---|
| 170 | message de_sendmsg;
|
---|
| 171 | iovec_dat_t de_tmp_iovec;
|
---|
| 172 | */
|
---|
| 173 | #if ENABLE_DP8390 == 1
|
---|
| 174 | /* For use by NS DP8390 driver */
|
---|
| 175 | port_t de_dp8390_port;
|
---|
| 176 | int de_prog_IO;
|
---|
| 177 | int de_16bit;
|
---|
| 178 | int de_startpage;
|
---|
| 179 | int de_stoppage;
|
---|
| 180 |
|
---|
| 181 | /* Do it yourself send queue */
|
---|
| 182 | struct sendq {
|
---|
| 183 | int sq_filled; /* This buffer contains a packet */
|
---|
| 184 | int sq_size; /* with this size */
|
---|
| 185 | int sq_sendpage; /* starting page of the buffer */
|
---|
| 186 | } de_sendq[SENDQ_NR];
|
---|
| 187 | int de_sendq_nr;
|
---|
| 188 | int de_sendq_head; /* Enqueue at the head */
|
---|
| 189 | int de_sendq_tail; /* Dequeue at the tail */
|
---|
| 190 |
|
---|
| 191 | dp_user2nicf_t de_user2nicf;
|
---|
| 192 | dp_nic2userf_t de_nic2userf;
|
---|
| 193 | dp_getblock_t de_getblockf;
|
---|
| 194 | #endif
|
---|
| 195 |
|
---|
| 196 | #if ENABLE_3C509 == 1
|
---|
| 197 | /* For use by 3Com Etherlink III (3c509) driver */
|
---|
| 198 | port_t de_id_port;
|
---|
| 199 | port_t de_if_port;
|
---|
| 200 | #endif
|
---|
| 201 |
|
---|
| 202 | #if ENABLE_3C501 == 1 || ENABLE_3C509 == 1
|
---|
| 203 | /* For use by 3Com Etherlink (3c501 and 3c509) driver */
|
---|
| 204 | buff_t *de_recvq_head;
|
---|
| 205 | buff_t *de_recvq_tail;
|
---|
| 206 | buff_t *de_xmitq_head;
|
---|
| 207 | buff_t *de_xmitq_tail;
|
---|
| 208 | u16_t de_recv_mode;
|
---|
| 209 | clock_t de_xmit_start;
|
---|
| 210 | #endif
|
---|
| 211 |
|
---|
| 212 | } dpeth_t;
|
---|
| 213 |
|
---|
| 214 | /*
|
---|
| 215 | * Function definitions
|
---|
| 216 | */
|
---|
| 217 |
|
---|
| 218 | /* dp.c */
|
---|
| 219 | void dp_next_iovec(iovec_dat_t * iovp);
|
---|
| 220 |
|
---|
| 221 | /* devio.c */
|
---|
| 222 | #if defined USE_IOPL
|
---|
| 223 | #include <ibm/portio.h>
|
---|
| 224 | #else
|
---|
| 225 | unsigned int inb(unsigned short int);
|
---|
| 226 | unsigned int inw(unsigned short int);
|
---|
| 227 | void insb(unsigned short int, int, void *, int);
|
---|
| 228 | void insw(unsigned short int, int, void *, int);
|
---|
| 229 | void outb(unsigned short int, unsigned long);
|
---|
| 230 | void outw(unsigned short int, unsigned long);
|
---|
| 231 | void outsb(unsigned short int, int, void *, int);
|
---|
| 232 | void outsw(unsigned short int, int, void *, int);
|
---|
| 233 | #endif
|
---|
| 234 |
|
---|
| 235 | /* netbuff.c */
|
---|
| 236 | void *alloc_buff(dpeth_t *, int);
|
---|
| 237 | void free_buff(dpeth_t *, void *);
|
---|
| 238 | void init_buff(dpeth_t *, buff_t **);
|
---|
| 239 | void mem2user(dpeth_t *, buff_t *);
|
---|
| 240 | void user2mem(dpeth_t *, buff_t *);
|
---|
| 241 |
|
---|
| 242 | /* 3c501.c */
|
---|
| 243 | #if ENABLE_3C501 == 1
|
---|
| 244 | int el1_probe(dpeth_t *);
|
---|
| 245 | #else
|
---|
| 246 | #define el1_probe(x) (0)
|
---|
| 247 | #endif
|
---|
| 248 |
|
---|
| 249 | /* 3c503.c */
|
---|
| 250 | #if ENABLE_3C503 == 1
|
---|
| 251 | int el2_probe(dpeth_t *);
|
---|
| 252 | #else
|
---|
| 253 | #define el2_probe(x) (0)
|
---|
| 254 | #endif
|
---|
| 255 |
|
---|
| 256 | /* 3c509.c */
|
---|
| 257 | #if ENABLE_3C509 == 1
|
---|
| 258 | int el3_probe(dpeth_t *);
|
---|
| 259 | #else
|
---|
| 260 | #define el3_probe(x) (0)
|
---|
| 261 | #endif
|
---|
| 262 |
|
---|
| 263 | /* ne.c */
|
---|
| 264 | #if ENABLE_NE2000 == 1
|
---|
| 265 | int ne_probe(dpeth_t * dep);
|
---|
| 266 | #else
|
---|
| 267 | #define ne_probe(x) (0)
|
---|
| 268 | #endif
|
---|
| 269 |
|
---|
| 270 | /* wd.c */
|
---|
| 271 | #if ENABLE_WDETH == 1
|
---|
| 272 | int wdeth_probe(dpeth_t * dep);
|
---|
| 273 | #else
|
---|
| 274 | #define wdeth_probe(x) (0)
|
---|
| 275 | #endif
|
---|
| 276 |
|
---|
| 277 | #define lock() (++dep->de_int_pending,sys_irqdisable(&dep->de_hook))
|
---|
| 278 | #define unlock() do{int i=(--dep->de_int_pending)?0:sys_irqenable(&dep->de_hook);}while(0)
|
---|
| 279 | #define milli_delay(t) tickdelay(1)
|
---|
| 280 |
|
---|
| 281 | /** dp.h **/
|
---|