Ji Jan,

Jan Kiszka wrote:
Wolfgang Grandegger wrote:
Jan Kiszka wrote:
Wolfgang Grandegger wrote:
...
Index: ksrc/drivers/can/rtcan_internal.h
===================================================================
--- ksrc/drivers/can/rtcan_internal.h    (revision 1695)
+++ ksrc/drivers/can/rtcan_internal.h    (working copy)
@@ -111,6 +111,10 @@
#ifndef compat_module_int_param_array
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+# define compat_module_int_param(name) \
+    MODULE_PARM(name, "i")
+# define compat_module_charp_param(name) \
+    MODULE_PARM(name, "s")
 # define compat_module_byte_param_array(name, count) \
     MODULE_PARM(name, "1-" __MODULE_STRING(count) "b")
 # define compat_module_short_param_array(name, count) \
@@ -118,6 +122,10 @@
 # define compat_module_int_param_array(name, count) \
     MODULE_PARM(name, "1-" __MODULE_STRING(count) "i")
 #else
+# define compat_module_int_param(name) \
+    module_param(name, int, 0444)
+# define compat_module_charp_param(name) \
+    module_param(name, charp, 0444)
 # define compat_module_byte_param_array(name, count) \
     module_param_array(name, byte, NULL, 0444)
 # define compat_module_short_param_array(name, count) \
