All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] [PATCH] Various fixes and improvements for RT-Socket-CAN
@ 2006-08-23 18:27 Wolfgang Grandegger
  2006-08-23 19:49 ` Jan Kiszka
  0 siblings, 1 reply; 2+ messages in thread
From: Wolfgang Grandegger @ 2006-08-23 18:27 UTC (permalink / raw)
  To: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 710 bytes --]

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.

[-- Attachment #2: xenomai-rtsocketcan4.patch --]
[-- Type: text/x-patch, Size: 28681 bytes --]

+ diff -u xenomai/ChangeLog.ORIG xenomai/ChangeLog
--- xenomai/ChangeLog.ORIG	2006-08-23 19:20:42.000000000 +0200
+++ xenomai/ChangeLog	2006-08-23 19:21:50.000000000 +0200
@@ -1,3 +1,17 @@
+2006-08-23  Wolfgang Grandegger <wg@domain.hid>
+
+	* 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  <rpm@xenomai.org>
 
 	* 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
--- xenomai/ksrc/drivers/can/mscan/rtcan_mscan.c.ORIG	2006-08-22 20:40:29.000000000 +0200
+++ xenomai/ksrc/drivers/can/mscan/rtcan_mscan.c	2006-08-22 20:41:52.000000000 +0200
@@ -29,7 +29,6 @@
 #include <linux/module.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
-#include <asm/mpc5xxx.h>
 #include <asm/ppcboot.h>
 
 #include <rtdm/rtdm_driver.h>
@@ -38,6 +37,7 @@
 #include <rtdm/rtcan.h>
 #include "rtcan_dev.h"
 #include "rtcan_raw.h"
+#include "rtcan_mscan_regs.h"
 
 extern int rtcan_mscan_create_proc(struct rtcan_device* dev);
 extern void rtcan_mscan_remove_proc(struct rtcan_device* dev);
@@ -49,39 +49,6 @@
 static char *mscan_ctlr_name  = "MSCAN-MPC5200";
 static char *mscan_board_name = "unkown";
 
-/** Value for the interrupt enable register */
-#define MSCAN_RIER                  (MPC5xxx_MSCAN_OVRIE | \
-				     MPC5xxx_MSCAN_RXFIE | \
-				     MPC5xxx_MSCAN_WUPIF | \
-				     MPC5xxx_MSCAN_CSCIE | \
-				     MPC5xxx_MSCAN_RSTATE0 | \
-				     MPC5xxx_MSCAN_RSTATE1 | \
-				     MPC5xxx_MSCAN_TSTATE0 | \
-				     MPC5xxx_MSCAN_TSTATE1)
-
-#define BTR0_BRP_MASK    0x3f
-#define BTR0_SJW_SHIFT   6
-#define BTR0_SJW_MASK    (0x3 << BTR0_SJW_SHIFT)
-
-#define BTR1_TSEG1_MASK  0xf
-#define BTR1_TSEG2_SHIFT 4
-#define BTR1_TSEG2_MASK  (0x7 << BTR1_TSEG2_SHIFT)
-#define BTR1_SAM_SHIFT   7
-
-#define BTR0_SET_BRP(brp)     (((brp) - 1) & BTR0_BRP_MASK)
-#define BTR0_SET_SJW(sjw)     ((((sjw) - 1) << BTR0_SJW_SHIFT) & BTR0_SJW_MASK)
-
-#define BTR1_SET_TSEG1(tseg1) (((tseg1) - 1) & BTR1_TSEG1_MASK)
-#define BTR1_SET_TSEG2(tseg2) ((((tseg2) - 1) << BTR1_TSEG2_SHIFT) & BTR1_TSEG2_MASK)
-#define BTR1_SET_SAM(sam)     (((sam) & 1) << BTR1_SAM_SHIFT)
-
-/* Message type access macros.
- */
-#define MSCAN_BUF_STD_RTR       0x10
-#define MSCAN_BUF_EXT_RTR       0x01
-#define MSCAN_BUF_EXTENDED      0x08
-#define MSCAN_TX_BUFS           3
-
 MODULE_AUTHOR("Wolfgang Grandegger <wg@domain.hid>");
 MODULE_DESCRIPTION("RT-Socket-CAN driver for MSCAN-MPC2500");
 MODULE_SUPPORTED_DEVICE("MSCAN-MPC5200 CAN controller");
@@ -143,7 +110,7 @@
     int i;
     unsigned char size;
     struct rtcan_rb_frame *frame = &skb->rb_frame;
-    struct mpc5xxx_mscan *regs = (struct mpc5xxx_mscan *)dev->base_addr;
+    struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr;
 
     skb->rb_frame_size = EMPTY_RB_FRAME_SIZE;
 
@@ -201,7 +168,7 @@
 {
     u8 rstat, tstat;
     struct rtcan_rb_frame *frame = &skb->rb_frame;
-    struct mpc5xxx_mscan *regs = (struct mpc5xxx_mscan *)dev->base_addr;
+    struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr;
 
     skb->rb_frame_size = EMPTY_RB_FRAME_SIZE + CAN_ERR_DLC;
 
@@ -210,16 +177,16 @@
 
     memset(&frame->data[0], 0, frame->can_dlc);
 
-    if ((r_status & MPC5xxx_MSCAN_OVRIF)) {
+    if ((r_status & MSCAN_OVRIF)) {
 	frame->can_id |= CAN_ERR_CRTL;
 	frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
 
-    } else if ((r_status & (MPC5xxx_MSCAN_CSCIF))) {
+    } else if ((r_status & (MSCAN_CSCIF))) {
 	
-	rstat = (r_status & (MPC5xxx_MSCAN_TSTAT0 | 
-			     MPC5xxx_MSCAN_TSTAT1)) >> 2 & 0x3;  
-	tstat = (r_status & (MPC5xxx_MSCAN_RSTAT0 | 
-			     MPC5xxx_MSCAN_RSTAT1)) >> 4 & 0x3;  
+	rstat = (r_status & (MSCAN_TSTAT0 | 
+			     MSCAN_TSTAT1)) >> 2 & 0x3;  
+	tstat = (r_status & (MSCAN_RSTAT0 | 
+			     MSCAN_RSTAT1)) >> 4 & 0x3;  
 	dev->state = mscan_stat_map[max(rstat, tstat)];
 
 	switch (dev->state) {
@@ -266,14 +233,14 @@
     nanosecs_abs_t timestamp = rtdm_clock_read();
     struct rtcan_skb skb;
     struct rtcan_device *dev;
-    struct mpc5xxx_mscan *regs;
+    struct mscan_regs *regs;
     u8 t_status, r_status;
     int recv_lock_free = 1;
     int ret = RTDM_IRQ_NONE;
 
 
     dev = (struct rtcan_device *)rtdm_irq_get_arg(irq_handle, void);
-    regs = (struct mpc5xxx_mscan *)dev->base_addr;
+    regs = (struct mscan_regs *)dev->base_addr;
 
     rtdm_lock_get(&dev->device_lock);
 
@@ -283,23 +250,23 @@
     ret = RTDM_IRQ_HANDLED;
 
     /* Transmit Interrupt? */
-    if ((t_status & MPC5xxx_MSCAN_TXE)) {
+    if ((t_status & MSCAN_TXE)) {
 	/* Disable transmit interrupt here or it will
 	 * constantly be pending.
 	 */
-	regs->cantier &= ~MPC5xxx_MSCAN_TXIE;
+	regs->cantier &= ~MSCAN_TXIE;
 
 	/* Wake up a sender */
 	rtdm_sem_up(&dev->tx_sem);
     }
 
     /* Wakeup interrupt?  */
-    if ((r_status & MPC5xxx_MSCAN_WUPIF)) {
+    if ((r_status & MSCAN_WUPIF)) {
 	rtdm_printk("WUPIF interrupt\n");
     }
 
     /* Receive Interrupt? */
-    if ((r_status & MPC5xxx_MSCAN_RXF)) {
+    if ((r_status & MSCAN_RXF)) {
 	
 	/* Read out HW registers */
 	rtcan_mscan_rx_interrupt(dev, &skb);
@@ -324,7 +291,7 @@
     }
 
     /* Error Interrupt? */
-    if ((r_status & (MPC5xxx_MSCAN_CSCIF | MPC5xxx_MSCAN_OVRIF))) {
+    if ((r_status & (MSCAN_CSCIF | MSCAN_OVRIF))) {
 	/* Check error condition and fill error frame */
 	rtcan_mscan_err_interrupt(dev, &skb, r_status);
 
@@ -345,8 +312,8 @@
 	regs->canrflg = r_status;
 
     if (!recv_lock_free) {
-        rtdm_lock_put(&socket_lock);
-        rtdm_lock_put(&recv_list_lock);
+        rtdm_lock_put(&rtcan_socket_lock);
+        rtdm_lock_put(&rtcan_recv_list_lock);
     }
     rtdm_lock_put(&dev->device_lock);
 
@@ -381,8 +348,8 @@
     int ret = 0;
     int rinit = 0;
     can_state_t state;
-    volatile struct mpc5xxx_mscan *regs = 
-	(struct mpc5xxx_mscan *)dev->base_addr;
+    volatile struct mscan_regs *regs = 
+	(struct mscan_regs *)dev->base_addr;
     u8 reg;
 
     state = dev->state;
@@ -391,12 +358,12 @@
         goto out;
 
     /* Switch to sleep mode */
-    regs->canctl0 |= MPC5xxx_MSCAN_SLPRQ;
-    regs->canctl0 |= MPC5xxx_MSCAN_INITRQ;
+    regs->canctl0 |= MSCAN_SLPRQ;
+    regs->canctl0 |= MSCAN_INITRQ;
     
     reg = regs->canctl1;
-    while (!(reg & MPC5xxx_MSCAN_SLPAK) ||
-	   !(reg & MPC5xxx_MSCAN_INITAK)) {
+    while (!(reg & MSCAN_SLPAK) ||
+	   !(reg & MSCAN_INITAK)) {
         if (likely(lock_ctx != NULL))
             rtdm_lock_put_irqrestore(&dev->device_lock, *lock_ctx);
         /* Busy sleep 1 microsecond */
@@ -440,8 +407,8 @@
 {
     int ret = 0, retries = 0;
     can_state_t state;
-    volatile struct mpc5xxx_mscan *regs = 
-	(struct mpc5xxx_mscan *)dev->base_addr;
+    volatile struct mscan_regs *regs = 
+	(struct mscan_regs *)dev->base_addr;
 
     /* We won't forget that state in the device structure is volatile and
      * access to it will not be optimized by the compiler. So ... */
@@ -461,21 +428,21 @@
 	rtdm_sem_init(&dev->tx_sem, MSCAN_TX_BUFS);
 
 	if ((dev->ctrl_mode & CAN_CTRLMODE_LISTENONLY)) {
-	    regs->canctl1 |= MPC5xxx_MSCAN_LISTEN;
+	    regs->canctl1 |= MSCAN_LISTEN;
 	} else {
-	    regs->canctl1 &= ~MPC5xxx_MSCAN_LISTEN;
+	    regs->canctl1 &= ~MSCAN_LISTEN;
 	}
 	if ((dev->ctrl_mode & CAN_CTRLMODE_LOOPBACK)) {
-	    regs->canctl1 |= MPC5xxx_MSCAN_LOOPB;
+	    regs->canctl1 |= MSCAN_LOOPB;
 	} else {
-	    regs->canctl1 &= ~MPC5xxx_MSCAN_LOOPB;
+	    regs->canctl1 &= ~MSCAN_LOOPB;
 	}
 
 	/* Switch to normal mode */
-	regs->canctl0 &= ~MPC5xxx_MSCAN_INITRQ;
-	regs->canctl0 &= ~MPC5xxx_MSCAN_SLPRQ;
-	while ((regs->canctl1 & MPC5xxx_MSCAN_INITAK) ||
-	       (regs->canctl1 & MPC5xxx_MSCAN_SLPAK)) {
+	regs->canctl0 &= ~MSCAN_INITRQ;
+	regs->canctl0 &= ~MSCAN_SLPRQ;
+	while ((regs->canctl1 & MSCAN_INITAK) ||
+	       (regs->canctl1 & MSCAN_SLPAK)) {
 	    if (likely(lock_ctx != NULL))
 		rtdm_lock_put_irqrestore(&dev->device_lock, *lock_ctx);
 	    /* Busy sleep 1 microsecond */
@@ -513,7 +480,7 @@
 			     struct can_bittime *bit_time,
 			     rtdm_lockctx_t *lock_ctx)
 {
-    struct mpc5xxx_mscan *regs = (struct mpc5xxx_mscan *)dev->base_addr; 
+    struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr; 
     u8 btr0, btr1;
 	
     switch (bit_time->type) {
@@ -549,7 +516,7 @@
 {
     int ret = 0, retries = 0;
     can_state_t state;
-    struct mpc5xxx_mscan *regs = (struct mpc5xxx_mscan *)dev->base_addr; 
+    struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr; 
 
     switch (mode) {
 
@@ -584,8 +551,8 @@
 	 * the meaning of interrupts ...) */
 	regs->canrier = 0;
 	regs->cantier = 0;
-	regs->canctl0 |= MPC5xxx_MSCAN_SLPRQ /*| MPC5xxx_MSCAN_INITRQ*/ | MPC5xxx_MSCAN_WUPE;
-	while (!(regs->canctl1 & MPC5xxx_MSCAN_SLPAK)) {
+	regs->canctl0 |= MSCAN_SLPRQ /*| MSCAN_INITRQ*/ | MSCAN_WUPE;
+	while (!(regs->canctl1 & MSCAN_SLPAK)) {
 	    rtdm_lock_put_irqrestore(&dev->device_lock, *lock_ctx);
 	    /* Busy sleep 1 microsecond */
 	    rtdm_task_busy_sleep(1000);
@@ -594,8 +561,8 @@
 		break;
 	}
 	rtdm_printk("Fallen asleep after %d tries.\n", retries);
-	regs->canctl0 &= ~MPC5xxx_MSCAN_INITRQ;
-	while ((regs->canctl1 & MPC5xxx_MSCAN_INITAK)) {
+	regs->canctl0 &= ~MSCAN_INITRQ;
+	while ((regs->canctl1 & MSCAN_INITAK)) {
 	    rtdm_lock_put_irqrestore(&dev->device_lock, *lock_ctx);
 	    /* Busy sleep 1 microsecond */
 	    rtdm_task_busy_sleep(1000);
@@ -604,7 +571,7 @@
 		break;
 	}
 	rtdm_printk("Back to normal after %d tries.\n", retries);
-	regs->canrier = MPC5xxx_MSCAN_WUPIE;
+	regs->canrier = MSCAN_WUPIE;
 	
     mode_sleep_out:
 	dev->state = state;
@@ -636,7 +603,7 @@
     /* Content of frame information register */
     unsigned char   dlc;
 
-    struct mpc5xxx_mscan *regs = (struct mpc5xxx_mscan *)dev->base_addr;
+    struct mscan_regs *regs = (struct mscan_regs *)dev->base_addr;
 
     /* Find an empty TX buffer. */
     for (buf = 0; buf < MSCAN_TX_BUFS; buf++) {
@@ -718,12 +685,12 @@
  *
  *  @param[in] dev Device ID of the controller to be configured
  */
-static inline void __init mscan_chip_config(struct mpc5xxx_mscan *regs)
+static inline void __init mscan_chip_config(struct mscan_regs *regs)
 {
     /* Choose IP bus as clock source.
      */
-    regs->canctl1 |= MPC5xxx_MSCAN_CLKSRC;
-    regs->canctl1 &= ~MPC5xxx_MSCAN_LISTEN;
+    regs->canctl1 |= MSCAN_CLKSRC;
+    regs->canctl1 &= ~MSCAN_LISTEN;
 
     /* Configure MSCAN to accept all incoming messages.
      */
@@ -735,7 +702,7 @@
     regs->canidar6 = regs->canidar7 = 0x00;
     regs->canidmr4 = regs->canidmr5 = 0xFF;
     regs->canidmr6 = regs->canidmr7 = 0xFF;
-    regs->canidac &= ~(MPC5xxx_MSCAN_IDAM0 | MPC5xxx_MSCAN_IDAM1);
+    regs->canidac &= ~(MSCAN_IDAM0 | MSCAN_IDAM1);
 }
 
 static inline void __init mscan_gpio_config(void)
@@ -779,16 +746,16 @@
     unsigned long addr;
     struct rtcan_device *dev;
     struct rtcan_priv *priv;
-    struct mpc5xxx_mscan *regs;
+    struct mscan_regs *regs;
 
     switch (port[idx]) {
     case 1:
-	addr = MPC5xxx_MSCAN1;
-	irq = MPC5xxx_CAN1_IRQ;
+	addr = MSCAN_CAN1_ADDR;
+	irq = MSCAN_CAN1_IRQ;
 	break;
     case 2:
-	addr = MPC5xxx_MSCAN2;
-	irq = MPC5xxx_CAN2_IRQ;
+	addr = MSCAN_CAN2_ADDR;
+	irq = MSCAN_CAN2_IRQ;
 	break;
     default:
 	return 0;
@@ -805,10 +772,10 @@
 
     priv = dev->priv;
     dev->base_addr = addr;
-    regs = (struct mpc5xxx_mscan *)dev->base_addr;
+    regs = (struct mscan_regs *)dev->base_addr;
     
     /* Enable MSCAN module. */
-    regs->canctl1 |= MPC5xxx_MSCAN_CANE;
+    regs->canctl1 |= MSCAN_CANE;
     udelay(100);
     
     /* Set dummy state for following call */
@@ -862,7 +829,7 @@
 
  out_dev_free:
     /* Disable MSCAN module. */
-    regs->canctl1 &= ~MPC5xxx_MSCAN_CANE;
+    regs->canctl1 &= ~MSCAN_CANE;
     rtcan_dev_free(dev);
 
     return ret;
+ diff -u xenomai/ksrc/drivers/can/mscan/rtcan_mscan_proc.c.ORIG xenomai/ksrc/drivers/can/mscan/rtcan_mscan_proc.c
--- xenomai/ksrc/drivers/can/mscan/rtcan_mscan_proc.c.ORIG	2006-08-22 20:40:29.000000000 +0200
+++ xenomai/ksrc/drivers/can/mscan/rtcan_mscan_proc.c	2006-08-22 20:41:52.000000000 +0200
@@ -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
--- xenomai/ksrc/drivers/can/mscan/rtcan_mscan_regs.h.ORIG	2006-08-22 20:41:52.000000000 +0200
+++ xenomai/ksrc/drivers/can/mscan/rtcan_mscan_regs.h	2006-08-22 20:41:52.000000000 +0200
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2006 Wolfgang Grandegger <wg@domain.hid>
+ *
+ * Based on linux-2.4.25/include/asm-ppc/mpc5xxx.h
+ * Prototypes, etc. for the Motorola MPC5xxx embedded cpu chips
+ *
+ * Author: Dale Farnsworth <dfarnsworth@domain.hid>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __RTCAN_MSCAN_REGS_H_
+#define __RTCAN_MSCAN_REGS_H_
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+#include <asm/mpc5xxx.h>
+#define MSCAN_MBAR	MPC5xxx_MBAR
+#define MSCAN_CAN1_IRQ	MPC5xxx_CAN1_IRQ
+#define MSCAN_CAN2_IRQ	MPC5xxx_CAN2_IRQ
+#else
+#include <asm/mpc52xx.h>
+#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_gpio
+#endif
+
+#define MSCAN_CAN1_ADDR	(MSCAN_MBAR + 0x0900) /* MSCAN Module 1 */
+#define MSCAN_CAN2_ADDR	(MSCAN_MBAR + 0x0980) /* MSCAN Module 2 */
+
+/* MSCAN control register 0 (CANCTL0) bits */
+#define MSCAN_RXFRM	0x80
+#define MSCAN_RXACT	0x40
+#define MSCAN_CSWAI	0x20
+#define MSCAN_SYNCH	0x10
+#define MSCAN_TIME	0x08
+#define MSCAN_WUPE	0x04
+#define MSCAN_SLPRQ	0x02
+#define MSCAN_INITRQ	0x01
+
+/* MSCAN control register 1 (CANCTL1) bits */
+#define MSCAN_CANE	0x80
+#define MSCAN_CLKSRC	0x40
+#define MSCAN_LOOPB	0x20
+#define MSCAN_LISTEN	0x10
+#define MSCAN_WUPM	0x04
+#define MSCAN_SLPAK	0x02
+#define MSCAN_INITAK	0x01
+
+/* MSCAN receiver flag register (CANRFLG) bits */
+#define MSCAN_WUPIF	0x80
+#define MSCAN_CSCIF	0x40
+#define MSCAN_RSTAT1	0x20
+#define MSCAN_RSTAT0	0x10
+#define MSCAN_TSTAT1	0x08
+#define MSCAN_TSTAT0	0x04
+#define MSCAN_OVRIF	0x02
+#define MSCAN_RXF	0x01
+
+/* MSCAN receiver interrupt enable register (CANRIER) bits */
+#define MSCAN_WUPIE	0x80
+#define MSCAN_CSCIE	0x40
+#define MSCAN_RSTATE1	0x20
+#define MSCAN_RSTATE0	0x10
+#define MSCAN_TSTATE1	0x08
+#define MSCAN_TSTATE0	0x04
+#define MSCAN_OVRIE	0x02
+#define MSCAN_RXFIE	0x01
+
+/* MSCAN transmitter flag register (CANTFLG) bits */
+#define MSCAN_TXE2	0x04
+#define MSCAN_TXE1	0x02
+#define MSCAN_TXE0	0x01
+#define MSCAN_TXE	(MSCAN_TXE2 | MSCAN_TXE1 | MSCAN_TXE0)
+
+/* MSCAN transmitter interrupt enable register (CANTIER) bits */
+#define MSCAN_TXIE2	0x04
+#define MSCAN_TXIE1	0x02
+#define MSCAN_TXIE0	0x01
+#define MSCAN_TXIE	(MSCAN_TXIE2 | MSCAN_TXIE1 | MSCAN_TXIE0)
+
+/* MSCAN transmitter message abort request (CANTARQ) bits */
+#define MSCAN_ABTRQ2	0x04
+#define MSCAN_ABTRQ1	0x02
+#define MSCAN_ABTRQ0	0x01
+
+/* MSCAN transmitter message abort ack (CANTAAK) bits */
+#define MSCAN_ABTAK2	0x04
+#define MSCAN_ABTAK1	0x02
+#define MSCAN_ABTAK0	0x01
+
+/* MSCAN transmit buffer selection (CANTBSEL) bits */
+#define MSCAN_TX2	0x04
+#define MSCAN_TX1	0x02
+#define MSCAN_TX0	0x01
+
+/* MSCAN ID acceptance control register (CANIDAC) bits */
+#define MSCAN_IDAM1	0x20
+#define MSCAN_IDAM0	0x10
+#define MSCAN_IDHIT2	0x04
+#define MSCAN_IDHIT1	0x02
+#define MSCAN_IDHIT0	0x01
+
+struct mscan_msgbuf {
+	volatile u8  idr[0x8];		/* 0x00 */
+	volatile u8  dsr[0x10];		/* 0x08 */
+	volatile u8  dlr;		/* 0x18 */
+	volatile u8  tbpr;		/* 0x19 */	/* This register is not applicable for receive buffers */
+	volatile u16 rsrv1;		/* 0x1A */
+	volatile u8  tsrh;		/* 0x1C */
+	volatile u8  tsrl;		/* 0x1D */
+	volatile u16 rsrv2;		/* 0x1E */
+};
+
+struct mscan_regs {
+	volatile u8  canctl0;		/* MSCAN + 0x00 */
+	volatile u8  canctl1;		/* MSCAN + 0x01 */
+	volatile u16 rsrv1;		/* MSCAN + 0x02 */
+	volatile u8  canbtr0;		/* MSCAN + 0x04 */
+	volatile u8  canbtr1;		/* MSCAN + 0x05 */
+	volatile u16 rsrv2;		/* MSCAN + 0x06 */
+	volatile u8  canrflg;		/* MSCAN + 0x08 */
+	volatile u8  canrier;		/* MSCAN + 0x09 */
+	volatile u16 rsrv3;		/* MSCAN + 0x0A */
+	volatile u8  cantflg;		/* MSCAN + 0x0C */
+	volatile u8  cantier;		/* MSCAN + 0x0D */
+	volatile u16 rsrv4;		/* MSCAN + 0x0E */
+	volatile u8  cantarq;		/* MSCAN + 0x10 */
+	volatile u8  cantaak;		/* MSCAN + 0x11 */
+	volatile u16 rsrv5;		/* MSCAN + 0x12 */
+	volatile u8  cantbsel;		/* MSCAN + 0x14 */
+	volatile u8  canidac;		/* MSCAN + 0x15 */
+	volatile u16 rsrv6[3];		/* MSCAN + 0x16 */
+	volatile u8  canrxerr;		/* MSCAN + 0x1C */
+	volatile u8  cantxerr;		/* MSCAN + 0x1D */
+	volatile u16 rsrv7;		/* MSCAN + 0x1E */
+	volatile u8  canidar0;		/* MSCAN + 0x20 */
+	volatile u8  canidar1;		/* MSCAN + 0x21 */
+	volatile u16 rsrv8;		/* MSCAN + 0x22 */
+	volatile u8  canidar2;		/* MSCAN + 0x24 */
+	volatile u8  canidar3;		/* MSCAN + 0x25 */
+	volatile u16 rsrv9;		/* MSCAN + 0x26 */
+	volatile u8  canidmr0;		/* MSCAN + 0x28 */
+	volatile u8  canidmr1;		/* MSCAN + 0x29 */
+	volatile u16 rsrv10;		/* MSCAN + 0x2A */
+	volatile u8  canidmr2;		/* MSCAN + 0x2C */
+	volatile u8  canidmr3;		/* MSCAN + 0x2D */
+	volatile u16 rsrv11;		/* MSCAN + 0x2E */
+	volatile u8  canidar4;		/* MSCAN + 0x30 */
+	volatile u8  canidar5;		/* MSCAN + 0x31 */
+	volatile u16 rsrv12;		/* MSCAN + 0x32 */
+	volatile u8  canidar6;		/* MSCAN + 0x34 */
+	volatile u8  canidar7;		/* MSCAN + 0x35 */
+	volatile u16 rsrv13;		/* MSCAN + 0x36 */
+	volatile u8  canidmr4;		/* MSCAN + 0x38 */
+	volatile u8  canidmr5;		/* MSCAN + 0x39 */
+	volatile u16 rsrv14;		/* MSCAN + 0x3A */
+	volatile u8  canidmr6;		/* MSCAN + 0x3C */
+	volatile u8  canidmr7;		/* MSCAN + 0x3D */
+	volatile u16 rsrv15;		/* MSCAN + 0x3E */
+
+	struct mscan_msgbuf canrxfg;	/* MSCAN + 0x40 */    /* Foreground receive buffer */
+	struct mscan_msgbuf cantxfg;	/* MSCAN + 0x60 */    /* Foreground transmit buffer */
+};
+
+/* Message type access macros.
+ */
+#define MSCAN_BUF_STD_RTR       0x10
+#define MSCAN_BUF_EXT_RTR       0x01
+#define MSCAN_BUF_EXTENDED      0x08
+#define MSCAN_TX_BUFS           3
+
+#define MSCAN_IDAM1	0x20
+/* Value for the interrupt enable register */
+#define MSCAN_RIER 	(MSCAN_OVRIE | \
+			 MSCAN_RXFIE | \
+			 MSCAN_WUPIF | \
+			 MSCAN_CSCIE | \
+			 MSCAN_RSTATE0 | \
+			 MSCAN_RSTATE1 | \
+			 MSCAN_TSTATE0 | \
+			 MSCAN_TSTATE1)
+
+#define BTR0_BRP_MASK 	 	0x3f
+#define BTR0_SJW_SHIFT 	 	6
+#define BTR0_SJW_MASK 	 	(0x3 << BTR0_SJW_SHIFT)
+
+#define BTR1_TSEG1_MASK	 	0xf
+#define BTR1_TSEG2_SHIFT  	4
+#define BTR1_TSEG2_MASK  	(0x7 << BTR1_TSEG2_SHIFT)
+#define BTR1_SAM_SHIFT 	  	7
+
+#define BTR0_SET_BRP(brp) 	(((brp) - 1) & BTR0_BRP_MASK)
+#define BTR0_SET_SJW(sjw) 	((((sjw) - 1) << BTR0_SJW_SHIFT) & BTR0_SJW_MASK)
+
+#define BTR1_SET_TSEG1(tseg1) 	(((tseg1) - 1) & BTR1_TSEG1_MASK)
+#define BTR1_SET_TSEG2(tseg2) 	((((tseg2) - 1) << BTR1_TSEG2_SHIFT) & BTR1_TSEG2_MASK)
+#define BTR1_SET_SAM(sam) 	(((sam) & 1) << BTR1_SAM_SHIFT)
+
+#endif /* __RTCAN_MSCAN_REGS_H_ */
+ diff -u xenomai/ksrc/drivers/can/rtcan_dev.c.ORIG xenomai/ksrc/drivers/can/rtcan_dev.c
--- xenomai/ksrc/drivers/can/rtcan_dev.c.ORIG	2006-08-22 20:40:29.000000000 +0200
+++ xenomai/ksrc/drivers/can/rtcan_dev.c	2006-08-22 20:41:52.000000000 +0200
@@ -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
--- xenomai/ksrc/drivers/can/rtcan_dev.h.ORIG	2006-08-22 20:40:30.000000000 +0200
+++ xenomai/ksrc/drivers/can/rtcan_dev.h	2006-08-22 21:29:11.000000000 +0200
@@ -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
--- xenomai/ksrc/drivers/can/rtcan_module.c.ORIG	2006-08-22 20:40:30.000000000 +0200
+++ xenomai/ksrc/drivers/can/rtcan_module.c	2006-08-22 20:41:52.000000000 +0200
@@ -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
--- xenomai/scripts/Modules.frag.ORIG	2006-08-22 20:39:57.000000000 +0200
+++ xenomai/scripts/Modules.frag	2006-08-22 22:10:17.000000000 +0200
@@ -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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-08-23 19:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-23 18:27 [Xenomai-core] [PATCH] Various fixes and improvements for RT-Socket-CAN Wolfgang Grandegger
2006-08-23 19:49 ` Jan Kiszka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.