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