123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
- */
- typedef struct Ether Ether;
- typedef struct Etherops Etherops;
- typedef struct Conn Conn;
- typedef struct Cinfo Cinfo;
- typedef struct Buf Buf;
- typedef struct Etherpkt Etherpkt;
- enum
- {
- /* controller ids */
- Cdc = 0,
- A8817x, /* Asis */
- A88178,
- A88179,
- A88772,
- S95xx, /* SMSC */
- Eaddrlen = 6,
- Epktlen = 1514,
- Ehdrsize = 2*Eaddrlen + 2,
- Maxpkt = 2000, /* no jumbo packets here */
- Nconns = 8, /* max number of connections */
- Nbufs = 32, /* max number of buffers */
- Scether = 6, /* ethernet cdc subclass */
- Fnheader = 0, /* Functions */
- Fnunion = 6,
- Fnether = 15,
- Cdcunion = 6, /* CDC Union descriptor subtype */
- };
- struct Buf
- {
- int type;
- int ndata;
- u8 * rp;
- u8 data[Hdrsize+Maxpkt];
- };
- struct Conn
- {
- Ref Ref; /* one per file in use */
- int nb;
- int type;
- int headersonly;
- int prom;
- Channel*rc; /* [2] of Buf* */
- };
- struct Etherops
- {
- int (*init)(Ether*, int *epin, int *epout);
- i32 (*bread)(Ether*, Buf*);
- i32 (*bwrite)(Ether*, Buf*);
- int (*ctl)(Ether*, char*);
- int (*promiscuous)(Ether*, int);
- int (*multicast)(Ether*, u8*, int);
- char* (*seprintstats)(char*, char*, Ether*);
- void (*free)(Ether*);
- int bufsize;
- char *name;
- void* aux;
- };
- struct Ether
- {
- QLock QLock;
- QLock wlck; /* write one at a time */
- int epinid; /* epin address */
- int epoutid; /* epout address */
- Dev* dev;
- Dev* epin;
- Dev* epout;
- int cid; /* ctlr id */
- int phy; /* phy id */
- Ref prom; /* nb. of promiscuous conns */
- int exiting; /* shutting down */
- int wrexited; /* write process died */
- u8 addr[Eaddrlen]; /* mac */
- int nconns; /* nb. of entries used in... */
- Conn* conns[Nconns]; /* connections */
- int nabufs; /* nb. of allocated buffers */
- int nbufs; /* nb. of buffers in use */
- int nblock; /* nonblocking (output)? */
- int nin;
- int nout;
- int nierrs;
- int noerrs;
- int mbps;
- int nmcasts;
- Channel*rc; /* read channel (of Buf*) */
- Channel*wc; /* write channel (of Buf*) */
- Channel*bc; /* free buf. chan. (of Buf*) */
- Etherops Etherops;
- Usbfs fs;
- };
- struct Cinfo
- {
- int vid; /* usb vendor id */
- int did; /* usb device/product id */
- int cid; /* controller id assigned by us */
- };
- struct Etherpkt
- {
- u8 d[Eaddrlen];
- u8 s[Eaddrlen];
- u8 type[2];
- u8 data[1500];
- };
- int ethermain(Dev *dev, int argc, char **argv);
- int asixreset(Ether*);
- int smscreset(Ether*);
- int cdcreset(Ether*);
- int parseaddr(u8 *m, char *s);
- void dumpframe(char *tag, void *p, int n);
- extern Cinfo cinfo[];
- extern int etherdebug;
- #define deprint if(etherdebug)fprint
|