aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/usb.h
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2009-04-27 22:59:01 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-06-16 00:44:49 -0400
commite04748e3a87271fcf30d383e3780c5d3ee1c1618 (patch)
tree1e1053837fcde0761673cbba6140514630a372ed /include/linux/usb.h
parentb10de142119a676552df3f0d2e3a9d647036c26a (diff)
USB: Push scatter gather lists down to host controller drivers.
This is the original patch I created before David Vrabel posted a better patch (http://marc.info/?l=linux-usb&m=123377477209109&w=2) that does basically the same thing. This patch will get replaced with his (modified) patch later. Allow USB device drivers that use usb_sg_init() and usb_sg_wait() to push bulk endpoint scatter gather lists down to the host controller drivers. This allows host controller drivers to more efficiently enqueue these transfers, and allows the xHCI host controller to better take advantage of USB 3.0 "bursts" for bulk endpoints. This patch currently only enables scatter gather lists for bulk endpoints. Other endpoint types that use the usb_sg_* functions will not have their scatter gather lists pushed down to the host controller. For periodic endpoints, we want each scatterlist entry to be a separate transfer. Eventually, HCDs could parse these scatter-gather lists for periodic endpoints also. For now, we use the old code and call usb_submit_urb() for each scatterlist entry. The caller of usb_sg_init() can request that all bytes in the scatter gather list be transferred by passing in a length of zero. Handle that request for a bulk endpoint under xHCI by walking the scatter gather list and calculating the length. We could let the HCD handle a zero length in this case, but I'm not sure if the core layers in between will get confused by this. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include/linux/usb.h')
-rw-r--r--include/linux/usb.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 13bced521b83..0a1819a64974 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -1198,6 +1198,8 @@ struct urb {
1198 unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/ 1198 unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/
1199 void *transfer_buffer; /* (in) associated data buffer */ 1199 void *transfer_buffer; /* (in) associated data buffer */
1200 dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ 1200 dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */
1201 struct usb_sg_request *sg; /* (in) scatter gather buffer list */
1202 int num_sgs; /* (in) number of entries in the sg list */
1201 u32 transfer_buffer_length; /* (in) data buffer length */ 1203 u32 transfer_buffer_length; /* (in) data buffer length */
1202 u32 actual_length; /* (return) actual transfer length */ 1204 u32 actual_length; /* (return) actual transfer length */
1203 unsigned char *setup_packet; /* (in) setup packet (control only) */ 1205 unsigned char *setup_packet; /* (in) setup packet (control only) */