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

Reply via email to