Commit 08da7da4 authored by Oliver Hartkopp's avatar Oliver Hartkopp Committed by Marc Kleine-Budde

can: provide a separate bittiming_const parameter to bittiming functions

As the bittiming calculation functions are to be used with different
bittiming_const structures for CAN and CAN FD the direct reference to
priv->bittiming_const inside these functions has to be removed.

Also moved the check for existing bittiming const to one place.
Signed-off-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
Acked-by: default avatarStephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent d5298dff
...@@ -99,10 +99,10 @@ static int can_update_spt(const struct can_bittiming_const *btc, ...@@ -99,10 +99,10 @@ static int can_update_spt(const struct can_bittiming_const *btc,
return 1000 * (tseg + 1 - *tseg2) / (tseg + 1); return 1000 * (tseg + 1 - *tseg2) / (tseg + 1);
} }
static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,
const struct can_bittiming_const *btc)
{ {
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
const struct can_bittiming_const *btc = priv->bittiming_const;
long rate, best_rate = 0; long rate, best_rate = 0;
long best_error = 1000000000, error = 0; long best_error = 1000000000, error = 0;
int best_tseg = 0, best_brp = 0, brp = 0; int best_tseg = 0, best_brp = 0, brp = 0;
...@@ -110,9 +110,6 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) ...@@ -110,9 +110,6 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt)
int spt_error = 1000, spt = 0, sampl_pt; int spt_error = 1000, spt = 0, sampl_pt;
u64 v64; u64 v64;
if (!priv->bittiming_const)
return -ENOTSUPP;
/* Use CIA recommended sample points */ /* Use CIA recommended sample points */
if (bt->sample_point) { if (bt->sample_point) {
sampl_pt = bt->sample_point; sampl_pt = bt->sample_point;
...@@ -204,7 +201,8 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) ...@@ -204,7 +201,8 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt)
return 0; return 0;
} }
#else /* !CONFIG_CAN_CALC_BITTIMING */ #else /* !CONFIG_CAN_CALC_BITTIMING */
static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,
const struct can_bittiming_const *btc)
{ {
netdev_err(dev, "bit-timing calculation not available\n"); netdev_err(dev, "bit-timing calculation not available\n");
return -EINVAL; return -EINVAL;
...@@ -217,16 +215,13 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt) ...@@ -217,16 +215,13 @@ static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt)
* prescaler value brp. You can find more information in the header * prescaler value brp. You can find more information in the header
* file linux/can/netlink.h. * file linux/can/netlink.h.
*/ */
static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt) static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt,
const struct can_bittiming_const *btc)
{ {
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
const struct can_bittiming_const *btc = priv->bittiming_const;
int tseg1, alltseg; int tseg1, alltseg;
u64 brp64; u64 brp64;
if (!priv->bittiming_const)
return -ENOTSUPP;
tseg1 = bt->prop_seg + bt->phase_seg1; tseg1 = bt->prop_seg + bt->phase_seg1;
if (!bt->sjw) if (!bt->sjw)
bt->sjw = 1; bt->sjw = 1;
...@@ -254,14 +249,14 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt) ...@@ -254,14 +249,14 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt)
return 0; return 0;
} }
static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt) static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt,
const struct can_bittiming_const *btc)
{ {
struct can_priv *priv = netdev_priv(dev);
int err; int err;
/* Check if the CAN device has bit-timing parameters */ /* Check if the CAN device has bit-timing parameters */
if (!priv->bittiming_const) if (!btc)
return 0; return -ENOTSUPP;
/* /*
* Depending on the given can_bittiming parameter structure the CAN * Depending on the given can_bittiming parameter structure the CAN
...@@ -270,9 +265,9 @@ static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt) ...@@ -270,9 +265,9 @@ static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt)
* provided directly which are then checked and fixed up. * provided directly which are then checked and fixed up.
*/ */
if (!bt->tq && bt->bitrate) if (!bt->tq && bt->bitrate)
err = can_calc_bittiming(dev, bt); err = can_calc_bittiming(dev, bt, btc);
else if (bt->tq && !bt->bitrate) else if (bt->tq && !bt->bitrate)
err = can_fixup_bittiming(dev, bt); err = can_fixup_bittiming(dev, bt, btc);
else else
err = -EINVAL; err = -EINVAL;
...@@ -670,7 +665,7 @@ static int can_changelink(struct net_device *dev, ...@@ -670,7 +665,7 @@ static int can_changelink(struct net_device *dev,
if (dev->flags & IFF_UP) if (dev->flags & IFF_UP)
return -EBUSY; return -EBUSY;
memcpy(&bt, nla_data(data[IFLA_CAN_BITTIMING]), sizeof(bt)); memcpy(&bt, nla_data(data[IFLA_CAN_BITTIMING]), sizeof(bt));
err = can_get_bittiming(dev, &bt); err = can_get_bittiming(dev, &bt, priv->bittiming_const);
if (err) if (err)
return err; return err;
memcpy(&priv->bittiming, &bt, sizeof(bt)); memcpy(&priv->bittiming, &bt, sizeof(bt));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment