Skip to contentSkip to conversation

Various fixes and improvements for RT-Socket-CAN

PATCH Applied Wolfgang Grandegger 2 participants 2 messages Aug 23, 2006

lore
Share & tools
lore
#0 lore raw

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
         else
             rtcan_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
Applied
#1 lore raw
Quoted 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