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