.. | .. |
---|
173 | 173 | static void dec_usb_memory_use_count(struct usb_memory *usbm, int *count) |
---|
174 | 174 | { |
---|
175 | 175 | struct usb_dev_state *ps = usbm->ps; |
---|
| 176 | + struct usb_hcd *hcd = bus_to_hcd(ps->dev->bus); |
---|
176 | 177 | unsigned long flags; |
---|
177 | 178 | |
---|
178 | 179 | spin_lock_irqsave(&ps->lock, flags); |
---|
.. | .. |
---|
181 | 182 | list_del(&usbm->memlist); |
---|
182 | 183 | spin_unlock_irqrestore(&ps->lock, flags); |
---|
183 | 184 | |
---|
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); |
---|
186 | 187 | usbfs_decrease_memory_usage( |
---|
187 | 188 | usbm->size + sizeof(struct usb_memory)); |
---|
188 | 189 | kfree(usbm); |
---|
.. | .. |
---|
221 | 222 | size_t size = vma->vm_end - vma->vm_start; |
---|
222 | 223 | void *mem; |
---|
223 | 224 | unsigned long flags; |
---|
224 | | - dma_addr_t dma_handle; |
---|
| 225 | + dma_addr_t dma_handle = DMA_MAPPING_ERROR; |
---|
225 | 226 | int ret; |
---|
226 | 227 | |
---|
227 | 228 | ret = usbfs_increase_memory_usage(size + sizeof(struct usb_memory)); |
---|
.. | .. |
---|
234 | 235 | goto error_decrease_mem; |
---|
235 | 236 | } |
---|
236 | 237 | |
---|
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); |
---|
239 | 240 | if (!mem) { |
---|
240 | 241 | ret = -ENOMEM; |
---|
241 | 242 | goto error_free_usbm; |
---|
.. | .. |
---|
251 | 252 | usbm->vma_use_count = 1; |
---|
252 | 253 | INIT_LIST_HEAD(&usbm->memlist); |
---|
253 | 254 | |
---|
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) { |
---|
255 | 263 | if (remap_pfn_range(vma, vma->vm_start, |
---|
256 | 264 | virt_to_phys(usbm->mem) >> PAGE_SHIFT, |
---|
257 | 265 | size, vma->vm_page_prot) < 0) { |
---|
.. | .. |
---|
726 | 734 | return 0; |
---|
727 | 735 | } |
---|
728 | 736 | |
---|
| 737 | +#ifdef CONFIG_PM |
---|
729 | 738 | /* The following routines apply to the entire device, not interfaces */ |
---|
730 | 739 | void usbfs_notify_suspend(struct usb_device *udev) |
---|
731 | 740 | { |
---|
.. | .. |
---|
744 | 753 | } |
---|
745 | 754 | mutex_unlock(&usbfs_mutex); |
---|
746 | 755 | } |
---|
| 756 | +#endif |
---|
747 | 757 | |
---|
748 | 758 | struct usb_driver usbfs_driver = { |
---|
749 | 759 | .name = "usbfs", |
---|