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, 16a650be7dSDavid du Colombier S95xx, /* SMSC */ 17906943f9SDavid du Colombier 18906943f9SDavid du Colombier Eaddrlen = 6, 19906943f9SDavid du Colombier Epktlen = 1514, 20d37e33ffSDavid du Colombier Ehdrsize = 2*Eaddrlen + 2, 21d37e33ffSDavid du Colombier 22906943f9SDavid du Colombier Maxpkt = 2000, /* no jumbo packets here */ 23906943f9SDavid du Colombier Nconns = 8, /* max number of connections */ 24a650be7dSDavid du Colombier Nbufs = 32, /* max number of buffers */ 25906943f9SDavid du Colombier Scether = 6, /* ethernet cdc subclass */ 26906943f9SDavid du Colombier Fnheader = 0, /* Functions */ 27906943f9SDavid du Colombier Fnunion = 6, 28906943f9SDavid du Colombier Fnether = 15, 29d37e33ffSDavid du Colombier 30d37e33ffSDavid du Colombier Cdcunion = 6, /* CDC Union descriptor subtype */ 31906943f9SDavid du Colombier }; 32906943f9SDavid du Colombier 33906943f9SDavid du Colombier struct Buf 34906943f9SDavid du Colombier { 35906943f9SDavid du Colombier int type; 36906943f9SDavid du Colombier int ndata; 37906943f9SDavid du Colombier uchar* rp; 38906943f9SDavid du Colombier uchar data[Hdrsize+Maxpkt]; 39906943f9SDavid du Colombier }; 40906943f9SDavid du Colombier 41906943f9SDavid du Colombier struct Conn 42906943f9SDavid du Colombier { 43906943f9SDavid du Colombier Ref; /* one per file in use */ 44906943f9SDavid du Colombier int nb; 45906943f9SDavid du Colombier int type; 46906943f9SDavid du Colombier int headersonly; 47906943f9SDavid du Colombier int prom; 48906943f9SDavid du Colombier Channel*rc; /* [2] of Buf* */ 49906943f9SDavid du Colombier }; 50906943f9SDavid du Colombier 51906943f9SDavid du Colombier struct Etherops 52906943f9SDavid du Colombier { 53906943f9SDavid du Colombier int (*init)(Ether*, int *epin, int *epout); 54906943f9SDavid du Colombier long (*bread)(Ether*, Buf*); 55906943f9SDavid du Colombier long (*bwrite)(Ether*, Buf*); 56906943f9SDavid du Colombier int (*ctl)(Ether*, char*); 57906943f9SDavid du Colombier int (*promiscuous)(Ether*, int); 58906943f9SDavid du Colombier int (*multicast)(Ether*, uchar*, int); 59906943f9SDavid du Colombier char* (*seprintstats)(char*, char*, Ether*); 60906943f9SDavid du Colombier void (*free)(Ether*); 61*0cc6832dSDavid du Colombier int bufsize; 62*0cc6832dSDavid du Colombier char *name; 63906943f9SDavid du Colombier void* aux; 64906943f9SDavid du Colombier }; 65906943f9SDavid du Colombier 66906943f9SDavid du Colombier struct Ether 67906943f9SDavid du Colombier { 68906943f9SDavid du Colombier QLock; 69906943f9SDavid du Colombier QLock wlck; /* write one at a time */ 70906943f9SDavid du Colombier int epinid; /* epin address */ 71906943f9SDavid du Colombier int epoutid; /* epout address */ 72906943f9SDavid du Colombier Dev* dev; 73906943f9SDavid du Colombier Dev* epin; 74906943f9SDavid du Colombier Dev* epout; 75906943f9SDavid du Colombier int cid; /* ctlr id */ 76906943f9SDavid du Colombier int phy; /* phy id */ 77906943f9SDavid du Colombier Ref prom; /* nb. of promiscuous conns */ 78d37e33ffSDavid du Colombier int exiting; /* shutting down */ 79d37e33ffSDavid du Colombier int wrexited; /* write process died */ 80906943f9SDavid du Colombier uchar addr[Eaddrlen]; /* mac */ 81906943f9SDavid du Colombier int nconns; /* nb. of entries used in... */ 82906943f9SDavid du Colombier Conn* conns[Nconns]; /* connections */ 83906943f9SDavid du Colombier int nabufs; /* nb. of allocated buffers */ 84906943f9SDavid du Colombier int nbufs; /* nb. of buffers in use */ 85906943f9SDavid du Colombier int nblock; /* nonblocking (output)? */ 86906943f9SDavid du Colombier long nin; 87906943f9SDavid du Colombier long nout; 88906943f9SDavid du Colombier long nierrs; 89906943f9SDavid du Colombier long noerrs; 90906943f9SDavid du Colombier int mbps; 91906943f9SDavid du Colombier int nmcasts; 92906943f9SDavid du Colombier Channel*rc; /* read channel (of Buf*) */ 93906943f9SDavid du Colombier Channel*wc; /* write channel (of Buf*) */ 94906943f9SDavid du Colombier Channel*bc; /* free buf. chan. (of Buf*) */ 95906943f9SDavid du Colombier Etherops; 96906943f9SDavid du Colombier Usbfs fs; 97906943f9SDavid du Colombier }; 98906943f9SDavid du Colombier 99906943f9SDavid du Colombier struct Cinfo 100906943f9SDavid du Colombier { 101906943f9SDavid du Colombier int vid; /* usb vendor id */ 102906943f9SDavid du Colombier int did; /* usb device/product id */ 103906943f9SDavid du Colombier int cid; /* controller id assigned by us */ 104906943f9SDavid du Colombier }; 105906943f9SDavid du Colombier 106906943f9SDavid du Colombier struct Etherpkt 107906943f9SDavid du Colombier { 108906943f9SDavid du Colombier uchar d[Eaddrlen]; 109906943f9SDavid du Colombier uchar s[Eaddrlen]; 110906943f9SDavid du Colombier uchar type[2]; 111906943f9SDavid du Colombier uchar data[1500]; 112906943f9SDavid du Colombier }; 113906943f9SDavid du Colombier 114906943f9SDavid du Colombier int ethermain(Dev *dev, int argc, char **argv); 115906943f9SDavid du Colombier int asixreset(Ether*); 116a650be7dSDavid du Colombier int smscreset(Ether*); 117906943f9SDavid du Colombier int cdcreset(Ether*); 118906943f9SDavid du Colombier int parseaddr(uchar *m, char *s); 119906943f9SDavid du Colombier void dumpframe(char *tag, void *p, int n); 120906943f9SDavid du Colombier 121906943f9SDavid du Colombier extern Cinfo cinfo[]; 122906943f9SDavid du Colombier extern int etherdebug; 123906943f9SDavid du Colombier 124906943f9SDavid du Colombier #define deprint if(etherdebug)fprint 125