|
|
1.1 root 1: /*
2: * All the goo for PC ethernet cards.
3: */
4: typedef struct Card Card;
5: typedef struct RingBuf RingBuf;
6: typedef struct Type Type;
7: typedef struct Ctlr Ctlr;
8:
9: /*
10: * Hardware interface.
11: */
12: struct Card {
13: ISAConf;
14:
15: int (*reset)(Ctlr*);
16: void (*init)(Ctlr*);
17: void (*attach)(Ctlr*);
18: void (*mode)(Ctlr*, int);
19:
20: void *(*read)(Ctlr*, void*, ulong, ulong);
21: void *(*write)(Ctlr*, ulong, void*, ulong);
22:
23: void (*receive)(Ctlr*);
24: void (*transmit)(Ctlr*);
25: void (*intr)(Ctlr*);
26: void (*watch)(Ctlr*);
27: void (*overflow)(Ctlr*);
28:
29: uchar bit16; /* true if a 16 bit interface */
30: uchar ram; /* true if card has shared memory */
31:
32: ulong dp8390; /* I/O address of 8390 (if any) */
33: ulong data; /* I/O data port if no shared memory */
34: uchar nxtpkt; /* software bndry */
35: uchar tstart; /* 8390 ring addresses */
36: uchar pstart;
37: uchar pstop;
38: };
39:
40: /*
41: * Software ring buffer.
42: */
43: struct RingBuf {
44: uchar owner;
45: uchar busy; /* unused */
46: ushort len;
47: uchar pkt[sizeof(Etherpkt)];
48: };
49:
50: enum {
51: Host = 0, /* buffer owned by host */
52: Interface = 1, /* buffer owned by card */
53:
54: Nrb = 16, /* default number of receive buffers */
55: Ntb = 4, /* default number of transmit buffers */
56: };
57:
58: /*
59: * One per ethernet packet type.
60: */
61: struct Type {
62: QLock;
63: Netprot; /* stat info */
64: int type; /* ethernet type */
65: int prom; /* promiscuous mode */
66: int filter; /* address filter */
67: uchar ea[6]; /* ethernet address */
68: Queue *q;
69: int inuse;
70: Ctlr *ctlr;
71:
72: Rendez cr; /* rendezvous for close */
73: Type *clist; /* close list */
74: };
75:
76: enum {
77: NType = 9, /* types/card */
78:
79: Eaddrlen = 6, /* Ethernet address length */
80: };
81:
82: /*
83: * Software controller.
84: */
85: struct Ctlr {
86: QLock;
87: int ctlrno;
88: Ctlr *next;
89:
90: Card card; /* hardware info */
91: int present;
92: int debug;
93:
94: ushort nrb; /* number of software receive buffers */
95: ushort ntb; /* number of software transmit buffers */
96: RingBuf *rb; /* software receive buffers */
97: RingBuf *tb; /* software transmit buffers */
98:
99: uchar ea[6]; /* ethernet address */
100: uchar ba[6]; /* broadcast address */
101:
102: Rendez rr; /* rendezvous for a receive buffer */
103: ushort rh; /* first receive buffer belonging to host */
104: ushort ri; /* first receive buffer belonging to card */
105:
106: Rendez tr; /* rendezvous for a transmit buffer */
107: QLock tlock; /* semaphore on th */
108: ushort th; /* first transmit buffer belonging to host */
109: ushort ti; /* first transmit buffer belonging to card */
110: int tbusy; /* transmitter is busy */
111:
112: Type type[NType];
113: int all; /* number of channels listening to all packets */
114: Type *clist; /* channels waiting to close */
115: Lock clock; /* lock for clist */
116: int prom; /* number of promiscuous channels */
117: int filter; /* number of address filters */
118: int early; /* true if ra set */
119: uchar ra[8]; /* received address if filtering */
120: int kproc; /* true if kproc started */
121: char name[NAMELEN]; /* name of kproc */
122: Network net;
123:
124: Queue lbq; /* software loopback packet queue */
125:
126: int inpackets;
127: int outpackets;
128: int crcs; /* input crc errors */
129: int oerrs; /* output errors */
130: int frames; /* framing errors */
131: int overflows; /* packet overflows */
132: int buffs; /* buffering errors */
133: };
134:
135: #define NEXT(x, l) (((x)+1)%(l))
136: #define HOWMANY(x, y) (((x)+((y)-1))/(y))
137: #define ROUNDUP(x, y) (HOWMANY((x), (y))*(y))
138:
139: /*
140: * The Western Digital 8003 and 8013 series, the NE2000
141: * and the 3Com 503 all use the DP8390 Network Interface
142: * Chip.
143: */
144: extern void dp8390reset(Ctlr*);
145: extern void dp8390attach(Ctlr*);
146: extern void dp8390mode(Ctlr*, int);
147: extern void dp8390getea(Ctlr*);
148: extern void dp8390setea(Ctlr*);
149: extern void *dp8390read(Ctlr*, void*, ulong, ulong);
150: extern void *dp8390write(Ctlr*, ulong, void*, ulong);
151: extern void dp8390receive(Ctlr*);
152: extern void dp8390transmit(Ctlr*);
153: extern void dp8390intr(Ctlr*);
154: extern void dp8390watch(Ctlr*);
155: extern void dp8390overflow(Ctlr*);
156:
157: extern void dp8390debug(Ctlr*);
158:
159: /*
160: * The DP8390 needs some time between successive
161: * chip selects, so we need special I/O routines.
162: * See l.s.
163: * These routines only need to be used for accessing
164: * the chip registers. Data I/O, either through
165: * remote DMA or shared memory, can use the normal
166: * routines.
167: */
168: extern int dp8390inb(ulong);
169: extern void dp8390outb(ulong, uchar);
170:
171: enum {
172: Dp8390BufSz = 256, /* hardware ring buffer size */
173: };
174:
175:
176: extern void addethercard(char*, int (*)(Ctlr*));
177: extern int eaddrmatch(Ctlr*, uchar*);
178: extern int parseether(void*, void*);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.