* [PATCH 0/7] can: m_can: Fix polling and other issues
@ 2024-07-26 19:59 Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 1/7] can: m_can: Reset coalescing during suspend/resume Markus Schneider-Pargmann
` (6 more replies)
0 siblings, 7 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
Hi everyone,
these are a number of fixes for m_can that fix polling mode and some
other issues that I saw while working on the code.
Any testing and review is appreciated.
It is currently based on v6.10-rc1 + a patch from Martin, mainly for
review purposes. Once next rc1 is out, I will rebase it, but it should
also apply cleanly.
Best,
Markus
Markus Schneider-Pargmann (7):
can: m_can: Reset coalescing during suspend/resume
can: m_can: Remove coalesing disable in isr during suspend
can: m_can: Remove m_can_rx_peripheral indirection
can: m_can: Do not cancel timer from within timer
can: m_can: disable_all_interrupts, not clear active_interrupts
can: m_can: Reset cached active_interrupts on start
can: m_can: Limit coalescing to peripheral instances
drivers/net/can/m_can/m_can.c | 112 ++++++++++++++++++++--------------
1 file changed, 67 insertions(+), 45 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/7] can: m_can: Reset coalescing during suspend/resume
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 2/7] can: m_can: Remove coalesing disable in isr during suspend Markus Schneider-Pargmann
` (5 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
During resume the interrupts are limited to IR_RF0N and the chip keeps
running. In this case if coalescing is enabled and active we may miss
waterlevel interrupts during suspend. It is safer to reset the
coalescing by stopping the timer and adding IR_RF0N | IR_TEFN to the
interrupts.
This is a theoratical issue and probably extremely rare.
Cc: Martin Hundebøll <martin@geanix.com>
Fixes: 4a94d7e31cf5 ("can: m_can: allow keeping the transceiver running in suspend")
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 7f63f866083e..9d7d551e3534 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2427,12 +2427,15 @@ int m_can_class_suspend(struct device *dev)
netif_device_detach(ndev);
/* leave the chip running with rx interrupt enabled if it is
- * used as a wake-up source.
+ * used as a wake-up source. Coalescing needs to be reset then,
+ * the timer is cancelled here, interrupts are done in resume.
*/
- if (cdev->pm_wake_source)
+ if (cdev->pm_wake_source) {
+ hrtimer_cancel(&cdev->hrtimer);
m_can_write(cdev, M_CAN_IE, IR_RF0N);
- else
+ } else {
m_can_stop(ndev);
+ }
m_can_clk_stop(cdev);
}
@@ -2462,6 +2465,13 @@ int m_can_class_resume(struct device *dev)
return ret;
if (cdev->pm_wake_source) {
+ /* Restore active interrupts but disable coalescing as
+ * we may have missed important waterlevel interrupts
+ * between suspend and resume. Timers are already
+ * stopped in suspend. Here we enable all interrupts
+ * again.
+ */
+ cdev->active_interrupts |= IR_RF0N | IR_TEFN;
m_can_write(cdev, M_CAN_IE, cdev->active_interrupts);
} else {
ret = m_can_start(ndev);
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/7] can: m_can: Remove coalesing disable in isr during suspend
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 1/7] can: m_can: Reset coalescing during suspend/resume Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 3/7] can: m_can: Remove m_can_rx_peripheral indirection Markus Schneider-Pargmann
` (4 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
We don't need to disable coalescing when the interrupt handler executes
while the chip is suspended. The coalescing is already reset during
suspend.
Fixes: 07f25091ca02 ("can: m_can: Implement receive coalescing")
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 9d7d551e3534..fd600ab93218 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1223,10 +1223,8 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
struct m_can_classdev *cdev = netdev_priv(dev);
u32 ir;
- if (pm_runtime_suspended(cdev->dev)) {
- m_can_coalescing_disable(cdev);
+ if (pm_runtime_suspended(cdev->dev))
return IRQ_NONE;
- }
ir = m_can_read(cdev, M_CAN_IR);
m_can_coalescing_update(cdev, ir);
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/7] can: m_can: Remove m_can_rx_peripheral indirection
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 1/7] can: m_can: Reset coalescing during suspend/resume Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 2/7] can: m_can: Remove coalesing disable in isr during suspend Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 4/7] can: m_can: Do not cancel timer from within timer Markus Schneider-Pargmann
` (3 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
m_can_rx_peripheral() is a wrapper around m_can_rx_handler() that calls
m_can_disable_all_interrupts() on error. The same handling for the same
error path is done in m_can_isr() as well.
So remove m_can_rx_peripheral() and do the call from m_can_isr()
directly.
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index fd600ab93218..42ed7f0fea78 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1037,22 +1037,6 @@ static int m_can_rx_handler(struct net_device *dev, int quota, u32 irqstatus)
return work_done;
}
-static int m_can_rx_peripheral(struct net_device *dev, u32 irqstatus)
-{
- struct m_can_classdev *cdev = netdev_priv(dev);
- int work_done;
-
- work_done = m_can_rx_handler(dev, NAPI_POLL_WEIGHT, irqstatus);
-
- /* Don't re-enable interrupts if the driver had a fatal error
- * (e.g., FIFO read failure).
- */
- if (work_done < 0)
- m_can_disable_all_interrupts(cdev);
-
- return work_done;
-}
-
static int m_can_poll(struct napi_struct *napi, int quota)
{
struct net_device *dev = napi->dev;
@@ -1250,7 +1234,7 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
} else {
int pkts;
- pkts = m_can_rx_peripheral(dev, ir);
+ pkts = m_can_rx_handler(dev, NAPI_POLL_WEIGHT, ir);
if (pkts < 0)
goto out_fail;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/7] can: m_can: Do not cancel timer from within timer
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
` (2 preceding siblings ...)
2024-07-26 19:59 ` [PATCH 3/7] can: m_can: Remove m_can_rx_peripheral indirection Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
2024-07-27 9:32 ` kernel test robot
2024-07-26 19:59 ` [PATCH 5/7] can: m_can: disable_all_interrupts, not clear active_interrupts Markus Schneider-Pargmann
` (2 subsequent siblings)
6 siblings, 1 reply; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
On setups without interrupts, the interrupt handler is called from a
timer callback. For non-peripheral receives napi is scheduled,
interrupts are disabled and the timer is canceled with a blocking call.
In case of an error this can happen as well.
Check if napi is scheduled in the timer callback after the interrupt
handler executed. If napi is scheduled, the timer is disabled. It will
be reenabled by m_can_poll().
Return error values from the interrupt handler so that interrupt threads
and timer callback can deal differently with it. In case of the timer
we only disable the timer. The rest will be done when stopping the
interface.
Fixes: b382380c0d2d ("can: m_can: Add hrtimer to generate software interrupt")
Fixes: a163c5761019 ("can: m_can: Start/Cancel polling timer together with interrupts")
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 58 ++++++++++++++++++++++++++---------
1 file changed, 43 insertions(+), 15 deletions(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 42ed7f0fea78..e70c7100a3c9 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -487,7 +487,7 @@ static inline void m_can_disable_all_interrupts(struct m_can_classdev *cdev)
if (!cdev->net->irq) {
dev_dbg(cdev->dev, "Stop hrtimer\n");
- hrtimer_cancel(&cdev->hrtimer);
+ hrtimer_try_to_cancel(&cdev->hrtimer);
}
}
@@ -1201,11 +1201,16 @@ static void m_can_coalescing_update(struct m_can_classdev *cdev, u32 ir)
HRTIMER_MODE_REL);
}
-static irqreturn_t m_can_isr(int irq, void *dev_id)
+/**
+ * This interrupt handler is called either from the interrupt thread or a
+ * hrtimer. This has implications like cancelling a timer won't be possible
+ * blocking.
+ */
+static int m_can_interrupt_handler(struct m_can_classdev *cdev)
{
- struct net_device *dev = (struct net_device *)dev_id;
- struct m_can_classdev *cdev = netdev_priv(dev);
+ struct net_device *dev = cdev->net;
u32 ir;
+ int ret;
if (pm_runtime_suspended(cdev->dev))
return IRQ_NONE;
@@ -1232,11 +1237,9 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
m_can_disable_all_interrupts(cdev);
napi_schedule(&cdev->napi);
} else {
- int pkts;
-
- pkts = m_can_rx_handler(dev, NAPI_POLL_WEIGHT, ir);
- if (pkts < 0)
- goto out_fail;
+ ret = m_can_rx_handler(dev, NAPI_POLL_WEIGHT, ir);
+ if (ret < 0)
+ return ret;
}
}
@@ -1254,8 +1257,9 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
} else {
if (ir & (IR_TEFN | IR_TEFW)) {
/* New TX FIFO Element arrived */
- if (m_can_echo_tx_event(dev) != 0)
- goto out_fail;
+ ret = m_can_echo_tx_event(dev);
+ if (ret != 0)
+ return ret;
}
}
@@ -1263,16 +1267,31 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
can_rx_offload_threaded_irq_finish(&cdev->offload);
return IRQ_HANDLED;
+}
-out_fail:
- m_can_disable_all_interrupts(cdev);
- return IRQ_HANDLED;
+static irqreturn_t m_can_isr(int irq, void *dev_id)
+{
+ struct net_device *dev = (struct net_device *)dev_id;
+ struct m_can_classdev *cdev = netdev_priv(dev);
+ int ret;
+
+ ret = m_can_interrupt_handler(cdev);
+ if (ret < 0) {
+ m_can_disable_all_interrupts(cdev);
+ return IRQ_HANDLED;
+ }
+
+ return ret;
}
static enum hrtimer_restart m_can_coalescing_timer(struct hrtimer *timer)
{
struct m_can_classdev *cdev = container_of(timer, struct m_can_classdev, hrtimer);
+ if (cdev->can.state == CAN_STATE_BUS_OFF ||
+ cdev->can.state == CAN_STATE_STOPPED)
+ return HRTIMER_NORESTART;
+
irq_wake_thread(cdev->net->irq, cdev->net);
return HRTIMER_NORESTART;
@@ -1973,8 +1992,17 @@ static enum hrtimer_restart hrtimer_callback(struct hrtimer *timer)
{
struct m_can_classdev *cdev = container_of(timer, struct
m_can_classdev, hrtimer);
+ int ret;
- m_can_isr(0, cdev->net);
+ if (cdev->can.state == CAN_STATE_BUS_OFF ||
+ cdev->can.state == CAN_STATE_STOPPED)
+ return HRTIMER_NORESTART;
+
+ ret = m_can_interrupt_handler(cdev);
+
+ /* On error or if napi is scheduled to read, stop the timer */
+ if (ret < 0 || napi_is_scheduled(&cdev->napi))
+ return HRTIMER_NORESTART;
hrtimer_forward_now(timer, ms_to_ktime(HRTIMER_POLL_INTERVAL_MS));
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/7] can: m_can: disable_all_interrupts, not clear active_interrupts
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
` (3 preceding siblings ...)
2024-07-26 19:59 ` [PATCH 4/7] can: m_can: Do not cancel timer from within timer Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 6/7] can: m_can: Reset cached active_interrupts on start Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 7/7] can: m_can: Limit coalescing to peripheral instances Markus Schneider-Pargmann
6 siblings, 0 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
active_interrupts is a cache for the enabled interrupts and not the
global masking of interrupts. Do not clear this variable otherwise we
may loose the state of the interrupts.
Fixes: 07f25091ca02 ("can: m_can: Implement receive coalescing")
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index e70c7100a3c9..bf4a9ae76db9 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -483,7 +483,6 @@ static inline void m_can_disable_all_interrupts(struct m_can_classdev *cdev)
{
m_can_coalescing_disable(cdev);
m_can_write(cdev, M_CAN_ILE, 0x0);
- cdev->active_interrupts = 0x0;
if (!cdev->net->irq) {
dev_dbg(cdev->dev, "Stop hrtimer\n");
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/7] can: m_can: Reset cached active_interrupts on start
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
` (4 preceding siblings ...)
2024-07-26 19:59 ` [PATCH 5/7] can: m_can: disable_all_interrupts, not clear active_interrupts Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 7/7] can: m_can: Limit coalescing to peripheral instances Markus Schneider-Pargmann
6 siblings, 0 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
To force writing the enabled interrupts, reset the active_interrupts
cache.
Fixes: 07f25091ca02 ("can: m_can: Implement receive coalescing")
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index bf4a9ae76db9..7c9ad9f7174e 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1542,6 +1542,7 @@ static int m_can_chip_config(struct net_device *dev)
else
interrupts &= ~(IR_ERR_LEC_31X);
}
+ cdev->active_interrupts = 0;
m_can_interrupt_enable(cdev, interrupts);
/* route all interrupts to INT0 */
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 7/7] can: m_can: Limit coalescing to peripheral instances
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
` (5 preceding siblings ...)
2024-07-26 19:59 ` [PATCH 6/7] can: m_can: Reset cached active_interrupts on start Markus Schneider-Pargmann
@ 2024-07-26 19:59 ` Markus Schneider-Pargmann
6 siblings, 0 replies; 9+ messages in thread
From: Markus Schneider-Pargmann @ 2024-07-26 19:59 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Markus Schneider-Pargmann, Martin Hundebøll, Michal Kubiak,
Simon Horman, Tony Lindgren, Judith Mendez
Cc: Matthias Schiffer, Linux regression tracking, linux-can, netdev,
linux-kernel
The use of coalescing for non-peripheral chips in the current
implementation is limited to non-existing. Disable the possibility to
set coalescing through ethtool.
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
drivers/net/can/m_can/m_can.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 7c9ad9f7174e..663eb4247029 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2182,7 +2182,7 @@ static int m_can_set_coalesce(struct net_device *dev,
return 0;
}
-static const struct ethtool_ops m_can_ethtool_ops = {
+static const struct ethtool_ops m_can_ethtool_ops_coalescing = {
.supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS_IRQ |
ETHTOOL_COALESCE_RX_MAX_FRAMES_IRQ |
ETHTOOL_COALESCE_TX_USECS_IRQ |
@@ -2193,18 +2193,20 @@ static const struct ethtool_ops m_can_ethtool_ops = {
.set_coalesce = m_can_set_coalesce,
};
-static const struct ethtool_ops m_can_ethtool_ops_polling = {
+static const struct ethtool_ops m_can_ethtool_ops = {
.get_ts_info = ethtool_op_get_ts_info,
};
-static int register_m_can_dev(struct net_device *dev)
+static int register_m_can_dev(struct m_can_classdev *cdev)
{
+ struct net_device *dev = cdev->net;
+
dev->flags |= IFF_ECHO; /* we support local echo */
dev->netdev_ops = &m_can_netdev_ops;
- if (dev->irq)
- dev->ethtool_ops = &m_can_ethtool_ops;
+ if (dev->irq && cdev->is_peripheral)
+ dev->ethtool_ops = &m_can_ethtool_ops_coalescing;
else
- dev->ethtool_ops = &m_can_ethtool_ops_polling;
+ dev->ethtool_ops = &m_can_ethtool_ops;
return register_candev(dev);
}
@@ -2390,7 +2392,7 @@ int m_can_class_register(struct m_can_classdev *cdev)
if (ret)
goto rx_offload_del;
- ret = register_m_can_dev(cdev->net);
+ ret = register_m_can_dev(cdev);
if (ret) {
dev_err(cdev->dev, "registering %s failed (err=%d)\n",
cdev->net->name, ret);
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 4/7] can: m_can: Do not cancel timer from within timer
2024-07-26 19:59 ` [PATCH 4/7] can: m_can: Do not cancel timer from within timer Markus Schneider-Pargmann
@ 2024-07-27 9:32 ` kernel test robot
0 siblings, 0 replies; 9+ messages in thread
From: kernel test robot @ 2024-07-27 9:32 UTC (permalink / raw)
To: Markus Schneider-Pargmann, Chandrasekar Ramakrishnan,
Marc Kleine-Budde, Vincent Mailhol, David S . Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Martin Hundebøll,
Michal Kubiak, Simon Horman, Tony Lindgren, Judith Mendez
Cc: oe-kbuild-all, Matthias Schiffer, Linux regression tracking,
linux-can, netdev, linux-kernel
Hi Markus,
kernel test robot noticed the following build warnings:
[auto build test WARNING on mkl-can-next/testing]
[also build test WARNING on linus/master v6.10 next-20240726]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Markus-Schneider-Pargmann/can-m_can-Reset-coalescing-during-suspend-resume/20240727-042714
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git testing
patch link: https://lore.kernel.org/r/20240726195944.2414812-5-msp%40baylibre.com
patch subject: [PATCH 4/7] can: m_can: Do not cancel timer from within timer
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20240727/202407271748.gsVE0Hih-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240727/202407271748.gsVE0Hih-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202407271748.gsVE0Hih-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/net/can/m_can/m_can.c:1205: warning: This comment starts with '/**', but isn't a kernel-doc comment. Refer Documentation/doc-guide/kernel-doc.rst
* This interrupt handler is called either from the interrupt thread or a
vim +1205 drivers/net/can/m_can/m_can.c
1203
1204 /**
> 1205 * This interrupt handler is called either from the interrupt thread or a
1206 * hrtimer. This has implications like cancelling a timer won't be possible
1207 * blocking.
1208 */
1209 static int m_can_interrupt_handler(struct m_can_classdev *cdev)
1210 {
1211 struct net_device *dev = cdev->net;
1212 u32 ir;
1213 int ret;
1214
1215 if (pm_runtime_suspended(cdev->dev))
1216 return IRQ_NONE;
1217
1218 ir = m_can_read(cdev, M_CAN_IR);
1219 m_can_coalescing_update(cdev, ir);
1220 if (!ir)
1221 return IRQ_NONE;
1222
1223 /* ACK all irqs */
1224 m_can_write(cdev, M_CAN_IR, ir);
1225
1226 if (cdev->ops->clear_interrupts)
1227 cdev->ops->clear_interrupts(cdev);
1228
1229 /* schedule NAPI in case of
1230 * - rx IRQ
1231 * - state change IRQ
1232 * - bus error IRQ and bus error reporting
1233 */
1234 if (ir & (IR_RF0N | IR_RF0W | IR_ERR_ALL_30X)) {
1235 cdev->irqstatus = ir;
1236 if (!cdev->is_peripheral) {
1237 m_can_disable_all_interrupts(cdev);
1238 napi_schedule(&cdev->napi);
1239 } else {
1240 ret = m_can_rx_handler(dev, NAPI_POLL_WEIGHT, ir);
1241 if (ret < 0)
1242 return ret;
1243 }
1244 }
1245
1246 if (cdev->version == 30) {
1247 if (ir & IR_TC) {
1248 /* Transmission Complete Interrupt*/
1249 u32 timestamp = 0;
1250 unsigned int frame_len;
1251
1252 if (cdev->is_peripheral)
1253 timestamp = m_can_get_timestamp(cdev);
1254 frame_len = m_can_tx_update_stats(cdev, 0, timestamp);
1255 m_can_finish_tx(cdev, 1, frame_len);
1256 }
1257 } else {
1258 if (ir & (IR_TEFN | IR_TEFW)) {
1259 /* New TX FIFO Element arrived */
1260 ret = m_can_echo_tx_event(dev);
1261 if (ret != 0)
1262 return ret;
1263 }
1264 }
1265
1266 if (cdev->is_peripheral)
1267 can_rx_offload_threaded_irq_finish(&cdev->offload);
1268
1269 return IRQ_HANDLED;
1270 }
1271
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-07-27 9:33 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-26 19:59 [PATCH 0/7] can: m_can: Fix polling and other issues Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 1/7] can: m_can: Reset coalescing during suspend/resume Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 2/7] can: m_can: Remove coalesing disable in isr during suspend Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 3/7] can: m_can: Remove m_can_rx_peripheral indirection Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 4/7] can: m_can: Do not cancel timer from within timer Markus Schneider-Pargmann
2024-07-27 9:32 ` kernel test robot
2024-07-26 19:59 ` [PATCH 5/7] can: m_can: disable_all_interrupts, not clear active_interrupts Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 6/7] can: m_can: Reset cached active_interrupts on start Markus Schneider-Pargmann
2024-07-26 19:59 ` [PATCH 7/7] can: m_can: Limit coalescing to peripheral instances Markus Schneider-Pargmann
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).