From owner-svn-src-stable@FreeBSD.ORG Thu Jul 9 15:29:27 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 13F441065690; Thu, 9 Jul 2009 15:29:27 +0000 (UTC) (envelope-from n_hibma@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 01D4D8FC0C; Thu, 9 Jul 2009 15:29:27 +0000 (UTC) (envelope-from n_hibma@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n69FTQcR089254; Thu, 9 Jul 2009 15:29:26 GMT (envelope-from n_hibma@svn.freebsd.org) Received: (from n_hibma@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n69FTQ71089251; Thu, 9 Jul 2009 15:29:26 GMT (envelope-from n_hibma@svn.freebsd.org) Message-Id: <200907091529.n69FTQ71089251@svn.freebsd.org> From: Nick Hibma Date: Thu, 9 Jul 2009 15:29:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195499 - stable/7/sys/dev/usb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Jul 2009 15:29:27 -0000 Author: n_hibma Date: Thu Jul 9 15:29:26 2009 New Revision: 195499 URL: http://svn.freebsd.org/changeset/base/195499 Log: Improve the debugging output: Make it switchable through a sysctl for ucom and u3g. Try to reset the device if it produces ucomwritecb and ucomreadcb errors. Modified: stable/7/sys/dev/usb/u3g.c stable/7/sys/dev/usb/ucom.c Modified: stable/7/sys/dev/usb/u3g.c ============================================================================== --- stable/7/sys/dev/usb/u3g.c Thu Jul 9 15:27:07 2009 (r195498) +++ stable/7/sys/dev/usb/u3g.c Thu Jul 9 15:29:26 2009 (r195499) @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -51,16 +52,13 @@ #endif #include "usbdevs.h" -//#define U3G_DEBUG -#ifdef U3G_DEBUG -#define DPRINTF(x...) device_printf(sc->sc_dev, ##x) -#define bootverbose (1) -#else -#define DPRINTF(x...) /* nop */ -#endif +static int u3gdebug = 1; +SYSCTL_NODE(_hw_usb, OID_AUTO, u3g, CTLFLAG_RW, 0, "USB u3g"); +SYSCTL_INT(_hw_usb_u3g, OID_AUTO, debug, CTLFLAG_RW, + &u3gdebug, 0, "u3g debug level"); +#define DPRINTF(x...) if (u3gdebug) device_printf(sc->sc_dev, ##x) -#define U3G_MAXPORTS 4 -#define U3G_CONFIG_INDEX 0 +#define U3G_MAXPORTS 6 struct u3g_softc { struct ucom_softc sc_ucom[U3G_MAXPORTS]; @@ -258,6 +256,9 @@ u3g_attach(device_t self) sprintf(devnamefmt,"U%d.%%d", device_get_unit(self)); int portno = 0; for (i = 0; i < uaa->nifaces && portno < U3G_MAXPORTS; i++) { + DPRINTF("Interface %d of %d, %sin use\n", + i, uaa->nifaces, + (uaa->ifaces[i]? "not ":"")); if (uaa->ifaces[i] == NULL) continue; @@ -268,7 +269,7 @@ u3g_attach(device_t self) * Claim the first umass device (cdX) as it contains * only Windows drivers anyway (CD-ROM), hiding it. */ - if (!bootverbose) + if (!(bootverbose || u3gdebug)) if (uaa->vendor == USB_VENDOR_HUAWEI) if (id->bInterfaceNumber == 2) uaa->ifaces[i] = NULL; @@ -279,6 +280,9 @@ u3g_attach(device_t self) int claim_iface = 0; for (n = 0; n < id->bNumEndpoints && portno < U3G_MAXPORTS; n++) { ed = usbd_interface2endpoint_descriptor(uaa->ifaces[i], n); + DPRINTF(" Endpoint %d of %d%s\n", + n, id->bNumEndpoints, + (ed? "":"no descriptor")); if (ed == NULL) continue; if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN @@ -585,7 +589,7 @@ u3gstub_BBB_cmd(struct u3gstub_softc *sc usbd_errstr(err)); } } else if (err != USBD_NORMAL_COMPLETION) { - if (bootverbose) + if (u3gdebug) device_printf(sc->sc_dev, "Failed to retrieve CSW to " "change to modem mode: %s\n", @@ -609,13 +613,10 @@ u3gstub_sierra_init(struct u3gstub_softc USETW(req.wLength, 0); err = usbd_do_request(sc->sc_udev, &req, 0); - if (bootverbose) { - if (err) { - device_printf(sc->sc_dev, - "Failed to send Sierra request: %s\n", - usbd_errstr(err)); - } - } + if (err && u3gdebug) + device_printf(sc->sc_dev, + "Failed to send Sierra request: %s\n", + usbd_errstr(err)); return 1; } @@ -633,13 +634,10 @@ u3gstub_huawei_init(struct u3gstub_softc USETW(req.wLength, 0); err = usbd_do_request(sc->sc_udev, &req, 0); - if (bootverbose) { - if (err) { - device_printf(sc->sc_dev, - "Failed to send Huawei request: %s\n", - usbd_errstr(err)); - } - } + if (err && u3gdebug) + device_printf(sc->sc_dev, + "Failed to send Huawei request: %s\n", + usbd_errstr(err)); return 1; } @@ -659,19 +657,19 @@ u3gstub_do_init(void *priv) u3g_dev_type = u3g_lookup(sc->sc_vendor, sc->sc_product); switch (u3g_dev_type->init) { case U3GINIT_HUAWEI: - if (bootverbose) + if (bootverbose || u3gdebug) device_printf(sc->sc_dev, "changing Huawei modem to modem mode\n"); u3gstub_huawei_init(sc); break; case U3GINIT_SIERRA: - if (bootverbose) + if (bootverbose || u3gdebug) device_printf(sc->sc_dev, "changing Sierra modem to modem mode\n"); u3gstub_sierra_init(sc); break; case U3GINIT_EJECT: - if (bootverbose) + if (bootverbose || u3gdebug) device_printf(sc->sc_dev, "sending CD eject command to change to modem mode\n"); while (!sc->sc_dying @@ -680,20 +678,20 @@ u3gstub_do_init(void *priv) ; /* nop */ break; case U3GINIT_ZTESTOR: - if (bootverbose) + if (bootverbose || u3gdebug) device_printf(sc->sc_dev, "changing ZTE STOR modem to modem mode\n"); u3gstub_BBB_cmd(sc, ztestor_cmd); break; case U3GINIT_CMOTECH: - if (bootverbose) + if (bootverbose || u3gdebug) device_printf(sc->sc_dev, "changing CMOTECH modem to modem mode\n"); u3gstub_BBB_cmd(sc, cmotech_cmd); break; case U3GINIT_WAIT: default: - if (bootverbose) + if (bootverbose || u3gdebug) device_printf(sc->sc_dev, "waiting for modem to change to modem mode\n"); /* nop */ @@ -726,7 +724,7 @@ u3gstub_match(device_t self) id = usbd_get_interface_descriptor(uaa->iface); if (id && id->bInterfaceNumber == 0 && id->bInterfaceClass == UICLASS_MASS) { - if (!bootverbose) + if (u3gdebug == 0) device_quiet(self); return UMATCH_VENDOR_PRODUCT; @@ -745,7 +743,7 @@ u3gstub_attach(device_t self) usb_endpoint_descriptor_t *ed; int i, err; - if (!bootverbose) + if (u3gdebug == 0) device_quiet(self); for (i = 0; i < uaa->nifaces; i++) Modified: stable/7/sys/dev/usb/ucom.c ============================================================================== --- stable/7/sys/dev/usb/ucom.c Thu Jul 9 15:27:07 2009 (r195498) +++ stable/7/sys/dev/usb/ucom.c Thu Jul 9 15:29:26 2009 (r195499) @@ -95,7 +95,6 @@ __FBSDID("$FreeBSD$"); #include -#ifdef USB_DEBUG static int ucomdebug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, ucom, CTLFLAG_RW, 0, "USB ucom"); SYSCTL_INT(_hw_usb_ucom, OID_AUTO, debug, CTLFLAG_RW, @@ -109,10 +108,6 @@ SYSCTL_INT(_hw_usb_ucom, OID_AUTO, debug if (ucomdebug > (n)) \ printf x; \ } while (0) -#else -#define DPRINTF(x) -#define DPRINTFN(n, x) -#endif static int ucom_modevent(module_t, int, void *); static void ucom_cleanup(struct ucom_softc *); @@ -690,11 +685,19 @@ ucomwritecb(usbd_xfer_handle xfer, usbd_ goto error; if (status != USBD_NORMAL_COMPLETION) { - printf("%s: ucomwritecb: %s\n", - device_get_nameunit(sc->sc_dev), usbd_errstr(status)); - if (status == USBD_STALLED) + if (status == USBD_STALLED) { + printf("%s: ucomwritecb: STALLED; clearing.\n", + device_get_nameunit(sc->sc_dev)); usbd_clear_endpoint_stall_async(sc->sc_bulkout_pipe); - /* XXX we should restart after some delay. */ + } else if (status == USBD_IOERROR) { + printf("%s: ucomwritecb: IOERROR; resetting device.\n", + device_get_nameunit(sc->sc_dev)); + usbd_reset_device(sc->sc_udev); + } else if (status != USBD_CANCELLED) { + printf("%s: ucomwritecb: %s\n", + device_get_nameunit(sc->sc_dev), + usbd_errstr(status)); + } goto error; } @@ -774,7 +777,21 @@ ucomreadcb(usbd_xfer_handle xfer, usbd_p sc->sc_state |= UCS_RXSTOP; if (status == USBD_STALLED) usbd_clear_endpoint_stall_async(sc->sc_bulkin_pipe); - /* XXX we should restart after some delay. */ + else if (status == USBD_IOERROR) + usbd_reset_device(sc->sc_udev); + if (status == USBD_STALLED) { + printf("%s: ucomreadcb: STALLED; clearing.\n", + device_get_nameunit(sc->sc_dev)); + usbd_clear_endpoint_stall_async(sc->sc_bulkin_pipe); + } else if (status == USBD_IOERROR) { + printf("%s: ucomreadcb: IOERROR; resetting device.\n", + device_get_nameunit(sc->sc_dev)); + usbd_reset_device(sc->sc_udev); + } else if (status != USBD_CANCELLED) { + printf("%s: ucomreadcb: %s\n", + device_get_nameunit(sc->sc_dev), + usbd_errstr(status)); + } return; } sc->sc_state |= UCS_RXSTOP;