diff options
Diffstat (limited to 'drivers/net/can/dev.c')
| -rw-r--r-- | drivers/net/can/dev.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index b70ded3760f2..81e39d7507d8 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c @@ -512,9 +512,13 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)  		 */  		struct sk_buff *skb = priv->echo_skb[idx];  		struct canfd_frame *cf = (struct canfd_frame *)skb->data; -		u8 len = cf->len; -		*len_ptr = len; +		/* get the real payload length for netdev statistics */ +		if (cf->can_id & CAN_RTR_FLAG) +			*len_ptr = 0; +		else +			*len_ptr = cf->len; +  		priv->echo_skb[idx] = NULL;  		return skb; @@ -538,7 +542,11 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)  	if (!skb)  		return 0; -	netif_rx(skb); +	skb_get(skb); +	if (netif_rx(skb) == NET_RX_SUCCESS) +		dev_consume_skb_any(skb); +	else +		dev_kfree_skb_any(skb);  	return len;  } @@ -584,7 +592,7 @@ static void can_restart(struct net_device *dev)  	cf->can_id |= CAN_ERR_RESTARTED; -	netif_rx(skb); +	netif_rx_ni(skb);  	stats->rx_packets++;  	stats->rx_bytes += cf->can_dlc;  |