xref: /plan9-contrib/sys/src/cmd/usb/ether/main.c (revision 906943f9f6b8411972abb5e3a03ed19f74be7ccc)
1*906943f9SDavid du Colombier /*
2*906943f9SDavid du Colombier  * usb/ether - usb ethernet adapter.
3*906943f9SDavid du Colombier  * BUG: This should use /dev/etherfile to
4*906943f9SDavid du Colombier  * use the kernel ether device code.
5*906943f9SDavid du Colombier  */
6*906943f9SDavid du Colombier #include <u.h>
7*906943f9SDavid du Colombier #include <libc.h>
8*906943f9SDavid du Colombier #include <fcall.h>
9*906943f9SDavid du Colombier #include <thread.h>
10*906943f9SDavid du Colombier #include "usb.h"
11*906943f9SDavid du Colombier #include "usbfs.h"
12*906943f9SDavid du Colombier #include "ether.h"
13*906943f9SDavid du Colombier 
14*906943f9SDavid du Colombier enum
15*906943f9SDavid du Colombier {
16*906943f9SDavid du Colombier 	Arglen = 80,
17*906943f9SDavid du Colombier };
18*906943f9SDavid du Colombier 
19*906943f9SDavid du Colombier static void
20*906943f9SDavid du Colombier usage(void)
21*906943f9SDavid du Colombier {
22*906943f9SDavid du Colombier 	fprint(2, "usage: %s [-Dd] [-m mnt] [-s srv] [dev...]\n", argv0);
23*906943f9SDavid du Colombier 	threadexitsall("usage");
24*906943f9SDavid du Colombier }
25*906943f9SDavid du Colombier 
26*906943f9SDavid du Colombier /*
27*906943f9SDavid du Colombier  * Ether devices may be weird.
28*906943f9SDavid du Colombier  * Be optimistic and try to use any communication
29*906943f9SDavid du Colombier  * device or one of the `vendor specific class' devices
30*906943f9SDavid du Colombier  * that we know are ethernets.
31*906943f9SDavid du Colombier  */
32*906943f9SDavid du Colombier static int
33*906943f9SDavid du Colombier matchether(char *info, void*)
34*906943f9SDavid du Colombier {
35*906943f9SDavid du Colombier 	Cinfo *ip;
36*906943f9SDavid du Colombier 	char buf[50];
37*906943f9SDavid du Colombier 
38*906943f9SDavid du Colombier 	/*
39*906943f9SDavid du Colombier 	 * I have an ether reporting comms.0.0
40*906943f9SDavid du Colombier 	 */
41*906943f9SDavid du Colombier 	if(strstr(info, "comms") != nil)
42*906943f9SDavid du Colombier 		return 0;
43*906943f9SDavid du Colombier 	for(ip = cinfo; ip->vid != 0; ip++){
44*906943f9SDavid du Colombier 		snprint(buf, sizeof(buf), "vid %#06x did %#06x", ip->vid, ip->did);
45*906943f9SDavid du Colombier 		if(strstr(info, buf) != nil)
46*906943f9SDavid du Colombier 			return 0;
47*906943f9SDavid du Colombier 	}
48*906943f9SDavid du Colombier 	return -1;
49*906943f9SDavid du Colombier }
50*906943f9SDavid du Colombier 
51*906943f9SDavid du Colombier void
52*906943f9SDavid du Colombier threadmain(int argc, char **argv)
53*906943f9SDavid du Colombier {
54*906943f9SDavid du Colombier 	char args[Arglen];
55*906943f9SDavid du Colombier 	char *as;
56*906943f9SDavid du Colombier 	char *ae;
57*906943f9SDavid du Colombier 	char *srv;
58*906943f9SDavid du Colombier 	char *mnt;
59*906943f9SDavid du Colombier 
60*906943f9SDavid du Colombier 	srv = nil;
61*906943f9SDavid du Colombier 	mnt = "/net";
62*906943f9SDavid du Colombier 
63*906943f9SDavid du Colombier 	quotefmtinstall();
64*906943f9SDavid du Colombier 	ae = args+sizeof(args);
65*906943f9SDavid du Colombier 	as = seprint(args, ae, "ether");
66*906943f9SDavid du Colombier 	ARGBEGIN{
67*906943f9SDavid du Colombier 	case 'D':
68*906943f9SDavid du Colombier 		usbfsdebug++;
69*906943f9SDavid du Colombier 		break;
70*906943f9SDavid du Colombier 	case 'd':
71*906943f9SDavid du Colombier 		usbdebug++;
72*906943f9SDavid du Colombier 		as = seprint(as, ae, " -d");
73*906943f9SDavid du Colombier 		break;
74*906943f9SDavid du Colombier 	case 'm':
75*906943f9SDavid du Colombier 		mnt = EARGF(usage());
76*906943f9SDavid du Colombier 		break;
77*906943f9SDavid du Colombier 	case 's':
78*906943f9SDavid du Colombier 		srv = EARGF(usage());
79*906943f9SDavid du Colombier 	default:
80*906943f9SDavid du Colombier 		usage();
81*906943f9SDavid du Colombier 	}ARGEND
82*906943f9SDavid du Colombier 
83*906943f9SDavid du Colombier 	rfork(RFNOTEG);
84*906943f9SDavid du Colombier 	threadsetgrp(threadid());
85*906943f9SDavid du Colombier 	fmtinstall('U', Ufmt);
86*906943f9SDavid du Colombier 	usbfsinit(srv, mnt, &usbdirfs, MAFTER|MCREATE);
87*906943f9SDavid du Colombier 	startdevs(args, argv, argc, matchether, nil, ethermain);
88*906943f9SDavid du Colombier 	threadexits(nil);
89*906943f9SDavid du Colombier }
90