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