xref: /plan9/sys/src/cmd/usb/ether/main.c (revision a650be7d984b0294fadd12cd786574e09003d20c)
1906943f9SDavid du Colombier /*
2906943f9SDavid du Colombier  * usb/ether - usb ethernet adapter.
3906943f9SDavid du Colombier  * BUG: This should use /dev/etherfile to
4906943f9SDavid du Colombier  * use the kernel ether device code.
5906943f9SDavid du Colombier  */
6906943f9SDavid du Colombier #include <u.h>
7906943f9SDavid du Colombier #include <libc.h>
8906943f9SDavid du Colombier #include <fcall.h>
9906943f9SDavid du Colombier #include <thread.h>
10906943f9SDavid du Colombier #include "usb.h"
11906943f9SDavid du Colombier #include "usbfs.h"
12906943f9SDavid du Colombier #include "ether.h"
13906943f9SDavid du Colombier 
14906943f9SDavid du Colombier enum
15906943f9SDavid du Colombier {
16906943f9SDavid du Colombier 	Arglen = 80,
17906943f9SDavid du Colombier };
18906943f9SDavid du Colombier 
19906943f9SDavid du Colombier static void
usage(void)20906943f9SDavid du Colombier usage(void)
21906943f9SDavid du Colombier {
22*a650be7dSDavid du Colombier 	fprint(2, "usage: %s [-a addr] [-Dd] [-N nb] [-m mnt] [-s srv] [dev...]\n", argv0);
23906943f9SDavid du Colombier 	threadexitsall("usage");
24906943f9SDavid du Colombier }
25906943f9SDavid du Colombier 
26906943f9SDavid du Colombier /*
27906943f9SDavid du Colombier  * Ether devices may be weird.
28906943f9SDavid du Colombier  * Be optimistic and try to use any communication
29906943f9SDavid du Colombier  * device or one of the `vendor specific class' devices
30906943f9SDavid du Colombier  * that we know are ethernets.
31906943f9SDavid du Colombier  */
32906943f9SDavid du Colombier static int
matchether(char * info,void *)33906943f9SDavid du Colombier matchether(char *info, void*)
34906943f9SDavid du Colombier {
35906943f9SDavid du Colombier 	Cinfo *ip;
36906943f9SDavid du Colombier 	char buf[50];
37906943f9SDavid du Colombier 
38906943f9SDavid du Colombier 	/*
39906943f9SDavid du Colombier 	 * I have an ether reporting comms.0.0
40906943f9SDavid du Colombier 	 */
41906943f9SDavid du Colombier 	if(strstr(info, "comms") != nil)
42906943f9SDavid du Colombier 		return 0;
43906943f9SDavid du Colombier 	for(ip = cinfo; ip->vid != 0; ip++){
44906943f9SDavid du Colombier 		snprint(buf, sizeof(buf), "vid %#06x did %#06x", ip->vid, ip->did);
45906943f9SDavid du Colombier 		if(strstr(info, buf) != nil)
46906943f9SDavid du Colombier 			return 0;
47906943f9SDavid du Colombier 	}
48906943f9SDavid du Colombier 	return -1;
49906943f9SDavid du Colombier }
50906943f9SDavid du Colombier 
51906943f9SDavid du Colombier void
threadmain(int argc,char ** argv)52906943f9SDavid du Colombier threadmain(int argc, char **argv)
53906943f9SDavid du Colombier {
54906943f9SDavid du Colombier 	char args[Arglen];
55ed868a7cSDavid du Colombier 	char *as, *ae, *srv, *mnt;
56906943f9SDavid du Colombier 
57906943f9SDavid du Colombier 	srv = nil;
58906943f9SDavid du Colombier 	mnt = "/net";
59906943f9SDavid du Colombier 
60906943f9SDavid du Colombier 	quotefmtinstall();
61906943f9SDavid du Colombier 	ae = args+sizeof(args);
62906943f9SDavid du Colombier 	as = seprint(args, ae, "ether");
63906943f9SDavid du Colombier 	ARGBEGIN{
64*a650be7dSDavid du Colombier 	case 'a':
65*a650be7dSDavid du Colombier 		as = seprint(as, ae, " -a %s", EARGF(usage()));
66*a650be7dSDavid du Colombier 		break;
67906943f9SDavid du Colombier 	case 'D':
68906943f9SDavid du Colombier 		usbfsdebug++;
69906943f9SDavid du Colombier 		break;
70906943f9SDavid du Colombier 	case 'd':
71906943f9SDavid du Colombier 		usbdebug++;
72906943f9SDavid du Colombier 		as = seprint(as, ae, " -d");
73906943f9SDavid du Colombier 		break;
74ed868a7cSDavid du Colombier 	case 'N':
75ed868a7cSDavid du Colombier 		as = seprint(as, ae, " -N %s", EARGF(usage()));
76ed868a7cSDavid du Colombier 		break;
77906943f9SDavid du Colombier 	case 'm':
78906943f9SDavid du Colombier 		mnt = EARGF(usage());
79906943f9SDavid du Colombier 		break;
80906943f9SDavid du Colombier 	case 's':
81906943f9SDavid du Colombier 		srv = EARGF(usage());
82ed868a7cSDavid du Colombier 		break;
83906943f9SDavid du Colombier 	default:
84906943f9SDavid du Colombier 		usage();
85906943f9SDavid du Colombier 	}ARGEND
86906943f9SDavid du Colombier 
87906943f9SDavid du Colombier 	rfork(RFNOTEG);
88906943f9SDavid du Colombier 	threadsetgrp(threadid());
89906943f9SDavid du Colombier 	fmtinstall('U', Ufmt);
90906943f9SDavid du Colombier 	usbfsinit(srv, mnt, &usbdirfs, MAFTER|MCREATE);
91906943f9SDavid du Colombier 	startdevs(args, argv, argc, matchether, nil, ethermain);
92906943f9SDavid du Colombier 	threadexits(nil);
93906943f9SDavid du Colombier }
94