Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/usb Don't pretend to do zero length IN control trans...



details:   https://anonhg.NetBSD.org/src/rev/bd47318325b5
branches:  trunk
changeset: 341354:bd47318325b5
user:      skrll <skrll%NetBSD.org@localhost>
date:      Sun Nov 01 21:31:40 2015 +0000

description:
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.

diffstat:

 sys/dev/usb/uplcom.c |  40 ++++++++++++++++++++++++----------------
 1 files changed, 24 insertions(+), 16 deletions(-)

diffs (76 lines):

diff -r fd2e63684c8d -r bd47318325b5 sys/dev/usb/uplcom.c
--- a/sys/dev/usb/uplcom.c      Sun Nov 01 17:44:41 2015 +0000
+++ b/sys/dev/usb/uplcom.c      Sun Nov 01 21:31:40 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uplcom.c,v 1.75 2015/05/30 16:44:28 riastradh Exp $    */
+/*     $NetBSD: uplcom.c,v 1.76 2015/11/01 21:31:40 skrll 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.75 2015/05/30 16:44:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uplcom.c,v 1.76 2015/11/01 21:31:40 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -499,21 +499,20 @@
        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]))
 
@@ -525,13 +524,22 @@
        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",



Home | Main Index | Thread Index | Old Index