me8100.c
changeset 7 ee662c2e14f9
parent 4 a90b94337569
child 8 12065fad228b
--- 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;