Commit d03e9d07 authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-next-for-3.15-20140307' of git://gitorious.org/linux-can/linux-can-next

Marc Kleine-Budde says:

====================
pull-request: can-next 2014-02-12

this is a pull request of twelve patches for net-next/master.

Alexander Shiyan contributes two patches for the mcp251x, one making
the driver more quiet and the other one improves the compile time
coverage by removing the #ifdef CONFIG_PM_SLEEP. Then two patches for
the flexcan driver by me, one removing the #ifdef CONFIG_PM_SLEEP, too,
the other one making use of platform_get_device_id(). Another patch by
me which converts the janz-ican3 driver to use netdev_<level>(). The
remaining 7 patches are by Oliver Hartkopp, they add CAN FD support to
the netlink configuration interface.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a5d5ff57 dd22586d
...@@ -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,26 +249,29 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt) ...@@ -254,26 +249,29 @@ 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 -ENOTSUPP;
/* Non-expert mode? Check if the bitrate has been pre-defined */ /*
if (!bt->tq) * Depending on the given can_bittiming parameter structure the CAN
/* Determine bit-timing parameters */ * timing parameters are calculated based on the provided bitrate OR
err = can_calc_bittiming(dev, bt); * alternatively the CAN timing parameters (tq, prop_seg, etc.) are
else * provided directly which are then checked and fixed up.
/* Check bit-timing params and calculate proper brp */ */
err = can_fixup_bittiming(dev, bt); if (!bt->tq && bt->bitrate)
if (err) err = can_calc_bittiming(dev, bt, btc);
return err; else if (bt->tq && !bt->bitrate)
} err = can_fixup_bittiming(dev, bt, btc);
else
err = -EINVAL;
return 0; return err;
} }
/* /*
...@@ -317,7 +315,9 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, ...@@ -317,7 +315,9 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
BUG_ON(idx >= priv->echo_skb_max); BUG_ON(idx >= priv->echo_skb_max);
/* check flag whether this packet has to be looped back */ /* check flag whether this packet has to be looped back */
if (!(dev->flags & IFF_ECHO) || skb->pkt_type != PACKET_LOOPBACK) { if (!(dev->flags & IFF_ECHO) || skb->pkt_type != PACKET_LOOPBACK ||
(skb->protocol != htons(ETH_P_CAN) &&
skb->protocol != htons(ETH_P_CANFD))) {
kfree_skb(skb); kfree_skb(skb);
return; return;
} }
...@@ -329,7 +329,6 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, ...@@ -329,7 +329,6 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
return; return;
/* make settings for echo to reduce code in irq context */ /* make settings for echo to reduce code in irq context */
skb->protocol = htons(ETH_P_CAN);
skb->pkt_type = PACKET_BROADCAST; skb->pkt_type = PACKET_BROADCAST;
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
skb->dev = dev; skb->dev = dev;
...@@ -595,6 +594,39 @@ void free_candev(struct net_device *dev) ...@@ -595,6 +594,39 @@ void free_candev(struct net_device *dev)
} }
EXPORT_SYMBOL_GPL(free_candev); EXPORT_SYMBOL_GPL(free_candev);
/*
* 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);
/* Do not allow changing the MTU while running */
if (dev->flags & IFF_UP)
return -EBUSY;
/* allow change of MTU according to the CANFD ability of the device */
switch (new_mtu) {
case CAN_MTU:
priv->ctrlmode &= ~CAN_CTRLMODE_FD;
break;
case CANFD_MTU:
if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD))
return -EINVAL;
priv->ctrlmode |= CAN_CTRLMODE_FD;
break;
default:
return -EINVAL;
}
dev->mtu = new_mtu;
return 0;
}
EXPORT_SYMBOL_GPL(can_change_mtu);
/* /*
* Common open function when the device gets opened. * Common open function when the device gets opened.
* *
...@@ -605,11 +637,19 @@ int open_candev(struct net_device *dev) ...@@ -605,11 +637,19 @@ int open_candev(struct net_device *dev)
{ {
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
if (!priv->bittiming.tq && !priv->bittiming.bitrate) { if (!priv->bittiming.bitrate) {
netdev_err(dev, "bit-timing not yet defined\n"); netdev_err(dev, "bit-timing not yet defined\n");
return -EINVAL; return -EINVAL;
} }
/* 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))) {
netdev_err(dev, "incorrect/missing data bit-timing\n");
return -EINVAL;
}
/* Switch carrier on if device was stopped while in bus-off state */ /* Switch carrier on if device was stopped while in bus-off state */
if (!netif_carrier_ok(dev)) if (!netif_carrier_ok(dev))
netif_carrier_on(dev); netif_carrier_on(dev);
...@@ -648,6 +688,10 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = { ...@@ -648,6 +688,10 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = {
= { .len = sizeof(struct can_bittiming_const) }, = { .len = sizeof(struct can_bittiming_const) },
[IFLA_CAN_CLOCK] = { .len = sizeof(struct can_clock) }, [IFLA_CAN_CLOCK] = { .len = sizeof(struct can_clock) },
[IFLA_CAN_BERR_COUNTER] = { .len = sizeof(struct can_berr_counter) }, [IFLA_CAN_BERR_COUNTER] = { .len = sizeof(struct can_berr_counter) },
[IFLA_CAN_DATA_BITTIMING]
= { .len = sizeof(struct can_bittiming) },
[IFLA_CAN_DATA_BITTIMING_CONST]
= { .len = sizeof(struct can_bittiming_const) },
}; };
static int can_changelink(struct net_device *dev, static int can_changelink(struct net_device *dev,
...@@ -666,9 +710,7 @@ static int can_changelink(struct net_device *dev, ...@@ -666,9 +710,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));
if ((!bt.bitrate && !bt.tq) || (bt.bitrate && bt.tq)) err = can_get_bittiming(dev, &bt, priv->bittiming_const);
return -EINVAL;
err = can_get_bittiming(dev, &bt);
if (err) if (err)
return err; return err;
memcpy(&priv->bittiming, &bt, sizeof(bt)); memcpy(&priv->bittiming, &bt, sizeof(bt));
...@@ -692,6 +734,12 @@ static int can_changelink(struct net_device *dev, ...@@ -692,6 +734,12 @@ static int can_changelink(struct net_device *dev,
return -EOPNOTSUPP; return -EOPNOTSUPP;
priv->ctrlmode &= ~cm->mask; priv->ctrlmode &= ~cm->mask;
priv->ctrlmode |= cm->flags; priv->ctrlmode |= cm->flags;
/* CAN_CTRLMODE_FD can only be set when driver supports FD */
if (priv->ctrlmode & CAN_CTRLMODE_FD)
dev->mtu = CANFD_MTU;
else
dev->mtu = CAN_MTU;
} }
if (data[IFLA_CAN_RESTART_MS]) { if (data[IFLA_CAN_RESTART_MS]) {
...@@ -710,6 +758,27 @@ static int can_changelink(struct net_device *dev, ...@@ -710,6 +758,27 @@ static int can_changelink(struct net_device *dev,
return err; return err;
} }
if (data[IFLA_CAN_DATA_BITTIMING]) {
struct can_bittiming dbt;
/* Do not allow changing bittiming while running */
if (dev->flags & IFF_UP)
return -EBUSY;
memcpy(&dbt, nla_data(data[IFLA_CAN_DATA_BITTIMING]),
sizeof(dbt));
err = can_get_bittiming(dev, &dbt, priv->data_bittiming_const);
if (err)
return err;
memcpy(&priv->data_bittiming, &dbt, sizeof(dbt));
if (priv->do_set_data_bittiming) {
/* Finally, set the bit-timing registers */
err = priv->do_set_data_bittiming(dev);
if (err)
return err;
}
}
return 0; return 0;
} }
...@@ -718,7 +787,8 @@ static size_t can_get_size(const struct net_device *dev) ...@@ -718,7 +787,8 @@ static size_t can_get_size(const struct net_device *dev)
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
size_t size = 0; size_t size = 0;
size += nla_total_size(sizeof(struct can_bittiming)); /* IFLA_CAN_BITTIMING */ if (priv->bittiming.bitrate) /* IFLA_CAN_BITTIMING */
size += nla_total_size(sizeof(struct can_bittiming));
if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */
size += nla_total_size(sizeof(struct can_bittiming_const)); size += nla_total_size(sizeof(struct can_bittiming_const));
size += nla_total_size(sizeof(struct can_clock)); /* IFLA_CAN_CLOCK */ size += nla_total_size(sizeof(struct can_clock)); /* IFLA_CAN_CLOCK */
...@@ -727,6 +797,10 @@ static size_t can_get_size(const struct net_device *dev) ...@@ -727,6 +797,10 @@ static size_t can_get_size(const struct net_device *dev)
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */
if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */ if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */
size += nla_total_size(sizeof(struct can_berr_counter)); size += nla_total_size(sizeof(struct can_berr_counter));
if (priv->data_bittiming.bitrate) /* IFLA_CAN_DATA_BITTIMING */
size += nla_total_size(sizeof(struct can_bittiming));
if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
size += nla_total_size(sizeof(struct can_bittiming_const));
return size; return size;
} }
...@@ -740,19 +814,34 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) ...@@ -740,19 +814,34 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
if (priv->do_get_state) if (priv->do_get_state)
priv->do_get_state(dev, &state); priv->do_get_state(dev, &state);
if (nla_put(skb, IFLA_CAN_BITTIMING,
sizeof(priv->bittiming), &priv->bittiming) || if ((priv->bittiming.bitrate &&
nla_put(skb, IFLA_CAN_BITTIMING,
sizeof(priv->bittiming), &priv->bittiming)) ||
(priv->bittiming_const && (priv->bittiming_const &&
nla_put(skb, IFLA_CAN_BITTIMING_CONST, nla_put(skb, IFLA_CAN_BITTIMING_CONST,
sizeof(*priv->bittiming_const), priv->bittiming_const)) || sizeof(*priv->bittiming_const), priv->bittiming_const)) ||
nla_put(skb, IFLA_CAN_CLOCK, sizeof(cm), &priv->clock) || nla_put(skb, IFLA_CAN_CLOCK, sizeof(cm), &priv->clock) ||
nla_put_u32(skb, IFLA_CAN_STATE, state) || nla_put_u32(skb, IFLA_CAN_STATE, state) ||
nla_put(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm) || nla_put(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm) ||
nla_put_u32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms) || nla_put_u32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms) ||
(priv->do_get_berr_counter && (priv->do_get_berr_counter &&
!priv->do_get_berr_counter(dev, &bec) && !priv->do_get_berr_counter(dev, &bec) &&
nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec))) nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) ||
(priv->data_bittiming.bitrate &&
nla_put(skb, IFLA_CAN_DATA_BITTIMING,
sizeof(priv->data_bittiming), &priv->data_bittiming)) ||
(priv->data_bittiming_const &&
nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
sizeof(*priv->data_bittiming_const),
priv->data_bittiming_const)))
return -EMSGSIZE; return -EMSGSIZE;
return 0; return 0;
} }
......
...@@ -1132,9 +1132,9 @@ static int flexcan_probe(struct platform_device *pdev) ...@@ -1132,9 +1132,9 @@ static int flexcan_probe(struct platform_device *pdev)
of_id = of_match_device(flexcan_of_match, &pdev->dev); of_id = of_match_device(flexcan_of_match, &pdev->dev);
if (of_id) { if (of_id) {
devtype_data = of_id->data; devtype_data = of_id->data;
} else if (pdev->id_entry->driver_data) { } else if (platform_get_device_id(pdev)->driver_data) {
devtype_data = (struct flexcan_devtype_data *) devtype_data = (struct flexcan_devtype_data *)
pdev->id_entry->driver_data; platform_get_device_id(pdev)->driver_data;
} else { } else {
return -ENODEV; return -ENODEV;
} }
...@@ -1201,8 +1201,7 @@ static int flexcan_remove(struct platform_device *pdev) ...@@ -1201,8 +1201,7 @@ static int flexcan_remove(struct platform_device *pdev)
return 0; return 0;
} }
#ifdef CONFIG_PM_SLEEP static int __maybe_unused flexcan_suspend(struct device *device)
static int flexcan_suspend(struct device *device)
{ {
struct net_device *dev = dev_get_drvdata(device); struct net_device *dev = dev_get_drvdata(device);
struct flexcan_priv *priv = netdev_priv(dev); struct flexcan_priv *priv = netdev_priv(dev);
...@@ -1221,7 +1220,7 @@ static int flexcan_suspend(struct device *device) ...@@ -1221,7 +1220,7 @@ static int flexcan_suspend(struct device *device)
return 0; return 0;
} }
static int flexcan_resume(struct device *device) static int __maybe_unused flexcan_resume(struct device *device)
{ {
struct net_device *dev = dev_get_drvdata(device); struct net_device *dev = dev_get_drvdata(device);
struct flexcan_priv *priv = netdev_priv(dev); struct flexcan_priv *priv = netdev_priv(dev);
...@@ -1233,7 +1232,6 @@ static int flexcan_resume(struct device *device) ...@@ -1233,7 +1232,6 @@ static int flexcan_resume(struct device *device)
} }
return flexcan_chip_enable(priv); return flexcan_chip_enable(priv);
} }
#endif /* CONFIG_PM_SLEEP */
static SIMPLE_DEV_PM_OPS(flexcan_pm_ops, flexcan_suspend, flexcan_resume); static SIMPLE_DEV_PM_OPS(flexcan_pm_ops, flexcan_suspend, flexcan_resume);
......
...@@ -198,9 +198,6 @@ struct ican3_dev { ...@@ -198,9 +198,6 @@ struct ican3_dev {
struct net_device *ndev; struct net_device *ndev;
struct napi_struct napi; struct napi_struct napi;
/* Device for printing */
struct device *dev;
/* module number */ /* module number */
unsigned int num; unsigned int num;
...@@ -295,7 +292,7 @@ static int ican3_old_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -295,7 +292,7 @@ static int ican3_old_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg)
xord = locl ^ peer; xord = locl ^ peer;
if ((xord & MSYNC_RB_MASK) == 0x00) { if ((xord & MSYNC_RB_MASK) == 0x00) {
dev_dbg(mod->dev, "no mbox for reading\n"); netdev_dbg(mod->ndev, "no mbox for reading\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -340,7 +337,7 @@ static int ican3_old_send_msg(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -340,7 +337,7 @@ static int ican3_old_send_msg(struct ican3_dev *mod, struct ican3_msg *msg)
xord = locl ^ peer; xord = locl ^ peer;
if ((xord & MSYNC_WB_MASK) == MSYNC_WB_MASK) { if ((xord & MSYNC_WB_MASK) == MSYNC_WB_MASK) {
dev_err(mod->dev, "no mbox for writing\n"); netdev_err(mod->ndev, "no mbox for writing\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -542,7 +539,7 @@ static int ican3_new_send_msg(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -542,7 +539,7 @@ static int ican3_new_send_msg(struct ican3_dev *mod, struct ican3_msg *msg)
memcpy_fromio(&desc, desc_addr, sizeof(desc)); memcpy_fromio(&desc, desc_addr, sizeof(desc));
if (!(desc.control & DESC_VALID)) { if (!(desc.control & DESC_VALID)) {
dev_dbg(mod->dev, "%s: no free buffers\n", __func__); netdev_dbg(mod->ndev, "%s: no free buffers\n", __func__);
return -ENOMEM; return -ENOMEM;
} }
...@@ -573,7 +570,7 @@ static int ican3_new_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -573,7 +570,7 @@ static int ican3_new_recv_msg(struct ican3_dev *mod, struct ican3_msg *msg)
memcpy_fromio(&desc, desc_addr, sizeof(desc)); memcpy_fromio(&desc, desc_addr, sizeof(desc));
if (!(desc.control & DESC_VALID)) { if (!(desc.control & DESC_VALID)) {
dev_dbg(mod->dev, "%s: no buffers to recv\n", __func__); netdev_dbg(mod->ndev, "%s: no buffers to recv\n", __func__);
return -ENOMEM; return -ENOMEM;
} }
...@@ -883,7 +880,7 @@ static void can_frame_to_ican3(struct ican3_dev *mod, ...@@ -883,7 +880,7 @@ static void can_frame_to_ican3(struct ican3_dev *mod,
*/ */
static void ican3_handle_idvers(struct ican3_dev *mod, struct ican3_msg *msg) static void ican3_handle_idvers(struct ican3_dev *mod, struct ican3_msg *msg)
{ {
dev_dbg(mod->dev, "IDVERS response: %s\n", msg->data); netdev_dbg(mod->ndev, "IDVERS response: %s\n", msg->data);
} }
static void ican3_handle_msglost(struct ican3_dev *mod, struct ican3_msg *msg) static void ican3_handle_msglost(struct ican3_dev *mod, struct ican3_msg *msg)
...@@ -899,7 +896,7 @@ static void ican3_handle_msglost(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -899,7 +896,7 @@ static void ican3_handle_msglost(struct ican3_dev *mod, struct ican3_msg *msg)
* error frame for userspace * error frame for userspace
*/ */
if (msg->spec == MSG_MSGLOST) { if (msg->spec == MSG_MSGLOST) {
dev_err(mod->dev, "lost %d control messages\n", msg->data[0]); netdev_err(mod->ndev, "lost %d control messages\n", msg->data[0]);
return; return;
} }
...@@ -939,13 +936,13 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -939,13 +936,13 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg)
/* we can only handle the SJA1000 part */ /* we can only handle the SJA1000 part */
if (msg->data[1] != CEVTIND_CHIP_SJA1000) { if (msg->data[1] != CEVTIND_CHIP_SJA1000) {
dev_err(mod->dev, "unable to handle errors on non-SJA1000\n"); netdev_err(mod->ndev, "unable to handle errors on non-SJA1000\n");
return -ENODEV; return -ENODEV;
} }
/* check the message length for sanity */ /* check the message length for sanity */
if (le16_to_cpu(msg->len) < 6) { if (le16_to_cpu(msg->len) < 6) {
dev_err(mod->dev, "error message too short\n"); netdev_err(mod->ndev, "error message too short\n");
return -EINVAL; return -EINVAL;
} }
...@@ -967,7 +964,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -967,7 +964,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg)
*/ */
if (isrc == CEVTIND_BEI) { if (isrc == CEVTIND_BEI) {
int ret; int ret;
dev_dbg(mod->dev, "bus error interrupt\n"); netdev_dbg(mod->ndev, "bus error interrupt\n");
/* TX error */ /* TX error */
if (!(ecc & ECC_DIR)) { if (!(ecc & ECC_DIR)) {
...@@ -983,7 +980,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -983,7 +980,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg)
*/ */
ret = ican3_set_buserror(mod, 1); ret = ican3_set_buserror(mod, 1);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to re-enable bus-error\n"); netdev_err(mod->ndev, "unable to re-enable bus-error\n");
return ret; return ret;
} }
...@@ -998,7 +995,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -998,7 +995,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg)
/* data overrun interrupt */ /* data overrun interrupt */
if (isrc == CEVTIND_DOI || isrc == CEVTIND_LOST) { if (isrc == CEVTIND_DOI || isrc == CEVTIND_LOST) {
dev_dbg(mod->dev, "data overrun interrupt\n"); netdev_dbg(mod->ndev, "data overrun interrupt\n");
cf->can_id |= CAN_ERR_CRTL; cf->can_id |= CAN_ERR_CRTL;
cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
stats->rx_over_errors++; stats->rx_over_errors++;
...@@ -1007,7 +1004,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -1007,7 +1004,7 @@ static int ican3_handle_cevtind(struct ican3_dev *mod, struct ican3_msg *msg)
/* error warning + passive interrupt */ /* error warning + passive interrupt */
if (isrc == CEVTIND_EI) { if (isrc == CEVTIND_EI) {
dev_dbg(mod->dev, "error warning + passive interrupt\n"); netdev_dbg(mod->ndev, "error warning + passive interrupt\n");
if (status & SR_BS) { if (status & SR_BS) {
state = CAN_STATE_BUS_OFF; state = CAN_STATE_BUS_OFF;
cf->can_id |= CAN_ERR_BUSOFF; cf->can_id |= CAN_ERR_BUSOFF;
...@@ -1088,7 +1085,7 @@ static void ican3_handle_inquiry(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -1088,7 +1085,7 @@ static void ican3_handle_inquiry(struct ican3_dev *mod, struct ican3_msg *msg)
complete(&mod->termination_comp); complete(&mod->termination_comp);
break; break;
default: default:
dev_err(mod->dev, "received an unknown inquiry response\n"); netdev_err(mod->ndev, "received an unknown inquiry response\n");
break; break;
} }
} }
...@@ -1096,7 +1093,7 @@ static void ican3_handle_inquiry(struct ican3_dev *mod, struct ican3_msg *msg) ...@@ -1096,7 +1093,7 @@ static void ican3_handle_inquiry(struct ican3_dev *mod, struct ican3_msg *msg)
static void ican3_handle_unknown_message(struct ican3_dev *mod, static void ican3_handle_unknown_message(struct ican3_dev *mod,
struct ican3_msg *msg) struct ican3_msg *msg)
{ {
dev_warn(mod->dev, "received unknown message: spec 0x%.2x length %d\n", netdev_warn(mod->ndev, "received unknown message: spec 0x%.2x length %d\n",
msg->spec, le16_to_cpu(msg->len)); msg->spec, le16_to_cpu(msg->len));
} }
...@@ -1105,7 +1102,7 @@ static void ican3_handle_unknown_message(struct ican3_dev *mod, ...@@ -1105,7 +1102,7 @@ static void ican3_handle_unknown_message(struct ican3_dev *mod,
*/ */
static void ican3_handle_message(struct ican3_dev *mod, struct ican3_msg *msg) static void ican3_handle_message(struct ican3_dev *mod, struct ican3_msg *msg)
{ {
dev_dbg(mod->dev, "%s: modno %d spec 0x%.2x len %d bytes\n", __func__, netdev_dbg(mod->ndev, "%s: modno %d spec 0x%.2x len %d bytes\n", __func__,
mod->num, msg->spec, le16_to_cpu(msg->len)); mod->num, msg->spec, le16_to_cpu(msg->len));
switch (msg->spec) { switch (msg->spec) {
...@@ -1406,7 +1403,7 @@ static int ican3_reset_module(struct ican3_dev *mod) ...@@ -1406,7 +1403,7 @@ static int ican3_reset_module(struct ican3_dev *mod)
msleep(10); msleep(10);
} while (time_before(jiffies, start + HZ / 4)); } while (time_before(jiffies, start + HZ / 4));
dev_err(mod->dev, "failed to reset CAN module\n"); netdev_err(mod->ndev, "failed to reset CAN module\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -1425,7 +1422,7 @@ static int ican3_startup_module(struct ican3_dev *mod) ...@@ -1425,7 +1422,7 @@ static int ican3_startup_module(struct ican3_dev *mod)
ret = ican3_reset_module(mod); ret = ican3_reset_module(mod);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to reset module\n"); netdev_err(mod->ndev, "unable to reset module\n");
return ret; return ret;
} }
...@@ -1434,41 +1431,41 @@ static int ican3_startup_module(struct ican3_dev *mod) ...@@ -1434,41 +1431,41 @@ static int ican3_startup_module(struct ican3_dev *mod)
ret = ican3_msg_connect(mod); ret = ican3_msg_connect(mod);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to connect to module\n"); netdev_err(mod->ndev, "unable to connect to module\n");
return ret; return ret;
} }
ican3_init_new_host_interface(mod); ican3_init_new_host_interface(mod);
ret = ican3_msg_newhostif(mod); ret = ican3_msg_newhostif(mod);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to switch to new-style interface\n"); netdev_err(mod->ndev, "unable to switch to new-style interface\n");
return ret; return ret;
} }
/* default to "termination on" */ /* default to "termination on" */
ret = ican3_set_termination(mod, true); ret = ican3_set_termination(mod, true);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to enable termination\n"); netdev_err(mod->ndev, "unable to enable termination\n");
return ret; return ret;
} }
/* default to "bus errors enabled" */ /* default to "bus errors enabled" */
ret = ican3_set_buserror(mod, 1); ret = ican3_set_buserror(mod, 1);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to set bus-error\n"); netdev_err(mod->ndev, "unable to set bus-error\n");
return ret; return ret;
} }
ican3_init_fast_host_interface(mod); ican3_init_fast_host_interface(mod);
ret = ican3_msg_fasthostif(mod); ret = ican3_msg_fasthostif(mod);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to switch to fast host interface\n"); netdev_err(mod->ndev, "unable to switch to fast host interface\n");
return ret; return ret;
} }
ret = ican3_set_id_filter(mod, true); ret = ican3_set_id_filter(mod, true);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to set acceptance filter\n"); netdev_err(mod->ndev, "unable to set acceptance filter\n");
return ret; return ret;
} }
...@@ -1487,14 +1484,14 @@ static int ican3_open(struct net_device *ndev) ...@@ -1487,14 +1484,14 @@ static int ican3_open(struct net_device *ndev)
/* open the CAN layer */ /* open the CAN layer */
ret = open_candev(ndev); ret = open_candev(ndev);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to start CAN layer\n"); netdev_err(mod->ndev, "unable to start CAN layer\n");
return ret; return ret;
} }
/* bring the bus online */ /* bring the bus online */
ret = ican3_set_bus_state(mod, true); ret = ican3_set_bus_state(mod, true);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to set bus-on\n"); netdev_err(mod->ndev, "unable to set bus-on\n");
close_candev(ndev); close_candev(ndev);
return ret; return ret;
} }
...@@ -1518,7 +1515,7 @@ static int ican3_stop(struct net_device *ndev) ...@@ -1518,7 +1515,7 @@ static int ican3_stop(struct net_device *ndev)
/* bring the bus offline, stop receiving packets */ /* bring the bus offline, stop receiving packets */
ret = ican3_set_bus_state(mod, false); ret = ican3_set_bus_state(mod, false);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to set bus-off\n"); netdev_err(mod->ndev, "unable to set bus-off\n");
return ret; return ret;
} }
...@@ -1545,7 +1542,7 @@ static int ican3_xmit(struct sk_buff *skb, struct net_device *ndev) ...@@ -1545,7 +1542,7 @@ static int ican3_xmit(struct sk_buff *skb, struct net_device *ndev)
/* check that we can actually transmit */ /* check that we can actually transmit */
if (!ican3_txok(mod)) { if (!ican3_txok(mod)) {
dev_err(mod->dev, "BUG: no free descriptors\n"); netdev_err(mod->ndev, "BUG: no free descriptors\n");
spin_unlock_irqrestore(&mod->lock, flags); spin_unlock_irqrestore(&mod->lock, flags);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
...@@ -1657,7 +1654,7 @@ static int ican3_set_mode(struct net_device *ndev, enum can_mode mode) ...@@ -1657,7 +1654,7 @@ static int ican3_set_mode(struct net_device *ndev, enum can_mode mode)
/* bring the bus online */ /* bring the bus online */
ret = ican3_set_bus_state(mod, true); ret = ican3_set_bus_state(mod, true);
if (ret) { if (ret) {
dev_err(mod->dev, "unable to set bus-on\n"); netdev_err(ndev, "unable to set bus-on\n");
return ret; return ret;
} }
...@@ -1682,7 +1679,7 @@ static int ican3_get_berr_counter(const struct net_device *ndev, ...@@ -1682,7 +1679,7 @@ static int ican3_get_berr_counter(const struct net_device *ndev,
ret = wait_for_completion_timeout(&mod->buserror_comp, HZ); ret = wait_for_completion_timeout(&mod->buserror_comp, HZ);
if (ret == 0) { if (ret == 0) {
dev_info(mod->dev, "%s timed out\n", __func__); netdev_info(mod->ndev, "%s timed out\n", __func__);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -1708,7 +1705,7 @@ static ssize_t ican3_sysfs_show_term(struct device *dev, ...@@ -1708,7 +1705,7 @@ static ssize_t ican3_sysfs_show_term(struct device *dev,
ret = wait_for_completion_timeout(&mod->termination_comp, HZ); ret = wait_for_completion_timeout(&mod->termination_comp, HZ);
if (ret == 0) { if (ret == 0) {
dev_info(mod->dev, "%s timed out\n", __func__); netdev_info(mod->ndev, "%s timed out\n", __func__);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -1778,7 +1775,6 @@ static int ican3_probe(struct platform_device *pdev) ...@@ -1778,7 +1775,6 @@ static int ican3_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, ndev); platform_set_drvdata(pdev, ndev);
mod = netdev_priv(ndev); mod = netdev_priv(ndev);
mod->ndev = ndev; mod->ndev = ndev;
mod->dev = &pdev->dev;
mod->num = pdata->modno; mod->num = pdata->modno;
netif_napi_add(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS); netif_napi_add(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS);
skb_queue_head_init(&mod->echoq); skb_queue_head_init(&mod->echoq);
......
...@@ -601,10 +601,10 @@ static int mcp251x_do_set_bittiming(struct net_device *net) ...@@ -601,10 +601,10 @@ static int mcp251x_do_set_bittiming(struct net_device *net)
(bt->prop_seg - 1)); (bt->prop_seg - 1));
mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK, mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK,
(bt->phase_seg2 - 1)); (bt->phase_seg2 - 1));
dev_info(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n", dev_dbg(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n",
mcp251x_read_reg(spi, CNF1), mcp251x_read_reg(spi, CNF1),
mcp251x_read_reg(spi, CNF2), mcp251x_read_reg(spi, CNF2),
mcp251x_read_reg(spi, CNF3)); mcp251x_read_reg(spi, CNF3));
return 0; return 0;
} }
...@@ -1155,8 +1155,6 @@ static int mcp251x_can_probe(struct spi_device *spi) ...@@ -1155,8 +1155,6 @@ static int mcp251x_can_probe(struct spi_device *spi)
devm_can_led_init(net); devm_can_led_init(net);
dev_info(&spi->dev, "probed\n");
return ret; return ret;
error_probe: error_probe:
...@@ -1197,9 +1195,7 @@ static int mcp251x_can_remove(struct spi_device *spi) ...@@ -1197,9 +1195,7 @@ static int mcp251x_can_remove(struct spi_device *spi)
return 0; return 0;
} }
#ifdef CONFIG_PM_SLEEP static int __maybe_unused mcp251x_can_suspend(struct device *dev)
static int mcp251x_can_suspend(struct device *dev)
{ {
struct spi_device *spi = to_spi_device(dev); struct spi_device *spi = to_spi_device(dev);
struct mcp251x_priv *priv = spi_get_drvdata(spi); struct mcp251x_priv *priv = spi_get_drvdata(spi);
...@@ -1229,7 +1225,7 @@ static int mcp251x_can_suspend(struct device *dev) ...@@ -1229,7 +1225,7 @@ static int mcp251x_can_suspend(struct device *dev)
return 0; return 0;
} }
static int mcp251x_can_resume(struct device *dev) static int __maybe_unused mcp251x_can_resume(struct device *dev)
{ {
struct spi_device *spi = to_spi_device(dev); struct spi_device *spi = to_spi_device(dev);
struct mcp251x_priv *priv = spi_get_drvdata(spi); struct mcp251x_priv *priv = spi_get_drvdata(spi);
...@@ -1249,7 +1245,6 @@ static int mcp251x_can_resume(struct device *dev) ...@@ -1249,7 +1245,6 @@ static int mcp251x_can_resume(struct device *dev)
enable_irq(spi->irq); enable_irq(spi->irq);
return 0; return 0;
} }
#endif
static SIMPLE_DEV_PM_OPS(mcp251x_can_pm_ops, mcp251x_can_suspend, static SIMPLE_DEV_PM_OPS(mcp251x_can_pm_ops, mcp251x_can_suspend,
mcp251x_can_resume); mcp251x_can_resume);
......
...@@ -33,8 +33,9 @@ enum can_mode { ...@@ -33,8 +33,9 @@ enum can_mode {
struct can_priv { struct can_priv {
struct can_device_stats can_stats; struct can_device_stats can_stats;
struct can_bittiming bittiming; struct can_bittiming bittiming, data_bittiming;
const struct can_bittiming_const *bittiming_const; const struct can_bittiming_const *bittiming_const,
*data_bittiming_const;
struct can_clock clock; struct can_clock clock;
enum can_state state; enum can_state state;
...@@ -45,6 +46,7 @@ struct can_priv { ...@@ -45,6 +46,7 @@ struct can_priv {
struct timer_list restart_timer; struct timer_list restart_timer;
int (*do_set_bittiming)(struct net_device *dev); int (*do_set_bittiming)(struct net_device *dev);
int (*do_set_data_bittiming)(struct net_device *dev);
int (*do_set_mode)(struct net_device *dev, enum can_mode mode); int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
int (*do_get_state)(const struct net_device *dev, int (*do_get_state)(const struct net_device *dev,
enum can_state *state); enum can_state *state);
...@@ -111,6 +113,7 @@ struct can_priv *safe_candev_priv(struct net_device *dev); ...@@ -111,6 +113,7 @@ struct can_priv *safe_candev_priv(struct net_device *dev);
int open_candev(struct net_device *dev); int open_candev(struct net_device *dev);
void close_candev(struct net_device *dev); void close_candev(struct net_device *dev);
int can_change_mtu(struct net_device *dev, int new_mtu);
int register_candev(struct net_device *dev); int register_candev(struct net_device *dev);
void unregister_candev(struct net_device *dev); void unregister_candev(struct net_device *dev);
......
...@@ -96,6 +96,7 @@ struct can_ctrlmode { ...@@ -96,6 +96,7 @@ struct can_ctrlmode {
#define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */ #define CAN_CTRLMODE_3_SAMPLES 0x04 /* Triple sampling mode */
#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */ #define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */
#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ #define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */
#define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */
/* /*
* CAN device statistics * CAN device statistics
...@@ -122,6 +123,8 @@ enum { ...@@ -122,6 +123,8 @@ enum {
IFLA_CAN_RESTART_MS, IFLA_CAN_RESTART_MS,
IFLA_CAN_RESTART, IFLA_CAN_RESTART,
IFLA_CAN_BERR_COUNTER, IFLA_CAN_BERR_COUNTER,
IFLA_CAN_DATA_BITTIMING,
IFLA_CAN_DATA_BITTIMING_CONST,
__IFLA_CAN_MAX __IFLA_CAN_MAX
}; };
......
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