It's about time, but here's the ZERO_PACKET patch for uhci.c
It also fixes a bug if you sent a zero length bulk packet to simulate
ZERO_PACKET before support was added.
JE
diff -urNX dontdiff linux-2.4.10-pre10.orig/drivers/usb/uhci.c
linux-2.4.10-pre10/drivers/usb/uhci.c
--- linux-2.4.10-pre10.orig/drivers/usb/uhci.c Thu Oct 4 17:21:59 2001
+++ linux-2.4.10-pre10/drivers/usb/uhci.c Sun Sep 30 16:26:30 2001
@@ -1258,21 +1258,38 @@
return -ENOMEM;
uhci_add_td_to_urb(urb, td);
- uhci_fill_td(td, status, destination | ((pktsze - 1) << 21) |
+ uhci_fill_td(td, status, destination |
+ (((pktsze - 1) & UHCI_NULL_DATA_SIZE) << 21) |
(usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE),
data);
data += pktsze;
- len -= maxsze;
-
- if (len <= 0)
- td->status |= TD_CTRL_IOC;
+ len -= pktsze;
usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
usb_pipeout(urb->pipe));
} while (len > 0);
+ if (usb_pipeout(urb->pipe) && (urb->transfer_flags & USB_ZERO_PACKET) &&
+ urb->transfer_buffer_length) {
+ td = uhci_alloc_td(uhci, urb->dev);
+ if (!td)
+ return -ENOMEM;
+
+ uhci_add_td_to_urb(urb, td);
+ uhci_fill_td(td, status, destination | UHCI_NULL_DATA_SIZE |
+ (usb_gettoggle(urb->dev, usb_pipeendpoint(urb->pipe),
+ usb_pipeout(urb->pipe)) << TD_TOKEN_TOGGLE),
+ data);
+
+ usb_dotoggle(urb->dev, usb_pipeendpoint(urb->pipe),
+ usb_pipeout(urb->pipe));
+ }
+
+ /* Set the flag on the last packet */
+ td->status |= TD_CTRL_IOC;
+
qh = uhci_alloc_qh(uhci, urb->dev);
if (!qh)
return -ENOMEM;
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel