1*906943f9SDavid du Colombier typedef struct Ether Ether; 2*906943f9SDavid du Colombier typedef struct Etherops Etherops; 3*906943f9SDavid du Colombier typedef struct Conn Conn; 4*906943f9SDavid du Colombier typedef struct Cinfo Cinfo; 5*906943f9SDavid du Colombier typedef struct Buf Buf; 6*906943f9SDavid du Colombier typedef struct Etherpkt Etherpkt; 7*906943f9SDavid du Colombier 8*906943f9SDavid du Colombier enum 9*906943f9SDavid du Colombier { 10*906943f9SDavid du Colombier /* controller ids */ 11*906943f9SDavid du Colombier Cdc = 0, 12*906943f9SDavid du Colombier A8817x, /* Asis */ 13*906943f9SDavid du Colombier A88178, 14*906943f9SDavid du Colombier A88179, 15*906943f9SDavid du Colombier A88772, 16*906943f9SDavid du Colombier 17*906943f9SDavid du Colombier Eaddrlen = 6, 18*906943f9SDavid du Colombier Epktlen = 1514, 19*906943f9SDavid du Colombier Maxpkt = 2000, /* no jumbo packets here */ 20*906943f9SDavid du Colombier Nconns = 8, /* max number of connections */ 21*906943f9SDavid du Colombier Nbufs = 8, /* max number of buffers */ 22*906943f9SDavid du Colombier Scether = 6, /* ethernet cdc subclass */ 23*906943f9SDavid du Colombier Fnheader = 0, /* Functions */ 24*906943f9SDavid du Colombier Fnunion = 6, 25*906943f9SDavid du Colombier Fnether = 15, 26*906943f9SDavid du Colombier }; 27*906943f9SDavid du Colombier 28*906943f9SDavid du Colombier struct Buf 29*906943f9SDavid du Colombier { 30*906943f9SDavid du Colombier int type; 31*906943f9SDavid du Colombier int ndata; 32*906943f9SDavid du Colombier uchar* rp; 33*906943f9SDavid du Colombier uchar data[Hdrsize+Maxpkt]; 34*906943f9SDavid du Colombier }; 35*906943f9SDavid du Colombier 36*906943f9SDavid du Colombier struct Conn 37*906943f9SDavid du Colombier { 38*906943f9SDavid du Colombier Ref; /* one per file in use */ 39*906943f9SDavid du Colombier int nb; 40*906943f9SDavid du Colombier int type; 41*906943f9SDavid du Colombier int headersonly; 42*906943f9SDavid du Colombier int prom; 43*906943f9SDavid du Colombier Channel*rc; /* [2] of Buf* */ 44*906943f9SDavid du Colombier }; 45*906943f9SDavid du Colombier 46*906943f9SDavid du Colombier struct Etherops 47*906943f9SDavid du Colombier { 48*906943f9SDavid du Colombier int (*init)(Ether*, int *epin, int *epout); 49*906943f9SDavid du Colombier long (*bread)(Ether*, Buf*); 50*906943f9SDavid du Colombier long (*bwrite)(Ether*, Buf*); 51*906943f9SDavid du Colombier int (*ctl)(Ether*, char*); 52*906943f9SDavid du Colombier int (*promiscuous)(Ether*, int); 53*906943f9SDavid du Colombier int (*multicast)(Ether*, uchar*, int); 54*906943f9SDavid du Colombier char* (*seprintstats)(char*, char*, Ether*); 55*906943f9SDavid du Colombier void (*free)(Ether*); 56*906943f9SDavid du Colombier void* aux; 57*906943f9SDavid du Colombier }; 58*906943f9SDavid du Colombier 59*906943f9SDavid du Colombier struct Ether 60*906943f9SDavid du Colombier { 61*906943f9SDavid du Colombier QLock; 62*906943f9SDavid du Colombier QLock wlck; /* write one at a time */ 63*906943f9SDavid du Colombier int epinid; /* epin address */ 64*906943f9SDavid du Colombier int epoutid; /* epout address */ 65*906943f9SDavid du Colombier Dev* dev; 66*906943f9SDavid du Colombier Dev* epin; 67*906943f9SDavid du Colombier Dev* epout; 68*906943f9SDavid du Colombier int cid; /* ctlr id */ 69*906943f9SDavid du Colombier int phy; /* phy id */ 70*906943f9SDavid du Colombier Ref prom; /* nb. of promiscuous conns */ 71*906943f9SDavid du Colombier int exiting; /* shutting it down */ 72*906943f9SDavid du Colombier uchar addr[Eaddrlen]; /* mac */ 73*906943f9SDavid du Colombier int nconns; /* nb. of entries used in... */ 74*906943f9SDavid du Colombier Conn* conns[Nconns]; /* connections */ 75*906943f9SDavid du Colombier int nabufs; /* nb. of allocated buffers */ 76*906943f9SDavid du Colombier int nbufs; /* nb. of buffers in use */ 77*906943f9SDavid du Colombier int nblock; /* nonblocking (output)? */ 78*906943f9SDavid du Colombier long nin; 79*906943f9SDavid du Colombier long nout; 80*906943f9SDavid du Colombier long nierrs; 81*906943f9SDavid du Colombier long noerrs; 82*906943f9SDavid du Colombier int mbps; 83*906943f9SDavid du Colombier int nmcasts; 84*906943f9SDavid du Colombier Channel*rc; /* read channel (of Buf*) */ 85*906943f9SDavid du Colombier Channel*wc; /* write channel (of Buf*) */ 86*906943f9SDavid du Colombier Channel*bc; /* free buf. chan. (of Buf*) */ 87*906943f9SDavid du Colombier Etherops; 88*906943f9SDavid du Colombier Usbfs fs; 89*906943f9SDavid du Colombier }; 90*906943f9SDavid du Colombier 91*906943f9SDavid du Colombier struct Cinfo 92*906943f9SDavid du Colombier { 93*906943f9SDavid du Colombier int vid; /* usb vendor id */ 94*906943f9SDavid du Colombier int did; /* usb device/product id */ 95*906943f9SDavid du Colombier int cid; /* controller id assigned by us */ 96*906943f9SDavid du Colombier }; 97*906943f9SDavid du Colombier 98*906943f9SDavid du Colombier struct Etherpkt 99*906943f9SDavid du Colombier { 100*906943f9SDavid du Colombier uchar d[Eaddrlen]; 101*906943f9SDavid du Colombier uchar s[Eaddrlen]; 102*906943f9SDavid du Colombier uchar type[2]; 103*906943f9SDavid du Colombier uchar data[1500]; 104*906943f9SDavid du Colombier }; 105*906943f9SDavid du Colombier 106*906943f9SDavid du Colombier int ethermain(Dev *dev, int argc, char **argv); 107*906943f9SDavid du Colombier int asixreset(Ether*); 108*906943f9SDavid du Colombier int cdcreset(Ether*); 109*906943f9SDavid du Colombier int parseaddr(uchar *m, char *s); 110*906943f9SDavid du Colombier void dumpframe(char *tag, void *p, int n); 111*906943f9SDavid du Colombier 112*906943f9SDavid du Colombier extern Cinfo cinfo[]; 113*906943f9SDavid du Colombier extern int etherdebug; 114*906943f9SDavid du Colombier 115*906943f9SDavid du Colombier #define deprint if(etherdebug)fprint 116