summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/serial/u3g.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/serial/u3g.c')
-rw-r--r--sys/dev/usb/serial/u3g.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/sys/dev/usb/serial/u3g.c b/sys/dev/usb/serial/u3g.c
index 4bc42ae..9376e9e 100644
--- a/sys/dev/usb/serial/u3g.c
+++ b/sys/dev/usb/serial/u3g.c
@@ -411,7 +411,6 @@ static const struct usb_device_id u3g_devs[] = {
U3G_DEV(QUALCOMMINC, E0078, 0),
U3G_DEV(QUALCOMMINC, E0082, 0),
U3G_DEV(QUALCOMMINC, E0086, 0),
- U3G_DEV(QUALCOMMINC, E2000, U3GINIT_SCSIEJECT),
U3G_DEV(QUALCOMMINC, E2002, 0),
U3G_DEV(QUALCOMMINC, E2003, 0),
U3G_DEV(QUALCOMMINC, MF626, 0),
@@ -655,6 +654,12 @@ u3g_test_autoinst(void *arg, struct usb_device *udev,
if (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa))
return; /* no device match */
+ if (bootverbose) {
+ printf("Ejecting 0x%04x:0x%04x using method %ld\n",
+ uaa->info.idVendor, uaa->info.idProduct,
+ USB_GET_DRIVER_INFO(uaa));
+ }
+
switch (USB_GET_DRIVER_INFO(uaa)) {
case U3GINIT_HUAWEI:
error = u3g_huawei_init(udev);
@@ -669,7 +674,8 @@ u3g_test_autoinst(void *arg, struct usb_device *udev,
error = usb_msc_eject(udev, 0, MSC_EJECT_REZERO);
break;
case U3GINIT_ZTESTOR:
- error = usb_msc_eject(udev, 0, MSC_EJECT_ZTESTOR);
+ error = usb_msc_eject(udev, 0, MSC_EJECT_STOPUNIT);
+ error |= usb_msc_eject(udev, 0, MSC_EJECT_ZTESTOR);
break;
case U3GINIT_CMOTECH:
error = usb_msc_eject(udev, 0, MSC_EJECT_CMOTECH);
@@ -818,8 +824,10 @@ u3g_attach(device_t dev)
DPRINTF("ucom_attach failed\n");
goto detach;
}
+ ucom_set_pnpinfo_usb(&sc->sc_super_ucom, dev);
device_printf(dev, "Found %u port%s.\n", sc->sc_numports,
sc->sc_numports > 1 ? "s":"");
+
return (0);
detach:
@@ -831,15 +839,15 @@ static int
u3g_detach(device_t dev)
{
struct u3g_softc *sc = device_get_softc(dev);
- uint8_t m;
+ uint8_t subunit;
DPRINTF("sc=%p\n", sc);
/* NOTE: It is not dangerous to detach more ports than attached! */
- ucom_detach(&sc->sc_super_ucom, sc->sc_ucom, U3G_MAXPORTS);
+ ucom_detach(&sc->sc_super_ucom, sc->sc_ucom);
- for (m = 0; m != U3G_MAXPORTS; m++)
- usbd_transfer_unsetup(sc->sc_xfer[m], U3G_N_TRANSFER);
+ for (subunit = 0; subunit != U3G_MAXPORTS; subunit++)
+ usbd_transfer_unsetup(sc->sc_xfer[subunit], U3G_N_TRANSFER);
mtx_destroy(&sc->sc_mtx);
return (0);
@@ -851,7 +859,7 @@ u3g_start_read(struct ucom_softc *ucom)
struct u3g_softc *sc = ucom->sc_parent;
/* start read endpoint */
- usbd_transfer_start(sc->sc_xfer[ucom->sc_local_unit][U3G_BULK_RD]);
+ usbd_transfer_start(sc->sc_xfer[ucom->sc_subunit][U3G_BULK_RD]);
return;
}
@@ -861,7 +869,7 @@ u3g_stop_read(struct ucom_softc *ucom)
struct u3g_softc *sc = ucom->sc_parent;
/* stop read endpoint */
- usbd_transfer_stop(sc->sc_xfer[ucom->sc_local_unit][U3G_BULK_RD]);
+ usbd_transfer_stop(sc->sc_xfer[ucom->sc_subunit][U3G_BULK_RD]);
return;
}
@@ -870,7 +878,7 @@ u3g_start_write(struct ucom_softc *ucom)
{
struct u3g_softc *sc = ucom->sc_parent;
- usbd_transfer_start(sc->sc_xfer[ucom->sc_local_unit][U3G_BULK_WR]);
+ usbd_transfer_start(sc->sc_xfer[ucom->sc_subunit][U3G_BULK_WR]);
return;
}
@@ -879,7 +887,7 @@ u3g_stop_write(struct ucom_softc *ucom)
{
struct u3g_softc *sc = ucom->sc_parent;
- usbd_transfer_stop(sc->sc_xfer[ucom->sc_local_unit][U3G_BULK_WR]);
+ usbd_transfer_stop(sc->sc_xfer[ucom->sc_subunit][U3G_BULK_WR]);
return;
}
OpenPOWER on IntegriCloud