]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/read.c
Added support for oscar CAN interface.
[lincan.git] / lincan / src / read.c
index d203f0f0885bd9c7e58636b05c296525aaed2872..384bf1b27295adfc8a323f4f1529993e55ef752b 100644 (file)
@@ -4,7 +4,7 @@
  * Rewritten for new CAN queues by Pavel Pisa - OCERA team member
  * email:pisa@cmp.felk.cvut.cz
  * This software is released under the GPL-License.
- * Version lincan-0.2  9 Jul 2003
+ * Version lincan-0.3  17 Jun 2004
  */
 
 #include "../include/can.h"
@@ -60,7 +60,7 @@ inline ssize_t can_std_read(struct file *file, struct canque_ends_t *qends,
 }
 
 /* This is the 'RTR' read handler for remote transmission request messages */
-inline ssize_t can_rtr_read(struct chip_t *chip, struct msgobj_t *obj, 
+inline ssize_t can_rtr_read(struct canchip_t *chip, struct msgobj_t *obj, 
                                                                char *buffer)
 {
        can_spin_irqflags_t flags;
@@ -68,6 +68,9 @@ inline ssize_t can_rtr_read(struct chip_t *chip, struct msgobj_t *obj,
        struct canmsg_t read_msg;
        
        DEBUGMSG("Remote transmission request\n");
+
+       copy_from_user(&read_msg, buffer, sizeof(struct canmsg_t));
+
        can_spin_lock_irqsave(&hardware_p->rtr_lock, flags);
        if (hardware_p->rtr_queue == NULL) { //No remote messages pending
                new_rtr_entry=(struct rtr_id *)kmalloc(sizeof(struct rtr_id),GFP_ATOMIC);
@@ -98,7 +101,6 @@ inline ssize_t can_rtr_read(struct chip_t *chip, struct msgobj_t *obj,
        interruptible_sleep_on(&new_rtr_entry->rtr_wq);
 
        can_spin_lock_irqsave(&hardware_p->rtr_lock, flags);
-       copy_to_user(buffer, &read_msg, sizeof(struct canmsg_t));
        if (hardware_p->rtr_queue == new_rtr_entry) {
                if (new_rtr_entry->next != NULL) 
                        hardware_p->rtr_queue=new_rtr_entry->next;
@@ -117,6 +119,8 @@ inline ssize_t can_rtr_read(struct chip_t *chip, struct msgobj_t *obj,
        can_spin_unlock_irqrestore(&hardware_p->rtr_lock, flags);
        kfree(new_rtr_entry);
 
+       copy_to_user(buffer, &read_msg, sizeof(struct canmsg_t));
+
        return obj->ret;
 }
 
@@ -124,13 +128,13 @@ ssize_t can_read(struct file *file, char *buffer, size_t length, loff_t *offset)
 {
        struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
        struct msgobj_t *obj;
-       struct chip_t *chip;
+       struct canchip_t *chip;
        struct canmsg_t read_msg;
        struct canque_ends_t *qends;
        int ret=0;
 
        if(!canuser || (canuser->magic != CAN_USER_MAGIC)){
-               CANMSG("can_close: bad canuser magic\n");
+               CANMSG("can_read: bad canuser magic\n");
                return -ENODEV;
        }
 
@@ -154,6 +158,7 @@ ssize_t can_read(struct file *file, char *buffer, size_t length, loff_t *offset)
 
        copy_from_user(&read_msg, buffer, sizeof(struct canmsg_t));
        if (read_msg.flags & MSG_RTR)
+               /* FIXME: RTR processing should go to its own IOCTLs */
                ret = can_rtr_read(chip, obj, buffer);
        else
                ret = can_std_read(file, qends, obj, buffer, length);