diff options
author | Christoph Hellwig <hch@lst.de> | 2019-08-16 02:24:32 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-08-21 13:03:35 -0400 |
commit | 7b81cb6bddd2c4f2489506771070924bd0ae9902 (patch) | |
tree | e93409bd98a306bc26cc19c1c6a29f70029d42a0 /include/linux/usb | |
parent | 0709831a50d31b3caf2237e8d7fe89e15b0d919d (diff) |
usb: add a HCD_DMA flag instead of guestimating DMA capabilities
The usb core is the only major place in the kernel that checks for
a non-NULL device dma_mask to see if a device is DMA capable. This
is generally a bad idea, as all major busses always set up a DMA mask,
even if the device is not DMA capable - in fact bus layers like PCI
can't even know if a device is DMA capable at enumeration time. This
leads to lots of workaround in HCD drivers, and also prevented us from
setting up a DMA mask for platform devices by default last time we
tried.
Replace this guess with an explicit HCD_DMA that is set by drivers that
appear to have DMA support.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20190816062435.881-4-hch@lst.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/usb')
-rw-r--r-- | include/linux/usb/hcd.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index a20e7815d814..8d3869c7de85 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h | |||
@@ -256,6 +256,7 @@ struct hc_driver { | |||
256 | 256 | ||
257 | int flags; | 257 | int flags; |
258 | #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ | 258 | #define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ |
259 | #define HCD_DMA 0x0002 /* HC uses DMA */ | ||
259 | #define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */ | 260 | #define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */ |
260 | #define HCD_USB11 0x0010 /* USB 1.1 */ | 261 | #define HCD_USB11 0x0010 /* USB 1.1 */ |
261 | #define HCD_USB2 0x0020 /* USB 2.0 */ | 262 | #define HCD_USB2 0x0020 /* USB 2.0 */ |
@@ -422,8 +423,10 @@ static inline bool hcd_periodic_completion_in_progress(struct usb_hcd *hcd, | |||
422 | return hcd->high_prio_bh.completing_ep == ep; | 423 | return hcd->high_prio_bh.completing_ep == ep; |
423 | } | 424 | } |
424 | 425 | ||
425 | #define hcd_uses_dma(hcd) \ | 426 | static inline bool hcd_uses_dma(struct usb_hcd *hcd) |
426 | (IS_ENABLED(CONFIG_HAS_DMA) && (hcd)->self.uses_dma) | 427 | { |
428 | return IS_ENABLED(CONFIG_HAS_DMA) && (hcd->driver->flags & HCD_DMA); | ||
429 | } | ||
427 | 430 | ||
428 | extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); | 431 | extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); |
429 | extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, | 432 | extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, |