Signed-off-by: Kurt Van Dijck <dev.kurt@xxxxxxxxxxxxxxxxxxxxxx> --- drivers/net/can/c_can/c_can.c | 12 ++++++++---- drivers/net/can/rx-offload.c | 30 ++++++++---------------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index 16d266b..8f68d51 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c @@ -384,7 +384,7 @@ static int c_can_handle_lost_msg_obj(struct net_device *dev, frame->can_id |= CAN_ERR_CRTL; frame->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; - can_rx_offload_receive_skb(&priv->offload, skb); + can_rx_offload_irq_receive_skb(&priv->offload, skb); return 1; } @@ -436,7 +436,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl) stats->rx_packets++; stats->rx_bytes += frame->can_dlc; - can_rx_offload_receive_skb(&priv->offload, skb); + can_rx_offload_irq_receive_skb(&priv->offload, skb); return 0; } @@ -948,7 +948,7 @@ static int c_can_handle_state_change(struct net_device *dev, stats->rx_packets++; stats->rx_bytes += cf->can_dlc; - can_rx_offload_receive_skb(&priv->offload, skb); + can_rx_offload_irq_receive_skb(&priv->offload, skb); return 1; } @@ -1018,7 +1018,7 @@ static int c_can_handle_bus_err(struct net_device *dev, stats->rx_packets++; stats->rx_bytes += cf->can_dlc; - can_rx_offload_receive_skb(&priv->offload, skb); + can_rx_offload_irq_receive_skb(&priv->offload, skb); return 1; } @@ -1034,6 +1034,8 @@ static irqreturn_t c_can_isr(int irq, void *dev_id) if (!reg_int) return IRQ_NONE; + can_rx_offload_irq_start(&priv->offload); + /* Only read the status register if a status interrupt was pending */ if (reg_int & INT_STS_PENDING) { priv->last_status = curr = priv->read_reg(priv, C_CAN_STS_REG); @@ -1080,6 +1082,8 @@ static irqreturn_t c_can_isr(int irq, void *dev_id) c_can_do_tx(dev); end: + can_rx_offload_irq_end(&priv->offload); + /* disable all IRQs if we are in bus off state */ if (priv->can.state == CAN_STATE_BUS_OFF) c_can_irq_control(priv, false); diff --git a/drivers/net/can/rx-offload.c b/drivers/net/can/rx-offload.c index 5613e7e..334e59c 100644 --- a/drivers/net/can/rx-offload.c +++ b/drivers/net/can/rx-offload.c @@ -153,10 +153,9 @@ static int can_rx_offload_compare(struct sk_buff *a, struct sk_buff *b) int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pending) { - struct sk_buff_head skb_queue; unsigned int i; - __skb_queue_head_init(&skb_queue); + can_rx_offload_irq_start(offload); for (i = offload->mb_first; can_rx_offload_le(offload, i, offload->mb_last); @@ -170,26 +169,13 @@ int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, if (!skb) break; - __skb_queue_add_sort(&skb_queue, skb, can_rx_offload_compare); + __skb_queue_add_sort(&offload->irq_skb_queue, skb, + can_rx_offload_compare); } - if (!skb_queue_empty(&skb_queue)) { - unsigned long flags; - u32 queue_len; + can_rx_offload_irq_end(offload); - spin_lock_irqsave(&offload->skb_queue.lock, flags); - skb_queue_splice_tail(&skb_queue, &offload->skb_queue); - spin_unlock_irqrestore(&offload->skb_queue.lock, flags); - - queue_len = skb_queue_len(&offload->skb_queue); - if (queue_len > offload->skb_queue_len_max / 8) - netdev_dbg(offload->dev, "%s: queue_len=%d\n", - __func__, queue_len); - - can_rx_offload_schedule(offload); - } - - return skb_queue_len(&skb_queue); + return skb_queue_len(&offload->irq_skb_queue); } EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_timestamp); @@ -198,13 +184,13 @@ int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload) struct sk_buff *skb; int received = 0; + can_rx_offload_irq_start(offload); while ((skb = can_rx_offload_offload_one(offload, 0))) { - skb_queue_tail(&offload->skb_queue, skb); + __skb_queue_tail(&offload->irq_skb_queue, skb); received++; } - if (received) - can_rx_offload_schedule(offload); + can_rx_offload_irq_end(offload); return received; } -- 1.8.5.rc3