USB: fix usbmon and DMA mapping for scatter-gather URBs
This patch (as1368) fixes a rather obscure bug in usbmon: When tracing URBs sent by the scatter-gather library, it accesses the data buffers while they are still mapped for DMA. The solution is to move the mapping and unmapping out of the s-g library and into the usual place in hcd.c. This requires the addition of new URB flag bits to describe the kind of mapping needed, since we have to call dma_map_sg() if the HCD supports native scatter-gather operation and dma_map_page() if it doesn't. The nice thing about having the new flags is that they simplify the testing for unmapping. The patch removes the only caller of usb_buffer_[un]map_sg(), so those functions are #if'ed out. A later patch will remove them entirely. As a result of this change, urb->sg will be set in situations where it wasn't set previously. Hence the xhci and whci drivers are adjusted to test urb->num_sgs instead, which retains its original meaning and is nonzero only when the HCD has to handle a scatterlist. Finally, even when a submission error occurs we don't want to hand URBs to usbmon before they are unmapped. The submission path is rearranged so that map_urb_for_dma() is called only for non-root-hub URBs and unmap_urb_for_dma() is called immediately after a submission error. This simplifies the error handling. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> CC: <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0ff8d1b3c8
commit
ff9c895f07
@ -965,10 +965,19 @@ extern int usb_disabled(void);
|
||||
* needed */
|
||||
#define URB_FREE_BUFFER 0x0100 /* Free transfer buffer with the URB */
|
||||
|
||||
/* The following flags are used internally by usbcore and HCDs */
|
||||
#define URB_DIR_IN 0x0200 /* Transfer from device to host */
|
||||
#define URB_DIR_OUT 0
|
||||
#define URB_DIR_MASK URB_DIR_IN
|
||||
|
||||
#define URB_DMA_MAP_SINGLE 0x00010000 /* Non-scatter-gather mapping */
|
||||
#define URB_DMA_MAP_PAGE 0x00020000 /* HCD-unsupported S-G */
|
||||
#define URB_DMA_MAP_SG 0x00040000 /* HCD-supported S-G */
|
||||
#define URB_MAP_LOCAL 0x00080000 /* HCD-local-memory mapping */
|
||||
#define URB_SETUP_MAP_SINGLE 0x00100000 /* Setup packet DMA mapped */
|
||||
#define URB_SETUP_MAP_LOCAL 0x00200000 /* HCD-local setup packet */
|
||||
#define URB_DMA_SG_COMBINED 0x00400000 /* S-G entries were combined */
|
||||
|
||||
struct usb_iso_packet_descriptor {
|
||||
unsigned int offset;
|
||||
unsigned int length; /* expected length */
|
||||
|
Reference in New Issue
Block a user