Skip to content

Commit

Permalink
can: flexcan: use can_rx_offload_queue_sorted() for flexcan_irq_bus_*()
Browse files Browse the repository at this point in the history
Currently, in case of bus error, driver will generate error message and put
in the tail of the message queue. To avoid confusions, this change should
place the bus related messages in proper order.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
  • Loading branch information
olerem authored and marckleinebudde committed Nov 9, 2018
1 parent 4530ec3 commit d788905
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/net/can/flexcan.c
Original file line number Diff line number Diff line change
Expand Up @@ -561,9 +561,13 @@ static netdev_tx_t flexcan_start_xmit(struct sk_buff *skb, struct net_device *de
static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr)
{
struct flexcan_priv *priv = netdev_priv(dev);
struct flexcan_regs __iomem *regs = priv->regs;
struct sk_buff *skb;
struct can_frame *cf;
bool rx_errors = false, tx_errors = false;
u32 timestamp;

timestamp = priv->read(&regs->timer) << 16;

skb = alloc_can_err_skb(dev, &cf);
if (unlikely(!skb))
Expand Down Expand Up @@ -610,17 +614,21 @@ static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr)
if (tx_errors)
dev->stats.tx_errors++;

can_rx_offload_queue_tail(&priv->offload, skb);
can_rx_offload_queue_sorted(&priv->offload, skb, timestamp);
}

static void flexcan_irq_state(struct net_device *dev, u32 reg_esr)
{
struct flexcan_priv *priv = netdev_priv(dev);
struct flexcan_regs __iomem *regs = priv->regs;
struct sk_buff *skb;
struct can_frame *cf;
enum can_state new_state, rx_state, tx_state;
int flt;
struct can_berr_counter bec;
u32 timestamp;

timestamp = priv->read(&regs->timer) << 16;

flt = reg_esr & FLEXCAN_ESR_FLT_CONF_MASK;
if (likely(flt == FLEXCAN_ESR_FLT_CONF_ACTIVE)) {
Expand Down Expand Up @@ -650,7 +658,7 @@ static void flexcan_irq_state(struct net_device *dev, u32 reg_esr)
if (unlikely(new_state == CAN_STATE_BUS_OFF))
can_bus_off(dev);

can_rx_offload_queue_tail(&priv->offload, skb);
can_rx_offload_queue_sorted(&priv->offload, skb, timestamp);
}

static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload)
Expand Down

0 comments on commit d788905

Please sign in to comment.