From: Greg KH To: torvalds@transmeta.com Cc: linux-usb-devel@lists.sourceforge.net Subject: [PATCH 3 of 6] USB HCD changes 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) /* -------------------------------------------------------------------------- */