Source-Changes-HG archive

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

[src/netbsd-6]: src/sys/dev/usb Pull up following revision(s) (requested by r...



details:   https://anonhg.NetBSD.org/src/rev/6fb0ed8bd496
branches:  netbsd-6
changeset: 774440:6fb0ed8bd496
user:      riz <riz%NetBSD.org@localhost>
date:      Mon Aug 13 20:29:32 2012 +0000

description:
Pull up following revision(s) (requested by riastradh in ticket #495):
        sys/dev/usb/uftdi.c: revision 1.53
Use as large a packet size as the ftdi endpoint specifies.
Now I can read from my beaglebone!

diffstat:

 sys/dev/usb/uftdi.c |  45 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 34 insertions(+), 11 deletions(-)

diffs (100 lines):

diff -r c439644e37f8 -r 6fb0ed8bd496 sys/dev/usb/uftdi.c
--- a/sys/dev/usb/uftdi.c       Mon Aug 13 20:27:11 2012 +0000
+++ b/sys/dev/usb/uftdi.c       Mon Aug 13 20:29:32 2012 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uftdi.c,v 1.51 2012/02/11 05:27:55 plunky Exp $        */
+/*     $NetBSD: uftdi.c,v 1.51.2.1 2012/08/13 20:29:32 riz Exp $       */
 
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uftdi.c,v 1.51 2012/02/11 05:27:55 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uftdi.c,v 1.51.2.1 2012/08/13 20:29:32 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -63,12 +63,19 @@
 #define UFTDI_MAX_PORTS                4
 
 /*
- * These are the maximum number of bytes transferred per frame.
- * The output buffer size cannot be increased due to the size encoding.
+ * These are the default number of bytes transferred per frame if the
+ * endpoint doesn't tell us.  The output buffer size is a hard limit
+ * for devices that use a 6-bit size encoding.
  */
 #define UFTDIIBUFSIZE 64
 #define UFTDIOBUFSIZE 64
 
+/*
+ * Magic constants!  Where do these come from?  They're what Linux uses...
+ */
+#define        UFTDI_MAX_IBUFSIZE      512
+#define        UFTDI_MAX_OBUFSIZE      256
+
 struct uftdi_softc {
        device_t                sc_dev;         /* base device */
        usbd_device_handle      sc_udev;        /* device */
@@ -254,6 +261,7 @@
                sc->sc_iface[idx] = iface;
 
                uca.bulkin = uca.bulkout = -1;
+               uca.ibufsize = uca.obufsize = 0;
                for (i = 0; i < id->bNumEndpoints; i++) {
                        int addr, dir, attr;
                        ed = usbd_interface2endpoint_descriptor(iface, i);
@@ -267,11 +275,22 @@
                        addr = ed->bEndpointAddress;
                        dir = UE_GET_DIR(ed->bEndpointAddress);
                        attr = ed->bmAttributes & UE_XFERTYPE;
-                       if (dir == UE_DIR_IN && attr == UE_BULK)
+                       if (dir == UE_DIR_IN && attr == UE_BULK) {
                                uca.bulkin = addr;
-                       else if (dir == UE_DIR_OUT && attr == UE_BULK)
+                               uca.ibufsize = UGETW(ed->wMaxPacketSize);
+                               if (uca.ibufsize >= UFTDI_MAX_IBUFSIZE)
+                                       uca.ibufsize = UFTDI_MAX_IBUFSIZE;
+                       } else if (dir == UE_DIR_OUT && attr == UE_BULK) {
                                uca.bulkout = addr;
-                       else {
+                               uca.obufsize = UGETW(ed->wMaxPacketSize)
+                                   - sc->sc_hdrlen;
+                               if (uca.obufsize >= UFTDI_MAX_OBUFSIZE)
+                                       uca.obufsize = UFTDI_MAX_OBUFSIZE;
+                               /* Limit length if we have a 6-bit header.  */
+                               if ((sc->sc_hdrlen > 0) &&
+                                   (uca.obufsize > UFTDIOBUFSIZE))
+                                       uca.obufsize = UFTDIOBUFSIZE;
+                       } else {
                                aprint_error_dev(self,
                                    "unexpected endpoint\n");
                                goto bad;
@@ -290,9 +309,11 @@
 
                uca.portno = FTDI_PIT_SIOA + idx;
                /* bulkin, bulkout set above */
-               uca.ibufsize = UFTDIIBUFSIZE;
-               uca.obufsize = UFTDIOBUFSIZE - sc->sc_hdrlen;
-               uca.ibufsizepad = UFTDIIBUFSIZE;
+               if (uca.ibufsize == 0)
+                       uca.ibufsize = UFTDIIBUFSIZE;
+               uca.ibufsizepad = uca.ibufsize;
+               if (uca.obufsize == 0)
+                       uca.obufsize = UFTDIOBUFSIZE - sc->sc_hdrlen;
                uca.opkthdrlen = sc->sc_hdrlen;
                uca.device = dev;
                uca.iface = iface;
@@ -300,7 +321,9 @@
                uca.arg = sc;
                uca.info = NULL;
 
-               DPRINTF(("uftdi: in=0x%x out=0x%x\n", uca.bulkin, uca.bulkout));
+               DPRINTF(("uftdi: in=0x%x out=0x%x isize=0x%x osize=0x%x\n",
+                       uca.bulkin, uca.bulkout,
+                       uca.ibufsize, uca.obufsize));
                sc->sc_subdev[idx] = config_found_sm_loc(self, "ucombus", NULL,
                    &uca, ucomprint, ucomsubmatch);
        }



Home | Main Index | Thread Index | Old Index