No need, module_param comes even with 2.4. We only need wrapping for
parameter arrays (due to different semantics of the macro arguments).
But with limitations, unfortunately:

  /* type is byte, short, ushort, int, uint, long, ulong, bool. (2.6
     has more, but they are not supported).  perm is permissions when
     it appears in sysfs: 0 means doens't appear, 0444 means read-only
     by everyone, 0644 means changable dynamically by root, etc.  name
     must be in scope (unlike MODULE_PARM).
  */
  #define module_param(name, type, perm) \
        static inline void *__check_existence_##name(void) { return
             &name; } \
        MODULE_PARM(name, _MODULE_PARM_STRING_ ## type)

  #define _MODULE_PARM_STRING_byte "b"
  #define _MODULE_PARM_STRING_short "h"
  #define _MODULE_PARM_STRING_ushort "h"
  #define _MODULE_PARM_STRING_int "i"
  #define _MODULE_PARM_STRING_uint "i"
  #define _MODULE_PARM_STRING_long "l"
  #define _MODULE_PARM_STRING_ulong "l"
  #define _MODULE_PARM_STRING_bool "i"

Especially "s" is missing. But it could be wrapped with:

  #define _MODULE_PARM_STRING_charp "s"

Any idea why this is not already done?

Likely because you mostly don't need it? I think mscan is an exception
here, at least from my experience.

Well, a "find . -name '*.c'|xargs grep charp|grep module" reveals plenty of references. And in 2.6 there is "module_param_string* as well, which will copy the string directly into the preallocated array.

When _MODULE_PARM_STRING_charp helps to enhance module_param on 2.4,
lets put it in Xenomai's wrapping header. I think we should also move
the parameter array over (directing it officially through the RTDM layer
can still be done later, at the latest when providing user-space
support). I would support a patch doing this as well.

With the proposed modifications almost all module parameter use cases can be handled in a portable way, including strings and arrays of strings. I have moved it to the Xenomai's wrapping header file, including compat_module_param_array ...

I also want to replace the compat_module_*_param_array functions with
the attached code snippet.

Ok, I'm awaiting a revised patch.

... and updated the ISA and MEM driver as well in the attached revised patch.

Wolfgang.


Index: include/asm-generic/wrappers.h
===================================================================
--- include/asm-generic/wrappers.h	(revision 1695)
+++ include/asm-generic/wrappers.h	(working copy)
@@ -46,6 +46,10 @@
 #endif
 
 #define module_param_named(name,var,type,mode)  module_param(var,type,mode)
+#define _MODULE_PARM_STRING_charp "s"
+#define compat_module_param_array(name, type, count, perm) \
+	static inline void *__check_existence_##name(void) { return &name; } \
+	MODULE_PARM(name, "1-" __MODULE_STRING(count) _MODULE_PARM_STRING_##type)
 
 #define container_of(ptr, type, member) ({			\
 	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
@@ -176,6 +180,9 @@
 
 #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) */
 
+#define compat_module_param_array(name, type, count, perm) \
+	module_param_array(name, type, NULL, perm)
+
 /* VM */
 
 #ifdef CONFIG_MMU
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 1695)
+++ ChangeLog	(working copy)
@@ -1,3 +1,24 @@
+2006-10-08  Wolfgang Grandegger  <[EMAIL PROTECTED]>
+
+	* include/asm-generic/wrappers.h: MODULE_PARM has been removed
+	in Linux 2.6.17. Module parameter compatibility functions 
+	reimplemented and moved to Xenomai's wrapping header. 
+	
+	* ksrc/drivers/can/mscan/rtcan_mscan.c, 
+	ksrc/drivers/can/sja1000/rtcan_isa.c,
+	ksrc/drivers/can/sja1000/rtcan_mem.c: Use new module parameter 
+	compatibility functions. 	
+	
+	* ksrc/drivers/can/mscan/rtcan_mscan.c (rtcan_mscan_init): Error 
+	handling corrected.
+
+	* ksrc/drivers/can/mscan/rtcan_mscan_regs.h: Fix invalid address
+	for MPC5200 GPIO registers. Now the MSCAN driver works for Linux
+	2.6.17.
+
+	* ksrc/drivers/can/rtcan_module.c (rtcan_dev_get_state_name): Bug
+	fix. Function did return invalid state name.
+
 2006-10-06  Jan Kiszka  <[EMAIL PROTECTED]>
 
 	* src/testsuite/cyclic/cyclictest.c: Align to latest v0.11,
Index: ksrc/drivers/can/rtcan_internal.h
===================================================================
--- ksrc/drivers/can/rtcan_internal.h	(revision 1695)
+++ ksrc/drivers/can/rtcan_internal.h	(working copy)
@@ -108,25 +108,6 @@
 
 #endif /* CONFIG_PROC_FS */
 
-
-#ifndef compat_module_int_param_array
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
-# define compat_module_byte_param_array(name, count) \
-    MODULE_PARM(name, "1-" __MODULE_STRING(count) "b")
-# define compat_module_short_param_array(name, count) \
-    MODULE_PARM(name, "1-" __MODULE_STRING(count) "h")
-# define compat_module_int_param_array(name, count) \
-    MODULE_PARM(name, "1-" __MODULE_STRING(count) "i")
-#else
-# define compat_module_byte_param_array(name, count) \
-    module_param_array(name, byte, NULL, 0444)
-# define compat_module_short_param_array(name, count) \
-    module_param_array(name, short, NULL, 0444)
-# define compat_module_int_param_array(name, count) \
-    module_param_array(name, int, NULL, 0444)
-#endif
-#endif
-
 #ifdef CONFIG_XENO_DRIVERS_RTCAN_DEBUG
 # define RTCAN_DBG(fmt,args...) do { printk(fmt ,##args); } while (0)
 # define RTCAN_RTDM_DBG(fmt,args...) do { rtdm_printk(fmt ,##args); } while (0)
Index: ksrc/drivers/can/rtcan_module.c
===================================================================
--- ksrc/drivers/can/rtcan_module.c	(revision 1695)
+++ ksrc/drivers/can/rtcan_module.c	(working copy)
@@ -54,15 +54,15 @@
 }
 
 static char *rtcan_state_names[] = {
-    "active", "stopped", "sleeping", "warning", 
-    "passive" , "bus-off", "scanning"
+    "active", "warning", "passive" , "bus-off", 
+    "scanning", "stopped", "sleeping"
 };
 
 static void rtcan_dev_get_state_name(can_state_t state, 
 				     char* name, int max_len)
 {
     if (state >= CAN_STATE_ACTIVE && 
-	state <= CAN_STATE_SCANNING_BAUDRATE)
+	state <= CAN_STATE_SLEEPING)
 	strncpy(name, rtcan_state_names[state], max_len);
     else
 	strncpy(name, "unknown", max_len);
Index: ksrc/drivers/can/mscan/rtcan_mscan.c
===================================================================
--- ksrc/drivers/can/mscan/rtcan_mscan.c	(revision 1695)
+++ ksrc/drivers/can/mscan/rtcan_mscan.c	(working copy)
@@ -37,6 +37,7 @@
 #include <rtdm/rtcan.h>
 #include "rtcan_dev.h"
 #include "rtcan_raw.h"
+#include "rtcan_internal.h"
 #include "rtcan_mscan_regs.h"
 
 extern int rtcan_mscan_create_proc(struct rtcan_device* dev);
@@ -56,7 +57,7 @@
 
 /** Module parameter for the CAN controllers' */
 
