Module Name: src Committed By: snj Date: Sat Mar 25 17:26:53 UTC 2017
Modified Files: src/sys/dev/usb [netbsd-6]: uplcom.c Log Message: Pull up following revision(s) (requested by bad in ticket #1444): sys/dev/usb/uplcom.c: revision 1.76 Don't pretend to do zero length IN control transfers as dwctwo(4) (correctly according to usb 2.0 specification 8.5.3) uses IN status stage when no (zero length) data stage. Instead read into a 1 byte array. My uplcom(4) now works on RPI. To generate a diff of this commit: cvs rdiff -u -r1.73 -r1.73.2.1 src/sys/dev/usb/uplcom.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/uplcom.c diff -u src/sys/dev/usb/uplcom.c:1.73 src/sys/dev/usb/uplcom.c:1.73.2.1 --- src/sys/dev/usb/uplcom.c:1.73 Fri Dec 23 00:51:48 2011 +++ src/sys/dev/usb/uplcom.c Sat Mar 25 17:26:53 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: uplcom.c,v 1.73 2011/12/23 00:51:48 jakllsch Exp $ */ +/* $NetBSD: uplcom.c,v 1.73.2.1 2017/03/25 17:26:53 snj Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. * All rights reserved. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uplcom.c,v 1.73 2011/12/23 00:51:48 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uplcom.c,v 1.73.2.1 2017/03/25 17:26:53 snj Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -491,21 +491,20 @@ struct pl2303x_init { uint8_t request; uint16_t value; uint16_t index; - uint16_t length; }; static const struct pl2303x_init pl2303x[] = { - { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0 }, - { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404, 0, 0 }, - { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0 }, - { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0, 0 }, - { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0 }, - { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404, 1, 0 }, - { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0, 0 }, - { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0, 0 }, - { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0, 1, 0 }, - { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 1, 0, 0 }, - { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 2, 0x44, 0 } + { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0 }, + { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404, 0 }, + { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0 }, + { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0 }, + { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0 }, + { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x0404, 1 }, + { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8484, 0 }, + { UT_READ_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0x8383, 0 }, + { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 0, 1 }, + { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 1, 0 }, + { UT_WRITE_VENDOR_DEVICE, UPLCOM_SET_REQUEST, 2, 0x44 } }; #define N_PL2302X_INIT (sizeof(pl2303x)/sizeof(pl2303x[0])) @@ -517,13 +516,22 @@ uplcom_pl2303x_init(struct uplcom_softc int i; for (i = 0; i < N_PL2302X_INIT; i++) { + char buf[1]; + void *b; + req.bmRequestType = pl2303x[i].req_type; req.bRequest = pl2303x[i].request; USETW(req.wValue, pl2303x[i].value); USETW(req.wIndex, pl2303x[i].index); - USETW(req.wLength, pl2303x[i].length); + if (UT_GET_DIR(req.bmRequestType) == UT_READ) { + b = buf; + USETW(req.wLength, sizeof(buf)); + } else { + b = NULL; + USETW(req.wLength, 0); + } - err = usbd_do_request(sc->sc_udev, &req, 0); + err = usbd_do_request(sc->sc_udev, &req, b); if (err) { aprint_error_dev(sc->sc_dev, "uplcom_pl2303x_init failed: %s\n",