|
@@ -122,35 +122,20 @@ static int flash_ioctl(struct inode *inodep, struct file *filep, unsigned int cm
|
|
|
static ssize_t flash_read(struct file *file, char __user *buf, size_t size,
|
|
|
loff_t *ppos)
|
|
|
{
|
|
|
- unsigned long p = *ppos;
|
|
|
- unsigned int count = size;
|
|
|
- int ret = 0;
|
|
|
+ ssize_t ret;
|
|
|
|
|
|
if (flashdebug)
|
|
|
printk(KERN_DEBUG "flash_read: flash_read: offset=0x%lX, "
|
|
|
"buffer=%p, count=0x%X.\n", p, buf, count);
|
|
|
+ /*
|
|
|
+ * We now lock against reads and writes. --rmk
|
|
|
+ */
|
|
|
+ if (mutex_lock_interruptible(&nwflash_mutex))
|
|
|
+ return -ERESTARTSYS;
|
|
|
|
|
|
- if (count)
|
|
|
- ret = -ENXIO;
|
|
|
-
|
|
|
- if (p < gbFlashSize) {
|
|
|
- if (count > gbFlashSize - p)
|
|
|
- count = gbFlashSize - p;
|
|
|
+ ret = simple_read_from_buffer(buf, size, ppos, FLASH_BASE, gbFlashSize);
|
|
|
+ mutex_unlock(&nwflash_mutex);
|
|
|
|
|
|
- /*
|
|
|
- * We now lock against reads and writes. --rmk
|
|
|
- */
|
|
|
- if (mutex_lock_interruptible(&nwflash_mutex))
|
|
|
- return -ERESTARTSYS;
|
|
|
-
|
|
|
- ret = copy_to_user(buf, (void *)(FLASH_BASE + p), count);
|
|
|
- if (ret == 0) {
|
|
|
- ret = count;
|
|
|
- *ppos += count;
|
|
|
- } else
|
|
|
- ret = -EFAULT;
|
|
|
- mutex_unlock(&nwflash_mutex);
|
|
|
- }
|
|
|
return ret;
|
|
|
}
|
|
|
|