Module Name: src
Committed By: pooka
Date: Sat Oct 3 19:07:33 UTC 2009
Modified Files:
src/sys/rump/dev/wip/librumpusbhc: rumpusbhc.c
Log Message:
probe and attach ugen0 through ugen3
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c
diff -u src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c:1.1 src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c:1.2
--- src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c:1.1 Fri Oct 2 15:35:46 2009
+++ src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c Sat Oct 3 19:07:33 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpusbhc.c,v 1.1 2009/10/02 15:35:46 pooka Exp $ */
+/* $NetBSD: rumpusbhc.c,v 1.2 2009/10/03 19:07:33 pooka Exp $ */
/*
* Copyright (c) 2009 Antti Kantee. All Rights Reserved.
@@ -60,11 +60,8 @@
* It's still somewhat under the hammer ....
*/
-/* hardcoded /dev/ugenN for now */
-#define UGENDEV 2
-
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpusbhc.c,v 1.1 2009/10/02 15:35:46 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpusbhc.c,v 1.2 2009/10/03 19:07:33 pooka Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -109,11 +106,11 @@
NULL,
};
-static int rumpusbhc_match(struct device *, struct cfdata *, void *);
+static int rumpusbhc_probe(struct device *, struct cfdata *, void *);
static void rumpusbhc_attach(struct device *, struct device *, void *);
CFATTACH_DECL_NEW(rumpusbhc, sizeof(struct rumpusbhc_softc),
- rumpusbhc_match, rumpusbhc_attach, NULL, NULL);
+ rumpusbhc_probe, rumpusbhc_attach, NULL, NULL);
CFDRIVER_DECL(rumpusbhc, DV_DULL, rumpusbhc_attrs);
struct cfparent rumpusbhcpar = {
@@ -122,18 +119,22 @@
DVUNIT_ANY
};
+/* probe ugen0 through ugen3 */
struct cfdata rumpusbhc_cfdata[] = {
- { "rumpusbhc", "rumpusbhc", 0, FSTATE_STAR, NULL, 0, &rumpusbhcpar},
+ { "rumpusbhc", "rumpusbhc", 0, FSTATE_NOTFOUND, NULL, 0, &rumpusbhcpar},
+ { "rumpusbhc", "rumpusbhc", 1, FSTATE_NOTFOUND, NULL, 0, &rumpusbhcpar},
+ { "rumpusbhc", "rumpusbhc", 2, FSTATE_NOTFOUND, NULL, 0, &rumpusbhcpar},
+ { "rumpusbhc", "rumpusbhc", 3, FSTATE_NOTFOUND, NULL, 0, &rumpusbhcpar},
};
#define UGENDEV_BASESTR "/dev/ugen"
#define UGENDEV_BUFSIZE 32
static void
-makeugendevstr(struct rumpusbhc_softc *sc, int endpoint, char *buf)
+makeugendevstr(int devnum, int endpoint, char *buf)
{
CTASSERT(UGENDEV_BUFSIZE > sizeof(UGENDEV_BASESTR)+sizeof("0.00")+1);
- sprintf(buf, "%s%d.%02d", UGENDEV_BASESTR, sc->sc_devnum, endpoint);
+ sprintf(buf, "%s%d.%02d", UGENDEV_BASESTR, devnum, endpoint);
}
/*
@@ -722,7 +723,7 @@
oflags = O_RDWR;
}
- makeugendevstr(sc, endpt, buf);
+ makeugendevstr(sc->sc_devnum, endpt, buf);
fd = rumpuser_open(buf, oflags, &error);
if (fd == -1)
return USBD_INVAL; /* XXX: no mapping */
@@ -813,15 +814,24 @@
}
static int
-rumpusbhc_match(struct device *parent, struct cfdata *match, void *aux)
+rumpusbhc_probe(struct device *parent, struct cfdata *match, void *aux)
{
+ char buf[UGENDEV_BUFSIZE];
+ int fd, error;
+ makeugendevstr(match->cf_unit, 0, buf);
+ fd = rumpuser_open(buf, O_RDWR, &error);
+ if (fd == -1)
+ return 0;
+
+ rumpuser_close(fd, &error);
return 1;
}
static void
rumpusbhc_attach(struct device *parent, struct device *self, void *aux)
{
+ struct mainbus_attach_args *maa = aux;
struct rumpusbhc_softc *sc = device_private(self);
char buf[UGENDEV_BUFSIZE];
int error;
@@ -832,14 +842,13 @@
memset(&sc->sc_ugenfd, -1, sizeof(sc->sc_ugenfd));
memset(&sc->sc_fdmodes, -1, sizeof(sc->sc_fdmodes));
- sc->sc_devnum = UGENDEV;
-
sc->sc_bus.usbrev = USBREV_2_0;
sc->sc_bus.methods = &rumpusbhc_bus_methods;
sc->sc_bus.hci_private = sc;
sc->sc_bus.pipe_size = sizeof(struct rumpusbhc_pipe);
+ sc->sc_devnum = maa->maa_unit;
- makeugendevstr(sc, 0, buf);
+ makeugendevstr(sc->sc_devnum, 0, buf);
sc->sc_ugenfd[UGEN_EPT_CTRL] = rumpuser_open(buf, O_RDWR, &error);
if (error)
panic("rumpusbhc_attach: failed to open ctrl ept %s\n", buf);