Re: [RFC PATCH 3/5] can: dev: add CAN XL support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 11.07.22 21:46, Marc Kleine-Budde wrote:
On 11.07.2022 20:34:24, Oliver Hartkopp wrote:
Extend the CAN device driver infrastructure to handle CAN XL frames.
This especially addresses the increased data length which is extended
to uint16 for CAN XL.

Signed-off-by: Oliver Hartkopp <socketcan@xxxxxxxxxxxx>
---
  drivers/net/can/dev/rx-offload.c |  2 +-
  drivers/net/can/dev/skb.c        | 53 +++++++++++++++++++++++++++-----
  include/linux/can/skb.h          |  3 +-
  3 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/drivers/net/can/dev/rx-offload.c b/drivers/net/can/dev/rx-offload.c
index a32a01c172d4..8505e547e922 100644
--- a/drivers/net/can/dev/rx-offload.c
+++ b/drivers/net/can/dev/rx-offload.c
@@ -245,11 +245,11 @@ unsigned int can_rx_offload_get_echo_skb(struct can_rx_offload *offload,
  					 unsigned int *frame_len_ptr)
  {
  	struct net_device *dev = offload->dev;
  	struct net_device_stats *stats = &dev->stats;
  	struct sk_buff *skb;
-	u8 len;
+	unsigned int len;
  	int err;
skb = __can_get_echo_skb(dev, idx, &len, frame_len_ptr);
  	if (!skb)
  		return 0;
diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c
index 8bb62dd864c8..a849f503dcff 100644
--- a/drivers/net/can/dev/skb.c
+++ b/drivers/net/can/dev/skb.c
@@ -53,11 +53,12 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
  	BUG_ON(idx >= priv->echo_skb_max);
/* check flag whether this packet has to be looped back */
  	if (!(dev->flags & IFF_ECHO) ||
  	    (skb->protocol != htons(ETH_P_CAN) &&
-	     skb->protocol != htons(ETH_P_CANFD))) {
+	     skb->protocol != htons(ETH_P_CANFD) &&
+	     skb->protocol != htons(ETH_P_CANXL))) {
  		kfree_skb(skb);
  		return 0;
  	}
if (!priv->echo_skb[idx]) {
@@ -86,12 +87,12 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
  	return 0;
  }
  EXPORT_SYMBOL_GPL(can_put_echo_skb);
struct sk_buff *
-__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr,
-		   unsigned int *frame_len_ptr)
+__can_get_echo_skb(struct net_device *dev, unsigned int idx,
+		   unsigned int *len_ptr, unsigned int *frame_len_ptr)
  {
  	struct can_priv *priv = netdev_priv(dev);
if (idx >= priv->echo_skb_max) {
  		netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n",
@@ -104,16 +105,17 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr,
  		 * length is supported on both CAN and CANFD frames.
  		 */
  		struct sk_buff *skb = priv->echo_skb[idx];
  		struct can_skb_priv *can_skb_priv = can_skb_prv(skb);
  		struct canfd_frame *cf = (struct canfd_frame *)skb->data;
+		unsigned int len = can_get_data_len(skb);
/* get the real payload length for netdev statistics */
  		if (cf->can_id & CAN_RTR_FLAG)
  			*len_ptr = 0;
  		else
-			*len_ptr = cf->len;
+			*len_ptr = len;
if (frame_len_ptr)
  			*frame_len_ptr = can_skb_priv->frame_len;
priv->echo_skb[idx] = NULL;
@@ -139,11 +141,11 @@ __can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr,
   */
  unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx,
  			      unsigned int *frame_len_ptr)
  {
  	struct sk_buff *skb;
-	u8 len;
+	unsigned int len;
skb = __can_get_echo_skb(dev, idx, &len, frame_len_ptr);
  	if (!skb)
  		return 0;
@@ -244,10 +246,41 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, return skb;
  }
  EXPORT_SYMBOL_GPL(alloc_canfd_skb);
+struct sk_buff *alloc_canxl_skb(struct net_device *dev,
+				struct canxl_frame **cfx)

The prototype has to be added to a header file

Yes! Seen that when looking through the patches on the mailing list once more m(

:-D

Will add it to skb.h

Best,
Oliver



[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux