* 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"
}
/* 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;
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);
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;
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;
}
{
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;
}
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);