X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/786c7d54e8d820e89997e507c29ea716c0d55fd9..2827b727d2910a3b48f9de7d67b3a67f59e256c7:/lincan/src/close.c diff --git a/lincan/src/close.c b/lincan/src/close.c index 5f7d112..9042ff2 100644 --- a/lincan/src/close.c +++ b/lincan/src/close.c @@ -1,47 +1,60 @@ /* close.c * Linux CAN-bus device driver. * Written by Arnaud Westenberg email:arnaud@wanadoo.nl + * 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 0.7 6 Aug 2001 + * Version lincan-0.2 9 Jul 2003 */ -#define __NO_VERSION__ -#include - -#include -#if defined (CONFIG_MODVERSIONS) && !defined (MODVERSIONS) -#define MODVERSIONS -#endif - -#if defined (MODVERSIONS) -#include -#endif - -#include - +#include "../include/can.h" +#include "../include/can_sysdep.h" #include "../include/main.h" #include "../include/close.h" #include "../include/i82527.h" #include "../include/setup.h" +#include "../include/fasync.h" + +#define __NO_VERSION__ +#include int can_close(struct inode *inode, struct file *file) { - objects_p[MINOR_NR]->flags &= ~BUFFERS_ALLOCATED; - /* Give up message buffer memory */ - if (objects_p[MINOR_NR]->fifo->buf_tx_entry) - del_mem_from_list(objects_p[MINOR_NR]->fifo->buf_tx_entry); - else - CANMSG("objects_p[MINOR_NR]->fifo->buf_tx_entry is NULL\n"); - if (objects_p[MINOR_NR]->fifo->buf_rx_entry) - del_mem_from_list(objects_p[MINOR_NR]->fifo->buf_rx_entry); - else - CANMSG("objects_p[MINOR_NR]->fifo->buf_rx_entry is NULL\n"); - -/* FIXME: what about clearing chip HW status, stopping sending messages etc? */ + struct canuser_t *canuser = (struct canuser_t*)(file->private_data); + struct canque_ends_t *qends; + struct msgobj_t *obj; + can_spin_irqflags_t iflags; + + if(!canuser || (canuser->magic != CAN_USER_MAGIC)){ + CANMSG("can_close: bad canuser magic\n"); + return -ENODEV; + } + + obj = canuser->msgobj; + qends = canuser->qends; + + #ifdef CAN_ENABLE_KERN_FASYNC + + can_fasync(-1, file, 0); + + #endif /*CAN_ENABLE_KERN_FASYNC*/ + + can_spin_lock_irqsave(&canuser_manipulation_lock, iflags); + list_del(&canuser->peers); + can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags); + canuser->qends = NULL; + canqueue_ends_dispose_kern(qends, file->f_flags & O_SYNC); + + kfree(canuser); + + can_spin_lock_irqsave(&canuser_manipulation_lock, iflags); + if(atomic_dec_and_test(&obj->obj_used)){ + can_msgobj_clear_fl(obj,OPENED); + }; + can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags); - objects_p[MINOR_NR]->flags &= ~OPENED; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50)) + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50)) MOD_DEC_USE_COUNT; -#endif + #endif return 0; }