Various fixes and improvements for RT-Socket-CAN
PATCH 1/1 Various fixes and improvements for RT-Socket-CAN
Hello,
attached is a patch for the RT-Socket-CAN RTDM driver providing:
* ksrc/drivers/can/rtcan_dev.c, ksrc/drivers/can/rtcan_dev.h, ksrc/drivers/can/rtcan_modules.c: Suppress handling of refcount if module support is not enabled or modules cannot be unloaded.
* ksrc/drivers/can/mscan/rtcan_mscan.c, ksrc/drivers/can/mscan/rtcan_mscan_proc.c, ksrc/drivers/can/mscan/rtcan_mscan_regs.h: Make the MSCAN driver work on Linux 2.6. We now use our own set of MSCAN register definitions because they differ between 2.4 and 2.6 (prefix).
* scripts/Modules.frag: bug fix for making PEAK device drivers.
Note that it adds the file ksrc/drivers/can/mscan/rtcan_mscan_regs.h !
Wolfgang.
+ diff -u xenomai/ChangeLog.ORIG xenomai/ChangeLog
ChangeLog renamed from ChangeLog.ORIG +14 -0
@@ -1,3 +1,17 @@ +2006-08-23 Wolfgang Grandegger <[email protected]> + + * ksrc/drivers/can/rtcan_dev.c, ksrc/drivers/can/rtcan_dev.h, + ksrc/drivers/can/rtcan_modules.c: Suppress handling of refcount + if module support is not enabled or modules cannot be unloaded. + + * ksrc/drivers/can/mscan/rtcan_mscan.c, + ksrc/drivers/can/mscan/rtcan_mscan_proc.c, + ksrc/drivers/can/mscan/rtcan_mscan_regs.h: Make the MSCAN driver + work on Linux 2.6. We now use our own set of MSCAN register + definitions because they differ between 2.4 and 2.6 (prefix). + + * scripts/Modules.frag: bug fix for making PEAK device drivers. + 2006-08-23 Philippe Gerum <[email protected]> * include/asm-i386/features.h (xeno_x86_features_check): Try
+ diff -u xenomai/ksrc/drivers/can/mscan/rtcan_mscan.c.ORIG xenomai/ksrc/drivers/can/mscan/rtcan_mscan.c
ksrc/drivers/can/mscan/rtcan_mscan.c renamed from ksrc/drivers/can/mscan/rtcan_mscan.c.ORIG +54 -87
333 lines not on this page · raw message
+ diff -u xenomai/ksrc/drivers/can/mscan/rtcan_mscan_proc.c.ORIG xenomai/ksrc/drivers/can/mscan/rtcan_mscan_proc.c
ksrc/drivers/can/mscan/rtcan_mscan_proc.c renamed from ksrc/drivers/can/mscan/rtcan_mscan_proc.c.ORIG +17 -17
@@ -20,13 +20,13 @@#include <linux/module.h> #include <linux/ioport.h> #include <linux/delay.h> -#include <asm/mpc5xxx.h> #include <rtdm/rtdm_driver.h> /* CAN device profile */ #include "rtcan_dev.h" #include "rtcan_internal.h" +#include "rtcan_mscan_regs.h" #define MSCAN_REG_ARGS (reg) "%-8s 0x%02x\n", #reg, (int)((regs)->reg) & 0xff
@@ -36,7 +36,7 @@ int count, int *eof, void *data) { struct rtcan_device *dev = (struct rtcan_device *)data; -struct mpc5xxx_mscan *regs = (struct mpc5xxx_mscan *)dev->base_addr; +struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr;struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5xxx_GPIO;RTCAN_PROC_PRINT_VARS (80 );
@@ -44,24 +44,24 @@ goto done;if (!RTCAN_PROC_PRINT ("canctl0 0x%02x%s%s%s%s%s%s%s%s\n" , regs->canctl0, - (regs->canctl0 & MPC5xxx_MSCAN_RXFRM) ?" rxfrm" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_RXACT) ?" rxact" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_CSWAI) ?" cswai" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_SYNCH) ?" synch" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_TIME) ?" time" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_WUPE) ?" wupe" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_SLPRQ) ?" slprq" :"" , - (regs->canctl0 & MPC5xxx_MSCAN_INITRQ)?" initrq" :"" )) + (regs->canctl0 &MSCAN_RXFRM ) ?" rxfrm" :"" , + (regs->canctl0 &MSCAN_RXACT ) ?" rxact" :"" , + (regs->canctl0 &MSCAN_CSWAI ) ?" cswai" :"" , + (regs->canctl0 &MSCAN_SYNCH ) ?" synch" :"" , + (regs->canctl0 &MSCAN_TIME ) ?" time" :"" , + (regs->canctl0 &MSCAN_WUPE ) ?" wupe" :"" , + (regs->canctl0 &MSCAN_SLPRQ ) ?" slprq" :"" , + (regs->canctl0 &MSCAN_INITRQ )?" initrq" :"" )) goto done;if (!RTCAN_PROC_PRINT ("canctl1 0x%02x%s%s%s%s%s%s%s\n" , regs->canctl1, - (regs->canctl1 & MPC5xxx_MSCAN_CANE) ?" cane" :"" , - (regs->canctl1 & MPC5xxx_MSCAN_CLKSRC)?" clksrc" :"" , - (regs->canctl1 & MPC5xxx_MSCAN_LOOPB) ?" loopb" :"" , - (regs->canctl1 & MPC5xxx_MSCAN_LISTEN)?" listen" :"" , - (regs->canctl1 & MPC5xxx_MSCAN_WUPM) ?" wump" :"" , - (regs->canctl1 & MPC5xxx_MSCAN_SLPAK) ?" slpak" :"" , - (regs->canctl1 & MPC5xxx_MSCAN_INITAK)?" initak" :"" )) + (regs->canctl1 &MSCAN_CANE ) ?" cane" :"" , + (regs->canctl1 &MSCAN_CLKSRC )?" clksrc" :"" , + (regs->canctl1 &MSCAN_LOOPB ) ?" loopb" :"" , + (regs->canctl1 &MSCAN_LISTEN )?" listen" :"" , + (regs->canctl1 &MSCAN_WUPM ) ?" wump" :"" , + (regs->canctl1 &MSCAN_SLPAK ) ?" slpak" :"" , + (regs->canctl1 &MSCAN_INITAK )?" initak" :"" )) goto done; if (!RTCAN_PROC_PRINT(MSCAN_REG_ARGS(canbtr0 )) | !RTCAN_PROC_PRINT(MSCAN_REG_ARGS(canbtr1 )) |
+ diff -u xenomai/ksrc/drivers/can/mscan/rtcan_mscan_regs.h.ORIG xenomai/ksrc/drivers/can/mscan/rtcan_mscan_regs.h
ksrc/drivers/can/mscan/rtcan_mscan_regs.h renamed from ksrc/drivers/can/mscan/rtcan_mscan_regs.h.ORIG +214 -0
214 lines not on this page · raw message
+ diff -u xenomai/ksrc/drivers/can/rtcan_dev.c.ORIG xenomai/ksrc/drivers/can/rtcan_dev.c
ksrc/drivers/can/rtcan_dev.c renamed from ksrc/drivers/can/rtcan_dev.c.ORIG +23 -3
@@ -79,16 +79,22 @@struct rtcan_device *rtcan_dev_get_by_name (const char *name) {struct rtcan_device *dev; +#ifdef RTCAN_USE_REFCOUNT rtdm_lockctx_t context; +#endif +#ifdef RTCAN_USE_REFCOUNT rtdm_lock_get_irqsave (&rtcan_devices_rt_lock, context); +#endif dev =__rtcan_dev_get_by_name (name); + +#ifdef RTCAN_USE_REFCOUNT if (dev !=NULL )atomic_inc (&dev->refcount); -rtdm_lock_put_irqrestore (&rtcan_devices_rt_lock, context); +#endif return dev; }
@@ -103,19 +109,25 @@struct rtcan_device *rtcan_dev_get_by_index (int ifindex) {struct rtcan_device *dev; +#ifdef RTCAN_USE_REFCOUNT rtdm_lockctx_t context; +#endif if ((ifindex <=0 ) || (ifindex >RTCAN_MAX_DEVICES ))return NULL ; +#ifdef RTCAN_USE_REFCOUNT rtdm_lock_get_irqsave (&rtcan_devices_rt_lock, context); +#endif dev =__rtcan_dev_get_by_index (ifindex); + +#ifdef RTCAN_USE_REFCOUNT if (dev !=NULL )atomic_inc (&dev->refcount); -rtdm_lock_put_irqrestore (&rtcan_devices_rt_lock, context); +#endif return dev; }
@@ -134,8 +146,10 @@strncpy (dev->name, buf,IFNAMSIZ );break ; } +#ifdef RTCAN_USE_REFCOUNT elsertcan_dev_dereference (tmp ); +#endif } }
@@ -165,8 +179,9 @@/* Init TX Semaphore, will be destroyed forthwith * when setting stop mode */ rtdm_sem_init (&dev->tx_sem,0 ); - +#ifdef RTCAN_USE_REFCOUNT atomic_set (&dev->refcount,0 ); +#endif /* Initialize receive list */ dev->empty_list = recv_list_elem = dev->receivers;
@@ -241,6 +256,7 @@int rtcan_dev_unregister (struct rtcan_device *dev) { +#ifdef RTCAN_USE_REFCOUNT rtdm_lockctx_t context;
@@ -281,6 +297,10 @@printk ("RTCAN: unregistered %s\n" , dev->name);return 0 ; +#else +printk ("RTCAN: Oops, unexpected call of rtcan_dev_unregister()\n" ); +return -EINVAL ; +#endif }
+ diff -u xenomai/ksrc/drivers/can/rtcan_dev.h.ORIG xenomai/ksrc/drivers/can/rtcan_dev.h
ksrc/drivers/can/rtcan_dev.h renamed from ksrc/drivers/can/rtcan_dev.h.ORIG +13 -5
@@ -36,8 +36,6 @@#include "rtcan_list.h" -#define RTCAN_DEV_VERS_0_1 0x0001 -/* Number of MSCAN devices the driver can handle */ #define RTCAN_MAX_DEVICES CONFIG_XENO_DRIVERS_RTCAN_MAX_DEVICES
@@ -45,10 +43,13 @@* for reception at the same time using Bind */ #define RTCAN_MAX_RECEIVERS CONFIG_XENO_DRIVERS_RTCAN_MAX_RECEIVERS +/* Suppress handling of refcount if module support is not enabled +* or modules cannot be unloaded */ +#if defined(CONFIG_MODULES ) && !defined(CONFIG_MODULE_UNLOAD ) +#define RTCAN_USE_REFCOUNT +#endif + -/** -* rtcan_device -*/ struct rtcan_device {unsigned int version;
@@ -61,7 +62,9 @@rtdm_irq_t irq_handle;/* RTDM IRQ handle */ int ifindex; +#ifdef RTCAN_USE_REFCOUNT atomic_t refcount; +#endif void *priv;/* pointer to chip private data */
@@ -153,8 +156,13 @@struct rtcan_device *rtcan_dev_get_by_name (const char *if_name);struct rtcan_device *rtcan_dev_get_by_index (int ifindex); +#ifdef RTCAN_USE_REFCOUNT #define rtcan_dev_reference (dev) atomic_inc(&(dev)->refcount)#define rtcan_dev_dereference (dev) atomic_dec(&(dev)->refcount) +#else +#define rtcan_dev_reference (dev) do {} while(0) +#define rtcan_dev_dereference (dev) do {} while(0) +#endif int rtcan_dev_create_proc (struct rtcan_device * dev);void rtcan_dev_remove_proc (struct rtcan_device * dev);
+ diff -u xenomai/ksrc/drivers/can/rtcan_module.c.ORIG xenomai/ksrc/drivers/can/rtcan_module.c
ksrc/drivers/can/rtcan_module.c renamed from ksrc/drivers/can/rtcan_module.c.ORIG +7 -3
@@ -237,10 +237,14 @@ !RTCAN_PROC_PRINT ("%s %s\n" ,"State " , state_name) || !RTCAN_PROC_PRINT ("%s %d\n" ,"TX-Counter" , dev->tx_count) || !RTCAN_PROC_PRINT ("%s %d\n" ,"RX-Counter" , dev->rx_count) || - !RTCAN_PROC_PRINT ("%s %d\n" ,"Errors " , dev->err_count) || - !RTCAN_PROC_PRINT("%s %d\n", "Refcount ", atomic_read(&dev->refcount))) + !RTCAN_PROC_PRINT("%s %d\n", "Errors ", dev->err_count)) goto done; - + +#ifdef RTCAN_USE_REFCOUNT +if (!RTCAN_PROC_PRINT ("%s %d\n" ,"Refcount " ,atomic_read (&dev->refcount))) + goto done; +#endif + done:up (&rtcan_devices_nrt_lock);RTCAN_PROC_PRINT_DONE ;
+ diff -u xenomai/scripts/Modules.frag.ORIG xenomai/scripts/Modules.frag
scripts/Modules.frag renamed from scripts/Modules.frag.ORIG +2 -2
@@ -14,5 +14,5 @@ DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN) += drivers/xenomai/can/xeno_rtcan.o DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN_MSCAN) += drivers/xenomai/can/mscan/xeno_rtcan_mscan.o DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN_SJA1000) += drivers/xenomai/can/sja1000/xeno_rtcan_sja1000.o -DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN_PEAK_PCI) += drivers/xenomai/can/sja1000/xeno_rtcan_peak_pci.o -DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN_PEAK_DNG) += drivers/xenomai/can/sja1000/xeno_rtcan_peak_dng.o +DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN_SJA1000_PEAK_PCI) += drivers/xenomai/can/sja1000/xeno_rtcan_peak_pci.o +DRIVERS-$(CONFIG_XENO_DRIVERS_RTCAN_SJA1000_PEAK_DNG) += drivers/xenomai/can/sja1000/xeno_rtcan_peak_dng.o
Jan Kiszka
AppliedQuoted 14 lines · Wolfgang Grandegger
Hello,
attached is a patch for the RT-Socket-CAN RTDM driver providing:
*
ksrc/drivers/can/rtcan_dev.c,ksrc/drivers/can/rtcan_dev.h,ksrc/drivers/can/rtcan_modules.c: Suppress handling of refcount if module support is not enabled or modules cannot be unloaded.*
ksrc/drivers/can/mscan/rtcan_mscan.c,ksrc/drivers/can/mscan/rtcan_mscan_proc.c,ksrc/drivers/can/mscan/rtcan_mscan_regs.h: Make the MSCAN driver work on Linux 2.6. We now use our own set of MSCAN register definitions because they differ between 2.4 and 2.6 (prefix).
Quoted 4 lines
*
scripts/Modules.frag: bug fix for making PEAK device drivers.Note that it adds the file
ksrc/drivers/can/mscan/rtcan_mscan_regs.h!
Applied.
Thanks,
Jan