diff options
author | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2009-04-27 22:59:01 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-06-16 00:44:49 -0400 |
commit | e04748e3a87271fcf30d383e3780c5d3ee1c1618 (patch) | |
tree | 1e1053837fcde0761673cbba6140514630a372ed /include/linux/usb.h | |
parent | b10de142119a676552df3f0d2e3a9d647036c26a (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.h | 2 |
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) */ |