Module Name: src Committed By: snj Date: Tue May 10 23:10:59 UTC 2016
Modified Files: src/sys/dev/usb [netbsd-6]: uslsa.c Log Message: Pull up following revision(s) (requested by riastradh in ticket #1381): sys/dev/usb/uslsa.c: revision 1.19 Improve support for the CP2104. This particular device has a higher maximum baud rate and thus the SLSA_R_SET_BAUDDIV sets the wrong rate. Changed to code to use the SLSA_R_SET_BAUDRATE command and providing a fallback for the old SLSA_R_SET_BAUDDIV command if the device doesn't recognize the command. Unknown yet if the CP2101 has this command or not. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.18.2.1 src/sys/dev/usb/uslsa.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/dev/usb/uslsa.c diff -u src/sys/dev/usb/uslsa.c:1.18 src/sys/dev/usb/uslsa.c:1.18.2.1 --- src/sys/dev/usb/uslsa.c:1.18 Sat Jan 14 21:15:48 2012 +++ src/sys/dev/usb/uslsa.c Tue May 10 23:10:59 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: uslsa.c,v 1.18 2012/01/14 21:15:48 jakllsch Exp $ */ +/* $NetBSD: uslsa.c,v 1.18.2.1 2016/05/10 23:10:59 snj Exp $ */ /* from ugensa.c */ @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uslsa.c,v 1.18 2012/01/14 21:15:48 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uslsa.c,v 1.18.2.1 2016/05/10 23:10:59 snj Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -388,8 +388,11 @@ static int uslsa_param(void *vsc, int portno, struct termios *t) { struct uslsa_softc *sc; - int ret; + usb_device_request_t req; + usbd_status status; uint16_t value; + uint32_t baud; + int ret; sc = vsc; @@ -399,12 +402,27 @@ uslsa_param(void *vsc, int portno, struc return EIO; } - value = SLSA_RV_BAUDDIV(t->c_ospeed); + req.bmRequestType = UT_WRITE_VENDOR_INTERFACE; + req.bRequest = SLSA_R_SET_BAUDRATE; + USETW(req.wValue, 0); + USETW(req.wIndex, sc->sc_ifnum); + USETW(req.wLength, 4); - if ((ret = uslsa_request_set(sc, SLSA_R_SET_BAUDDIV, value)) != 0) { - device_printf(sc->sc_dev, "%s: SET_BAUDDIV failed\n", - __func__); - return ret; + baud = t->c_ospeed; + status = usbd_do_request(sc->sc_udev, &req, &baud); + if (status != USBD_NORMAL_COMPLETION) { + /* fallback method for devices that don't know SET_BAUDRATE */ + /* hope we calculate it right */ + device_printf(sc->sc_dev, "%s: set baudrate %d, failed %s," + " using set bauddiv\n", + __func__, baud, usbd_errstr(status)); + + value = SLSA_RV_BAUDDIV(t->c_ospeed); + if ((ret = uslsa_request_set(sc, SLSA_R_SET_BAUDDIV, value)) != 0) { + device_printf(sc->sc_dev, "%s: SET_BAUDDIV failed\n", + __func__); + return ret; + } } value = 0;