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