diff options
-rw-r--r-- | pci.c | 6 | ||||
-rw-r--r-- | surface.c | 18 |
2 files changed, 21 insertions, 3 deletions
@@ -9,7 +9,8 @@ #include "harddoomdev.h" #include "private_data.h" -int init_pci(struct pci_dev *dev) { +int init_pci(struct pci_dev *dev) +{ struct doom_data *doom_data; int err = 0; @@ -39,7 +40,8 @@ error_enable: return err; } -void cleanup_pci(struct pci_dev *dev) { +void cleanup_pci(struct pci_dev *dev) +{ struct doom_data *doom_data; doom_data = pci_get_drvdata(dev); @@ -3,6 +3,7 @@ #include <linux/fs.h> #include <linux/dma-mapping.h> #include <linux/slab.h> +#include <asm/uaccess.h> #include "private_data.h" #include "harddoom.h" @@ -17,7 +18,22 @@ long surface_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ssize_t surface_read(struct file *filp, char __user *buf, size_t count, loff_t *offset) { - return -1; + struct surface_data *surface_data; + unsigned long not_written; + + surface_data = filp->private_data; + if (*offset >= surface_data->surface_size) { + return 0; + } + + if (*offset + count > surface_data->surface_size) { + count = surface_data->surface_size - *offset; + } + + not_written = copy_to_user(buf, surface_data->surface_cpu + *offset, + count); + + return count - not_written; } loff_t surface_llseek(struct file *filp, loff_t offset, int origin) |