]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/close.c
Merge branch 'master' into can-usb1
[lincan.git] / lincan / src / close.c
index a69247c6bc14cca1e234c68c0d6cf89601002aa7..a4dfe120583acb74763dee2d4a3fcb679513b830 100644 (file)
 int can_close(struct inode *inode, struct file *file)
 {
        struct canuser_t *canuser = (struct canuser_t*)(file->private_data);
+       struct canchip_t *chip;
        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;
        }
-       
+       if ((chip=objects_p[MINOR_NR]->hostchip) == NULL) {
+               CANMSG("There is no hardware support for the device file with minor nr.: %d\n",MINOR_NR);
+               return -ENODEV;
+       }
+
        obj = canuser->msgobj;
        qends = canuser->qends;
-       
+
     #ifdef CAN_ENABLE_KERN_FASYNC
 
        can_fasync(-1, file, 0);
@@ -76,9 +81,14 @@ int can_close(struct inode *inode, struct file *file)
                can_msgobj_clear_fl(obj,OPENED);
        };
        can_spin_unlock_irqrestore(&canuser_manipulation_lock, iflags);
-       
+
     #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50))
        MOD_DEC_USE_COUNT;
     #endif
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10))
+       if (chip->hostdevice->hwspecops->release_device)
+               kref_put(&chip->hostdevice->refcount,chip->hostdevice->hwspecops->release_device);
+#endif
        return 0;
 }