Hi,
Here's a patch against 2.5.3-pre5 that makes the following changes in
the USB HCD drivers:
- removes "speed" from pipe bitmaps. Not only does it duplicate
stuff from dev->speed, but it allocates only one bit while
log2(3) bits are actually needed.
- removes references to that bit, including some hidden
assumptions in the UHCI drivers and a few explicit references
in usb-ohci
- removes an unused macro.
This patch was done by David Brownell.
thanks,
greg k-h
diff -Nru a/drivers/usb/uhci.c b/drivers/usb/uhci.c
--- a/drivers/usb/uhci.c Fri Jan 25 10:29:59 2002
+++ b/drivers/usb/uhci.c Fri Jan 25 10:29:59 2002
@@ -813,7 +813,9 @@
destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP;
/* 3 errors */
- status = (urb->pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE | (3 << 27);
+ status = TD_CTRL_ACTIVE | (3 << 27);
+ if (urb->dev->speed == USB_SPEED_LOW)
+ status |= TD_CTRL_LS;
/*
* Build the TD for the control request
@@ -892,7 +894,7 @@
qh->urbp = urbp;
/* Low speed or small transfers gets a different queue and treatment */
- if (urb->pipe & TD_CTRL_LS) {
+ if (urb->dev->speed == USB_SPEED_LOW) {
uhci_insert_tds_in_qh(qh, urb, 0);
uhci_insert_qh(uhci, uhci->skel_ls_control_qh, urb);
} else {
@@ -1059,7 +1061,7 @@
uhci_insert_tds_in_qh(urbp->qh, urb, 0);
/* Low speed or small transfers gets a different queue and treatment */
- if (urb->pipe & TD_CTRL_LS)
+ if (urb->dev->speed == USB_SPEED_LOW)
uhci_insert_qh(uhci, uhci->skel_ls_control_qh, urb);
else
uhci_insert_qh(uhci, uhci->skel_hs_control_qh, urb);
@@ -1083,7 +1085,9 @@
/* The "pipe" thing contains the destination in bits 8--18 */
destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid(urb->pipe);
- status = (urb->pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE | TD_CTRL_IOC;
+ status = TD_CTRL_ACTIVE | TD_CTRL_IOC;
+ if (urb->dev->speed == USB_SPEED_LOW)
+ status |= TD_CTRL_LS;
td = uhci_alloc_td(uhci, urb->dev);
if (!td)
@@ -1218,7 +1222,7 @@
return -EINVAL;
/* Can't have low speed bulk transfers */
- if (urb->pipe & TD_CTRL_LS)
+ if (urb->dev->speed == USB_SPEED_LOW)
return -EINVAL;
/* The "pipe" thing contains the destination in bits 8--18 */
diff -Nru a/drivers/usb/usb-ohci.c b/drivers/usb/usb-ohci.c
--- a/drivers/usb/usb-ohci.c Fri Jan 25 10:29:58 2002
+++ b/drivers/usb/usb-ohci.c Fri Jan 25 10:29:58 2002
@@ -1234,7 +1234,7 @@
| usb_pipeendpoint (pipe) << 7
| (usb_pipeisoc (pipe)? 0x8000: 0)
| (usb_pipecontrol (pipe)? 0: (usb_pipeout (pipe)? 0x800:
0x1000))
- | usb_pipeslow (pipe) << 13
+ | (usb_dev->speed == USB_SPEED_LOW) << 13
| usb_maxpacket (usb_dev, pipe, usb_pipeout (pipe)) << 16);
if (ed->type == PIPE_INTERRUPT && ed->state == ED_UNLINK) {
diff -Nru a/drivers/usb/usb-uhci.c b/drivers/usb/usb-uhci.c
--- a/drivers/usb/usb-uhci.c Fri Jan 25 10:29:58 2002
+++ b/drivers/usb/usb-uhci.c Fri Jan 25 10:29:58 2002
@@ -723,8 +723,11 @@
destination = (urb->pipe & PIPE_DEVEP_MASK) | USB_PID_SETUP;
/* 3 errors */
- status = (urb->pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE |
- (urb->transfer_flags & USB_DISABLE_SPD ? 0 : TD_CTRL_SPD) | (3 << 27);
+ status = TD_CTRL_ACTIVE
+ | (urb->transfer_flags & USB_DISABLE_SPD ? 0 : TD_CTRL_SPD)
+ | (3 << 27);
+ if (urb->dev->speed == USB_SPEED_LOW)
+ status |= TD_CTRL_LS;
/* Build the TD for the control request, try forever, 8 bytes of data */
fill_td (td, status, destination | (7 << 21), urb_priv->setup_packet_dma);
@@ -799,7 +802,7 @@
//uhci_show_queue(qh);
/* Start it up... put low speed first */
- if (urb->pipe & TD_CTRL_LS)
+ if (urb->dev->speed == USB_SPEED_LOW)
insert_qh (s, s->control_chain, qh, 0);
else
insert_qh (s, s->bulk_chain, qh, 0);
@@ -876,8 +879,11 @@
destination = (pipe & PIPE_DEVEP_MASK) | usb_packetid (pipe);
/* 3 errors */
- status = (pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE |
- ((urb->transfer_flags & USB_DISABLE_SPD) ? 0 : TD_CTRL_SPD) | (3 <<
27);
+ status = TD_CTRL_ACTIVE
+ | ((urb->transfer_flags & USB_DISABLE_SPD) ? 0 : TD_CTRL_SPD)
+ | (3 << 27);
+ if (urb->dev->speed == USB_SPEED_LOW)
+ status |= TD_CTRL_LS;
/* Build the TDs for the bulk request */
len = urb->transfer_buffer_length;
@@ -1472,8 +1478,11 @@
if (alloc_td (s, &td, UHCI_PTR_DEPTH))
return -ENOMEM;
- status = (pipe & TD_CTRL_LS) | TD_CTRL_ACTIVE | TD_CTRL_IOC |
- (urb->transfer_flags & USB_DISABLE_SPD ? 0 : TD_CTRL_SPD) | (3 << 27);
+ status = TD_CTRL_ACTIVE | TD_CTRL_IOC
+ | (urb->transfer_flags & USB_DISABLE_SPD ? 0 : TD_CTRL_SPD)
+ | (3 << 27);
+ if (urb->dev->speed == USB_SPEED_LOW)
+ status |= TD_CTRL_LS;
destination = (urb->pipe & PIPE_DEVEP_MASK) | usb_packetid (urb->pipe) |
(((urb->transfer_buffer_length - 1) & 0x7ff) << 21);
@@ -2506,8 +2515,11 @@
desc->hw.td.info |=
cpu_to_le32((!usb_gettoggle (urb->dev, usb_pipeendpoint (urb->pipe),
usb_pipeout (urb->pipe)) << TD_TOKEN_TOGGLE));
}
- desc->hw.td.status= cpu_to_le32((urb->pipe &
TD_CTRL_LS) | TD_CTRL_ACTIVE | TD_CTRL_IOC |
+ desc->hw.td.status= cpu_to_le32(TD_CTRL_ACTIVE |
+TD_CTRL_IOC |
(urb->transfer_flags & USB_DISABLE_SPD ? 0 :
TD_CTRL_SPD) | (3 << 27));
+ if (urb->dev->speed == USB_SPEED_LOW)
+ desc->hw.td.status |=
+ __constant_cpu_to_le32 (TD_CTRL_LS);
mb();
}
else {
diff -Nru a/drivers/usb/usb.c b/drivers/usb/usb.c
--- a/drivers/usb/usb.c Fri Jan 25 10:29:59 2002
+++ b/drivers/usb/usb.c Fri Jan 25 10:29:59 2002
@@ -324,8 +324,9 @@
unsigned int pipe = urb->pipe;
long bustime;
- bustime = usb_calc_bus_time (usb_pipeslow(pipe), usb_pipein(pipe),
- usb_pipeisoc(pipe), usb_maxpacket(dev, pipe,
usb_pipeout(pipe)));
+ bustime = usb_calc_bus_time (dev->speed == USB_SPEED_LOW,
+ usb_pipein(pipe), usb_pipeisoc(pipe),
+ usb_maxpacket(dev, pipe, usb_pipeout(pipe)));
if (usb_pipeisoc(pipe))
bustime = NS_TO_US(bustime) / urb->number_of_packets;
else
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h Fri Jan 25 10:29:58 2002
+++ b/include/linux/usb.h Fri Jan 25 10:29:58 2002
@@ -1096,7 +1103,7 @@
* - endpoint number (4 bits)
* - current Data0/1 state (1 bit) [Historical; now gone]
* - direction (1 bit)
- * - speed (1 bit)
+ * - speed (1 bit) [Historical and specific to USB 1.1; now gone.]
* - max packet size (2 bits: 8, 16, 32 or 64) [Historical; now gone.]
* - pipe type (2 bits: control, interrupt, bulk, isochronous)
*
@@ -1107,25 +1114,22 @@
* Let's not fall in that trap. We'll just encode it as a simple
* unsigned int. The encoding is:
*
- * - max size: bits 0-1 (00 = 8, 01 = 16, 10 = 32, 11 = 64)
[Historical; now gone.]
- * - direction: bit 7 (0 = Host-to-Device [Out], 1 = Device-to-Host
[In])
+ * - max size: bits 0-1 [Historical; now gone.]
+ * - direction: bit 7 (0 = Host-to-Device [Out],
+ * 1 = Device-to-Host [In])
* - device: bits 8-14
* - endpoint: bits 15-18
* - Data0/1: bit 19 [Historical; now gone. ]
- * - speed: bit 26 (0 = Full, 1 = Low Speed)
- * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, 10 =
control, 11 = bulk)
+ * - lowspeed: bit 26 [Historical; now gone. ]
+ * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt,
+ * 10 = control, 11 = bulk)
*
* Why? Because it's arbitrary, and whatever encoding we select is really
* up to us. This one happens to share a lot of bit positions with the UHCI
* specification, so that much of the uhci driver can just mask the bits
* appropriately.
- *
- * NOTE: there's no encoding (yet?) for a "high speed" endpoint; treat them
- * like full speed devices.
*/
-// FIXME 2.5 get rid of usb_pipeslow(), just use dev->speed
-
#define PIPE_ISOCHRONOUS 0
#define PIPE_INTERRUPT 1
#define PIPE_CONTROL 2
@@ -1139,9 +1143,7 @@
#define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1)
#define usb_pipein(pipe) (((pipe) >> 7) & 1)
#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)
-#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
-#define usb_pipeslow(pipe) (((pipe) >> 26) & 1)
#define usb_pipetype(pipe) (((pipe) >> 30) & 3)
#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)
@@ -1163,13 +1165,7 @@
static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int
endpoint)
{
- return (dev->devnum << 8) | (endpoint << 15) |
- ((dev->speed == USB_SPEED_LOW) << 26);
-}
-
-static inline unsigned int __default_pipe(struct usb_device *dev)
-{
- return ((dev->speed == USB_SPEED_LOW) << 26);
+ return (dev->devnum << 8) | (endpoint << 15);
}
/* Create various pipes... */
@@ -1181,8 +1177,8 @@
#define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) |
__create_pipe(dev,endpoint) | USB_DIR_IN)
#define usb_sndintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) |
__create_pipe(dev,endpoint))
#define usb_rcvintpipe(dev,endpoint) ((PIPE_INTERRUPT << 30) |
__create_pipe(dev,endpoint) | USB_DIR_IN)
-#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | __default_pipe(dev))
-#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | __default_pipe(dev) |
USB_DIR_IN)
+#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30))
+#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | USB_DIR_IN)
/* -------------------------------------------------------------------------- */
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel