diff -r f6a492c65093 -r ee662c2e14f9 me8100.c --- 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;