]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/staging/vme/devices/vme_user.c
staging: vme_user: allow large read()/write()
[karo-tx-linux.git] / drivers / staging / vme / devices / vme_user.c
index 3467cde5ac6c0810304797741a7bcf98bec3a36c..a2345db91e8503e4952bc43a66ad8bbf6c44a573 100644 (file)
@@ -120,75 +120,50 @@ struct vme_user_vma_priv {
        atomic_t refcnt;
 };
 
-/*
- * We are going ot alloc a page during init per window for small transfers.
- * Small transfers will go VME -> buffer -> user space. Larger (more than a
- * page) transfers will lock the user space buffer into memory and then
- * transfer the data directly into the user space buffers.
- */
 static ssize_t resource_to_user(int minor, char __user *buf, size_t count,
                                loff_t *ppos)
 {
        ssize_t retval;
        ssize_t copied = 0;
 
-       if (count <= image[minor].size_buf) {
-               /* We copy to kernel buffer */
-               copied = vme_master_read(image[minor].resource,
-                       image[minor].kern_buf, count, *ppos);
-               if (copied < 0)
-                       return (int)copied;
-
-               retval = __copy_to_user(buf, image[minor].kern_buf,
-                       (unsigned long)copied);
-               if (retval != 0) {
-                       copied = (copied - retval);
-                       pr_info("User copy failed\n");
-                       return -EINVAL;
-               }
+       if (count > image[minor].size_buf)
+               count = image[minor].size_buf;
 
-       } else {
-               /* XXX Need to write this */
-               pr_info("Currently don't support large transfers\n");
-               /* Map in pages from userspace */
+       /* We copy to kernel buffer */
+       copied = vme_master_read(image[minor].resource, image[minor].kern_buf,
+                                count, *ppos);
+       if (copied < 0)
+               return (int)copied;
 
-               /* Call vme_master_read to do the transfer */
+       retval = __copy_to_user(buf, image[minor].kern_buf,
+                               (unsigned long)copied);
+       if (retval != 0) {
+               copied = (copied - retval);
+               pr_info("User copy failed\n");
                return -EINVAL;
        }
 
        return copied;
 }
 
-/*
- * We are going to alloc a page during init per window for small transfers.
- * Small transfers will go user space -> buffer -> VME. Larger (more than a
- * page) transfers will lock the user space buffer into memory and then
- * transfer the data directly from the user space buffers out to VME.
- */
 static ssize_t resource_from_user(unsigned int minor, const char __user *buf,
                                  size_t count, loff_t *ppos)
 {
        ssize_t retval;
        ssize_t copied = 0;
 
-       if (count <= image[minor].size_buf) {
-               retval = __copy_from_user(image[minor].kern_buf, buf,
-                       (unsigned long)count);
-               if (retval != 0)
-                       copied = (copied - retval);
-               else
-                       copied = count;
-
-               copied = vme_master_write(image[minor].resource,
-                       image[minor].kern_buf, copied, *ppos);
-       } else {
-               /* XXX Need to write this */
-               pr_info("Currently don't support large transfers\n");
-               /* Map in pages from userspace */
-
-               /* Call vme_master_write to do the transfer */
-               return -EINVAL;
-       }
+       if (count > image[minor].size_buf)
+               count = image[minor].size_buf;
+
+       retval = __copy_from_user(image[minor].kern_buf, buf,
+                                 (unsigned long)count);
+       if (retval != 0)
+               copied = (copied - retval);
+       else
+               copied = count;
+
+       copied = vme_master_write(image[minor].resource, image[minor].kern_buf,
+                                 copied, *ppos);
 
        return copied;
 }