USB: drop HCD_LOCAL_MEM flag
With the addition of the local memory allocator, the HCD_LOCAL_MEM flag can be dropped and the checks against it replaced with a check for the localmem_pool ptr being initialized. Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> Tested-by: Fredrik Noring <noring@nocrew.org> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Christoph Hellwig <hch@lst.de>alistair/sunxi64-5.4-dsi
parent
7d99532955
commit
2d7a3dc3e2
|
@ -68,7 +68,7 @@ int hcd_buffer_create(struct usb_hcd *hcd)
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_HAS_DMA) ||
|
if (!IS_ENABLED(CONFIG_HAS_DMA) ||
|
||||||
(!is_device_dma_capable(hcd->self.sysdev) &&
|
(!is_device_dma_capable(hcd->self.sysdev) &&
|
||||||
!(hcd->driver->flags & HCD_LOCAL_MEM)))
|
!hcd->localmem_pool))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < HCD_BUFFER_POOLS; i++) {
|
for (i = 0; i < HCD_BUFFER_POOLS; i++) {
|
||||||
|
@ -130,8 +130,7 @@ void *hcd_buffer_alloc(
|
||||||
|
|
||||||
/* some USB hosts just use PIO */
|
/* some USB hosts just use PIO */
|
||||||
if (!IS_ENABLED(CONFIG_HAS_DMA) ||
|
if (!IS_ENABLED(CONFIG_HAS_DMA) ||
|
||||||
(!is_device_dma_capable(bus->sysdev) &&
|
!is_device_dma_capable(bus->sysdev)) {
|
||||||
!(hcd->driver->flags & HCD_LOCAL_MEM))) {
|
|
||||||
*dma = ~(dma_addr_t) 0;
|
*dma = ~(dma_addr_t) 0;
|
||||||
return kmalloc(size, mem_flags);
|
return kmalloc(size, mem_flags);
|
||||||
}
|
}
|
||||||
|
@ -162,8 +161,7 @@ void hcd_buffer_free(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_HAS_DMA) ||
|
if (!IS_ENABLED(CONFIG_HAS_DMA) ||
|
||||||
(!is_device_dma_capable(bus->sysdev) &&
|
!is_device_dma_capable(bus->sysdev)) {
|
||||||
!(hcd->driver->flags & HCD_LOCAL_MEM))) {
|
|
||||||
kfree(addr);
|
kfree(addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1347,14 +1347,14 @@ EXPORT_SYMBOL_GPL(usb_hcd_unlink_urb_from_ep);
|
||||||
* using regular system memory - like pci devices doing bus mastering.
|
* using regular system memory - like pci devices doing bus mastering.
|
||||||
*
|
*
|
||||||
* To support host controllers with limited dma capabilities we provide dma
|
* To support host controllers with limited dma capabilities we provide dma
|
||||||
* bounce buffers. This feature can be enabled using the HCD_LOCAL_MEM flag.
|
* bounce buffers. This feature can be enabled by initializing
|
||||||
|
* hcd->localmem_pool using usb_hcd_setup_local_mem().
|
||||||
* For this to work properly the host controller code must first use the
|
* For this to work properly the host controller code must first use the
|
||||||
* function dma_declare_coherent_memory() to point out which memory area
|
* function dma_declare_coherent_memory() to point out which memory area
|
||||||
* that should be used for dma allocations.
|
* that should be used for dma allocations.
|
||||||
*
|
*
|
||||||
* The HCD_LOCAL_MEM flag then tells the usb code to allocate all data for
|
* The initialized hcd->localmem_pool then tells the usb code to allocate all
|
||||||
* dma using dma_alloc_coherent() which in turn allocates from the memory
|
* data for dma using the genalloc API.
|
||||||
* area pointed out with dma_declare_coherent_memory().
|
|
||||||
*
|
*
|
||||||
* So, to summarize...
|
* So, to summarize...
|
||||||
*
|
*
|
||||||
|
@ -1364,9 +1364,6 @@ EXPORT_SYMBOL_GPL(usb_hcd_unlink_urb_from_ep);
|
||||||
* (a) "normal" kernel memory is no good, and
|
* (a) "normal" kernel memory is no good, and
|
||||||
* (b) there's not enough to share
|
* (b) there's not enough to share
|
||||||
*
|
*
|
||||||
* - The only *portable* hook for such stuff in the
|
|
||||||
* DMA framework is dma_declare_coherent_memory()
|
|
||||||
*
|
|
||||||
* - So we use that, even though the primary requirement
|
* - So we use that, even though the primary requirement
|
||||||
* is that the memory be "local" (hence addressable
|
* is that the memory be "local" (hence addressable
|
||||||
* by that device), not "coherent".
|
* by that device), not "coherent".
|
||||||
|
@ -1533,7 +1530,7 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
|
||||||
urb->setup_dma))
|
urb->setup_dma))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
urb->transfer_flags |= URB_SETUP_MAP_SINGLE;
|
urb->transfer_flags |= URB_SETUP_MAP_SINGLE;
|
||||||
} else if (hcd->driver->flags & HCD_LOCAL_MEM) {
|
} else if (hcd->localmem_pool) {
|
||||||
ret = hcd_alloc_coherent(
|
ret = hcd_alloc_coherent(
|
||||||
urb->dev->bus, mem_flags,
|
urb->dev->bus, mem_flags,
|
||||||
&urb->setup_dma,
|
&urb->setup_dma,
|
||||||
|
@ -1603,7 +1600,7 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
|
||||||
else
|
else
|
||||||
urb->transfer_flags |= URB_DMA_MAP_SINGLE;
|
urb->transfer_flags |= URB_DMA_MAP_SINGLE;
|
||||||
}
|
}
|
||||||
} else if (hcd->driver->flags & HCD_LOCAL_MEM) {
|
} else if (hcd->localmem_pool) {
|
||||||
ret = hcd_alloc_coherent(
|
ret = hcd_alloc_coherent(
|
||||||
urb->dev->bus, mem_flags,
|
urb->dev->bus, mem_flags,
|
||||||
&urb->transfer_dma,
|
&urb->transfer_dma,
|
||||||
|
|
|
@ -559,7 +559,7 @@ static int ehci_init(struct usb_hcd *hcd)
|
||||||
ehci->command = temp;
|
ehci->command = temp;
|
||||||
|
|
||||||
/* Accept arbitrarily long scatter-gather lists */
|
/* Accept arbitrarily long scatter-gather lists */
|
||||||
if (!(hcd->driver->flags & HCD_LOCAL_MEM))
|
if (!hcd->localmem_pool)
|
||||||
hcd->self.sg_tablesize = ~0;
|
hcd->self.sg_tablesize = ~0;
|
||||||
|
|
||||||
/* Prepare for unlinking active QHs */
|
/* Prepare for unlinking active QHs */
|
||||||
|
|
|
@ -4995,7 +4995,7 @@ static int hcd_fotg210_init(struct usb_hcd *hcd)
|
||||||
fotg210->command = temp;
|
fotg210->command = temp;
|
||||||
|
|
||||||
/* Accept arbitrarily long scatter-gather lists */
|
/* Accept arbitrarily long scatter-gather lists */
|
||||||
if (!(hcd->driver->flags & HCD_LOCAL_MEM))
|
if (!hcd->localmem_pool)
|
||||||
hcd->self.sg_tablesize = ~0;
|
hcd->self.sg_tablesize = ~0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -448,7 +448,7 @@ static int ohci_init (struct ohci_hcd *ohci)
|
||||||
struct usb_hcd *hcd = ohci_to_hcd(ohci);
|
struct usb_hcd *hcd = ohci_to_hcd(ohci);
|
||||||
|
|
||||||
/* Accept arbitrarily long scatter-gather lists */
|
/* Accept arbitrarily long scatter-gather lists */
|
||||||
if (!(hcd->driver->flags & HCD_LOCAL_MEM))
|
if (!hcd->localmem_pool)
|
||||||
hcd->self.sg_tablesize = ~0;
|
hcd->self.sg_tablesize = ~0;
|
||||||
|
|
||||||
if (distrust_firmware)
|
if (distrust_firmware)
|
||||||
|
|
|
@ -49,7 +49,7 @@ static const struct hc_driver ohci_sm501_hc_driver = {
|
||||||
* generic hardware linkage
|
* generic hardware linkage
|
||||||
*/
|
*/
|
||||||
.irq = ohci_irq,
|
.irq = ohci_irq,
|
||||||
.flags = HCD_USB11 | HCD_MEMORY | HCD_LOCAL_MEM,
|
.flags = HCD_USB11 | HCD_MEMORY,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* basic lifecycle operations
|
* basic lifecycle operations
|
||||||
|
@ -153,7 +153,8 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
|
||||||
* fine. This is however not always the case - buffers may be allocated
|
* fine. This is however not always the case - buffers may be allocated
|
||||||
* using kmalloc() - so the usb core needs to be told that it must copy
|
* using kmalloc() - so the usb core needs to be told that it must copy
|
||||||
* data into our local memory if the buffers happen to be placed in
|
* data into our local memory if the buffers happen to be placed in
|
||||||
* regular memory. The HCD_LOCAL_MEM flag does just that.
|
* regular memory. A non-null hcd->localmem_pool initialized by the
|
||||||
|
* the call to usb_hcd_setup_local_mem() below does just that.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (usb_hcd_setup_local_mem(hcd, mem->start,
|
if (usb_hcd_setup_local_mem(hcd, mem->start,
|
||||||
|
|
|
@ -153,7 +153,7 @@ static const struct hc_driver ohci_tmio_hc_driver = {
|
||||||
|
|
||||||
/* generic hardware linkage */
|
/* generic hardware linkage */
|
||||||
.irq = ohci_irq,
|
.irq = ohci_irq,
|
||||||
.flags = HCD_USB11 | HCD_MEMORY | HCD_LOCAL_MEM,
|
.flags = HCD_USB11 | HCD_MEMORY,
|
||||||
|
|
||||||
/* basic lifecycle operations */
|
/* basic lifecycle operations */
|
||||||
.start = ohci_tmio_start,
|
.start = ohci_tmio_start,
|
||||||
|
|
|
@ -581,7 +581,7 @@ static int uhci_start(struct usb_hcd *hcd)
|
||||||
|
|
||||||
hcd->uses_new_polling = 1;
|
hcd->uses_new_polling = 1;
|
||||||
/* Accept arbitrarily long scatter-gather lists */
|
/* Accept arbitrarily long scatter-gather lists */
|
||||||
if (!(hcd->driver->flags & HCD_LOCAL_MEM))
|
if (!hcd->localmem_pool)
|
||||||
hcd->self.sg_tablesize = ~0;
|
hcd->self.sg_tablesize = ~0;
|
||||||
|
|
||||||
spin_lock_init(&uhci->lock);
|
spin_lock_init(&uhci->lock);
|
||||||
|
|
|
@ -256,7 +256,6 @@ struct hc_driver {
|
||||||
|
|
||||||
int flags;
|
int flags;
|
||||||
#define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */
|
#define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */
|
||||||
#define HCD_LOCAL_MEM 0x0002 /* HC needs local memory */
|
|
||||||
#define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */
|
#define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */
|
||||||
#define HCD_USB11 0x0010 /* USB 1.1 */
|
#define HCD_USB11 0x0010 /* USB 1.1 */
|
||||||
#define HCD_USB2 0x0020 /* USB 2.0 */
|
#define HCD_USB2 0x0020 /* USB 2.0 */
|
||||||
|
|
Loading…
Reference in New Issue