hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/usb/core/devio.c
....@@ -173,6 +173,7 @@
173173 static void dec_usb_memory_use_count(struct usb_memory *usbm, int *count)
174174 {
175175 struct usb_dev_state *ps = usbm->ps;
176
+ struct usb_hcd *hcd = bus_to_hcd(ps->dev->bus);
176177 unsigned long flags;
177178
178179 spin_lock_irqsave(&ps->lock, flags);
....@@ -181,8 +182,8 @@
181182 list_del(&usbm->memlist);
182183 spin_unlock_irqrestore(&ps->lock, flags);
183184
184
- usb_free_coherent(ps->dev, usbm->size, usbm->mem,
185
- usbm->dma_handle);
185
+ hcd_buffer_free_pages(hcd, usbm->size,
186
+ usbm->mem, usbm->dma_handle);
186187 usbfs_decrease_memory_usage(
187188 usbm->size + sizeof(struct usb_memory));
188189 kfree(usbm);
....@@ -221,7 +222,7 @@
221222 size_t size = vma->vm_end - vma->vm_start;
222223 void *mem;
223224 unsigned long flags;
224
- dma_addr_t dma_handle;
225
+ dma_addr_t dma_handle = DMA_MAPPING_ERROR;
225226 int ret;
226227
227228 ret = usbfs_increase_memory_usage(size + sizeof(struct usb_memory));
....@@ -234,8 +235,8 @@
234235 goto error_decrease_mem;
235236 }
236237
237
- mem = usb_alloc_coherent(ps->dev, size, GFP_USER | __GFP_NOWARN,
238
- &dma_handle);
238
+ mem = hcd_buffer_alloc_pages(hcd,
239
+ size, GFP_USER | __GFP_NOWARN, &dma_handle);
239240 if (!mem) {
240241 ret = -ENOMEM;
241242 goto error_free_usbm;
....@@ -251,7 +252,14 @@
251252 usbm->vma_use_count = 1;
252253 INIT_LIST_HEAD(&usbm->memlist);
253254
254
- if (hcd->localmem_pool || !hcd_uses_dma(hcd)) {
255
+ /*
256
+ * In DMA-unavailable cases, hcd_buffer_alloc_pages allocates
257
+ * normal pages and assigns DMA_MAPPING_ERROR to dma_handle. Check
258
+ * whether we are in such cases, and then use remap_pfn_range (or
259
+ * dma_mmap_coherent) to map normal (or DMA) pages into the user
260
+ * space, respectively.
261
+ */
262
+ if (dma_handle == DMA_MAPPING_ERROR) {
255263 if (remap_pfn_range(vma, vma->vm_start,
256264 virt_to_phys(usbm->mem) >> PAGE_SHIFT,
257265 size, vma->vm_page_prot) < 0) {
....@@ -726,6 +734,7 @@
726734 return 0;
727735 }
728736
737
+#ifdef CONFIG_PM
729738 /* The following routines apply to the entire device, not interfaces */
730739 void usbfs_notify_suspend(struct usb_device *udev)
731740 {
....@@ -744,6 +753,7 @@
744753 }
745754 mutex_unlock(&usbfs_mutex);
746755 }
756
+#endif
747757
748758 struct usb_driver usbfs_driver = {
749759 .name = "usbfs",