diff options
Diffstat (limited to 'drivers/net/can/dev.c')
| -rw-r--r-- | drivers/net/can/dev.c | 155 | 
1 files changed, 76 insertions, 79 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 483d270664cc..ac86be52b461 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c @@ -1,6 +1,5 @@  // SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (C) 2005 Marc Kleine-Budde, Pengutronix +/* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix   * Copyright (C) 2006 Andrey Volkov, Varma Electronics   * Copyright (C) 2008-2009 Wolfgang Grandegger <[email protected]>   */ @@ -12,6 +11,7 @@  #include <linux/if_arp.h>  #include <linux/workqueue.h>  #include <linux/can.h> +#include <linux/can/can-ml.h>  #include <linux/can/dev.h>  #include <linux/can/skb.h>  #include <linux/can/netlink.h> @@ -62,8 +62,7 @@ EXPORT_SYMBOL_GPL(can_len2dlc);  #define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */  #define CAN_CALC_SYNC_SEG 1 -/* - * Bit-timing calculation derived from: +/* Bit-timing calculation derived from:   *   * Code based on LinCAN sources and H8S2638 project   * Copyright 2004-2006 Pavel Pisa - DCE FELK CVUT cz @@ -75,10 +74,11 @@ EXPORT_SYMBOL_GPL(can_len2dlc);   * registers of the CAN controller. You can find more information   * in the header file linux/can/netlink.h.   */ -static int can_update_sample_point(const struct can_bittiming_const *btc, -			  unsigned int sample_point_nominal, unsigned int tseg, -			  unsigned int *tseg1_ptr, unsigned int *tseg2_ptr, -			  unsigned int *sample_point_error_ptr) +static int +can_update_sample_point(const struct can_bittiming_const *btc, +			unsigned int sample_point_nominal, unsigned int tseg, +			unsigned int *tseg1_ptr, unsigned int *tseg2_ptr, +			unsigned int *sample_point_error_ptr)  {  	unsigned int sample_point_error, best_sample_point_error = UINT_MAX;  	unsigned int sample_point, best_sample_point = 0; @@ -86,7 +86,9 @@ static int can_update_sample_point(const struct can_bittiming_const *btc,  	int i;  	for (i = 0; i <= 1; i++) { -		tseg2 = tseg + CAN_CALC_SYNC_SEG - (sample_point_nominal * (tseg + CAN_CALC_SYNC_SEG)) / 1000 - i; +		tseg2 = tseg + CAN_CALC_SYNC_SEG - +			(sample_point_nominal * (tseg + CAN_CALC_SYNC_SEG)) / +			1000 - i;  		tseg2 = clamp(tseg2, btc->tseg2_min, btc->tseg2_max);  		tseg1 = tseg - tseg2;  		if (tseg1 > btc->tseg1_max) { @@ -94,10 +96,12 @@ static int can_update_sample_point(const struct can_bittiming_const *btc,  			tseg2 = tseg - tseg1;  		} -		sample_point = 1000 * (tseg + CAN_CALC_SYNC_SEG - tseg2) / (tseg + CAN_CALC_SYNC_SEG); +		sample_point = 1000 * (tseg + CAN_CALC_SYNC_SEG - tseg2) / +			(tseg + CAN_CALC_SYNC_SEG);  		sample_point_error = abs(sample_point_nominal - sample_point); -		if ((sample_point <= sample_point_nominal) && (sample_point_error < best_sample_point_error)) { +		if (sample_point <= sample_point_nominal && +		    sample_point_error < best_sample_point_error) {  			best_sample_point = sample_point;  			best_sample_point_error = sample_point_error;  			*tseg1_ptr = tseg1; @@ -148,7 +152,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,  		/* choose brp step which is possible in system */  		brp = (brp / btc->brp_inc) * btc->brp_inc; -		if ((brp < btc->brp_min) || (brp > btc->brp_max)) +		if (brp < btc->brp_min || brp > btc->brp_max)  			continue;  		bitrate = priv->clock.freq / (brp * tsegall); @@ -162,7 +166,8 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,  		if (bitrate_error < best_bitrate_error)  			best_sample_point_error = UINT_MAX; -		can_update_sample_point(btc, sample_point_nominal, tseg / 2, &tseg1, &tseg2, &sample_point_error); +		can_update_sample_point(btc, sample_point_nominal, tseg / 2, +					&tseg1, &tseg2, &sample_point_error);  		if (sample_point_error > best_sample_point_error)  			continue; @@ -191,8 +196,9 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,  	}  	/* real sample point */ -	bt->sample_point = can_update_sample_point(btc, sample_point_nominal, best_tseg, -					  &tseg1, &tseg2, NULL); +	bt->sample_point = can_update_sample_point(btc, sample_point_nominal, +						   best_tseg, &tseg1, &tseg2, +						   NULL);  	v64 = (u64)best_brp * 1000 * 1000 * 1000;  	do_div(v64, priv->clock.freq); @@ -216,7 +222,8 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,  	bt->brp = best_brp;  	/* real bitrate */ -	bt->bitrate = priv->clock.freq / (bt->brp * (CAN_CALC_SYNC_SEG + tseg1 + tseg2)); +	bt->bitrate = priv->clock.freq / +		(bt->brp * (CAN_CALC_SYNC_SEG + tseg1 + tseg2));  	return 0;  } @@ -229,8 +236,7 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,  }  #endif /* CONFIG_CAN_CALC_BITTIMING */ -/* - * Checks the validity of the specified bit-timing parameters prop_seg, +/* Checks the validity of the specified bit-timing parameters prop_seg,   * phase_seg1, phase_seg2 and sjw and tries to determine the bitrate   * prescaler value brp. You can find more information in the header   * file linux/can/netlink.h. @@ -270,9 +276,10 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt,  }  /* Checks the validity of predefined bitrate settings */ -static int can_validate_bitrate(struct net_device *dev, struct can_bittiming *bt, -				const u32 *bitrate_const, -				const unsigned int bitrate_const_cnt) +static int +can_validate_bitrate(struct net_device *dev, struct can_bittiming *bt, +		     const u32 *bitrate_const, +		     const unsigned int bitrate_const_cnt)  {  	struct can_priv *priv = netdev_priv(dev);  	unsigned int i; @@ -295,8 +302,7 @@ static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt,  {  	int err; -	/* -	 * Depending on the given can_bittiming parameter structure the CAN +	/* Depending on the given can_bittiming parameter structure the CAN  	 * timing parameters are calculated based on the provided bitrate OR  	 * alternatively the CAN timing parameters (tq, prop_seg, etc.) are  	 * provided directly which are then checked and fixed up. @@ -397,8 +403,7 @@ void can_change_state(struct net_device *dev, struct can_frame *cf,  }  EXPORT_SYMBOL_GPL(can_change_state); -/* - * Local echo of CAN messages +/* Local echo of CAN messages   *   * CAN network devices *should* support a local echo functionality   * (see Documentation/networking/can.rst). To test the handling of CAN @@ -423,8 +428,7 @@ static void can_flush_echo_skb(struct net_device *dev)  	}  } -/* - * Put the skb on the stack to be looped backed locally lateron +/* Put the skb on the stack to be looped backed locally lateron   *   * The function is typically called in the start_xmit function   * of the device driver. The driver must protect access to @@ -446,7 +450,6 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,  	}  	if (!priv->echo_skb[idx]) { -  		skb = can_create_echo_skb(skb);  		if (!skb)  			return; @@ -466,7 +469,8 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,  }  EXPORT_SYMBOL_GPL(can_put_echo_skb); -struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr) +struct sk_buff * +__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)  {  	struct can_priv *priv = netdev_priv(dev); @@ -493,8 +497,7 @@ struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8  	return NULL;  } -/* - * Get the skb from the stack and loop it back locally +/* Get the skb from the stack and loop it back locally   *   * The function is typically called when the TX done interrupt   * is handled in the device driver. The driver must protect @@ -515,11 +518,10 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)  }  EXPORT_SYMBOL_GPL(can_get_echo_skb); -/* -  * Remove the skb from the stack and free it. -  * -  * The function is typically called when TX failed. -  */ +/* Remove the skb from the stack and free it. + * + * The function is typically called when TX failed. + */  void can_free_echo_skb(struct net_device *dev, unsigned int idx)  {  	struct can_priv *priv = netdev_priv(dev); @@ -533,9 +535,7 @@ void can_free_echo_skb(struct net_device *dev, unsigned int idx)  }  EXPORT_SYMBOL_GPL(can_free_echo_skb); -/* - * CAN device restart for bus-off recovery - */ +/* CAN device restart for bus-off recovery */  static void can_restart(struct net_device *dev)  {  	struct can_priv *priv = netdev_priv(dev); @@ -546,15 +546,14 @@ static void can_restart(struct net_device *dev)  	BUG_ON(netif_carrier_ok(dev)); -	/* -	 * No synchronization needed because the device is bus-off and +	/* No synchronization needed because the device is bus-off and  	 * no messages can come in or go out.  	 */  	can_flush_echo_skb(dev);  	/* send restart message upstream */  	skb = alloc_can_err_skb(dev, &cf); -	if (skb == NULL) { +	if (!skb) {  		err = -ENOMEM;  		goto restart;  	} @@ -580,7 +579,8 @@ restart:  static void can_restart_work(struct work_struct *work)  {  	struct delayed_work *dwork = to_delayed_work(work); -	struct can_priv *priv = container_of(dwork, struct can_priv, restart_work); +	struct can_priv *priv = container_of(dwork, struct can_priv, +					     restart_work);  	can_restart(priv->dev);  } @@ -589,8 +589,7 @@ int can_restart_now(struct net_device *dev)  {  	struct can_priv *priv = netdev_priv(dev); -	/* -	 * A manual restart is only permitted if automatic restart is +	/* A manual restart is only permitted if automatic restart is  	 * disabled and the device is in the bus-off state  	 */  	if (priv->restart_ms) @@ -604,8 +603,7 @@ int can_restart_now(struct net_device *dev)  	return 0;  } -/* - * CAN bus-off +/* CAN bus-off   *   * This functions should be called when the device goes bus-off to   * tell the netif layer that no more packets can be sent or received. @@ -708,9 +706,7 @@ struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf)  }  EXPORT_SYMBOL_GPL(alloc_can_err_skb); -/* - * Allocate and setup space for the CAN network device - */ +/* Allocate and setup space for the CAN network device */  struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,  				    unsigned int txqs, unsigned int rxqs)  { @@ -718,11 +714,24 @@ struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,  	struct can_priv *priv;  	int size; +	/* We put the driver's priv, the CAN mid layer priv and the +	 * echo skb into the netdevice's priv. The memory layout for +	 * the netdev_priv is like this: +	 * +	 * +-------------------------+ +	 * | driver's priv           | +	 * +-------------------------+ +	 * | struct can_ml_priv      | +	 * +-------------------------+ +	 * | array of struct sk_buff | +	 * +-------------------------+ +	 */ + +	size = ALIGN(sizeof_priv, NETDEV_ALIGN) + sizeof(struct can_ml_priv); +  	if (echo_skb_max) -		size = ALIGN(sizeof_priv, sizeof(struct sk_buff *)) + +		size = ALIGN(size, sizeof(struct sk_buff *)) +  			echo_skb_max * sizeof(struct sk_buff *); -	else -		size = sizeof_priv;  	dev = alloc_netdev_mqs(size, "can%d", NET_NAME_UNKNOWN, can_setup,  			       txqs, rxqs); @@ -732,10 +741,12 @@ struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,  	priv = netdev_priv(dev);  	priv->dev = dev; +	dev->ml_priv = (void *)priv + ALIGN(sizeof_priv, NETDEV_ALIGN); +  	if (echo_skb_max) {  		priv->echo_skb_max = echo_skb_max;  		priv->echo_skb = (void *)priv + -			ALIGN(sizeof_priv, sizeof(struct sk_buff *)); +			(size - echo_skb_max * sizeof(struct sk_buff *));  	}  	priv->state = CAN_STATE_STOPPED; @@ -746,18 +757,14 @@ struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,  }  EXPORT_SYMBOL_GPL(alloc_candev_mqs); -/* - * Free space of the CAN network device - */ +/* Free space of the CAN network device */  void free_candev(struct net_device *dev)  {  	free_netdev(dev);  }  EXPORT_SYMBOL_GPL(free_candev); -/* - * changing MTU and control mode for CAN/CANFD devices - */ +/* changing MTU and control mode for CAN/CANFD devices */  int can_change_mtu(struct net_device *dev, int new_mtu)  {  	struct can_priv *priv = netdev_priv(dev); @@ -794,8 +801,7 @@ int can_change_mtu(struct net_device *dev, int new_mtu)  }  EXPORT_SYMBOL_GPL(can_change_mtu); -/* - * Common open function when the device gets opened. +/* Common open function when the device gets opened.   *   * This function should be called in the open function of the device   * driver. @@ -812,7 +818,7 @@ int open_candev(struct net_device *dev)  	/* For CAN FD the data bitrate has to be >= the arbitration bitrate */  	if ((priv->ctrlmode & CAN_CTRLMODE_FD) &&  	    (!priv->data_bittiming.bitrate || -	     (priv->data_bittiming.bitrate < priv->bittiming.bitrate))) { +	     priv->data_bittiming.bitrate < priv->bittiming.bitrate)) {  		netdev_err(dev, "incorrect/missing data bit-timing\n");  		return -EINVAL;  	} @@ -848,8 +854,7 @@ void of_can_transceiver(struct net_device *dev)  EXPORT_SYMBOL_GPL(of_can_transceiver);  #endif -/* - * Common close function for cleanup before the device gets closed. +/* Common close function for cleanup before the device gets closed.   *   * This function should be called in the close function of the device   * driver. @@ -863,9 +868,7 @@ void close_candev(struct net_device *dev)  }  EXPORT_SYMBOL_GPL(close_candev); -/* - * CAN netlink interface - */ +/* CAN netlink interface */  static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = {  	[IFLA_CAN_STATE]	= { .type = NLA_U32 },  	[IFLA_CAN_CTRLMODE]	= { .len = sizeof(struct can_ctrlmode) }, @@ -1209,7 +1212,6 @@ static int can_newlink(struct net *src_net, struct net_device *dev,  static void can_dellink(struct net_device *dev, struct list_head *head)  { -	return;  }  static struct rtnl_link_ops can_link_ops __read_mostly = { @@ -1227,9 +1229,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = {  	.fill_xstats	= can_fill_xstats,  }; -/* - * Register the CAN network device - */ +/* Register the CAN network device */  int register_candev(struct net_device *dev)  {  	struct can_priv *priv = netdev_priv(dev); @@ -1255,22 +1255,19 @@ int register_candev(struct net_device *dev)  }  EXPORT_SYMBOL_GPL(register_candev); -/* - * Unregister the CAN network device - */ +/* Unregister the CAN network device */  void unregister_candev(struct net_device *dev)  {  	unregister_netdev(dev);  }  EXPORT_SYMBOL_GPL(unregister_candev); -/* - * Test if a network device is a candev based device +/* Test if a network device is a candev based device   * and return the can_priv* if so.   */  struct can_priv *safe_candev_priv(struct net_device *dev)  { -	if ((dev->type != ARPHRD_CAN) || (dev->rtnl_link_ops != &can_link_ops)) +	if (dev->type != ARPHRD_CAN || dev->rtnl_link_ops != &can_link_ops)  		return NULL;  	return netdev_priv(dev); @@ -1285,7 +1282,7 @@ static __init int can_dev_init(void)  	err = rtnl_link_register(&can_link_ops);  	if (!err) -		printk(KERN_INFO MOD_DESC "\n"); +		pr_info(MOD_DESC "\n");  	return err;  }  |