|
@@ -124,7 +124,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
/* FlexCAN module is essentially modelled as a little-endian IP in most
|
|
|
* SoCs, i.e the registers as well as the message buffer areas are
|
|
|
* implemented in a little-endian fashion.
|
|
|
-@@ -630,7 +684,7 @@ static netdev_tx_t flexcan_start_xmit(st
|
|
|
+@@ -632,7 +686,7 @@ static netdev_tx_t flexcan_start_xmit(st
|
|
|
struct canfd_frame *cfd = (struct canfd_frame *)skb->data;
|
|
|
u32 can_id;
|
|
|
u32 data;
|
|
@@ -133,7 +133,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
int i;
|
|
|
|
|
|
if (can_dropped_invalid_skb(dev, skb))
|
|
|
-@@ -648,6 +702,9 @@ static netdev_tx_t flexcan_start_xmit(st
|
|
|
+@@ -650,6 +704,9 @@ static netdev_tx_t flexcan_start_xmit(st
|
|
|
if (cfd->can_id & CAN_RTR_FLAG)
|
|
|
ctrl |= FLEXCAN_MB_CNT_RTR;
|
|
|
|
|
@@ -143,7 +143,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
for (i = 0; i < cfd->len; i += sizeof(u32)) {
|
|
|
data = be32_to_cpup((__be32 *)&cfd->data[i]);
|
|
|
priv->write(data, &priv->tx_mb->data[i / sizeof(u32)]);
|
|
|
-@@ -858,7 +915,10 @@ static struct sk_buff *flexcan_mailbox_r
|
|
|
+@@ -860,7 +917,10 @@ static struct sk_buff *flexcan_mailbox_r
|
|
|
reg_ctrl = priv->read(&mb->can_ctrl);
|
|
|
}
|
|
|
|
|
@@ -155,7 +155,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
if (unlikely(!skb)) {
|
|
|
skb = ERR_PTR(-ENOMEM);
|
|
|
goto mark_as_read;
|
|
|
-@@ -873,9 +933,17 @@ static struct sk_buff *flexcan_mailbox_r
|
|
|
+@@ -875,9 +935,17 @@ static struct sk_buff *flexcan_mailbox_r
|
|
|
else
|
|
|
cfd->can_id = (reg_id >> 18) & CAN_SFF_MASK;
|
|
|
|
|
@@ -176,7 +176,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
|
|
|
for (i = 0; i < cfd->len; i += sizeof(u32)) {
|
|
|
__be32 data = cpu_to_be32(priv->read(&mb->data[i / sizeof(u32)]));
|
|
|
-@@ -1020,27 +1088,14 @@ static irqreturn_t flexcan_irq(int irq,
|
|
|
+@@ -1022,27 +1090,14 @@ static irqreturn_t flexcan_irq(int irq,
|
|
|
|
|
|
static void flexcan_set_bittiming(struct net_device *dev)
|
|
|
{
|
|
@@ -209,7 +209,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
|
|
|
reg |= FLEXCAN_CTRL_LPB;
|
|
|
if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
|
|
|
-@@ -1051,9 +1106,102 @@ static void flexcan_set_bittiming(struct
|
|
|
+@@ -1053,9 +1108,102 @@ static void flexcan_set_bittiming(struct
|
|
|
netdev_dbg(dev, "writing ctrl=0x%08x\n", reg);
|
|
|
priv->write(reg, ®s->ctrl);
|
|
|
|
|
@@ -315,7 +315,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
}
|
|
|
|
|
|
/* flexcan_chip_start
|
|
|
-@@ -1065,7 +1213,7 @@ static int flexcan_chip_start(struct net
|
|
|
+@@ -1067,7 +1215,7 @@ static int flexcan_chip_start(struct net
|
|
|
{
|
|
|
struct flexcan_priv *priv = netdev_priv(dev);
|
|
|
struct flexcan_regs __iomem *regs = priv->regs;
|
|
@@ -324,7 +324,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
u64 reg_imask;
|
|
|
int err, i;
|
|
|
struct flexcan_mb __iomem *mb;
|
|
|
-@@ -1162,6 +1310,26 @@ static int flexcan_chip_start(struct net
|
|
|
+@@ -1164,6 +1312,26 @@ static int flexcan_chip_start(struct net
|
|
|
netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
|
|
|
priv->write(reg_ctrl, ®s->ctrl);
|
|
|
|
|
@@ -351,7 +351,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
if ((priv->devtype_data->quirks & FLEXCAN_QUIRK_ENABLE_EACEN_RRS)) {
|
|
|
reg_ctrl2 = priv->read(®s->ctrl2);
|
|
|
reg_ctrl2 |= FLEXCAN_CTRL2_EACEN | FLEXCAN_CTRL2_RRS;
|
|
|
-@@ -1309,6 +1477,12 @@ static int flexcan_open(struct net_devic
|
|
|
+@@ -1304,6 +1472,12 @@ static int flexcan_open(struct net_devic
|
|
|
struct flexcan_priv *priv = netdev_priv(dev);
|
|
|
int err;
|
|
|
|
|
@@ -362,11 +362,11 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
+ }
|
|
|
+
|
|
|
err = pm_runtime_get_sync(priv->dev);
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
-@@ -1321,7 +1495,10 @@ static int flexcan_open(struct net_devic
|
|
|
+ if (err < 0) {
|
|
|
+ pm_runtime_put_noidle(priv->dev);
|
|
|
+@@ -1322,7 +1496,10 @@ static int flexcan_open(struct net_devic
|
|
|
if (err)
|
|
|
- goto out_close;
|
|
|
+ goto out_transceiver_disable;
|
|
|
|
|
|
- priv->mb_size = sizeof(struct flexcan_mb) + CAN_MAX_DLEN;
|
|
|
+ if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
|
|
@@ -376,7 +376,7 @@ Signed-off-by: Marc Kleine-Budde <[email protected]>
|
|
|
priv->mb_count = (sizeof(priv->regs->mb[0]) / priv->mb_size) +
|
|
|
(sizeof(priv->regs->mb[1]) / priv->mb_size);
|
|
|
|
|
|
-@@ -1666,6 +1843,18 @@ static int flexcan_probe(struct platform
|
|
|
+@@ -1670,6 +1847,18 @@ static int flexcan_probe(struct platform
|
|
|
priv->devtype_data = devtype_data;
|
|
|
priv->reg_xceiver = reg_xceiver;
|
|
|
|