USB: usbfs: fix mmap dma mismatch
[sfrench/cifs-2.6.git] / drivers / usb / core / devio.c
index b9db9812d6c5e1764d73c0a1bd0145f0b3a878fc..d93d94d7ff50605afddfb35afc360d5f2c88ff62 100644 (file)
@@ -251,9 +251,19 @@ static int usbdev_mmap(struct file *file, struct vm_area_struct *vma)
        usbm->vma_use_count = 1;
        INIT_LIST_HEAD(&usbm->memlist);
 
-       if (dma_mmap_coherent(hcd->self.sysdev, vma, mem, dma_handle, size)) {
-               dec_usb_memory_use_count(usbm, &usbm->vma_use_count);
-               return -EAGAIN;
+       if (hcd->localmem_pool || !hcd_uses_dma(hcd)) {
+               if (remap_pfn_range(vma, vma->vm_start,
+                                   virt_to_phys(usbm->mem) >> PAGE_SHIFT,
+                                   size, vma->vm_page_prot) < 0) {
+                       dec_usb_memory_use_count(usbm, &usbm->vma_use_count);
+                       return -EAGAIN;
+               }
+       } else {
+               if (dma_mmap_coherent(hcd->self.sysdev, vma, mem, dma_handle,
+                                     size)) {
+                       dec_usb_memory_use_count(usbm, &usbm->vma_use_count);
+                       return -EAGAIN;
+               }
        }
 
        vma->vm_flags |= VM_IO;