summaryrefslogtreecommitdiffstats
path: root/include/linux/usb
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2019-08-16 02:24:32 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-08-21 13:03:35 -0400
commit7b81cb6bddd2c4f2489506771070924bd0ae9902 (patch)
treee93409bd98a306bc26cc19c1c6a29f70029d42a0 /include/linux/usb
parent0709831a50d31b3caf2237e8d7fe89e15b0d919d (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.h7
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) \ 426static 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
428extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb); 431extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb);
429extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb, 432extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb,