Module Name:    src
Committed By:   reinoud
Date:           Mon Mar 10 19:55:18 UTC 2014

Modified Files:
        src/sys/dev/usb: uslsa.c

Log Message:
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.19 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.19
--- src/sys/dev/usb/uslsa.c:1.18	Sat Jan 14 21:15:48 2012
+++ src/sys/dev/usb/uslsa.c	Mon Mar 10 19:55:18 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: uslsa.c,v 1.18 2012/01/14 21:15:48 jakllsch Exp $ */
+/* $NetBSD: uslsa.c,v 1.19 2014/03/10 19:55:18 reinoud 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.19 2014/03/10 19:55:18 reinoud 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;

Reply via email to