-static int port[RTCAN_MSCAN_DEVS] = {
+int port[RTCAN_MSCAN_DEVS] = {
 #ifdef CONFIG_XENO_DRIVERS_RTCAN_MSCAN_1
 #ifdef CONFIG_XENO_DRIVERS_RTCAN_MSCAN_2
 	1, 2  /* Enable CAN 1 and 2 */
@@ -71,24 +72,21 @@
 #endif
 #endif
 };
-
-static int port_count = RTCAN_MSCAN_DEVS;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
-module_param_array(port, int, &port_count, 0400);
-#else
-MODULE_PARM(port, "2" __MODULE_STRING(RTCAN_MSCAN_DEVS) "i");
-#endif
+compat_module_param_array(port, int, RTCAN_MSCAN_DEVS, 0444);
 MODULE_PARM_DESC(port, "Port numbers of enabled controllers, e.g. 1,2");
 
-unsigned long mscan_clock = CONFIG_XENO_DRIVERS_RTCAN_MSCAN_CLOCK;
-MODULE_PARM(mscan_clock,"i");
+/* 
+ * Note: on the MPC5200 the MSCAN clock source is the IP bus 
+ * clock (IP_CLK) while on the MPC5200B it is the oscillator 
+ * clock (SYS_XTAL_IN).
+ */
+unsigned int mscan_clock = CONFIG_XENO_DRIVERS_RTCAN_MSCAN_CLOCK;
+module_param(mscan_clock, int, 0444);
 MODULE_PARM_DESC(mscan_clock, "Clock frequency in Hz");
 
 char *mscan_pins = NULL;
-MODULE_PARM(mscan_pins,"s");
+module_param(mscan_pins, charp, 0444);
 MODULE_PARM_DESC(mscan_pins, "Routing to GPIO pins (PSC2 or I2C1/TMR01)");
-
  
 struct rtcan_device *rtcan_mscan_devs[RTCAN_MSCAN_DEVS];
 
@@ -739,7 +737,6 @@
     }
 }
 
-/** Init module */
 int __init rtcan_mscan_init_one(int idx)
 {
     int ret, irq;
@@ -836,32 +833,13 @@
 
 }
 
