All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
@ 2011-11-24 12:07 Wolfgang Grandegger
  2011-11-24 12:07 ` [PATCH net-next 1/2] can: cc770: add driver core " Wolfgang Grandegger
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-11-24 12:07 UTC (permalink / raw)
  To: netdev
  Cc: linux-can, socketcan-users, IreneV, Stanislav Yelenskiy,
	Wolfgang Grandegger

Already since a while we have support for the Bosch CC770 and Intel
AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
It would be nice if somebody could test the driver. Unfortunately,
I currently do not have hardware at hand. I have not yet ported the
OF platform driver as it needs further attaention due to the merge
of the platform and OF platform interface.

Wolfgang Grandegger (2):
  can: cc770: add driver core for the Bosch CC770 and Intel AN82527
  can: cc770: legacy CC770 ISA bus driver

 drivers/net/can/Kconfig           |    2 +
 drivers/net/can/Makefile          |    1 +
 drivers/net/can/cc770/Kconfig     |   14 +
 drivers/net/can/cc770/Makefile    |    8 +
 drivers/net/can/cc770/cc770.c     |  895 +++++++++++++++++++++++++++++++++++++
 drivers/net/can/cc770/cc770.h     |  247 ++++++++++
 drivers/net/can/cc770/cc770_isa.c |  337 ++++++++++++++
 7 files changed, 1504 insertions(+), 0 deletions(-)
 create mode 100644 drivers/net/can/cc770/Kconfig
 create mode 100644 drivers/net/can/cc770/Makefile
 create mode 100644 drivers/net/can/cc770/cc770.c
 create mode 100644 drivers/net/can/cc770/cc770.h
 create mode 100644 drivers/net/can/cc770/cc770_isa.c

-- 
1.7.4.1


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

* [PATCH net-next 1/2] can: cc770: add driver core for the Bosch CC770 and Intel AN82527
  2011-11-24 12:07 [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 Wolfgang Grandegger
@ 2011-11-24 12:07 ` Wolfgang Grandegger
  2011-11-24 12:07 ` [PATCH next-next 2/2] can: cc770: legacy CC770 ISA bus driver Wolfgang Grandegger
  2011-11-29 23:39 ` [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 David Miller
  2 siblings, 0 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-11-24 12:07 UTC (permalink / raw)
  To: netdev
  Cc: linux-can, socketcan-users, IreneV, Stanislav Yelenskiy,
	Wolfgang Grandegger

Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
---
 drivers/net/can/Kconfig        |    2 +
 drivers/net/can/Makefile       |    1 +
 drivers/net/can/cc770/Kconfig  |    3 +
 drivers/net/can/cc770/Makefile |    7 +
 drivers/net/can/cc770/cc770.c  |  895 ++++++++++++++++++++++++++++++++++++++++
 drivers/net/can/cc770/cc770.h  |  247 +++++++++++
 6 files changed, 1155 insertions(+), 0 deletions(-)
 create mode 100644 drivers/net/can/cc770/Kconfig
 create mode 100644 drivers/net/can/cc770/Makefile
 create mode 100644 drivers/net/can/cc770/cc770.c
 create mode 100644 drivers/net/can/cc770/cc770.h

diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig
index f6c98fb..ab45758 100644
--- a/drivers/net/can/Kconfig
+++ b/drivers/net/can/Kconfig
@@ -116,6 +116,8 @@ source "drivers/net/can/sja1000/Kconfig"
 
 source "drivers/net/can/c_can/Kconfig"
 
+source "drivers/net/can/cc770/Kconfig"
+
 source "drivers/net/can/usb/Kconfig"
 
 source "drivers/net/can/softing/Kconfig"
diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile
index 24ebfe8..938be37 100644
--- a/drivers/net/can/Makefile
+++ b/drivers/net/can/Makefile
@@ -14,6 +14,7 @@ obj-y				+= softing/
 obj-$(CONFIG_CAN_SJA1000)	+= sja1000/
 obj-$(CONFIG_CAN_MSCAN)		+= mscan/
 obj-$(CONFIG_CAN_C_CAN)		+= c_can/
+obj-$(CONFIG_CAN_CC770)		+= cc770/
 obj-$(CONFIG_CAN_AT91)		+= at91_can.o
 obj-$(CONFIG_CAN_TI_HECC)	+= ti_hecc.o
 obj-$(CONFIG_CAN_MCP251X)	+= mcp251x.o
diff --git a/drivers/net/can/cc770/Kconfig b/drivers/net/can/cc770/Kconfig
new file mode 100644
index 0000000..225131b
--- /dev/null
+++ b/drivers/net/can/cc770/Kconfig
@@ -0,0 +1,3 @@
+menuconfig CAN_CC770
+	tristate "Bosch CC770 and Intel AN82527 devices"
+	depends on CAN_DEV && HAS_IOMEM
diff --git a/drivers/net/can/cc770/Makefile b/drivers/net/can/cc770/Makefile
new file mode 100644
index 0000000..34e8180
--- /dev/null
+++ b/drivers/net/can/cc770/Makefile
@@ -0,0 +1,7 @@
+#
+#  Makefile for the Bosch CC770 CAN controller drivers.
+#
+
+obj-$(CONFIG_CAN_CC770) += cc770.o
+
+ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
diff --git a/drivers/net/can/cc770/cc770.c b/drivers/net/can/cc770/cc770.c
new file mode 100644
index 0000000..81dc830
--- /dev/null
+++ b/drivers/net/can/cc770/cc770.c
@@ -0,0 +1,895 @@
+/*
+ * cc770.c - Bosch CC770 and Intel AN82527 network device driver
+ *
+ * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com>
+ *
+ * Derived from the old Socket-CAN i82527 driver:
+ *
+ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Volkswagen nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * Alternatively, provided that this notice is retained in full, this
+ * software may be distributed under the terms of the GNU General
+ * Public License ("GPL") version 2, in which case the provisions of the
+ * GPL apply INSTEAD OF those given above.
+ *
+ * The provided data structures and external interfaces from this code
+ * are not restricted to be used by modules with a GPL compatible license.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Send feedback to <socketcan-users@lists.berlios.de>
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/version.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/netdevice.h>
+#include <linux/if_arp.h>
+#include <linux/if_ether.h>
+#include <linux/skbuff.h>
+#include <linux/delay.h>
+
+#include <linux/can.h>
+#include <linux/can/dev.h>
+#include <linux/can/error.h>
+#include <linux/can/dev.h>
+
+#include "cc770.h"
+
+#define DRV_NAME  "cc770"
+
+MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION(DRV_NAME "CAN netdevice driver");
+
+/*
+ * The CC770 is a CAN controller from Bosch, which is 100% compatible
+ * with the AN82527 from Intel, but with "bugs" being fixed and some
+ * additional functionality, mainly:
+ *
+ * 1. RX and TX error counters are readable.
+ * 2. Support of silent (listen-only) mode.
+ * 3. Message object 15 can receive all types of frames, also RTR and EFF.
+ *
+ * Details are available from Bosch's "CC770_Product_Info_2007-01.pdf",
+ * which explains in detail the compatibility between the CC770 and the
+ * 82527. This driver use the additional functionality 3. on real CC770
+ * devices. Unfortunately, the CC770 does still not store the message
+ * identifier of received remote transmission request frames and
+ * therefore it's set to 0.
+ *
+ * The message objects 1..14 can be used for TX and RX while the message
+ * objects 15 is optimized for RX. It has a shadow register for reliable
+ * data receiption under heavy bus load. Therefore it makes sense to use
+ * this message object for the needed use case. The frame type (EFF/SFF)
+ * for the message object 15 can be defined via kernel module parameter
+ * "msgobj15_eff". If not equal 0, it will receive 29-bit EFF frames,
+ * otherwise 11 bit SFF messages.
+ */
+static int msgobj15_eff;
+module_param(msgobj15_eff, int, S_IRUGO);
+MODULE_PARM_DESC(msgobj15_eff, "Extended 29-bit frames for message object 15 "
+		 "(default: 11-bit standard frames)");
+
+static int i82527_compat;
+module_param(i82527_compat, int, S_IRUGO);
+MODULE_PARM_DESC(i82527_compat, "Strict Intel 82527 comptibility mode "
+		 "without using additional functions");
+
+/*
+ * This driver uses the last 5 message objects 11..15. The definitions
+ * and structure below allows to configure and assign them to the real
+ * message object.
+ */
+static unsigned char cc770_obj_flags[CC770_OBJ_MAX] = {
+	[CC770_OBJ_RX0] = CC770_OBJ_FLAG_RX,
+	[CC770_OBJ_RX1] = CC770_OBJ_FLAG_RX | CC770_OBJ_FLAG_EFF,
+	[CC770_OBJ_RX_RTR0] = CC770_OBJ_FLAG_RX | CC770_OBJ_FLAG_RTR,
+	[CC770_OBJ_RX_RTR1] = CC770_OBJ_FLAG_RX | CC770_OBJ_FLAG_RTR |
+			      CC770_OBJ_FLAG_EFF,
+	[CC770_OBJ_TX] = 0,
+};
+
+static struct can_bittiming_const cc770_bittiming_const = {
+	.name = DRV_NAME,
+	.tseg1_min = 1,
+	.tseg1_max = 16,
+	.tseg2_min = 1,
+	.tseg2_max = 8,
+	.sjw_max = 4,
+	.brp_min = 1,
+	.brp_max = 64,
+	.brp_inc = 1,
+};
+
+static inline int intid2obj(unsigned int intid)
+{
+	if (intid == 2)
+		return 0;
+	else
+		return MSGOBJ_LAST + 2 - intid;
+}
+
+static void enable_all_objs(const struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	u8 msgcfg;
+	unsigned char obj_flags;
+	unsigned int o, mo;
+
+	for (o = 0; o <  CC770_OBJ_MAX; o++) {
+		obj_flags = priv->obj_flags[o];
+		mo = obj2msgobj(o);
+
+		if (obj_flags & CC770_OBJ_FLAG_RX) {
+			/*
+			 * We don't need extra objects for RTR and EFF if
+			 * the additional CC770 functions are enabled.
+			 */
+			if (priv->control_normal_mode & CTRL_EAF) {
+				if (o > 0)
+					continue;
+				netdev_dbg(dev, "Message object %d for "
+					   "RX data, RTR, SFF and EFF\n", mo);
+			} else {
+				netdev_dbg(dev,
+					   "Message object %d for RX %s %s\n",
+					   mo, obj_flags & CC770_OBJ_FLAG_RTR ?
+					   "RTR" : "data",
+					   obj_flags & CC770_OBJ_FLAG_EFF ?
+					   "EFF" : "SFF");
+			}
+
+			if (obj_flags & CC770_OBJ_FLAG_EFF)
+				msgcfg = MSGCFG_XTD;
+			else
+				msgcfg = 0;
+			if (obj_flags & CC770_OBJ_FLAG_RTR)
+				msgcfg |= MSGCFG_DIR;
+
+			cc770_write_reg(priv, msgobj[mo].config, msgcfg);
+			cc770_write_reg(priv, msgobj[mo].ctrl0,
+					MSGVAL_SET | TXIE_RES |
+					RXIE_SET | INTPND_RES);
+
+			if (obj_flags & CC770_OBJ_FLAG_RTR)
+				cc770_write_reg(priv, msgobj[mo].ctrl1,
+						NEWDAT_RES | CPUUPD_SET |
+						TXRQST_RES | RMTPND_RES);
+			else
+				cc770_write_reg(priv, msgobj[mo].ctrl1,
+						NEWDAT_RES | MSGLST_RES |
+						TXRQST_RES | RMTPND_RES);
+		} else {
+			netdev_dbg(dev, "Message object %d for "
+				   "TX data, RTR, SFF and EFF\n", mo);
+
+			cc770_write_reg(priv, msgobj[mo].ctrl1,
+					RMTPND_RES | TXRQST_RES |
+					CPUUPD_RES | NEWDAT_RES);
+			cc770_write_reg(priv, msgobj[mo].ctrl0,
+					MSGVAL_RES | TXIE_RES |
+					RXIE_RES | INTPND_RES);
+		}
+	}
+}
+
+static void disable_all_objs(const struct cc770_priv *priv)
+{
+	int i, mo;
+
+	for (i = 0; i <  CC770_OBJ_MAX; i++) {
+		mo = obj2msgobj(i);
+
+		if (priv->obj_flags[i] & CC770_OBJ_FLAG_RX) {
+			if (i > 0 && priv->control_normal_mode & CTRL_EAF)
+				continue;
+
+			cc770_write_reg(priv, msgobj[mo].ctrl1,
+					NEWDAT_RES | MSGLST_RES |
+					TXRQST_RES | RMTPND_RES);
+			cc770_write_reg(priv, msgobj[mo].ctrl0,
+					MSGVAL_RES | TXIE_RES |
+					RXIE_RES | INTPND_RES);
+		} else {
+			/* Clear message object for send */
+			cc770_write_reg(priv, msgobj[mo].ctrl1,
+					RMTPND_RES | TXRQST_RES |
+					CPUUPD_RES | NEWDAT_RES);
+			cc770_write_reg(priv, msgobj[mo].ctrl0,
+					MSGVAL_RES | TXIE_RES |
+					RXIE_RES | INTPND_RES);
+		}
+	}
+}
+
+static void set_reset_mode(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	/* Enable configuration and puts chip in bus-off, disable interrupts */
+	cc770_write_reg(priv, control, CTRL_CCE | CTRL_INI);
+
+	priv->can.state = CAN_STATE_STOPPED;
+
+	/* Clear interrupts */
+	cc770_read_reg(priv, interrupt);
+
+	/* Clear status register */
+	cc770_write_reg(priv, status, 0);
+
+	/* Disable all used message objects */
+	disable_all_objs(priv);
+}
+
+static void set_normal_mode(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	/* Clear interrupts */
+	cc770_read_reg(priv, interrupt);
+
+	/* Clear status register and pre-set last error code */
+	cc770_write_reg(priv, status, STAT_LEC_MASK);
+
+	/* Enable all used message objects*/
+	enable_all_objs(dev);
+
+	/*
+	 * Clear bus-off, interrupts only for errors,
+	 * not for status change
+	 */
+	cc770_write_reg(priv, control, priv->control_normal_mode);
+
+	priv->can.state = CAN_STATE_ERROR_ACTIVE;
+}
+
+static void chipset_init(struct cc770_priv *priv)
+{
+	int mo, id, data;
+
+	/* Enable configuration and put chip in bus-off, disable interrupts */
+	cc770_write_reg(priv, control, (CTRL_CCE | CTRL_INI));
+
+	/* Set CLKOUT divider and slew rates */
+	cc770_write_reg(priv, clkout, priv->clkout);
+
+	/* Configure CPU interface / CLKOUT enable */
+	cc770_write_reg(priv, cpu_interface, priv->cpu_interface | CPUIF_CEN);
+
+	/* Set bus configuration  */
+	cc770_write_reg(priv, bus_config, priv->bus_config);
+
+	/* Clear interrupts */
+	cc770_read_reg(priv, interrupt);
+
+	/* Clear status register */
+	cc770_write_reg(priv, status, 0);
+
+	/* Clear and invalidate message objects */
+	for (mo = MSGOBJ_FIRST; mo <= MSGOBJ_LAST; mo++) {
+		cc770_write_reg(priv, msgobj[mo].ctrl0,
+				INTPND_UNC | RXIE_RES |
+				TXIE_RES | MSGVAL_RES);
+		cc770_write_reg(priv, msgobj[mo].ctrl0,
+				INTPND_RES | RXIE_RES |
+				TXIE_RES | MSGVAL_RES);
+		cc770_write_reg(priv, msgobj[mo].ctrl1,
+				NEWDAT_RES | MSGLST_RES |
+				TXRQST_RES | RMTPND_RES);
+		for (data = 0; data < 8; data++)
+			cc770_write_reg(priv, msgobj[mo].data[data], 0);
+		for (id = 0; id < 4; id++)
+			cc770_write_reg(priv, msgobj[mo].id[id], 0);
+		cc770_write_reg(priv, msgobj[mo].config, 0);
+	}
+
+	/* Set all global ID masks to "don't care" */
+	cc770_write_reg(priv, global_mask_std[0], 0);
+	cc770_write_reg(priv, global_mask_std[1], 0);
+	cc770_write_reg(priv, global_mask_ext[0], 0);
+	cc770_write_reg(priv, global_mask_ext[1], 0);
+	cc770_write_reg(priv, global_mask_ext[2], 0);
+	cc770_write_reg(priv, global_mask_ext[3], 0);
+
+}
+
+static int cc770_probe_chip(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	/* Enable configuration, put chip in bus-off, disable ints */
+	cc770_write_reg(priv, control, CTRL_CCE | CTRL_EAF | CTRL_INI);
+	/* Configure cpu interface / CLKOUT disable */
+	cc770_write_reg(priv, cpu_interface, priv->cpu_interface);
+
+	/*
+	 * Check if hardware reset is still inactive or maybe there
+	 * is no chip in this address space
+	 */
+	if (cc770_read_reg(priv, cpu_interface) & CPUIF_RST) {
+		netdev_info(dev, "probing @0x%p failed (reset)\n",
+			    priv->reg_base);
+		return 0;
+	}
+
+	/* Write and read back test pattern */
+	cc770_write_reg(priv, msgobj[1].data[1], 0x25);
+	cc770_write_reg(priv, msgobj[2].data[3], 0x52);
+	cc770_write_reg(priv, msgobj[10].data[6], 0xc3);
+	if ((cc770_read_reg(priv, msgobj[1].data[1]) != 0x25) ||
+	    (cc770_read_reg(priv, msgobj[2].data[3]) != 0x52) ||
+	    (cc770_read_reg(priv, msgobj[10].data[6]) != 0xc3)) {
+		netdev_info(dev, "probing @0x%p failed (pattern)\n",
+			    priv->reg_base);
+		return 0;
+	}
+
+	/* Check if this chip is a CC770 supporting additional functions */
+	if (cc770_read_reg(priv, control) & CTRL_EAF)
+		priv->control_normal_mode |= CTRL_EAF;
+
+	return 1;
+}
+
+static void cc770_start(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	/* leave reset mode */
+	if (priv->can.state != CAN_STATE_STOPPED)
+		set_reset_mode(dev);
+
+	/* leave reset mode */
+	set_normal_mode(dev);
+}
+
+static int cc770_set_mode(struct net_device *dev, enum can_mode mode)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	if (!priv->open_time)
+		return -EINVAL;
+
+	switch (mode) {
+	case CAN_MODE_START:
+		cc770_start(dev);
+		if (netif_queue_stopped(dev))
+			netif_wake_queue(dev);
+		break;
+
+	default:
+		return -EOPNOTSUPP;
+	}
+
+	return 0;
+}
+
+static int cc770_set_bittiming(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	struct can_bittiming *bt = &priv->can.bittiming;
+	u8 btr0, btr1;
+
+	btr0 = ((bt->brp - 1) & 0x3f) | (((bt->sjw - 1) & 0x3) << 6);
+	btr1 = ((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) |
+		(((bt->phase_seg2 - 1) & 0x7) << 4);
+	if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
+		btr1 |= 0x80;
+
+	netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1);
+
+	cc770_write_reg(priv, bit_timing_0, btr0);
+	cc770_write_reg(priv, bit_timing_1, btr1);
+
+	return 0;
+}
+
+static netdev_tx_t cc770_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	struct net_device_stats *stats = &dev->stats;
+	struct can_frame *cf = (struct can_frame *)skb->data;
+	unsigned int mo = obj2msgobj(CC770_OBJ_TX);
+	u8 dlc, rtr;
+	u32 id;
+	int i;
+
+	if (can_dropped_invalid_skb(dev, skb))
+		return NETDEV_TX_OK;
+
+	if ((cc770_read_reg(priv,
+			    msgobj[mo].ctrl1) & TXRQST_UNC) == TXRQST_SET) {
+		netdev_err(dev, "TX register is still occupied!\n");
+		return NETDEV_TX_BUSY;
+	}
+
+	netif_stop_queue(dev);
+
+	dlc = cf->can_dlc;
+	id = cf->can_id;
+	if (cf->can_id & CAN_RTR_FLAG)
+		rtr = 0;
+	else
+		rtr = MSGCFG_DIR;
+	cc770_write_reg(priv, msgobj[mo].ctrl1,
+			RMTPND_RES | TXRQST_RES | CPUUPD_SET | NEWDAT_RES);
+	cc770_write_reg(priv, msgobj[mo].ctrl0,
+			MSGVAL_SET | TXIE_SET | RXIE_RES | INTPND_RES);
+	if (id & CAN_EFF_FLAG) {
+		id &= CAN_EFF_MASK;
+		cc770_write_reg(priv, msgobj[mo].config,
+				(dlc << 4) + rtr + MSGCFG_XTD);
+		cc770_write_reg(priv, msgobj[mo].id[3],
+				(id << 3) & 0xFFU);
+		cc770_write_reg(priv, msgobj[mo].id[2],
+				(id >> 5) & 0xFFU);
+		cc770_write_reg(priv, msgobj[mo].id[1],
+				(id >> 13) & 0xFFU);
+		cc770_write_reg(priv, msgobj[mo].id[0],
+				(id >> 21) & 0xFFU);
+	} else {
+		id &= CAN_SFF_MASK;
+		cc770_write_reg(priv, msgobj[mo].config,
+				(dlc << 4) + rtr);
+		cc770_write_reg(priv, msgobj[mo].id[0],
+				(id >> 3) & 0xFFU);
+		cc770_write_reg(priv, msgobj[mo].id[1],
+				(id << 5) & 0xFFU);
+	}
+
+	dlc &= 0x0f;		/* restore length only */
+	for (i = 0; i < dlc; i++)
+		cc770_write_reg(priv, msgobj[mo].data[i], cf->data[i]);
+
+	cc770_write_reg(priv, msgobj[mo].ctrl1,
+			RMTPND_RES | TXRQST_SET | CPUUPD_RES | NEWDAT_UNC);
+
+	stats->tx_bytes += dlc;
+
+	can_put_echo_skb(skb, dev, 0);
+
+	/*
+	 * HM: We had some cases of repeated IRQs so make sure the
+	 * INT is acknowledged I know it's already further up, but
+	 * doing again fixed the issue
+	 */
+	cc770_write_reg(priv, msgobj[mo].ctrl0,
+			MSGVAL_UNC | TXIE_UNC | RXIE_UNC | INTPND_RES);
+
+	return NETDEV_TX_OK;
+}
+
+static void cc770_rx(struct net_device *dev, unsigned int mo, u8 ctrl1)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	struct net_device_stats *stats = &dev->stats;
+	struct can_frame *cf;
+	struct sk_buff *skb;
+	u8 config;
+	u32 id;
+	int i;
+
+	skb = alloc_can_skb(dev, &cf);
+	if (skb == NULL)
+		return;
+
+	config = cc770_read_reg(priv, msgobj[mo].config);
+
+	if (ctrl1 & RMTPND_SET) {
+		/*
+		 * Unfortunately, the chip does not store the real message
+		 * identifier of the received remote transmission request
+		 * frame. Therefore we set it to 0.
+		 */
+		cf->can_id = CAN_RTR_FLAG;
+		if (config & MSGCFG_XTD)
+			cf->can_id |= CAN_EFF_FLAG;
+		cf->can_dlc = 0;
+	} else {
+		if (config & MSGCFG_XTD) {
+			id = cc770_read_reg(priv, msgobj[mo].id[3]);
+			id |= cc770_read_reg(priv, msgobj[mo].id[2]) << 8;
+			id |= cc770_read_reg(priv, msgobj[mo].id[1]) << 16;
+			id |= cc770_read_reg(priv, msgobj[mo].id[0]) << 24;
+			id >>= 3;
+			id |= CAN_EFF_FLAG;
+		} else {
+			id = cc770_read_reg(priv, msgobj[mo].id[1]);
+			id |= cc770_read_reg(priv, msgobj[mo].id[0]) << 8;
+			id >>= 5;
+		}
+
+		cf->can_id = id;
+		cf->can_dlc = get_can_dlc((config & 0xf0) >> 4);
+		for (i = 0; i < cf->can_dlc; i++)
+			cf->data[i] = cc770_read_reg(priv, msgobj[mo].data[i]);
+	}
+	netif_rx(skb);
+
+	stats->rx_packets++;
+	stats->rx_bytes += cf->can_dlc;
+}
+
+static int cc770_err(struct net_device *dev, u8 status)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	struct net_device_stats *stats = &dev->stats;
+	struct can_frame *cf;
+	struct sk_buff *skb;
+	u8 lec;
+
+	netdev_dbg(dev, "status interrupt (%#x)\n", status);
+
+	skb = alloc_can_err_skb(dev, &cf);
+	if (skb == NULL)
+		return -ENOMEM;
+
+	if (status & STAT_BOFF) {
+		/* Disable interrupts */
+		cc770_write_reg(priv, control, CTRL_INI);
+		cf->can_id |= CAN_ERR_BUSOFF;
+		priv->can.state = CAN_STATE_BUS_OFF;
+		can_bus_off(dev);
+	} else if (status & STAT_WARN) {
+		cf->can_id |= CAN_ERR_CRTL;
+		cf->data[1] = CAN_ERR_CRTL_RX_WARNING | CAN_ERR_CRTL_TX_WARNING;
+		priv->can.state = CAN_STATE_ERROR_WARNING;
+		priv->can.can_stats.error_warning++;
+	}
+
+	lec = status & STAT_LEC_MASK;
+	if (lec < 7 && lec > 0) {
+		if (lec == STAT_LEC_ACK) {
+			cf->can_id |= CAN_ERR_ACK;
+		} else {
+			cf->can_id |= CAN_ERR_PROT;
+			switch (lec) {
+			case STAT_LEC_STUFF:
+				cf->data[2] |= CAN_ERR_PROT_STUFF;
+				break;
+			case STAT_LEC_FORM:
+				cf->data[2] |= CAN_ERR_PROT_FORM;
+				break;
+			case STAT_LEC_BIT1:
+				cf->data[2] |= CAN_ERR_PROT_BIT1;
+				break;
+			case STAT_LEC_BIT0:
+				cf->data[2] |= CAN_ERR_PROT_BIT0;
+				break;
+			case STAT_LEC_CRC:
+				cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ;
+				break;
+			}
+		}
+	}
+
+	netif_rx(skb);
+
+	stats->rx_packets++;
+	stats->rx_bytes += cf->can_dlc;
+
+	return 0;
+}
+
+static int cc770_status_interrupt(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	u8 status;
+
+	status = cc770_read_reg(priv, status);
+	/* Reset the status register including RXOK and TXOK */
+	cc770_write_reg(priv, status, STAT_LEC_MASK);
+
+	if (status & (STAT_WARN | STAT_BOFF) ||
+	    (status & STAT_LEC_MASK) != STAT_LEC_MASK) {
+		cc770_err(dev, status);
+		return status & STAT_BOFF;
+	}
+
+	return 0;
+}
+
+static void cc770_rx_interrupt(struct net_device *dev, unsigned int o)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	struct net_device_stats *stats = &dev->stats;
+	unsigned int mo = obj2msgobj(o);
+	u8 ctrl1;
+
+	while (1) {
+		ctrl1 = cc770_read_reg(priv, msgobj[mo].ctrl1);
+
+		if (!(ctrl1 & NEWDAT_SET))  {
+			/* Check for RTR if additional functions are enabled */
+			if (priv->control_normal_mode & CTRL_EAF) {
+				if (!(cc770_read_reg(priv, msgobj[mo].ctrl0) &
+				      INTPND_SET))
+					break;
+			} else {
+				break;
+			}
+		}
+
+		if (ctrl1 & MSGLST_SET) {
+			stats->rx_over_errors++;
+			stats->rx_errors++;
+		}
+		if (mo < MSGOBJ_LAST)
+			cc770_write_reg(priv, msgobj[mo].ctrl1,
+					NEWDAT_RES | MSGLST_RES |
+					TXRQST_UNC | RMTPND_UNC);
+		cc770_rx(dev, mo, ctrl1);
+
+		cc770_write_reg(priv, msgobj[mo].ctrl0,
+				MSGVAL_SET | TXIE_RES |
+				RXIE_SET | INTPND_RES);
+		cc770_write_reg(priv, msgobj[mo].ctrl1,
+				NEWDAT_RES | MSGLST_RES |
+				TXRQST_RES | RMTPND_RES);
+	}
+}
+
+static void cc770_rtr_interrupt(struct net_device *dev, unsigned int o)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	unsigned int mo = obj2msgobj(o);
+	u8 ctrl0, ctrl1;
+
+	while (1) {
+		ctrl0 = cc770_read_reg(priv, msgobj[mo].ctrl0);
+		if (!(ctrl0 & INTPND_SET))
+			break;
+
+		ctrl1 = cc770_read_reg(priv, msgobj[mo].ctrl1);
+		cc770_rx(dev, mo, ctrl1);
+
+		cc770_write_reg(priv, msgobj[mo].ctrl0,
+				MSGVAL_SET | TXIE_RES |
+				RXIE_SET | INTPND_RES);
+		cc770_write_reg(priv, msgobj[mo].ctrl1,
+				NEWDAT_RES | CPUUPD_SET |
+				TXRQST_RES | RMTPND_RES);
+	}
+}
+
+static void cc770_tx_interrupt(struct net_device *dev, unsigned int o)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	struct net_device_stats *stats = &dev->stats;
+	unsigned int mo = obj2msgobj(o);
+
+	/* Nothing more to send, switch off interrupts */
+	cc770_write_reg(priv, msgobj[mo].ctrl0,
+			MSGVAL_RES | TXIE_RES | RXIE_RES | INTPND_RES);
+	/*
+	 * We had some cases of repeated IRQ so make sure the
+	 * INT is acknowledged
+	 */
+	cc770_write_reg(priv, msgobj[mo].ctrl0,
+			MSGVAL_UNC | TXIE_UNC | RXIE_UNC | INTPND_RES);
+
+	stats->tx_packets++;
+	can_get_echo_skb(dev, 0);
+	netif_wake_queue(dev);
+}
+
+irqreturn_t cc770_interrupt(int irq, void *dev_id)
+{
+	struct net_device *dev = (struct net_device *)dev_id;
+	struct cc770_priv *priv = netdev_priv(dev);
+	u8 intid;
+	int o, n = 0;
+
+	/* Shared interrupts and IRQ off? */
+	if (priv->can.state == CAN_STATE_STOPPED)
+		return IRQ_NONE;
+
+	if (priv->pre_irq)
+		priv->pre_irq(priv);
+
+	while (n < CC770_MAX_IRQ) {
+		/* Read the highest pending interrupt request */
+		intid = cc770_read_reg(priv, interrupt);
+		if (!intid)
+			break;
+		n++;
+
+		if (intid == 1) {
+			/* Exit in case of bus-off */
+			if (cc770_status_interrupt(dev))
+				break;
+		} else {
+			o = intid2obj(intid);
+
+			if (o >= CC770_OBJ_MAX) {
+				netdev_err(dev, "Unexpected interrupt id %d\n",
+					   intid);
+				continue;
+			}
+
+			if (priv->obj_flags[o] & CC770_OBJ_FLAG_RTR)
+				cc770_rtr_interrupt(dev, o);
+			else if (priv->obj_flags[o] & CC770_OBJ_FLAG_RX)
+				cc770_rx_interrupt(dev, o);
+			else
+				cc770_tx_interrupt(dev, o);
+		}
+	}
+
+	if (priv->post_irq)
+		priv->post_irq(priv);
+
+	if (n >= CC770_MAX_IRQ)
+		netdev_dbg(dev, "%d messages handled in ISR", n);
+
+	return (n) ? IRQ_HANDLED : IRQ_NONE;
+}
+
+static int cc770_open(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+	int err;
+
+	/* set chip into reset mode */
+	set_reset_mode(dev);
+
+	/* common open */
+	err = open_candev(dev);
+	if (err)
+		return err;
+
+	err = request_irq(dev->irq, &cc770_interrupt, priv->irq_flags,
+			  dev->name, (void *)dev);
+	if (err) {
+		close_candev(dev);
+		return -EAGAIN;
+	}
+
+	/* init and start chip */
+	cc770_start(dev);
+	priv->open_time = jiffies;
+
+	netif_start_queue(dev);
+
+	return 0;
+}
+
+static int cc770_close(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	netif_stop_queue(dev);
+	set_reset_mode(dev);
+
+	free_irq(dev->irq, (void *)dev);
+	close_candev(dev);
+
+	priv->open_time = 0;
+
+	return 0;
+}
+
+struct net_device *alloc_cc770dev(int sizeof_priv)
+{
+	struct net_device *dev;
+	struct cc770_priv *priv;
+
+	dev = alloc_candev(sizeof(struct cc770_priv) + sizeof_priv,
+			   CC770_ECHO_SKB_MAX);
+	if (!dev)
+		return NULL;
+
+	priv = netdev_priv(dev);
+
+	priv->dev = dev;
+	priv->can.bittiming_const = &cc770_bittiming_const;
+	priv->can.do_set_bittiming = cc770_set_bittiming;
+	priv->can.do_set_mode = cc770_set_mode;
+	priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
+
+	memcpy(priv->obj_flags, cc770_obj_flags, sizeof(cc770_obj_flags));
+
+	if (sizeof_priv)
+		priv->priv = (void *)priv + sizeof(struct cc770_priv);
+
+	return dev;
+}
+EXPORT_SYMBOL_GPL(alloc_cc770dev);
+
+void free_cc770dev(struct net_device *dev)
+{
+	free_candev(dev);
+}
+EXPORT_SYMBOL_GPL(free_cc770dev);
+
+static const struct net_device_ops cc770_netdev_ops = {
+	.ndo_open = cc770_open,
+	.ndo_stop = cc770_close,
+	.ndo_start_xmit = cc770_start_xmit,
+};
+
+int register_cc770dev(struct net_device *dev)
+{
+	struct cc770_priv *priv = netdev_priv(dev);
+
+	if (!cc770_probe_chip(dev))
+		return -ENODEV;
+
+	dev->netdev_ops = &cc770_netdev_ops;
+
+	dev->flags |= IFF_ECHO;	/* we support local echo */
+
+	/* Should we use additional functions? */
+	if (!i82527_compat && priv->control_normal_mode & CTRL_EAF) {
+		priv->control_normal_mode = CTRL_IE | CTRL_EAF | CTRL_EIE;
+		netdev_dbg(dev, "i82527 mode with additional functions\n");
+	} else {
+		priv->control_normal_mode = CTRL_IE | CTRL_EIE;
+		netdev_dbg(dev, "strict i82527 compatibility mode\n");
+	}
+
+	chipset_init(priv);
+	set_reset_mode(dev);
+
+	return register_candev(dev);
+}
+EXPORT_SYMBOL_GPL(register_cc770dev);
+
+void unregister_cc770dev(struct net_device *dev)
+{
+	set_reset_mode(dev);
+	unregister_candev(dev);
+}
+EXPORT_SYMBOL_GPL(unregister_cc770dev);
+
+static __init int cc770_init(void)
+{
+	if (msgobj15_eff) {
+		cc770_obj_flags[CC770_OBJ_RX0] |= CC770_OBJ_FLAG_EFF;
+		cc770_obj_flags[CC770_OBJ_RX1] &= ~CC770_OBJ_FLAG_EFF;
+	}
+
+	pr_info("%s CAN netdevice driver\n", DRV_NAME);
+
+	return 0;
+}
+module_init(cc770_init);
+
+static __exit void cc770_exit(void)
+{
+	pr_info("%s: driver removed\n", DRV_NAME);
+}
+module_exit(cc770_exit);
diff --git a/drivers/net/can/cc770/cc770.h b/drivers/net/can/cc770/cc770.h
new file mode 100644
index 0000000..ca5b768
--- /dev/null
+++ b/drivers/net/can/cc770/cc770.h
@@ -0,0 +1,247 @@
+/*
+ * cc770.h - Bosch CC770 and Intel AN82527 network device driver
+ *
+ * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com>
+ *
+ * Derived from the old Socket-CAN i82527 driver:
+ *
+ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Volkswagen nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * Alternatively, provided that this notice is retained in full, this
+ * software may be distributed under the terms of the GNU General
+ * Public License ("GPL") version 2, in which case the provisions of the
+ * GPL apply INSTEAD OF those given above.
+ *
+ * The provided data structures and external interfaces from this code
+ * are not restricted to be used by modules with a GPL compatible license.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Send feedback to <socketcan-users@lists.berlios.de>
+ */
+
+#ifndef CC770_DEV_H
+#define CC770_DEV_H
+
+#include <linux/can/dev.h>
+
+struct cc770_msgobj {
+	u8 ctrl0;
+	u8 ctrl1;
+	u8 id[4];
+	u8 config;
+	u8 data[8];
+	u8 dontuse;		/* padding */
+} __attribute__ ((packed));
+
+struct cc770_regs {
+	union {
+		struct cc770_msgobj msgobj[16]; /* Message object 1..15 */
+		struct {
+			u8 control;		/* Control Register */
+			u8 status;		/* Status Register */
+			u8 cpu_interface;	/* CPU Interface Register */
+			u8 dontuse1;
+			u8 high_speed_read[2];	/* High Speed Read */
+			u8 global_mask_std[2];	/* Standard Global Mask */
+			u8 global_mask_ext[4];	/* Extended Global Mask */
+			u8 msg15_mask[4];	/* Message 15 Mask */
+			u8 dontuse2[15];
+			u8 clkout;		/* Clock Out Register */
+			u8 dontuse3[15];
+			u8 bus_config;		/* Bus Configuration Register */
+			u8 dontuse4[15];
+			u8 bit_timing_0;	/* Bit Timing Register byte 0 */
+			u8 dontuse5[15];
+			u8 bit_timing_1;	/* Bit Timing Register byte 1 */
+			u8 dontuse6[15];
+			u8 interrupt;		/* Interrupt Register */
+			u8 dontuse7[15];
+			u8 rx_error_counter;	/* Receive Error Counter */
+			u8 dontuse8[15];
+			u8 tx_error_counter;	/* Transmit Error Counter */
+			u8 dontuse9[31];
+			u8 p1_conf;
+			u8 dontuse10[15];
+			u8 p2_conf;
+			u8 dontuse11[15];
+			u8 p1_in;
+			u8 dontuse12[15];
+			u8 p2_in;
+			u8 dontuse13[15];
+			u8 p1_out;
+			u8 dontuse14[15];
+			u8 p2_out;
+			u8 dontuse15[15];
+			u8 serial_reset_addr;
+		};
+	};
+} __attribute__ ((packed));
+
+/* Control Register (0x00) */
+#define CTRL_INI	0x01	/* Initialization */
+#define CTRL_IE		0x02	/* Interrupt Enable */
+#define CTRL_SIE	0x04	/* Status Interrupt Enable */
+#define CTRL_EIE	0x08	/* Error Interrupt Enable */
+#define CTRL_EAF	0x20	/* Enable additional functions */
+#define CTRL_CCE	0x40	/* Change Configuration Enable */
+
+/* Status Register (0x01) */
+#define STAT_LEC_STUFF	0x01	/* Stuff error */
+#define STAT_LEC_FORM	0x02	/* Form error */
+#define STAT_LEC_ACK	0x03	/* Acknowledgement error */
+#define STAT_LEC_BIT1	0x04	/* Bit1 error */
+#define STAT_LEC_BIT0	0x05	/* Bit0 error */
+#define STAT_LEC_CRC	0x06	/* CRC error */
+#define STAT_LEC_MASK	0x07	/* Last Error Code mask */
+#define STAT_TXOK	0x08	/* Transmit Message Successfully */
+#define STAT_RXOK	0x10	/* Receive Message Successfully */
+#define STAT_WAKE	0x20	/* Wake Up Status */
+#define STAT_WARN	0x40	/* Warning Status */
+#define STAT_BOFF	0x80	/* Bus Off Status */
+
+/* CPU Interface Register (0x02) */
+#define CPUIF_CEN	0x01	/* Clock Out Enable */
+#define CPUIF_MUX	0x04	/* Multiplex */
+#define CPUIF_SLP	0x08	/* Sleep */
+#define CPUIF_PWD	0x10	/* Power Down Mode */
+#define CPUIF_DMC	0x20	/* Divide Memory Clock */
+#define CPUIF_DSC	0x40	/* Divide System Clock */
+#define CPUIF_RST	0x80	/* Hardware Reset Status */
+
+/* Clock Out Register (0x1f) */
+#define CLKOUT_CD_MASK  0x0f	/* Clock Divider mask */
+#define CLKOUT_SL_MASK	0x30	/* Slew Rate mask */
+#define CLKOUT_SL_SHIFT	4
+
+/* Bus Configuration Register (0x2f) */
+#define BUSCFG_DR0	0x01	/* Disconnect RX0 Input / Select RX input */
+#define BUSCFG_DR1	0x02	/* Disconnect RX1 Input / Silent mode */
+#define BUSCFG_DT1	0x08	/* Disconnect TX1 Output */
+#define BUSCFG_POL	0x20	/* Polarity dominant or recessive */
+#define BUSCFG_CBY	0x40	/* Input Comparator Bypass */
+
+/* Message Control Register 0 (Base Address + 0x0) */
+#define INTPND_RES	0x01	/* No Interrupt pending */
+#define INTPND_SET	0x02	/* Interrupt pending */
+#define INTPND_UNC	0x03
+#define RXIE_RES	0x04	/* Receive Interrupt Disable */
+#define RXIE_SET	0x08	/* Receive Interrupt Enable */
+#define RXIE_UNC	0x0c
+#define TXIE_RES	0x10	/* Transmit Interrupt Disable */
+#define TXIE_SET	0x20	/* Transmit Interrupt Enable */
+#define TXIE_UNC	0x30
+#define MSGVAL_RES	0x40	/* Message Invalid */
+#define MSGVAL_SET	0x80	/* Message Valid */
+#define MSGVAL_UNC	0xc0
+
+/* Message Control Register 1 (Base Address + 0x01) */
+#define NEWDAT_RES	0x01	/* No New Data */
+#define NEWDAT_SET	0x02	/* New Data */
+#define NEWDAT_UNC	0x03
+#define MSGLST_RES	0x04	/* No Message Lost */
+#define MSGLST_SET	0x08	/* Message Lost */
+#define MSGLST_UNC	0x0c
+#define CPUUPD_RES	0x04	/* No CPU Updating */
+#define CPUUPD_SET	0x08	/* CPU Updating */
+#define CPUUPD_UNC	0x0c
+#define TXRQST_RES	0x10	/* No Transmission Request */
+#define TXRQST_SET	0x20	/* Transmission Request */
+#define TXRQST_UNC	0x30
+#define RMTPND_RES	0x40	/* No Remote Request Pending */
+#define RMTPND_SET	0x80	/* Remote Request Pending */
+#define RMTPND_UNC	0xc0
+
+/* Message Configuration Register (Base Address + 0x06) */
+#define MSGCFG_XTD	0x04	/* Extended Identifier */
+#define MSGCFG_DIR	0x08	/* Direction is Transmit */
+
+#define MSGOBJ_FIRST	1
+#define MSGOBJ_LAST	15
+
+#define CC770_IO_SIZE	0x100
+#define CC770_MAX_IRQ	20	/* max. number of interrupts handled in ISR */
+
+#define CC770_ECHO_SKB_MAX	1
+
+#define cc770_read_reg(priv, member)					\
+	priv->read_reg(priv, offsetof(struct cc770_regs, member))
+
+#define cc770_write_reg(priv, member, value)				\
+	priv->write_reg(priv, offsetof(struct cc770_regs, member), value)
+
+/*
+ * Message objects and flags used by this driver
+ */
+#define CC770_OBJ_FLAG_RX 	0x01
+#define CC770_OBJ_FLAG_RTR	0x02
+#define CC770_OBJ_FLAG_EFF	0x04
+
+enum {
+	CC770_OBJ_RX0 = 0,	/* for receiving normal messages */
+	CC770_OBJ_RX1,		/* for receiving normal messages */
+	CC770_OBJ_RX_RTR0,	/* for receiving remote transmission requests */
+	CC770_OBJ_RX_RTR1,	/* for receiving remote transmission requests */
+	CC770_OBJ_TX,		/* for sending messages */
+	CC770_OBJ_MAX
+};
+
+#define obj2msgobj(o)	(MSGOBJ_LAST - (o)) /* message object 11..15 */
+
+/*
+ * CC770 private data structure
+ */
+struct cc770_priv {
+	struct can_priv can;	/* must be the first member */
+	int open_time;
+	struct sk_buff *echo_skb;
+
+	/* the lower-layer is responsible for appropriate locking */
+	u8 (*read_reg)(const struct cc770_priv *priv, int reg);
+	void (*write_reg)(const struct cc770_priv *priv, int reg, u8 val);
+	void (*pre_irq)(const struct cc770_priv *priv);
+	void (*post_irq)(const struct cc770_priv *priv);
+
+	void *priv;		/* for board-specific data */
+	struct net_device *dev;
+
+	void __iomem *reg_base;	/* ioremap'ed address to registers */
+	unsigned long irq_flags;	/* for request_irq() */
+
+	unsigned char obj_flags[CC770_OBJ_MAX];
+	u8 control_normal_mode;	/* Control register for normal mode */
+	u8 cpu_interface;	/* CPU interface register */
+	u8 clkout;		/* Clock out register */
+	u8 bus_config;		/* Bus conffiguration register */
+};
+
+struct net_device *alloc_cc770dev(int sizeof_priv);
+void free_cc770dev(struct net_device *dev);
+int register_cc770dev(struct net_device *dev);
+void unregister_cc770dev(struct net_device *dev);
+
+#endif /* CC770_DEV_H */
-- 
1.7.4.1


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

* [PATCH next-next 2/2] can: cc770: legacy CC770 ISA bus driver
  2011-11-24 12:07 [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 Wolfgang Grandegger
  2011-11-24 12:07 ` [PATCH net-next 1/2] can: cc770: add driver core " Wolfgang Grandegger
@ 2011-11-24 12:07 ` Wolfgang Grandegger
  2011-11-29 23:39 ` [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 David Miller
  2 siblings, 0 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-11-24 12:07 UTC (permalink / raw)
  To: netdev
  Cc: linux-can, socketcan-users, IreneV, Stanislav Yelenskiy,
	Wolfgang Grandegger

This patch adds support for legacy Bosch CC770 and Intel AN82527 CAN
controllers on the ISA or PC-104 bus. The I/O port or memory address
and the IRQ number must be specified via module parameters:

  insmod cc770_isa.ko port=0x310,0x380 irq=7,11

for ISA devices using I/O ports or:

  insmod cc770_isa.ko mem=0xd1000,0xd1000 irq=7,11

for memory mapped ISA devices.

Indirect access via address and data port is supported as well:

  insmod cc770_isa.ko port=0x310,0x380 indirect=1 irq=7,11

Furthermore, the following mode parameter can be defined:

  clk: External oscillator clock frequency (default=16000000 [16 MHz])
  cir: CPU interface register (default=0x40 [CPU_DSC])
  ocr, Bus configuration register (default=0x00)
  cor, Clockout register (default=0x00)

Note: for clk, cir, bcr and cor, the first argument re-defines the
default for all other devices, e.g.:

  insmod cc770_isa.ko mem=0xd1000,0xd1000 irq=7,11 clk=24000000

is equivalent to

  insmod cc770_isa.ko mem=0xd1000,0xd1000 irq=7,11 clk=24000000,24000000

Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
---
 drivers/net/can/cc770/Kconfig     |   11 ++
 drivers/net/can/cc770/Makefile    |    1 +
 drivers/net/can/cc770/cc770_isa.c |  337 +++++++++++++++++++++++++++++++++++++
 3 files changed, 349 insertions(+), 0 deletions(-)
 create mode 100644 drivers/net/can/cc770/cc770_isa.c

diff --git a/drivers/net/can/cc770/Kconfig b/drivers/net/can/cc770/Kconfig
index 225131b..28e4d48 100644
--- a/drivers/net/can/cc770/Kconfig
+++ b/drivers/net/can/cc770/Kconfig
@@ -1,3 +1,14 @@
 menuconfig CAN_CC770
 	tristate "Bosch CC770 and Intel AN82527 devices"
 	depends on CAN_DEV && HAS_IOMEM
+
+if CAN_CC770
+
+config CAN_CC770_ISA
+	tristate "ISA Bus based legacy CC770 driver"
+	---help---
+	  This driver adds legacy support for CC770 and AN82527 chips
+	  connected to the ISA bus using I/O port, memory mapped or
+	  indirect access.
+
+endif
diff --git a/drivers/net/can/cc770/Makefile b/drivers/net/can/cc770/Makefile
index 34e8180..872ecff 100644
--- a/drivers/net/can/cc770/Makefile
+++ b/drivers/net/can/cc770/Makefile
@@ -3,5 +3,6 @@
 #
 
 obj-$(CONFIG_CAN_CC770) += cc770.o
+obj-$(CONFIG_CAN_CC770_ISA) += cc770_isa.o
 
 ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
diff --git a/drivers/net/can/cc770/cc770_isa.c b/drivers/net/can/cc770/cc770_isa.c
new file mode 100644
index 0000000..455d79f
--- /dev/null
+++ b/drivers/net/can/cc770/cc770_isa.c
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2009, 2011 Wolfgang Grandegger <wg@grandegger.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the version 2 of the GNU General Public License
+ * as published by the Free Software Foundation
+ *
+ * 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
+ */
+
+#include <linux/kernel.h>
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/io.h>
+#include <linux/can.h>
+#include <linux/can/dev.h>
+
+#include "cc770.h"
+
+#define DRV_NAME "cc770_isa"
+
+#define MAXDEV 8
+
+MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
+MODULE_DESCRIPTION("Socket-CAN driver for CC770 on the ISA bus");
+MODULE_LICENSE("GPL v2");
+
+#define CLK_DEFAULT	16000000	/* 16 MHz */
+#define BCR_DEFAULT	0x00
+#define COR_DEFAULT	0x00
+
+static unsigned long port[MAXDEV];
+static unsigned long mem[MAXDEV];
+static int __devinitdata irq[MAXDEV];
+static int __devinitdata clk[MAXDEV];
+static u8 __devinitdata cir[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff};
+static u8 __devinitdata bcr[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff};
+static u8 __devinitdata cor[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff};
+static int __devinitdata indirect[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1};
+
+module_param_array(port, ulong, NULL, S_IRUGO);
+MODULE_PARM_DESC(port, "I/O port number");
+
+module_param_array(mem, ulong, NULL, S_IRUGO);
+MODULE_PARM_DESC(mem, "I/O memory address");
+
+module_param_array(indirect, int, NULL, S_IRUGO);
+MODULE_PARM_DESC(indirect, "Indirect access via address and data port");
+
+module_param_array(irq, int, NULL, S_IRUGO);
+MODULE_PARM_DESC(irq, "IRQ number");
+
+module_param_array(clk, int, NULL, S_IRUGO);
+MODULE_PARM_DESC(clk, "External oscillator clock frequency "
+		 "(default=16000000 [16 MHz])");
+
+module_param_array(cir, byte, NULL, S_IRUGO);
+MODULE_PARM_DESC(cir, "CPU interface register (default=0x40 [CPU_DSC])");
+
+module_param_array(bcr, byte, NULL, S_IRUGO);
+MODULE_PARM_DESC(ocr, "Bus configuration register (default=0x00)");
+
+module_param_array(cor, byte, NULL, S_IRUGO);
+MODULE_PARM_DESC(cor, "Clockout register (default=0x00)");
+
+#define CC770_IOSIZE          0x20
+#define CC770_IOSIZE_INDIRECT 0x02
+
+static struct platform_device *cc770_isa_devs[MAXDEV];
+
+static u8 cc770_isa_mem_read_reg(const struct cc770_priv *priv, int reg)
+{
+	return readb(priv->reg_base + reg);
+}
+
+static void cc770_isa_mem_write_reg(const struct cc770_priv *priv,
+				      int reg, u8 val)
+{
+	writeb(val, priv->reg_base + reg);
+}
+
+static u8 cc770_isa_port_read_reg(const struct cc770_priv *priv, int reg)
+{
+	return inb((unsigned long)priv->reg_base + reg);
+}
+
+static void cc770_isa_port_write_reg(const struct cc770_priv *priv,
+				       int reg, u8 val)
+{
+	outb(val, (unsigned long)priv->reg_base + reg);
+}
+
+static u8 cc770_isa_port_read_reg_indirect(const struct cc770_priv *priv,
+					     int reg)
+{
+	unsigned long base = (unsigned long)priv->reg_base;
+
+	outb(reg, base);
+	return inb(base + 1);
+}
+
+static void cc770_isa_port_write_reg_indirect(const struct cc770_priv *priv,
+						int reg, u8 val)
+{
+	unsigned long base = (unsigned long)priv->reg_base;
+
+	outb(reg, base);
+	outb(val, base + 1);
+}
+
+static int __devinit cc770_isa_probe(struct platform_device *pdev)
+{
+	struct net_device *dev;
+	struct cc770_priv *priv;
+	void __iomem *base = NULL;
+	int iosize = CC770_IOSIZE;
+	int idx = pdev->id;
+	int err;
+	u32 clktmp;
+
+	dev_dbg(&pdev->dev, "probing idx=%d: port=%#lx, mem=%#lx, irq=%d\n",
+		idx, port[idx], mem[idx], irq[idx]);
+	if (mem[idx]) {
+		if (!request_mem_region(mem[idx], iosize, DRV_NAME)) {
+			err = -EBUSY;
+			goto exit;
+		}
+		base = ioremap_nocache(mem[idx], iosize);
+		if (!base) {
+			err = -ENOMEM;
+			goto exit_release;
+		}
+	} else {
+		if (indirect[idx] > 0 ||
+		    (indirect[idx] == -1 && indirect[0] > 0))
+			iosize = CC770_IOSIZE_INDIRECT;
+		if (!request_region(port[idx], iosize, DRV_NAME)) {
+			err = -EBUSY;
+			goto exit;
+		}
+	}
+
+	dev = alloc_cc770dev(0);
+	if (!dev) {
+		err = -ENOMEM;
+		goto exit_unmap;
+	}
+	priv = netdev_priv(dev);
+
+	dev->irq = irq[idx];
+	priv->irq_flags = IRQF_SHARED;
+	if (mem[idx]) {
+		priv->reg_base = base;
+		dev->base_addr = mem[idx];
+		priv->read_reg = cc770_isa_mem_read_reg;
+		priv->write_reg = cc770_isa_mem_write_reg;
+	} else {
+		priv->reg_base = (void __iomem *)port[idx];
+		dev->base_addr = port[idx];
+
+		if (iosize == CC770_IOSIZE_INDIRECT) {
+			priv->read_reg = cc770_isa_port_read_reg_indirect;
+			priv->write_reg = cc770_isa_port_write_reg_indirect;
+		} else {
+			priv->read_reg = cc770_isa_port_read_reg;
+			priv->write_reg = cc770_isa_port_write_reg;
+		}
+	}
+
+	if (clk[idx])
+		clktmp = clk[idx];
+	else if (clk[0])
+		clktmp = clk[0];
+	else
+		clktmp = CLK_DEFAULT;
+	priv->can.clock.freq = clktmp;
+
+	if (cir[idx] != 0xff) {
+		priv->cpu_interface = cir[idx] & 0xff;
+	} else if (cir[0] != 0xff) {
+		priv->cpu_interface = cir[0] & 0xff;
+	} else {
+		/* The system clock may not exceed 10 MHz */
+		if (clktmp > 10000000) {
+			priv->cpu_interface |= CPUIF_DSC;
+			clktmp /= 2;
+		}
+		/* The memory clock may not exceed 8 MHz */
+		if (clktmp > 8000000)
+			priv->cpu_interface |= CPUIF_DMC;
+	}
+
+	if (priv->cpu_interface & CPUIF_DSC)
+		priv->can.clock.freq /= 2;
+
+	if (bcr[idx] != 0xff)
+		priv->bus_config = bcr[idx] & 0xff;
+	else if (bcr[0] != 0xff)
+		priv->bus_config = bcr[0] & 0xff;
+	else
+		priv->bus_config = BCR_DEFAULT;
+
+	if (cor[idx] != 0xff)
+		priv->clkout = cor[idx];
+	else if (cor[0] != 0xff)
+		priv->clkout = cor[0] & 0xff;
+	else
+		priv->clkout = COR_DEFAULT;
+
+	dev_set_drvdata(&pdev->dev, dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
+
+	err = register_cc770dev(dev);
+	if (err) {
+		dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
+			DRV_NAME, err);
+		goto exit_unmap;
+	}
+
+	dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n",
+		 DRV_NAME, priv->reg_base, dev->irq);
+	return 0;
+
+ exit_unmap:
+	if (mem[idx])
+		iounmap(base);
+ exit_release:
+	if (mem[idx])
+		release_mem_region(mem[idx], iosize);
+	else
+		release_region(port[idx], iosize);
+ exit:
+	return err;
+}
+
+static int __devexit cc770_isa_remove(struct platform_device *pdev)
+{
+	struct net_device *dev = dev_get_drvdata(&pdev->dev);
+	struct cc770_priv *priv = netdev_priv(dev);
+	int idx = pdev->id;
+
+	unregister_cc770dev(dev);
+	dev_set_drvdata(&pdev->dev, NULL);
+
+	if (mem[idx]) {
+		iounmap(priv->reg_base);
+		release_mem_region(mem[idx], CC770_IOSIZE);
+	} else {
+		if (priv->read_reg == cc770_isa_port_read_reg_indirect)
+			release_region(port[idx], CC770_IOSIZE_INDIRECT);
+		else
+			release_region(port[idx], CC770_IOSIZE);
+	}
+	free_cc770dev(dev);
+
+	return 0;
+}
+
+static struct platform_driver cc770_isa_driver = {
+	.probe = cc770_isa_probe,
+	.remove = __devexit_p(cc770_isa_remove),
+	.driver = {
+		.name = DRV_NAME,
+		.owner = THIS_MODULE,
+	},
+};
+
+static int __init cc770_isa_init(void)
+{
+	int idx, err;
+
+	for (idx = 0; idx < MAXDEV; idx++) {
+		if ((port[idx] || mem[idx]) && irq[idx]) {
+			cc770_isa_devs[idx] =
+				platform_device_alloc(DRV_NAME, idx);
+			if (!cc770_isa_devs[idx]) {
+				err = -ENOMEM;
+				goto exit_free_devices;
+			}
+			err = platform_device_add(cc770_isa_devs[idx]);
+			if (err) {
+				platform_device_put(cc770_isa_devs[idx]);
+				goto exit_free_devices;
+			}
+			pr_debug("%s: platform device %d: port=%#lx, mem=%#lx, "
+				 "irq=%d\n",
+				 DRV_NAME, idx, port[idx], mem[idx], irq[idx]);
+		} else if (idx == 0 || port[idx] || mem[idx]) {
+				pr_err("%s: insufficient parameters supplied\n",
+				       DRV_NAME);
+				err = -EINVAL;
+				goto exit_free_devices;
+		}
+	}
+
+	err = platform_driver_register(&cc770_isa_driver);
+	if (err)
+		goto exit_free_devices;
+
+	pr_info("Legacy %s driver for max. %d devices registered\n",
+		DRV_NAME, MAXDEV);
+
+	return 0;
+
+exit_free_devices:
+	while (--idx >= 0) {
+		if (cc770_isa_devs[idx])
+			platform_device_unregister(cc770_isa_devs[idx]);
+	}
+
+	return err;
+}
+module_init(cc770_isa_init);
+
+static void __exit cc770_isa_exit(void)
+{
+	int idx;
+
+	platform_driver_unregister(&cc770_isa_driver);
+	for (idx = 0; idx < MAXDEV; idx++) {
+		if (cc770_isa_devs[idx])
+			platform_device_unregister(cc770_isa_devs[idx]);
+	}
+}
+module_exit(cc770_isa_exit);
-- 
1.7.4.1


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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-11-24 12:07 [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 Wolfgang Grandegger
  2011-11-24 12:07 ` [PATCH net-next 1/2] can: cc770: add driver core " Wolfgang Grandegger
  2011-11-24 12:07 ` [PATCH next-next 2/2] can: cc770: legacy CC770 ISA bus driver Wolfgang Grandegger
@ 2011-11-29 23:39 ` David Miller
       [not found]   ` <20111129.183950.1327835803051184146.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
  2 siblings, 1 reply; 18+ messages in thread
From: David Miller @ 2011-11-29 23:39 UTC (permalink / raw)
  To: wg; +Cc: netdev, linux-can, socketcan-users, boir1, stanislavelensky

From: Wolfgang Grandegger <wg@grandegger.com>
Date: Thu, 24 Nov 2011 13:07:26 +0100

> Already since a while we have support for the Bosch CC770 and Intel
> AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
> It would be nice if somebody could test the driver. Unfortunately,
> I currently do not have hardware at hand. I have not yet ported the
> OF platform driver as it needs further attaention due to the merge
> of the platform and OF platform interface.
> 
> Wolfgang Grandegger (2):
>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>   can: cc770: legacy CC770 ISA bus driver

All applied, thank you.

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
       [not found]   ` <20111129.183950.1327835803051184146.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
@ 2011-11-30  6:37     ` Oliver Hartkopp
       [not found]       ` <4ED5CF14.4020502-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
  2011-11-30 21:07       ` David Miller
  0 siblings, 2 replies; 18+ messages in thread
From: Oliver Hartkopp @ 2011-11-30  6:37 UTC (permalink / raw)
  To: David Miller, wg-5Yr1BZd7O62+XT7JhA+gdA
  Cc: netdev-u79uwXL29TY76Z2rM5mHXA,
	socketcan-users-0fE9KPoRgkgATYTw5x5z8w,
	linux-can-u79uwXL29TY76Z2rM5mHXA

On 30.11.2011 00:39, David Miller wrote:

> From: Wolfgang Grandegger <wg-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
> Date: Thu, 24 Nov 2011 13:07:26 +0100
> 
>> Already since a while we have support for the Bosch CC770 and Intel
>> AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
>> It would be nice if somebody could test the driver. Unfortunately,
>> I currently do not have hardware at hand. I have not yet ported the
>> OF platform driver as it needs further attaention due to the merge
>> of the platform and OF platform interface.
>>
>> Wolfgang Grandegger (2):
>>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>>   can: cc770: legacy CC770 ISA bus driver
> 
> All applied, thank you.


Hello Dave,

this patchset was superseded for some time.

We're currently in the v4 patchset (dated 2011-11-29).

See http://patchwork.ozlabs.org/patch/128244/

Do you want to revert the commit or should Wolfgang post a diff patch to get
to v4 ??

Regards,
Oliver

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
       [not found]       ` <4ED5CF14.4020502-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
@ 2011-11-30  8:29         ` Wolfgang Grandegger
       [not found]           ` <4ED5E94F.8010403-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
  0 siblings, 1 reply; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-11-30  8:29 UTC (permalink / raw)
  To: Oliver Hartkopp
  Cc: netdev-u79uwXL29TY76Z2rM5mHXA,
	socketcan-users-0fE9KPoRgkgATYTw5x5z8w, David Miller,
	linux-can-u79uwXL29TY76Z2rM5mHXA

On 11/30/2011 07:37 AM, Oliver Hartkopp wrote:
> On 30.11.2011 00:39, David Miller wrote:
> 
>> From: Wolfgang Grandegger <wg-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
>> Date: Thu, 24 Nov 2011 13:07:26 +0100
>>
>>> Already since a while we have support for the Bosch CC770 and Intel
>>> AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
>>> It would be nice if somebody could test the driver. Unfortunately,
>>> I currently do not have hardware at hand. I have not yet ported the
>>> OF platform driver as it needs further attaention due to the merge
>>> of the platform and OF platform interface.
>>>
>>> Wolfgang Grandegger (2):
>>>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>>>   can: cc770: legacy CC770 ISA bus driver
>>
>> All applied, thank you.
> 
> 
> Hello Dave,
> 
> this patchset was superseded for some time.
> 
> We're currently in the v4 patchset (dated 2011-11-29).

I just sent v5...

> See http://patchwork.ozlabs.org/patch/128244/
> 
> Do you want to revert the commit or should Wolfgang post a diff patch to get
> to v4 ??

Reverting and applying v5 would make sense as there are many changes.

Did I do something wrong?

Wolfgang.

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
       [not found]           ` <4ED5E94F.8010403-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
@ 2011-11-30 12:10             ` Wolfgang Grandegger
  0 siblings, 0 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-11-30 12:10 UTC (permalink / raw)
  To: Oliver Hartkopp
  Cc: netdev-u79uwXL29TY76Z2rM5mHXA,
	socketcan-users-0fE9KPoRgkgATYTw5x5z8w, David Miller,
	linux-can-u79uwXL29TY76Z2rM5mHXA

On 11/30/2011 09:29 AM, Wolfgang Grandegger wrote:
> On 11/30/2011 07:37 AM, Oliver Hartkopp wrote:
>> On 30.11.2011 00:39, David Miller wrote:
>>
>>> From: Wolfgang Grandegger <wg-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
>>> Date: Thu, 24 Nov 2011 13:07:26 +0100
>>>
>>>> Already since a while we have support for the Bosch CC770 and Intel
>>>> AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
>>>> It would be nice if somebody could test the driver. Unfortunately,
>>>> I currently do not have hardware at hand. I have not yet ported the
>>>> OF platform driver as it needs further attaention due to the merge
>>>> of the platform and OF platform interface.
>>>>
>>>> Wolfgang Grandegger (2):
>>>>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>>>>   can: cc770: legacy CC770 ISA bus driver
>>>
>>> All applied, thank you.
>>
>>
>> Hello Dave,
>>
>> this patchset was superseded for some time.
>>
>> We're currently in the v4 patchset (dated 2011-11-29).
> 
> I just sent v5...
> 
>> See http://patchwork.ozlabs.org/patch/128244/
>>
>> Do you want to revert the commit or should Wolfgang post a diff patch to get
>> to v4 ??
> 
> Reverting and applying v5 would make sense as there are many changes.
> 
> Did I do something wrong?

Well, yes, at least I forgot the CC to the devicetree and linuxppc-dev
list (due to a "signedoffcc = false" in my .gitconfig). Resending v5 in
a second.

Wolfgang.

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-11-30  6:37     ` Oliver Hartkopp
       [not found]       ` <4ED5CF14.4020502-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
@ 2011-11-30 21:07       ` David Miller
  2011-11-30 21:14         ` David Miller
                           ` (2 more replies)
  1 sibling, 3 replies; 18+ messages in thread
From: David Miller @ 2011-11-30 21:07 UTC (permalink / raw)
  To: socketcan; +Cc: wg, netdev, linux-can, socketcan-users, boir1, stanislavelensky

From: Oliver Hartkopp <socketcan@hartkopp.net>
Date: Wed, 30 Nov 2011 07:37:08 +0100

> On 30.11.2011 00:39, David Miller wrote:
> 
>> From: Wolfgang Grandegger <wg@grandegger.com>
>> Date: Thu, 24 Nov 2011 13:07:26 +0100
>> 
>>> Already since a while we have support for the Bosch CC770 and Intel
>>> AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
>>> It would be nice if somebody could test the driver. Unfortunately,
>>> I currently do not have hardware at hand. I have not yet ported the
>>> OF platform driver as it needs further attaention due to the merge
>>> of the platform and OF platform interface.
>>>
>>> Wolfgang Grandegger (2):
>>>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>>>   can: cc770: legacy CC770 ISA bus driver
>> 
>> All applied, thank you.
> 
> 
> Hello Dave,
> 
> this patchset was superseded for some time.
> 
> We're currently in the v4 patchset (dated 2011-11-29).
> 
> See http://patchwork.ozlabs.org/patch/128244/
> 
> Do you want to revert the commit or should Wolfgang post a diff patch to get
> to v4 ??

A not very good job was done here communicating to me what is happening.
Endless revisions, and not clear indication to me what should or should
not be applied as a result.

I want you guys to appoint someone to be the defacto CAN driver and
subsystem maintainer who collects and merges all the driver and
protocol patches into his tree, and acts as the one and only interface
for me when changes are ready to be included.

I sorted this out by reverting the older changes and applying V5.

But I had to fix things up, when applying patch #3 there are empty
trailing lines in some of the new files generated, and that causes
git to complain.

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-11-30 21:07       ` David Miller
@ 2011-11-30 21:14         ` David Miller
  2011-12-01  9:43           ` Wolfgang Grandegger
  2011-12-01  7:47         ` Oliver Hartkopp
       [not found]         ` <20111130.160727.1989923062226789802.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
  2 siblings, 1 reply; 18+ messages in thread
From: David Miller @ 2011-11-30 21:14 UTC (permalink / raw)
  To: socketcan; +Cc: wg, netdev, linux-can, socketcan-users, boir1, stanislavelensky

From: David Miller <davem@davemloft.net>
Date: Wed, 30 Nov 2011 16:07:27 -0500 (EST)

> I sorted this out by reverting the older changes and applying V5.
> 
> But I had to fix things up, when applying patch #3 there are empty
> trailing lines in some of the new files generated, and that causes
> git to complain.

Actually, I had to revert, it doesn't even compile.  I'm really pissed
off at how this patch set is being handled, this should never happen.

It's not damn secret how I smoke test everyone's changes, I "allmodconfig"
and type "make".

drivers/net/can/cc770/cc770_platform.c: In function ‘cc770_platform_read_reg’:
drivers/net/can/cc770/cc770_platform.c:68:2: error: implicit declaration of function ‘in_8’ [-Werror=implicit-function-declaration]
drivers/net/can/cc770/cc770_platform.c: In function ‘cc770_platform_write_reg’:
drivers/net/can/cc770/cc770_platform.c:74:2: error: implicit declaration of function ‘out_8’ [-Werror=implicit-function-declaration]
drivers/net/can/cc770/cc770_platform.c: At top level:
drivers/net/can/cc770/cc770_platform.c:78:17: warning: ‘struct platform_device’ declared inside parameter list [enabled by default]
drivers/net/can/cc770/cc770_platform.c:78:17: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
drivers/net/can/cc770/cc770_platform.c: In function ‘cc770_get_of_node_data’:
drivers/net/can/cc770/cc770_platform.c:80:31: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:85:2: error: implicit declaration of function ‘of_get_property’ [-Werror=implicit-function-declaration]
drivers/net/can/cc770/cc770_platform.c:85:7: warning: assignment makes pointer from integer without a cast [enabled by default]
drivers/net/can/cc770/cc770_platform.c:119:7: warning: assignment makes pointer from integer without a cast [enabled by default]
drivers/net/can/cc770/cc770_platform.c:128:9: warning: assignment makes pointer from integer without a cast [enabled by default]
drivers/net/can/cc770/cc770_platform.c:143:4: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c: At top level:
drivers/net/can/cc770/cc770_platform.c:151:18: warning: ‘struct platform_device’ declared inside parameter list [enabled by default]
drivers/net/can/cc770/cc770_platform.c: In function ‘cc770_get_platform_data’:
drivers/net/can/cc770/cc770_platform.c:154:42: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c: At top level:
drivers/net/can/cc770/cc770_platform.c:166:50: warning: ‘struct platform_device’ declared inside parameter list [enabled by default]
drivers/net/can/cc770/cc770_platform.c: In function ‘cc770_platform_probe’:
drivers/net/can/cc770/cc770_platform.c:175:2: error: implicit declaration of function ‘platform_get_resource’ [-Werror=implicit-function-declaration]
drivers/net/can/cc770/cc770_platform.c:175:6: warning: assignment makes pointer from integer without a cast [enabled by default]
drivers/net/can/cc770/cc770_platform.c:176:2: error: implicit declaration of function ‘platform_get_irq’ [-Werror=implicit-function-declaration]
drivers/net/can/cc770/cc770_platform.c:181:7: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:203:10: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:204:3: warning: passing argument 1 of ‘cc770_get_of_node_data’ from incompatible pointer type [enabled by default]
drivers/net/can/cc770/cc770_platform.c:77:22: note: expected ‘struct platform_device *’ but argument is of type ‘struct platform_device *’
drivers/net/can/cc770/cc770_platform.c:205:15: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:206:3: warning: passing argument 1 of ‘cc770_get_platform_data’ from incompatible pointer type [enabled by default]
drivers/net/can/cc770/cc770_platform.c:150:22: note: expected ‘struct platform_device *’ but argument is of type ‘struct platform_device *’
drivers/net/can/cc770/cc770_platform.c:212:2: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:218:23: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:219:2: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:223:16: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c: At top level:
drivers/net/can/cc770/cc770_platform.c:240:51: warning: ‘struct platform_device’ declared inside parameter list [enabled by default]
drivers/net/can/cc770/cc770_platform.c: In function ‘cc770_platform_remove’:
drivers/net/can/cc770/cc770_platform.c:242:48: error: dereferencing pointer to incomplete type
drivers/net/can/cc770/cc770_platform.c:250:6: warning: assignment makes pointer from integer without a cast [enabled by default]
drivers/net/can/cc770/cc770_platform.c: At top level:
drivers/net/can/cc770/cc770_platform.c:256:42: error: array type has incomplete element type
drivers/net/can/cc770/cc770_platform.c:257:2: error: field name not in record or union initializer
drivers/net/can/cc770/cc770_platform.c:257:2: error: (near initialization for ‘cc770_platform_table’)
drivers/net/can/cc770/cc770_platform.c:258:2: error: field name not in record or union initializer
drivers/net/can/cc770/cc770_platform.c:258:2: error: (near initialization for ‘cc770_platform_table’)
drivers/net/can/cc770/cc770_platform.c:262:15: error: variable ‘cc770_platform_driver’ has initializer but incomplete type
drivers/net/can/cc770/cc770_platform.c:263:2: error: unknown field ‘driver’ specified in initializer
drivers/net/can/cc770/cc770_platform.c:263:2: error: extra brace group at end of initializer
drivers/net/can/cc770/cc770_platform.c:263:2: error: (near initialization for ‘cc770_platform_driver’)
drivers/net/can/cc770/cc770_platform.c:267:2: warning: excess elements in struct initializer [enabled by default]
drivers/net/can/cc770/cc770_platform.c:267:2: warning: (near initialization for ‘cc770_platform_driver’) [enabled by default]
drivers/net/can/cc770/cc770_platform.c:268:2: error: unknown field ‘probe’ specified in initializer
drivers/net/can/cc770/cc770_platform.c:268:2: warning: excess elements in struct initializer [enabled by default]
drivers/net/can/cc770/cc770_platform.c:268:2: warning: (near initialization for ‘cc770_platform_driver’) [enabled by default]
drivers/net/can/cc770/cc770_platform.c:269:2: error: unknown field ‘remove’ specified in initializer
drivers/net/can/cc770/cc770_platform.c:269:2: warning: excess elements in struct initializer [enabled by default]
drivers/net/can/cc770/cc770_platform.c:269:2: warning: (near initialization for ‘cc770_platform_driver’) [enabled by default]
drivers/net/can/cc770/cc770_platform.c:272:1: warning: data definition has no type or storage class [enabled by default]
drivers/net/can/cc770/cc770_platform.c:272:1: warning: type defaults to ‘int’ in declaration of ‘module_platform_driver’ [-Wimplicit-int]
drivers/net/can/cc770/cc770_platform.c:272:1: warning: parameter names (without types) in function declaration [enabled by default]
drivers/net/can/cc770/cc770_platform.c:256:42: warning: ‘cc770_platform_table’ defined but not used [-Wunused-variable]
drivers/net/can/cc770/cc770_platform.c:262:31: warning: ‘cc770_platform_driver’ defined but not used [-Wunused-variable]
cc1: some warnings being treated as errors

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-11-30 21:07       ` David Miller
  2011-11-30 21:14         ` David Miller
@ 2011-12-01  7:47         ` Oliver Hartkopp
  2011-12-01  8:15           ` netdev development process - was " Oliver Hartkopp
  2011-12-01 18:09           ` David Miller
       [not found]         ` <20111130.160727.1989923062226789802.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
  2 siblings, 2 replies; 18+ messages in thread
From: Oliver Hartkopp @ 2011-12-01  7:47 UTC (permalink / raw)
  To: David Miller; +Cc: wg, netdev, linux-can, Marc Kleine-Budde, Urs Thuermann

On 30.11.2011 22:07, David Miller wrote:

> From: Oliver Hartkopp <socketcan@hartkopp.net>

>>>> Wolfgang Grandegger (2):
>>>>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>>>>   can: cc770: legacy CC770 ISA bus driver
>>>
>>> All applied, thank you.
>>
>>
>> Hello Dave,
>>
>> this patchset was superseded for some time.
>>
>> We're currently in the v4 patchset (dated 2011-11-29).
>>
>> See http://patchwork.ozlabs.org/patch/128244/
>>
>> Do you want to revert the commit or should Wolfgang post a diff patch to get
>> to v4 ??
> 
> A not very good job was done here communicating to me what is happening.
> Endless revisions, and not clear indication to me what should or should
> not be applied as a result.


Well in this case i was just astonished why you applied a superseded patch set
- but i must admit that the pile-up of posted versions was a bit confusing.
Even there were platform and devtree patches that needed to be acked by other
maintainers - IMO we should post these patches on netdev only when they are
already acked by the platform/devtree guys.

@Wolfgang/Marc: We should return to discuss the CAN relevant patches on
linux-can@vger.kernel.org before posting them on netdev. Don't know why this
established & good process has changed over the time ...

> I want you guys to appoint someone to be the defacto CAN driver and
> subsystem maintainer who collects and merges all the driver and
> protocol patches into his tree, and acts as the one and only interface
> for me when changes are ready to be included.


I'm also not very happy someone else acking changes of my maintained sources -
sometimes it feels like Wild West to me, who's acking first :-(

To make it clear:

	Wolfgang Grandegger maintains drivers/net/can

and

	Oliver Hartkopp maintains net/can

As Marc Kleine-Budde is also very active in CAN driver development we should
probably add him to the drivers/net/can maintainers.

We'll continue the discussion on linux-can ML and give an update to the
MAINTAINERS file if we sorted out any changes. So far Wolfgang and me remain
the 'only interface' for you. Sorry for the traffic & confusion on netdev.

Regards,
Oliver

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

* netdev development process - was Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-12-01  7:47         ` Oliver Hartkopp
@ 2011-12-01  8:15           ` Oliver Hartkopp
  2011-12-01  9:07             ` Wolfgang Grandegger
  2011-12-01 18:09           ` David Miller
  1 sibling, 1 reply; 18+ messages in thread
From: Oliver Hartkopp @ 2011-12-01  8:15 UTC (permalink / raw)
  To: wg, Marc Kleine-Budde, Urs Thuermann; +Cc: Urs Thuermann, linux-can

Hello Marc and Urs,

what are your plans regarding a maintainer ship of your persons?

Urs is pretty absent and Marc is pretty active :-)

IMO we should update the MAINTAINERS file to make the responsibilities clear
to Dave & the rest of the world.

@Urs: Should we remove you from net/can maintainers? The fact that you are
module author of several code parts is not touched at all but your activities
to contribute to discussions is close to zero.

@Marc/Wolfgang: What are your thoughts about that? Is Wolfgang still enough or
would you like to share your activities?

I think the remarks from Dave hit the point and we should really try to
minimize confusion when talking to him in the future ...

Regards,
Oliver


>> A not very good dev process - job was done here communicating to me what is happening.
>> Endless revisions, and not clear indication to me what should or should
>> not be applied as a result.
> 
> 
> Well in this case i was just astonished why you applied a superseded patch set
> - but i must admit that the pile-up of posted versions was a bit confusing.
> Even there were platform and devtree patches that needed to be acked by other
> maintainers - IMO we should post these patches on netdev only when they are
> already acked by the platform/devtree guys.
> 
> @Wolfgang/Marc: We should return to discuss the CAN relevant patches on
> linux-can@vger.kernel.org before posting them on netdev. Don't know why this
> established & good process has changed over the time ...
> 
>> I want you guys to appoint someone to be the defacto CAN driver and
>> subsystem maintainer who collects and merges all the driver and
>> protocol patches into his tree, and acts as the one and only interface
>> for me when changes are ready to be included.
> 
> 
> I'm also not very happy someone else acking changes of my maintained sources -
> sometimes it feels like Wild West to me, who's acking first :-(
> 
> To make it clear:
> 
> 	Wolfgang Grandegger maintains drivers/net/can
> 
> and
> 
> 	Oliver Hartkopp maintains net/can
> 
> As Marc Kleine-Budde is also very active in CAN driver development we should
> probably add him to the drivers/net/can maintainers.
> 
> We'll continue the discussion on linux-can ML and give an update to the
> MAINTAINERS file if we sorted out any changes. So far Wolfgang and me remain
> the 'only interface' for you. Sorry for the traffic & confusion on netdev.



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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
       [not found]         ` <20111130.160727.1989923062226789802.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
@ 2011-12-01  8:26           ` Wolfgang Grandegger
  0 siblings, 0 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-12-01  8:26 UTC (permalink / raw)
  To: David Miller
  Cc: socketcan-fJ+pQTUTwRTk1uMJSBkQmQ,
	linux-can-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA,
	socketcan-users-0fE9KPoRgkgATYTw5x5z8w

On 11/30/2011 10:07 PM, David Miller wrote:
> From: Oliver Hartkopp <socketcan-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
> Date: Wed, 30 Nov 2011 07:37:08 +0100
> 
>> On 30.11.2011 00:39, David Miller wrote:
>>
>>> From: Wolfgang Grandegger <wg-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
>>> Date: Thu, 24 Nov 2011 13:07:26 +0100
>>>
>>>> Already since a while we have support for the Bosch CC770 and Intel
>>>> AN82527 CAN controllers in our out-of-tree Socket-CAN repository.
>>>> It would be nice if somebody could test the driver. Unfortunately,
>>>> I currently do not have hardware at hand. I have not yet ported the
>>>> OF platform driver as it needs further attaention due to the merge
>>>> of the platform and OF platform interface.
>>>>
>>>> Wolfgang Grandegger (2):
>>>>   can: cc770: add driver core for the Bosch CC770 and Intel AN82527
>>>>   can: cc770: legacy CC770 ISA bus driver
>>>
>>> All applied, thank you.
>>
>>
>> Hello Dave,
>>
>> this patchset was superseded for some time.
>>
>> We're currently in the v4 patchset (dated 2011-11-29).
>>
>> See http://patchwork.ozlabs.org/patch/128244/
>>
>> Do you want to revert the commit or should Wolfgang post a diff patch to get
>> to v4 ??
> 
> A not very good job was done here communicating to me what is happening.
> Endless revisions, and not clear indication to me what should or should
> not be applied as a result.

Well, not sure what I should have communicated to you, but ...

> I want you guys to appoint someone to be the defacto CAN driver and
> subsystem maintainer who collects and merges all the driver and
> protocol patches into his tree, and acts as the one and only interface
> for me when changes are ready to be included.

... I agree that this will work better and it hopefully will then also
save your valuable time. We will discuss in the Socket-CAN community who
will/can act as the one and only interface to you.

> I sorted this out by reverting the older changes and applying V5.
> 
> But I had to fix things up, when applying patch #3 there are empty
> trailing lines in some of the new files generated, and that causes
> git to complain.

Sorry for the bad quality of my patch series. I will try to do a better
job next time.

Thanks,

Wolfgang.

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

* Re: netdev development process - was Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-12-01  8:15           ` netdev development process - was " Oliver Hartkopp
@ 2011-12-01  9:07             ` Wolfgang Grandegger
  0 siblings, 0 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-12-01  9:07 UTC (permalink / raw)
  To: Oliver Hartkopp
  Cc: Marc Kleine-Budde, Urs Thuermann, Urs Thuermann, linux-can

Hi Oliver,

On 12/01/2011 09:15 AM, Oliver Hartkopp wrote:
> Hello Marc and Urs,
> 
> what are your plans regarding a maintainer ship of your persons?
> 
> Urs is pretty absent and Marc is pretty active :-)
> 
> IMO we should update the MAINTAINERS file to make the responsibilities clear
> to Dave & the rest of the world.
> 
> @Urs: Should we remove you from net/can maintainers? The fact that you are
> module author of several code parts is not touched at all but your activities
> to contribute to discussions is close to zero.
> 
> @Marc/Wolfgang: What are your thoughts about that? Is Wolfgang still enough or
> would you like to share your activities?

I would appreciate if Marc would join net/can driver maintainer ship. I
do often not find the necessary time to do a good maintainer job.
Anyway, Dave asks for *one* person who acts as the one and only
interface to him. Strictly speaking this means that that person should
maintain it's own GIT tree, reviewing and applying all patches after
adding it's signed-off-by and doing the necessary compilation tests (on
x86, arm, powerpc, ...), at least. That's much more work than before and
I'm not sure if I want/can to do that.

> I think the remarks from Dave hit the point and we should really try to
> minimize confusion when talking to him in the future ...

That's what he asks for.

Wolfgang.

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-11-30 21:14         ` David Miller
@ 2011-12-01  9:43           ` Wolfgang Grandegger
  0 siblings, 0 replies; 18+ messages in thread
From: Wolfgang Grandegger @ 2011-12-01  9:43 UTC (permalink / raw)
  To: David Miller
  Cc: socketcan, netdev, linux-can, socketcan-users, boir1, stanislavelensky

On 11/30/2011 10:14 PM, David Miller wrote:
> From: David Miller <davem@davemloft.net>
> Date: Wed, 30 Nov 2011 16:07:27 -0500 (EST)
> 
>> I sorted this out by reverting the older changes and applying V5.
>>
>> But I had to fix things up, when applying patch #3 there are empty
>> trailing lines in some of the new files generated, and that causes
>> git to complain.
> 
> Actually, I had to revert, it doesn't even compile.  I'm really pissed
> off at how this patch set is being handled, this should never happen.
> 
> It's not damn secret how I smoke test everyone's changes, I "allmodconfig"
> and type "make".

To get that right, I just sent v6. Sorry for the pain.

Wolfgang.

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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-12-01  7:47         ` Oliver Hartkopp
  2011-12-01  8:15           ` netdev development process - was " Oliver Hartkopp
@ 2011-12-01 18:09           ` David Miller
  2011-12-01 20:04             ` Marc Kleine-Budde
  1 sibling, 1 reply; 18+ messages in thread
From: David Miller @ 2011-12-01 18:09 UTC (permalink / raw)
  To: socketcan; +Cc: wg, netdev, linux-can, mkl, urs

From: Oliver Hartkopp <socketcan@hartkopp.net>
Date: Thu, 01 Dec 2011 08:47:35 +0100

> On 30.11.2011 22:07, David Miller wrote:
> 
> To make it clear:
> 
> 	Wolfgang Grandegger maintains drivers/net/can
> 
> and
> 
> 	Oliver Hartkopp maintains net/can
> 
> As Marc Kleine-Budde is also very active in CAN driver development we should
> probably add him to the drivers/net/can maintainers.
> 
> We'll continue the discussion on linux-can ML and give an update to the
> MAINTAINERS file if we sorted out any changes. So far Wolfgang and me remain
> the 'only interface' for you. Sorry for the traffic & confusion on netdev.

I said I want one person.  One person who periodically send me GIT pull requests
or a patch series for "CAN updates" of all kinds.

Just like how the wireless stuff is maintained.  They don't send me driver vs.
protcol layer vs. rfcomm vs. bluetooth changes seperately, John Linville collects
everything and sends me periodic pull requests.

And this is what I want from you guys.  One person who explicitly says "Dave, please
take in these CAN changes" rather than the confusing manner in which changes get
submitted currently.

Thanks.


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

* Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527
  2011-12-01 18:09           ` David Miller
@ 2011-12-01 20:04             ` Marc Kleine-Budde
  2011-12-12  9:13               ` the linux-can-next tree (was: Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527) Marc Kleine-Budde
  0 siblings, 1 reply; 18+ messages in thread
From: Marc Kleine-Budde @ 2011-12-01 20:04 UTC (permalink / raw)
  To: David Miller; +Cc: socketcan, wg, netdev, linux-can, urs

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

On 12/01/2011 07:09 PM, David Miller wrote:
>> We'll continue the discussion on linux-can ML and give an update to the
>> MAINTAINERS file if we sorted out any changes. So far Wolfgang and me remain
>> the 'only interface' for you. Sorry for the traffic & confusion on netdev.
> 
> I said I want one person.  One person who periodically send me GIT pull requests
> or a patch series for "CAN updates" of all kinds.

We're currently discussing the problem and we understood the one person
contact policy.

> Just like how the wireless stuff is maintained.  They don't send me driver vs.
> protcol layer vs. rfcomm vs. bluetooth changes seperately, John Linville collects
> everything and sends me periodic pull requests.
> 
> And this is what I want from you guys.  One person who explicitly says "Dave, please
> take in these CAN changes" rather than the confusing manner in which changes get
> submitted currently.

regards, Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]

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

* the linux-can-next tree (was: Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527)
  2011-12-01 20:04             ` Marc Kleine-Budde
@ 2011-12-12  9:13               ` Marc Kleine-Budde
  2011-12-16 21:14                 ` the linux-can-next tree David Miller
  0 siblings, 1 reply; 18+ messages in thread
From: Marc Kleine-Budde @ 2011-12-12  9:13 UTC (permalink / raw)
  To: David Miller; +Cc: socketcan, wg, netdev, linux-can, urs

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

Hello David,

On 12/01/2011 09:04 PM, Marc Kleine-Budde wrote:
>> I said I want one person.  One person who periodically send me GIT pull requests
>> or a patch series for "CAN updates" of all kinds.
> 
> We're currently discussing the problem and we understood the one person
> contact policy.

We decided that I should be this person. Our can tree is located on
gitorious:

https://gitorious.org/linux-can/linux-can-next

regards, Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]

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

* Re: the linux-can-next tree
  2011-12-12  9:13               ` the linux-can-next tree (was: Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527) Marc Kleine-Budde
@ 2011-12-16 21:14                 ` David Miller
  0 siblings, 0 replies; 18+ messages in thread
From: David Miller @ 2011-12-16 21:14 UTC (permalink / raw)
  To: mkl; +Cc: socketcan, wg, netdev, linux-can, urs

From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: Mon, 12 Dec 2011 10:13:52 +0100

> Hello David,
> 
> On 12/01/2011 09:04 PM, Marc Kleine-Budde wrote:
>>> I said I want one person.  One person who periodically send me GIT pull requests
>>> or a patch series for "CAN updates" of all kinds.
>> 
>> We're currently discussing the problem and we understood the one person
>> contact policy.
> 
> We decided that I should be this person. Our can tree is located on
> gitorious:
> 
> https://gitorious.org/linux-can/linux-can-next

Let me know when you formally want me to pull from this.  Typically this is
done by posting a "N patch" series to netdev, one for each change, CC:'d
to me.

The first posting should be with a subject like "[PATCH 0/N] CAN updates"
and contain the pull request as well as the top-level diffstate et al.
of the pull, usually generated using "git request-pull"

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

end of thread, other threads:[~2011-12-16 21:18 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-24 12:07 [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 Wolfgang Grandegger
2011-11-24 12:07 ` [PATCH net-next 1/2] can: cc770: add driver core " Wolfgang Grandegger
2011-11-24 12:07 ` [PATCH next-next 2/2] can: cc770: legacy CC770 ISA bus driver Wolfgang Grandegger
2011-11-29 23:39 ` [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 David Miller
     [not found]   ` <20111129.183950.1327835803051184146.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2011-11-30  6:37     ` Oliver Hartkopp
     [not found]       ` <4ED5CF14.4020502-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
2011-11-30  8:29         ` Wolfgang Grandegger
     [not found]           ` <4ED5E94F.8010403-5Yr1BZd7O62+XT7JhA+gdA@public.gmane.org>
2011-11-30 12:10             ` Wolfgang Grandegger
2011-11-30 21:07       ` David Miller
2011-11-30 21:14         ` David Miller
2011-12-01  9:43           ` Wolfgang Grandegger
2011-12-01  7:47         ` Oliver Hartkopp
2011-12-01  8:15           ` netdev development process - was " Oliver Hartkopp
2011-12-01  9:07             ` Wolfgang Grandegger
2011-12-01 18:09           ` David Miller
2011-12-01 20:04             ` Marc Kleine-Budde
2011-12-12  9:13               ` the linux-can-next tree (was: Re: [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527) Marc Kleine-Budde
2011-12-16 21:14                 ` the linux-can-next tree David Miller
     [not found]         ` <20111130.160727.1989923062226789802.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2011-12-01  8:26           ` [PATCH next-next 0/2] can: cc770: add support for the Bosch CC770 and Intel AN82527 Wolfgang Grandegger

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.