--- a/me8100.c Wed Jan 16 20:33:24 2002 +0100
+++ b/me8100.c Thu Jan 17 20:25:34 2002 +0100
@@ -174,7 +174,7 @@
static int me8100_get_int_count(me8100_int_occur_type *, me8100_info_type *);
static inline int DEVICE(int i) { return i & 0x0f; }
-static inline int SUBDEVICE(int i) { return i >> 4; }
+static inline int SUBDEVICE(int i) { return (i >> 4) - 1; }
/* File operations provided by the driver */
@@ -611,6 +611,10 @@
}
}
+ if (file_ptr->f_mode & FMODE_READ) {
+ PDEBUG("*** open for reading\n");
+ }
+
MOD_INC_USE_COUNT;
return 0;
@@ -2111,8 +2115,29 @@
ssize_t me8100_read(struct file * file_ptr, char *buffer, size_t len, loff_t *offset)
{
+ int err;
+ unsigned short val;
+ int minor;
+
PDEBUG("me8100_read(%d) called\n", len);
- return -EINVAL;
+
+ minor = MINOR(file_ptr->f_dentry->d_inode->i_rdev);
+
+ if (len == 0) return 0; /* do we really need this check? */
+ if (len < 0) return -EINVAL; /* do we really need this check? */
+
+ val = inw(info_vec[DEVICE(minor)].subinfo[SUBDEVICE(minor)].regbase + ME8100_DI_REG);
+ PDEBUG("me8100_read: val=0x%0x\n", val);
+
+ if (len >= sizeof(val)) {
+ err = put_user(val, (unsigned short*) buffer);
+ len = sizeof(val);
+ } else {
+ err = put_user(val, (char*) buffer);
+ }
+
+ return len;
+
}
/* Writing: we do only write one word (an unsigned short) and return immediatly. Yes,
@@ -2133,9 +2158,9 @@
if (len < 0) return -EINVAL; /* do we need this? */
/* Take care of "short" writes! */
- if (len >= sizeof(unsigned short)) {
+ if (len >= sizeof(val)) {
err = get_user(val, (unsigned short*) buffer);
- len = sizeof(unsigned short);
+ len = sizeof(val);
} else {
err = get_user(val, (char*) buffer);
val &= 0xff;