1906943f9SDavid du Colombier typedef struct Ether Ether; 2906943f9SDavid du Colombier typedef struct Etherops Etherops; 3906943f9SDavid du Colombier typedef struct Conn Conn; 4906943f9SDavid du Colombier typedef struct Cinfo Cinfo; 5906943f9SDavid du Colombier typedef struct Buf Buf; 6906943f9SDavid du Colombier typedef struct Etherpkt Etherpkt; 7906943f9SDavid du Colombier 8906943f9SDavid du Colombier enum 9906943f9SDavid du Colombier { 10906943f9SDavid du Colombier /* controller ids */ 11906943f9SDavid du Colombier Cdc = 0, 12906943f9SDavid du Colombier A8817x, /* Asis */ 13906943f9SDavid du Colombier A88178, 14906943f9SDavid du Colombier A88179, 15906943f9SDavid du Colombier A88772, 16906943f9SDavid du Colombier 17906943f9SDavid du Colombier Eaddrlen = 6, 18906943f9SDavid du Colombier Epktlen = 1514, 19*d37e33ffSDavid du Colombier Ehdrsize = 2*Eaddrlen + 2, 20*d37e33ffSDavid du Colombier 21906943f9SDavid du Colombier Maxpkt = 2000, /* no jumbo packets here */ 22906943f9SDavid du Colombier Nconns = 8, /* max number of connections */ 23906943f9SDavid du Colombier Nbufs = 8, /* max number of buffers */ 24906943f9SDavid du Colombier Scether = 6, /* ethernet cdc subclass */ 25906943f9SDavid du Colombier Fnheader = 0, /* Functions */ 26906943f9SDavid du Colombier Fnunion = 6, 27906943f9SDavid du Colombier Fnether = 15, 28*d37e33ffSDavid du Colombier 29*d37e33ffSDavid du Colombier Cdcunion = 6, /* CDC Union descriptor subtype */ 30906943f9SDavid du Colombier }; 31906943f9SDavid du Colombier 32906943f9SDavid du Colombier struct Buf 33906943f9SDavid du Colombier { 34906943f9SDavid du Colombier int type; 35906943f9SDavid du Colombier int ndata; 36906943f9SDavid du Colombier uchar* rp; 37906943f9SDavid du Colombier uchar data[Hdrsize+Maxpkt]; 38906943f9SDavid du Colombier }; 39906943f9SDavid du Colombier 40906943f9SDavid du Colombier struct Conn 41906943f9SDavid du Colombier { 42906943f9SDavid du Colombier Ref; /* one per file in use */ 43906943f9SDavid du Colombier int nb; 44906943f9SDavid du Colombier int type; 45906943f9SDavid du Colombier int headersonly; 46906943f9SDavid du Colombier int prom; 47906943f9SDavid du Colombier Channel*rc; /* [2] of Buf* */ 48906943f9SDavid du Colombier }; 49906943f9SDavid du Colombier 50906943f9SDavid du Colombier struct Etherops 51906943f9SDavid du Colombier { 52906943f9SDavid du Colombier int (*init)(Ether*, int *epin, int *epout); 53906943f9SDavid du Colombier long (*bread)(Ether*, Buf*); 54906943f9SDavid du Colombier long (*bwrite)(Ether*, Buf*); 55906943f9SDavid du Colombier int (*ctl)(Ether*, char*); 56906943f9SDavid du Colombier int (*promiscuous)(Ether*, int); 57906943f9SDavid du Colombier int (*multicast)(Ether*, uchar*, int); 58906943f9SDavid du Colombier char* (*seprintstats)(char*, char*, Ether*); 59906943f9SDavid du Colombier void (*free)(Ether*); 60906943f9SDavid du Colombier void* aux; 61906943f9SDavid du Colombier }; 62906943f9SDavid du Colombier 63906943f9SDavid du Colombier struct Ether 64906943f9SDavid du Colombier { 65906943f9SDavid du Colombier QLock; 66906943f9SDavid du Colombier QLock wlck; /* write one at a time */ 67906943f9SDavid du Colombier int epinid; /* epin address */ 68906943f9SDavid du Colombier int epoutid; /* epout address */ 69906943f9SDavid du Colombier Dev* dev; 70906943f9SDavid du Colombier Dev* epin; 71906943f9SDavid du Colombier Dev* epout; 72906943f9SDavid du Colombier int cid; /* ctlr id */ 73906943f9SDavid du Colombier int phy; /* phy id */ 74906943f9SDavid du Colombier Ref prom; /* nb. of promiscuous conns */ 75*d37e33ffSDavid du Colombier int exiting; /* shutting down */ 76*d37e33ffSDavid du Colombier int wrexited; /* write process died */ 77906943f9SDavid du Colombier uchar addr[Eaddrlen]; /* mac */ 78906943f9SDavid du Colombier int nconns; /* nb. of entries used in... */ 79906943f9SDavid du Colombier Conn* conns[Nconns]; /* connections */ 80906943f9SDavid du Colombier int nabufs; /* nb. of allocated buffers */ 81906943f9SDavid du Colombier int nbufs; /* nb. of buffers in use */ 82906943f9SDavid du Colombier int nblock; /* nonblocking (output)? */ 83906943f9SDavid du Colombier long nin; 84906943f9SDavid du Colombier long nout; 85906943f9SDavid du Colombier long nierrs; 86906943f9SDavid du Colombier long noerrs; 87906943f9SDavid du Colombier int mbps; 88906943f9SDavid du Colombier int nmcasts; 89906943f9SDavid du Colombier Channel*rc; /* read channel (of Buf*) */ 90906943f9SDavid du Colombier Channel*wc; /* write channel (of Buf*) */ 91906943f9SDavid du Colombier Channel*bc; /* free buf. chan. (of Buf*) */ 92906943f9SDavid du Colombier Etherops; 93906943f9SDavid du Colombier Usbfs fs; 94906943f9SDavid du Colombier }; 95906943f9SDavid du Colombier 96906943f9SDavid du Colombier struct Cinfo 97906943f9SDavid du Colombier { 98906943f9SDavid du Colombier int vid; /* usb vendor id */ 99906943f9SDavid du Colombier int did; /* usb device/product id */ 100906943f9SDavid du Colombier int cid; /* controller id assigned by us */ 101906943f9SDavid du Colombier }; 102906943f9SDavid du Colombier 103906943f9SDavid du Colombier struct Etherpkt 104906943f9SDavid du Colombier { 105906943f9SDavid du Colombier uchar d[Eaddrlen]; 106906943f9SDavid du Colombier uchar s[Eaddrlen]; 107906943f9SDavid du Colombier uchar type[2]; 108906943f9SDavid du Colombier uchar data[1500]; 109906943f9SDavid du Colombier }; 110906943f9SDavid du Colombier 111906943f9SDavid du Colombier int ethermain(Dev *dev, int argc, char **argv); 112906943f9SDavid du Colombier int asixreset(Ether*); 113906943f9SDavid du Colombier int cdcreset(Ether*); 114906943f9SDavid du Colombier int parseaddr(uchar *m, char *s); 115906943f9SDavid du Colombier void dumpframe(char *tag, void *p, int n); 116906943f9SDavid du Colombier 117906943f9SDavid du Colombier extern Cinfo cinfo[]; 118906943f9SDavid du Colombier extern int etherdebug; 119906943f9SDavid du Colombier 120906943f9SDavid du Colombier #define deprint if(etherdebug)fprint 121