-/** Init module */
-static int __init rtcan_mscan_init(void)
-{
-    int i, ret;
-
-    mscan_gpio_config();
-
-    for (i = 0; i < RTCAN_MSCAN_DEVS; i++) {
-	if (port[i] < 1 || port[i] > RTCAN_MSCAN_DEVS)
-	    continue;
-
-	if ((ret = rtcan_mscan_init_one(i) != 0))
-	    return ret;
-    }
-
-    return 0;
-}
-
-
-/** Cleanup module */
 static void __exit rtcan_mscan_exit(void)
 {
     int i;
     struct rtcan_device *dev;
 
-    for (i = 0; i < port_count; i++) {
+    for (i = 0; i < RTCAN_MSCAN_DEVS; i++) {
+
 	if ((dev = rtcan_mscan_devs[i]) == NULL)
 	    continue;
 	
@@ -876,5 +854,24 @@
 
 }
 
+static int __init rtcan_mscan_init(void)
+{
+    int i, err;
+
+    mscan_gpio_config();
+
+    for (i = 0; i < RTCAN_MSCAN_DEVS; i++) {
+	if (port[i] < 1 || port[i] > RTCAN_MSCAN_DEVS)
+	    continue;
+
+	if ((err = rtcan_mscan_init_one(i) != 0)) {
+	    rtcan_mscan_exit();
+	    return err;
+	}
+    }
+
+    return 0;
+}
+
 module_init(rtcan_mscan_init);
 module_exit(rtcan_mscan_exit);
Index: ksrc/drivers/can/mscan/rtcan_mscan_regs.h
===================================================================
--- ksrc/drivers/can/mscan/rtcan_mscan_regs.h	(revision 1695)
+++ ksrc/drivers/can/mscan/rtcan_mscan_regs.h	(working copy)
@@ -35,7 +35,7 @@
 #define MSCAN_MBAR	MPC52xx_MBAR
 #define MSCAN_CAN1_IRQ	MPC52xx_MSCAN1_IRQ
 #define MSCAN_CAN2_IRQ	MPC52xx_MSCAN2_IRQ
-#define MPC5xxx_GPIO	MPC52xx_GPIO_OFFSET 
+#define MPC5xxx_GPIO	MPC52xx_VA(MPC52xx_GPIO_OFFSET) 
 #define mpc5xxx_gpio	mpc52xx_gpio
 #endif
 
Index: ksrc/drivers/can/sja1000/rtcan_peak_dng.c
===================================================================
--- ksrc/drivers/can/sja1000/rtcan_peak_dng.c	(revision 1695)
+++ ksrc/drivers/can/sja1000/rtcan_peak_dng.c	(working copy)
@@ -50,15 +50,9 @@
 static ushort io[RTCAN_PEAK_DNG_MAX_DEV];
 static char   irq[RTCAN_PEAK_DNG_MAX_DEV];
 
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)
-module_param_array(type, charp,  NULL, 0444);
-module_param_array(io,   ushort, NULL, 0444);
-module_param_array(irq,  byte,   NULL, 0444);
-#else
-MODULE_PARM(type, "0-" __MODULE_STRING(RTCAN_PEAK_DNG_MAX_DEV) "s");
-MODULE_PARM(io,   "0-" __MODULE_STRING(RTCAN_PEAK_DNG_MAX_DEV) "h");
-MODULE_PARM(irq,  "0-" __MODULE_STRING(RTCAN_PEAK_DNG_MAX_DEV) "b");
-#endif
+compat_module_param_array(type, charp,  RTCAN_PEAK_DNG_MAX_DEV, 0444);
+compat_module_param_array(io,   ushort, RTCAN_PEAK_DNG_MAX_DEV, 0444);
+compat_module_param_array(irq,  byte,   RTCAN_PEAK_DNG_MAX_DEV, 0444);
 
 MODULE_PARM_DESC(type, "The type of interface (sp, epp)");
 MODULE_PARM_DESC(io,   "The io-port address");
Index: ksrc/drivers/can/sja1000/rtcan_isa.c
===================================================================
--- ksrc/drivers/can/sja1000/rtcan_isa.c	(revision 1695)
+++ ksrc/drivers/can/sja1000/rtcan_isa.c	(working copy)
@@ -51,11 +51,11 @@
 static u8 ocr[RTCAN_ISA_MAX_DEV];
 static u8 cdr[RTCAN_ISA_MAX_DEV];
 
-compat_module_short_param_array(io, RTCAN_ISA_MAX_DEV);
-compat_module_int_param_array(irq, RTCAN_ISA_MAX_DEV);
-compat_module_int_param_array(clock, RTCAN_ISA_MAX_DEV);
-compat_module_byte_param_array(ocr, RTCAN_ISA_MAX_DEV);
-compat_module_byte_param_array(cdr, RTCAN_ISA_MAX_DEV);
+compat_module_param_array(io, ushort, RTCAN_ISA_MAX_DEV, 0444);
+compat_module_param_array(irq, int, RTCAN_ISA_MAX_DEV, 0444);
+compat_module_param_array(clock, uint, RTCAN_ISA_MAX_DEV, 0444);
+compat_module_param_array(ocr, byte, RTCAN_ISA_MAX_DEV, 0444);
+compat_module_param_array(cdr, byte, RTCAN_ISA_MAX_DEV, 0444);
 
 MODULE_PARM_DESC(io, "The io-port address");
 MODULE_PARM_DESC(irq, "The interrupt number");
Index: ksrc/drivers/can/sja1000/rtcan_mem.c
===================================================================
--- ksrc/drivers/can/sja1000/rtcan_mem.c	(revision 1695)
+++ ksrc/drivers/can/sja1000/rtcan_mem.c	(working copy)
@@ -59,11 +59,11 @@
 static u8 ocr[RTCAN_MEM_MAX_DEV];
 static u8 cdr[RTCAN_MEM_MAX_DEV];
 
-compat_module_int_param_array(mem, RTCAN_MEM_MAX_DEV);
-compat_module_int_param_array(irq, RTCAN_MEM_MAX_DEV);
-compat_module_int_param_array(clock, RTCAN_MEM_MAX_DEV);
-compat_module_byte_param_array(ocr, RTCAN_MEM_MAX_DEV);
-compat_module_byte_param_array(cdr, RTCAN_MEM_MAX_DEV);
+compat_module_param_array(mem, uint, RTCAN_MEM_MAX_DEV, 0444);
+compat_module_param_array(irq, int, RTCAN_MEM_MAX_DEV, 0444);
+compat_module_param_array(clock, uint, RTCAN_MEM_MAX_DEV, 0444);
+compat_module_param_array(ocr, byte, RTCAN_MEM_MAX_DEV, 0444);
+compat_module_param_array(cdr, byte, RTCAN_MEM_MAX_DEV, 0444);
 
 MODULE_PARM_DESC(mem, "The io-memory address");
 MODULE_PARM_DESC(irq, "The interrupt number");
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to