]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/main.c
Added support for KVASER PCICAN-S/D/Q cards.
[lincan.git] / lincan / src / main.c
index c40310dbde3cc2738d6189ce1488e27246056ec5..817d6787847ca6c4c6a2376072c5c2596f48848d 100644 (file)
 #include "../include/finish.h"
 #include "../include/fasync.h"
 
+#ifdef CAN_WITH_RTL
+#include <rtl_posixio.h>
+#include "../include/can_iortl.h"
+#endif /*CAN_WITH_RTL*/
+
 #define EXPORT_SYMTAB
 
+can_spinlock_t canuser_manipulation_lock;
+
 /* Module parameters, some must be supplied at module loading time */
 int major=CAN_MAJOR;
 MODULE_PARM(major,"1i");
@@ -95,6 +102,9 @@ MODULE_LICENSE("GPL");
 #ifdef MODULE_DESCRIPTION
 MODULE_DESCRIPTION("Universal Linux CAN-bus device driver");
 #endif
+#ifdef MODULE_AUTHOR
+MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>, Arnaud Westenberg");
+#endif
 
 /* Global structures, used to describe the installed hardware. */
 struct canhardware_t canhardware;
@@ -130,6 +140,20 @@ struct file_operations can_fops=
 
 EXPORT_SYMBOL(can_fops);
 
+
+#ifdef CAN_WITH_RTL
+struct rtl_file_operations can_fops_rtl = {
+       llseek:         NULL,
+       read:           can_read_rtl_posix,
+       write:          can_write_rtl_posix,
+       ioctl:          can_ioctl_rtl_posix,
+       mmap:           NULL,
+       open:           can_open_rtl_posix,
+       release:        can_release_rtl_posix
+};
+#endif /*CAN_WITH_RTL*/
+
+
 int init_module(void)
 {
        int res=0,i=0, j;
@@ -139,6 +163,7 @@ int init_module(void)
        if (parse_mod_parms())
                return -EINVAL;
 
+       can_spin_lock_init(&canuser_manipulation_lock);
        canqueue_kern_initialize();
 
        if (init_hw_struct())
@@ -156,6 +181,11 @@ int init_module(void)
 
        #ifdef CAN_WITH_RTL
        canqueue_rtl_initialize();
+       res=rtl_register_rtldev(major,DEVICE_NAME,&can_fops_rtl);
+       if (res<0) {
+               CANMSG("Error registering RT-Linux major number.\n");
+               goto rtldev_error;
+       }
        #endif /*CAN_WITH_RTL*/
 
        for (i=0; i<hardware_p->nr_boards; i++) {
@@ -233,6 +263,8 @@ int init_module(void)
                canhardware_done(hardware_p);
 
                #ifdef CAN_WITH_RTL
+               rtl_unregister_rtldev(major,DEVICE_NAME);
+       rtldev_error:
                canqueue_rtl_done();
                #endif /*CAN_WITH_RTL*/
 
@@ -272,6 +304,7 @@ void cleanup_module(void)
        canhardware_done(hardware_p);
 
        #ifdef CAN_WITH_RTL
+       rtl_unregister_rtldev(major,DEVICE_NAME);
        canqueue_rtl_done();
        #endif /*CAN_WITH_RTL*/