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.
This commit is contained in:
reinoud 2014-03-10 19:55:18 +00:00
parent 08ea4544e2
commit 7e71ecd76c
1 changed files with 26 additions and 8 deletions

View File

@ -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, struct termios *t)
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;