diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/usb/core/buffer.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/usb/core/buffer.c')
| -rw-r--r-- | drivers/usb/core/buffer.c | 41 | 
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index fbb087b728dc..268ccbec88f9 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c @@ -172,3 +172,44 @@ void hcd_buffer_free(  	}  	dma_free_coherent(hcd->self.sysdev, size, addr, dma);  } + +void *hcd_buffer_alloc_pages(struct usb_hcd *hcd, +		size_t size, gfp_t mem_flags, dma_addr_t *dma) +{ +	if (size == 0) +		return NULL; + +	if (hcd->localmem_pool) +		return gen_pool_dma_alloc_align(hcd->localmem_pool, +				size, dma, PAGE_SIZE); + +	/* some USB hosts just use PIO */ +	if (!hcd_uses_dma(hcd)) { +		*dma = DMA_MAPPING_ERROR; +		return (void *)__get_free_pages(mem_flags, +				get_order(size)); +	} + +	return dma_alloc_coherent(hcd->self.sysdev, +			size, dma, mem_flags); +} + +void hcd_buffer_free_pages(struct usb_hcd *hcd, +		size_t size, void *addr, dma_addr_t dma) +{ +	if (!addr) +		return; + +	if (hcd->localmem_pool) { +		gen_pool_free(hcd->localmem_pool, +				(unsigned long)addr, size); +		return; +	} + +	if (!hcd_uses_dma(hcd)) { +		free_pages((unsigned long)addr, get_order(size)); +		return; +	} + +	dma_free_coherent(hcd->self.sysdev, size, addr, dma); +}  |