xref: /plan9/sys/src/cmd/usb/ether/ether.h (revision 0cc6832d7c845a6250c7353daab06d4af2dfe5cb)
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