From: Benedikt Spranger <b.spranger@linutronix.de>
To: netdev@vger.kernel.org
Cc: Alexander Frank <Alexander.Frank@eberspaecher.com>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Holger Dengler <dengler@linutronix.de>,
Benedikt Spranger <b.spranger@linutronix.de>
Subject: [PATCH 08/16] c_can: Add FlexCard CAN TX fifo support
Date: Mon, 9 Sep 2013 09:25:05 +0200 [thread overview]
Message-ID: <1378711513-2548-9-git-send-email-b.spranger@linutronix.de> (raw)
In-Reply-To: <1378711513-2548-1-git-send-email-b.spranger@linutronix.de>
The FlexCard DCAN implementation contains a specialized TX fifo function.
Add the TX support for this function.
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
---
drivers/net/can/c_can/c_can.c | 77 ++++++++++++++++++++++++++++++++++++-------
1 file changed, 65 insertions(+), 12 deletions(-)
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index 39e2bb0..4b94f2d 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -41,6 +41,7 @@
#include <linux/can/error.h>
#include <linux/can/led.h>
+#include <linux/flexcard.h>
#include "c_can.h"
/* Number of interface registers */
@@ -566,24 +567,60 @@ static netdev_tx_t c_can_start_xmit(struct sk_buff *skb,
u32 msg_obj_no;
struct c_can_priv *priv = netdev_priv(dev);
struct can_frame *frame = (struct can_frame *)skb->data;
+ int tx_fifo;
if (can_dropped_invalid_skb(dev, skb))
return NETDEV_TX_OK;
- msg_obj_no = get_tx_next_msg_obj(priv);
+ tx_fifo = frame->can_dlc & FC_TXFIFO_FLAG;
+ frame->can_dlc &= FC_TXFIFO_DLC_MASK;
- /* prepare message object for transmission */
- c_can_write_msg_object(dev, 0, frame, msg_obj_no);
- can_put_echo_skb(skb, dev, msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
+ if (tx_fifo) {
+ u32 id, *data, ctrl;
- /*
- * we have to stop the queue in case of a wrap around or
- * if the next TX message object is still in use
- */
- priv->tx_next++;
- if (c_can_is_next_tx_obj_busy(priv, get_tx_next_msg_obj(priv)) ||
- (priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) == 0)
- netif_stop_queue(dev);
+ if (readl(priv->base + FC_TXFIFO_STAT) &
+ FC_TXFIFO_STAT_FULL) {
+ netif_stop_queue(dev);
+ return NETDEV_TX_BUSY;
+ }
+
+ if (frame->can_id & CAN_EFF_FLAG) {
+ id = frame->can_id & CAN_EFF_MASK;
+ id |= FC_TXFIFO_MSGID_EXT;
+ } else {
+ id = frame->can_id & CAN_SFF_MASK;
+ /* StdID is left alligned */
+ id <<= FC_TXFIFO_MSGID_STDID_SHIFT;
+ }
+
+ writel(id, priv->base + FC_TXFIFO_MSGID);
+ writel(frame->can_dlc, priv->base + FC_TXFIFO_MSGCTRL);
+
+ if (frame->can_dlc) {
+ data = (u32 *) frame->data;
+ writel(data[0], priv->base + FC_TXFIFO_MSGDA);
+ writel(data[1], priv->base + FC_TXFIFO_MSGDB);
+ }
+
+ ctrl = readl(priv->base + FC_TXFIFO_CTRL);
+ ctrl |= FC_TXFIFO_CTRL_REQ;
+ writel(ctrl, priv->base + FC_TXFIFO_CTRL);
+ kfree_skb(skb);
+ } else {
+ msg_obj_no = get_tx_next_msg_obj(priv);
+
+ /* prepare message object for transmission */
+ c_can_write_msg_object(dev, 0, frame, msg_obj_no);
+ priv->tx_next++;
+
+ can_put_echo_skb(skb, dev, msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
+ /* we have to stop the queue in case of a wrap around or
+ * if the next TX message object is still in use
+ */
+ if (c_can_is_next_tx_obj_busy(priv, get_tx_next_msg_obj(priv))
+ || ((priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) == 0))
+ netif_stop_queue(dev);
+ }
return NETDEV_TX_OK;
}
@@ -683,6 +720,8 @@ static void c_can_configure_msg_objects(struct net_device *dev, int invalidate)
IF_MASK_MDIR | IF_MASK_RES, 0,
IF_MCONT_UMASK | IF_MCONT_EOB |
IF_MCONT_RXIE | IF_MCONT_DLC_MAX);
+
+ c_can_inval_msg_object(dev, 0, FC_TXFIFO_MO);
}
/*
@@ -740,8 +779,13 @@ static int c_can_chip_config(struct net_device *dev)
static int c_can_start(struct net_device *dev)
{
struct c_can_priv *priv = netdev_priv(dev);
+ u32 conf;
int ret;
+ conf = readl(priv->base + FC_TXFIFO_CONF);
+ conf |= FC_TXFIFO_CONF_EN;
+ writel(conf, priv->base + FC_TXFIFO_CONF);
+
/* basic c_can configuration */
ret = c_can_chip_config(dev);
if (ret)
@@ -762,6 +806,11 @@ out:
static void c_can_stop(struct net_device *dev)
{
struct c_can_priv *priv = netdev_priv(dev);
+ u32 conf;
+
+ conf = readl(priv->base + FC_TXFIFO_CONF);
+ conf &= ~FC_TXFIFO_CONF_EN;
+ writel(conf, priv->base + FC_TXFIFO_CONF);
/* disable all interrupts */
c_can_enable_all_interrupts(priv, DISABLE_ALL_INTERRUPTS);
@@ -1350,6 +1399,8 @@ int register_c_can_dev(struct net_device *dev)
struct c_can_priv *priv = netdev_priv(dev);
int err;
+ writel(0, priv->base + FC_TXFIFO_CONF);
+
c_can_pm_runtime_enable(priv);
dev->flags |= IFF_ECHO; /* we support local echo */
@@ -1369,6 +1420,8 @@ void unregister_c_can_dev(struct net_device *dev)
{
struct c_can_priv *priv = netdev_priv(dev);
+ writel(0, priv->base + FC_TXFIFO_CONF);
+
unregister_candev(dev);
c_can_pm_runtime_disable(priv);
--
1.8.4.rc3
next prev parent reply other threads:[~2013-09-09 7:25 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-09 7:24 [PATCH 00/16] Support for Eberspächer Flexcard DCAN function Benedikt Spranger
2013-09-09 7:24 ` [PATCH 01/16] c_can_platform: add FlexCard D-CAN support Benedikt Spranger
2013-09-09 8:22 ` Marc Kleine-Budde
2013-09-09 7:24 ` [PATCH 02/16] c_can: add generic D-CAN RAM initialization support Benedikt Spranger
2013-09-09 8:34 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 03/16] c_can: simplify arbitration register handling Benedikt Spranger
2013-09-09 9:16 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 04/16] c_can: fix receive buffer configuration Benedikt Spranger
2013-09-09 10:51 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 05/16] c_can: use 32 bit access for D_CAN Benedikt Spranger
2013-09-09 9:37 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 06/16] c_can: consider set bittiming may fail Benedikt Spranger
2013-09-09 9:39 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 07/16] c_can: reconfigre message objects after leaving init state Benedikt Spranger
2013-09-09 7:25 ` Benedikt Spranger [this message]
2013-09-09 9:47 ` [PATCH 08/16] c_can: Add FlexCard CAN TX fifo support Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 09/16] c_can: expicit 32bit access on D_CAN to message buffer data register Benedikt Spranger
2013-09-09 11:20 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 10/16] c_can: add 16bit align 32bit access functions Benedikt Spranger
2013-09-09 9:57 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 11/16] c_can: stop netqueue if hardware is busy Benedikt Spranger
2013-09-09 10:05 ` Marc Kleine-Budde
2013-09-09 10:21 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 12/16] c_can: Add flag to disable automatic retransmission of CAN frames Benedikt Spranger
2013-09-09 10:21 ` Marc Kleine-Budde
2013-09-09 10:34 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 13/16] c_can: flexcard: add ioctl to reset FIFO message object Benedikt Spranger
2013-09-09 10:24 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 14/16] flexcard: can: CAN local loopback using SKB pflags Benedikt Spranger
2013-09-09 7:25 ` [PATCH 15/16] flexcard: can: Configure CAN loopback packages (TXACK) Benedikt Spranger
2013-09-09 10:29 ` Marc Kleine-Budde
2013-09-09 7:25 ` [PATCH 16/16] c_can: fix TX packet accounting Benedikt Spranger
2013-09-09 10:31 ` Marc Kleine-Budde
2013-09-09 7:54 ` [PATCH 00/16] Support for Eberspächer Flexcard DCAN function Marc Kleine-Budde
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=1378711513-2548-9-git-send-email-b.spranger@linutronix.de \
--to=b.spranger@linutronix.de \
--cc=Alexander.Frank@eberspaecher.com \
--cc=bigeasy@linutronix.de \
--cc=dengler@linutronix.de \
--cc=netdev@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).