PERFORCE change 107514 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Oct 8 14:33:00 PDT 2006
http://perforce.freebsd.org/chv.cgi?CH=107514
Change 107514 by hselasky at hselasky_mini_itx on 2006/10/08 21:32:00
UCOM API change: Pass initializers to ucom_attach() instead
of writing them directly to the "ucom_softc", except sc_portno.
Make the UCOM-layer multi-port friendly, by allowing
to specify number of "sub_units" when attaching a ucom device.
Allow calls to "ucom_get_data()" and "ucom_put_data()"
outside open/close. This makes supporting multi-port devices
easier. Some other small changes.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/ubsa.c#12 edit
.. //depot/projects/usb/src/sys/dev/usb/ucom.c#11 edit
.. //depot/projects/usb/src/sys/dev/usb/ucomvar.h#7 edit
.. //depot/projects/usb/src/sys/dev/usb/ucycom.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/ufoma.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb/uftdi.c#11 edit
.. //depot/projects/usb/src/sys/dev/usb/umct.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/umodem.c#12 edit
.. //depot/projects/usb/src/sys/dev/usb/uplcom.c#11 edit
.. //depot/projects/usb/src/sys/dev/usb/uvisor.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb/uvscom.c#13 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/ubsa.c#12 (text+ko) ====
@@ -440,13 +440,15 @@
{ 0, 0 }
};
+static devclass_t ubsa_devclass;
+
static driver_t ubsa_driver = {
- .name = "ucom",
+ .name = "ubsa",
.methods = ubsa_methods,
.size = sizeof(struct ubsa_softc),
};
-DRIVER_MODULE(ubsa, uhub, ubsa_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(ubsa, uhub, ubsa_driver, ubsa_devclass, usbd_driver_load, 0);
MODULE_DEPEND(ubsa, usb, 1, 1, 1);
MODULE_DEPEND(ubsa, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(ubsa, UBSA_MODVER);
@@ -526,12 +528,8 @@
sc->sc_dtr = -1;
sc->sc_rts = -1;
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &ubsa_callback;
-
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &ubsa_callback, &Giant);
if (error) {
DPRINTF(0, "ucom_attach failed\n");
goto detach;
@@ -551,7 +549,7 @@
DPRINTF(0, "sc=%p\n", sc);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer, UBSA_N_TRANSFER);
==== //depot/projects/usb/src/sys/dev/usb/ucom.c#11 (text+ko) ====
@@ -97,7 +97,19 @@
#define DPRINTF(...)
#endif
+static uint8_t
+ucom_units_alloc(uint32_t sub_units, uint32_t *p_root_unit);
+
static void
+ucom_units_free(uint32_t root_unit, uint32_t sub_units);
+
+static int
+ucom_attach_sub(struct ucom_softc *sc);
+
+static void
+ucom_detach_sub(struct ucom_softc *sc);
+
+static void
ucom_shutdown(struct ucom_softc *sc);
static int
@@ -134,8 +146,6 @@
static void
ucom_stop_write(struct tty *tp, int fflags);
-devclass_t ucom_devclass;
-
static moduledata_t ucom_mod = {
"ucom",
NULL,
@@ -146,25 +156,153 @@
MODULE_DEPEND(ucom, usb, 1, 1, 1);
MODULE_VERSION(ucom, UCOM_MODVER);
+#define UCOM_UNIT_MAX 0x1000 /* exclusive */
+
+static uint8_t ucom_bitmap[(UCOM_UNIT_MAX+7)/8];
+
+static uint8_t
+ucom_units_alloc(uint32_t sub_units, uint32_t *p_root_unit)
+{
+ uint32_t n;
+ uint32_t o;
+ uint32_t x;
+ uint32_t max = UCOM_UNIT_MAX - (UCOM_UNIT_MAX % sub_units);
+ uint8_t error = 1;
+
+ mtx_lock(&Giant);
+
+ for (n = 0; n < max; n += sub_units) {
+
+ /* check for free consecutive bits */
+
+ for (o = 0; o < sub_units; o++) {
+
+ x = n + o;
+
+ if (ucom_bitmap[x/8] & (1<< (x % 8))) {
+ goto skip;
+ }
+ }
+
+ /* allocate */
+
+ for (o = 0; o < sub_units; o++) {
+
+ x = n + o;
+
+ ucom_bitmap[x/8] |= (1<< (x % 8));
+ }
+
+ *p_root_unit = n;
+
+ error = 0;
+
+ break;
+
+ skip: ;
+ }
+
+ mtx_unlock(&Giant);
+
+ return error;
+}
+
+static void
+ucom_units_free(uint32_t root_unit, uint32_t sub_units)
+{
+ uint32_t x;
+
+ mtx_lock(&Giant);
+
+ while(sub_units--) {
+ x = root_unit + sub_units;
+ ucom_bitmap[x/8] &= ~(1<<(x%8));
+ }
+
+ mtx_unlock(&Giant);
+
+ return;
+}
+
+/*
+ * "N" sub_units are setup at a time. All sub-units will
+ * be given sequential unit numbers. The number of
+ * sub-units can be used to differentiate among
+ * different types of devices.
+ *
+ * The mutex pointed to by "p_mtx" is applied before all
+ * callbacks are called back. Also "p_mtx" must be applied
+ * before calling into the ucom-layer! Currently only Giant
+ * is supported.
+ */
int
-ucom_attach(struct ucom_softc *sc, device_t dev)
+ucom_attach(struct ucom_softc *sc, uint32_t sub_units, void *parent,
+ const struct ucom_callback *callback, struct mtx *p_mtx)
{
- struct tty *tp;
+ uint32_t n;
+ uint32_t root_unit;
int error = 0;
- int unit;
+
+ if ((p_mtx != &Giant) || /* XXX TTY layer requires Giant */
+ (sc == NULL) ||
+ (sub_units == 0) ||
+ (callback == NULL)) {
+ return EINVAL;
+ }
+
+ if (ucom_units_alloc(sub_units, &root_unit)) {
+ return ENOMEM;
+ }
+
+ for (n = 0; n < sub_units; n++, sc++) {
+ sc->sc_unit = root_unit + n;
+ sc->sc_parent_mtx = p_mtx;
+ sc->sc_parent = parent;
+ sc->sc_callback = callback;
+
+ mtx_lock(&Giant); /* XXX TTY layer */
+ error = ucom_attach_sub(sc);
+ mtx_unlock(&Giant); /* XXX TTY layer */
+
+ if (error) {
+ ucom_detach(sc - n, n);
+ ucom_units_free(root_unit + n, sub_units - n);
+ break;
+ }
+ sc->sc_flag |= UCOM_FLAG_ATTACHED;
+ }
+ return error;
+}
+
+/* NOTE: the following function will do nothing if
+ * structure pointed to by "sc" is zero.
+ */
+void
+ucom_detach(struct ucom_softc *sc, uint32_t sub_units)
+{
+ uint32_t n;
+
+ for (n = 0; n < sub_units; n++, sc++) {
+ if (sc->sc_flag & UCOM_FLAG_ATTACHED) {
+
+ mtx_lock(&Giant); /* XXX TTY layer */
+ ucom_detach_sub(sc);
+ mtx_unlock(&Giant); /* XXX TTY layer */
- mtx_assert(&Giant, MA_OWNED);
+ ucom_units_free(sc->sc_unit, 1);
- if (device_get_devclass(dev) != ucom_devclass) {
- /* NOTE: if all devices are not in the same
- * devclass, we get duplicate unit numbers
- * which will crash the TTY layer!
- */
- error = EINVAL;
- goto done;
+ /* avoid duplicate detach: */
+ sc->sc_flag &= ~UCOM_FLAG_ATTACHED;
+ }
}
+ return;
+}
- unit = device_get_unit(dev);
+static int
+ucom_attach_sub(struct ucom_softc *sc)
+{
+ struct tty *tp;
+ int error = 0;
tp = ttyalloc();
@@ -183,12 +321,12 @@
tp->t_modem = ucom_modem;
tp->t_ioctl = ucom_ioctl;
- DPRINTF(0, "tp = %p\n", tp);
+ DPRINTF(0, "tp = %p, unit = %d\n", tp, sc->sc_unit);
#ifndef TS_CALLOUT
-#define TS_CALLOUT NULL, unit, MINOR_CALLOUT /* compile fix for FreeBSD 6.x */
+#define TS_CALLOUT NULL, sc->sc_unit, MINOR_CALLOUT /* compile fix for FreeBSD 6.x */
#endif
- error = ttycreate(tp, TS_CALLOUT, "U%d", unit);
+ error = ttycreate(tp, TS_CALLOUT, "U%d", sc->sc_unit);
if (error) {
ttyfree(tp);
goto done;
@@ -198,23 +336,22 @@
TASK_INIT(&(sc->sc_task), 0, &ucom_notify, sc);
- DPRINTF(0, "ttycreate: ttyU%d\n", unit);
+ DPRINTF(0, "ttycreate: ttyU%d\n", sc->sc_unit);
done:
return error;
}
-void
-ucom_detach(struct ucom_softc *sc)
+static void
+ucom_detach_sub(struct ucom_softc *sc)
{
struct tty *tp = sc->sc_tty;
- mtx_assert(&Giant, MA_OWNED);
-
DPRINTF(0, "sc = %p, tp = %p\n", sc, sc->sc_tty);
sc->sc_flag |= UCOM_FLAG_GONE;
-
+ sc->sc_flag &= ~(UCOM_FLAG_READ_ON|
+ UCOM_FLAG_WRITE_ON);
if (tp) {
ttygone(tp);
@@ -299,6 +436,8 @@
}
}
+ sc->sc_flag |= UCOM_FLAG_READ_ON;
+
if (sc->sc_callback->ucom_start_read) {
(sc->sc_callback->ucom_start_read)(sc);
}
@@ -321,6 +460,9 @@
ucom_shutdown(sc);
+ sc->sc_flag &= ~(UCOM_FLAG_READ_ON|
+ UCOM_FLAG_WRITE_ON);
+
if (sc->sc_callback->ucom_stop_read) {
(sc->sc_callback->ucom_stop_read)(sc);
}
@@ -547,6 +689,8 @@
}
#if 0
+ sc->sc_flag &= ~UCOM_FLAG_READ_ON;
+
if (sc->sc_callback->ucom_stop_read) {
(sc->sc_callback->ucom_stop_read)(sc);
}
@@ -570,6 +714,8 @@
ttyldoptim(tp);
#if 0
+ sc->sc_flag |= UCOM_FLAG_READ_ON;
+
if (sc->sc_callback->ucom_start_read) {
(sc->sc_callback->ucom_start_read)(sc);
}
@@ -593,6 +739,8 @@
tp->t_state |= TS_BUSY;
+ sc->sc_flag |= UCOM_FLAG_WRITE_ON;
+
if (sc->sc_callback->ucom_start_write) {
(sc->sc_callback->ucom_start_write)(sc);
}
@@ -645,6 +793,10 @@
actlen[0] = 0;
+ if (!(sc->sc_flag & UCOM_FLAG_WRITE_ON)) {
+ return 0; /* multiport device polling */
+ }
+
if (tp->t_state & TS_TBLOCK) {
if ((sc->sc_mcr & SER_RTS) &&
(sc->sc_flag & UCOM_FLAG_RTS_IFLOW)) {
@@ -699,6 +851,10 @@
mtx_assert(&Giant, MA_OWNED);
+ if (!(sc->sc_flag & UCOM_FLAG_READ_ON)) {
+ return; /* multiport device polling */
+ }
+
/* set a flag to prevent recursation */
if (len == 0) {
==== //depot/projects/usb/src/sys/dev/usb/ucomvar.h#7 (text+ko) ====
@@ -105,13 +105,19 @@
const struct ucom_callback *sc_callback;
struct tty *sc_tty;
+ struct mtx *sc_parent_mtx;
void *sc_parent;
+ uint32_t sc_unit;
+
u_int16_t sc_portno;
u_int8_t sc_flag;
#define UCOM_FLAG_RTS_IFLOW 0x01 /* use RTS input flow control */
#define UCOM_FLAG_GONE 0x02 /* the device is gone */
+#define UCOM_FLAG_ATTACHED 0x04 /* set if attached */
+#define UCOM_FLAG_READ_ON 0x08 /* set if read is enabled */
+#define UCOM_FLAG_WRITE_ON 0x10 /* set if write is enabled */
u_int8_t sc_lsr;
u_int8_t sc_msr;
@@ -120,13 +126,11 @@
u_int8_t sc_last_status;
};
-extern devclass_t ucom_devclass;
-
extern int
-ucom_attach(struct ucom_softc *sc, device_t dev);
-
+ucom_attach(struct ucom_softc *sc, uint32_t sub_units, void *parent,
+ const struct ucom_callback *callback, struct mtx *p_mtx);
extern void
-ucom_detach(struct ucom_softc *);
+ucom_detach(struct ucom_softc *sc, uint32_t sub_units);
extern void
ucom_status_change(struct ucom_softc *);
@@ -134,7 +138,6 @@
extern u_int8_t
ucom_get_data(struct ucom_softc *sc, u_int8_t *buf, u_int32_t len,
u_int32_t *actlen);
-
extern void
ucom_put_data(struct ucom_softc *sc, u_int8_t *ptr, u_int16_t len);
==== //depot/projects/usb/src/sys/dev/usb/ucycom.c#8 (text+ko) ====
@@ -191,13 +191,15 @@
{ 0, 0 }
};
+static devclass_t ucycom_devclass;
+
static driver_t ucycom_driver = {
- .name = "ucom",
+ .name = "ucycom",
.methods = ucycom_methods,
.size = sizeof(struct ucycom_softc),
};
-DRIVER_MODULE(ucycom, uhub, ucycom_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(ucycom, uhub, ucycom_driver, ucycom_devclass, usbd_driver_load, 0);
MODULE_VERSION(ucycom, 1);
MODULE_DEPEND(ucycom, usb, 1, 1, 1);
@@ -339,12 +341,9 @@
goto detach;
}
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &ucycom_callback;
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &ucycom_callback, &Giant);
- error = ucom_attach(&(sc->sc_ucom), dev);
-
if (error) {
goto detach;
}
@@ -368,7 +367,7 @@
{
struct ucycom_softc *sc = device_get_softc(dev);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer, UCYCOM_ENDPT_MAX);
==== //depot/projects/usb/src/sys/dev/usb/ufoma.c#10 (text+ko) ====
@@ -397,13 +397,15 @@
{ 0, 0 }
};
+static devclass_t ufoma_devclass;
+
static driver_t ufoma_driver = {
- .name = "ucom",
+ .name = "ufoma",
.methods = ufoma_methods,
.size = sizeof(struct ufoma_softc),
};
-DRIVER_MODULE(ufoma, uhub, ufoma_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(ufoma, uhub, ufoma_driver, ufoma_devclass, usbd_driver_load, 0);
MODULE_DEPEND(ufoma, usb, 1, 1, 1);
MODULE_DEPEND(ufoma, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
@@ -520,14 +522,8 @@
sc->sc_currentmode = UMCPC_ACM_MODE_UNLINKED;
sc->sc_modetoactivate = mad->bMode[0];
- /* setup UCOM */
-
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &ufoma_callback;
-
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &ufoma_callback, &Giant);
if (error) {
DPRINTF(0, "ucom_attach failed\n");
goto detach;
@@ -562,7 +558,7 @@
mtx_unlock(&Giant);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_ctrl_xfer, UFOMA_CTRL_ENDPT_MAX);
==== //depot/projects/usb/src/sys/dev/usb/uftdi.c#11 (text+ko) ====
@@ -278,13 +278,15 @@
{ 0, 0 }
};
+static devclass_t uftdi_devclass;
+
static driver_t uftdi_driver = {
- .name = "ucom",
+ .name = "uftdi",
.methods = uftdi_methods,
.size = sizeof (struct uftdi_softc),
};
-DRIVER_MODULE(uftdi, uhub, uftdi_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(uftdi, uhub, uftdi_driver, uftdi_devclass, usbd_driver_load, 0);
MODULE_DEPEND(uftdi, usb, 1, 1, 1);
MODULE_DEPEND(uftdi, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
@@ -462,9 +464,7 @@
goto detach;
}
- sc->sc_ucom.sc_parent = sc;
sc->sc_ucom.sc_portno = FTDI_PIT_SIOA;
- sc->sc_ucom.sc_callback = &uftdi_callback;
if (uaa->iface) {
id = usbd_get_interface_descriptor(uaa->iface);
@@ -476,7 +476,8 @@
sc->sc_ucom.sc_portno += id->bInterfaceNumber;
}
- error = ucom_attach(&(sc->sc_ucom), dev);
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &uftdi_callback, &Giant);
if (error) {
goto detach;
@@ -500,7 +501,7 @@
mtx_unlock(&Giant);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer, UFTDI_ENDPT_MAX);
==== //depot/projects/usb/src/sys/dev/usb/umct.c#8 (text+ko) ====
@@ -292,13 +292,15 @@
{ 0, 0 }
};
+static devclass_t umct_devclass;
+
static driver_t umct_driver = {
- .name = "ucom",
+ .name = "umct",
.methods = umct_methods,
.size = sizeof(struct umct_softc),
};
-DRIVER_MODULE(umct, uhub, umct_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(umct, uhub, umct_driver, umct_devclass, usbd_driver_load, 0);
MODULE_DEPEND(umct, usb, 1, 1, 1);
MODULE_DEPEND(umct, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(umct, 1);
@@ -408,12 +410,8 @@
goto detach;
}
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &umct_callback;
-
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &umct_callback, &Giant);
if (error) {
goto detach;
}
@@ -436,7 +434,7 @@
mtx_unlock(&Giant);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer, UMCT_ENDPT_MAX);
==== //depot/projects/usb/src/sys/dev/usb/umodem.c#12 (text+ko) ====
@@ -343,13 +343,15 @@
{ 0, 0 }
};
+static devclass_t umodem_devclass;
+
static driver_t umodem_driver = {
- .name = "ucom",
+ .name = "umodem",
.methods = umodem_methods,
.size = sizeof(struct umodem_softc),
};
-DRIVER_MODULE(umodem, uhub, umodem_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(umodem, uhub, umodem_driver, umodem_devclass, usbd_driver_load, 0);
MODULE_DEPEND(umodem, usb, 1, 1, 1);
MODULE_DEPEND(umodem, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(umodem, UMODEM_MODVER);
@@ -511,12 +513,8 @@
sc->sc_dtr = -1;
sc->sc_break = -1;
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &umodem_callback;
-
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &umodem_callback, &Giant);
if (error) {
goto detach;
}
@@ -1089,7 +1087,7 @@
DPRINTF(0, "sc=%p\n", sc);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer_intr, UMODEM_N_INTR_TRANSFER);
==== //depot/projects/usb/src/sys/dev/usb/uplcom.c#11 (text+ko) ====
@@ -402,13 +402,15 @@
{ 0, 0 }
};
+static devclass_t uplcom_devclass;
+
static driver_t uplcom_driver = {
- .name = "ucom",
+ .name = "uplcom",
.methods = uplcom_methods,
.size = sizeof (struct uplcom_softc),
};
-DRIVER_MODULE(uplcom, uhub, uplcom_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(uplcom, uhub, uplcom_driver, uplcom_devclass, usbd_driver_load, 0);
MODULE_DEPEND(uplcom, usb, 1, 1, 1);
MODULE_DEPEND(uplcom, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(uplcom, UPLCOM_MODVER);
@@ -547,10 +549,6 @@
sc->sc_rts = -1;
sc->sc_break = -1;
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &uplcom_callback;
-
error = uplcom_reset(sc, uaa->device);
if (error) {
@@ -559,8 +557,8 @@
goto detach;
}
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &uplcom_callback, &Giant);
if (error) {
goto detach;
}
@@ -589,7 +587,7 @@
DPRINTF(0, "sc=%p\n", sc);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer_intr, UPLCOM_N_INTR_TRANSFER);
==== //depot/projects/usb/src/sys/dev/usb/uvisor.c#10 (text+ko) ====
@@ -281,13 +281,15 @@
{ 0, 0 }
};
+static devclass_t uvisor_devclass;
+
static driver_t uvisor_driver = {
- .name = "ucom",
+ .name = "uvisor",
.methods = uvisor_methods,
.size = sizeof (struct uvisor_softc),
};
-DRIVER_MODULE(uvisor, uhub, uvisor_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(uvisor, uhub, uvisor_driver, uvisor_devclass, usbd_driver_load, 0);
MODULE_DEPEND(uvisor, usb, 1, 1, 1);
MODULE_DEPEND(uvisor, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(uvisor, UVISOR_MODVER);
@@ -407,12 +409,8 @@
goto detach;
}
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &uvisor_callback;
-
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &uvisor_callback, &Giant);
if (error) {
DPRINTF(0, "ucom_attach failed\n");
goto detach;
@@ -432,7 +430,7 @@
DPRINTF(0, "sc=%p\n", sc);
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer, UVISOR_N_TRANSFER);
==== //depot/projects/usb/src/sys/dev/usb/uvscom.c#13 (text+ko) ====
@@ -377,13 +377,15 @@
{ 0, 0 }
};
+static devclass_t uvscom_devclass;
+
static driver_t uvscom_driver = {
- .name = "ucom",
+ .name = "uvscom",
.methods = uvscom_methods,
.size = sizeof (struct uvscom_softc),
};
-DRIVER_MODULE(uvscom, uhub, uvscom_driver, ucom_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(uvscom, uhub, uvscom_driver, uvscom_devclass, usbd_driver_load, 0);
MODULE_DEPEND(uvscom, usb, 1, 1, 1);
MODULE_DEPEND(uvscom, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(uvscom, UVSCOM_MODVER);
@@ -462,12 +464,8 @@
sc->sc_rts = -1;
sc->sc_line_ctrl = UVSCOM_LINE_INIT;
- sc->sc_ucom.sc_parent = sc;
- sc->sc_ucom.sc_portno = 0;
- sc->sc_ucom.sc_callback = &uvscom_callback;
-
- error = ucom_attach(&(sc->sc_ucom), dev);
-
+ error = ucom_attach(&(sc->sc_ucom), 1, sc,
+ &uvscom_callback, &Giant);
if (error) {
goto detach;
}
@@ -504,7 +502,7 @@
usbd_transfer_stop(sc->sc_xfer[4]);
}
- ucom_detach(&(sc->sc_ucom));
+ ucom_detach(&(sc->sc_ucom), 1);
usbd_transfer_unsetup(sc->sc_xfer, UVSCOM_N_TRANSFER);
More information about the p4-projects
mailing list