From: Wolfgang Grandegger <wg@domain.hid>
To: xenomai-core <xenomai@xenomai.org>
Subject: [Xenomai-core] [PATCH] Various fixes and improvements for RT-Socket-CAN
Date: Wed, 23 Aug 2006 20:27:14 +0200 [thread overview]
Message-ID: <44EC9E02.3090201@domain.hid> (raw)
[-- 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
next reply other threads:[~2006-08-23 18:27 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-23 18:27 Wolfgang Grandegger [this message]
2006-08-23 19:49 ` [Xenomai-core] [PATCH] Various fixes and improvements for RT-Socket-CAN Jan Kiszka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=44EC9E02.3090201@domain.hid \
--to=wg@domain.hid \
--cc=xenomai@xenomai.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.