Commit fcf89628 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge tag 'linux-can-next-for-5.19-20220519' of...

Merge tag 'linux-can-next-for-5.19-20220519' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next

Marc Kleine-Budde says:

====================
pull-request: can-next 2022-05-19

Oliver Hartkopp contributes a patch for the ISO-TP CAN protocol to
update the validation of address information during bind.

The next patch is by Jakub Kicinski and converts the CAN network
drivers from netif_napi_add() to the netif_napi_add_weight() function.

Another patch by Oliver Hartkopp removes obsolete CAN specific LED
support.

Vincent Mailhol's patch for the mcp251xfd driver fixes a
-Wunaligned-access warning by clang-14.

* tag 'linux-can-next-for-5.19-20220519' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next:
  can: mcp251xfd: silence clang's -Wunaligned-access warning
  can: can-dev: remove obsolete CAN LED support
  can: can-dev: move to netif_napi_add_weight()
  can: isotp: isotp_bind(): do not validate unused address information
====================

Link: https://lore.kernel.org/r/20220519202308.1435903-1-mkl@pengutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents d353e1a3 1a6dd999
...@@ -4376,7 +4376,6 @@ F: drivers/net/can/ ...@@ -4376,7 +4376,6 @@ F: drivers/net/can/
F: drivers/phy/phy-can-transceiver.c F: drivers/phy/phy-can-transceiver.c
F: include/linux/can/bittiming.h F: include/linux/can/bittiming.h
F: include/linux/can/dev.h F: include/linux/can/dev.h
F: include/linux/can/led.h
F: include/linux/can/length.h F: include/linux/can/length.h
F: include/linux/can/platform/ F: include/linux/can/platform/
F: include/linux/can/rx-offload.h F: include/linux/can/rx-offload.h
......
...@@ -71,23 +71,6 @@ config CAN_CALC_BITTIMING ...@@ -71,23 +71,6 @@ config CAN_CALC_BITTIMING
arguments "tq", "prop_seg", "phase_seg1", "phase_seg2" and "sjw". arguments "tq", "prop_seg", "phase_seg1", "phase_seg2" and "sjw".
If unsure, say Y. If unsure, say Y.
config CAN_LEDS
bool "Enable LED triggers for Netlink based drivers"
depends on LEDS_CLASS
# The netdev trigger (LEDS_TRIGGER_NETDEV) should be able to do
# everything that this driver is doing. This is marked as broken
# because it uses stuff that is intended to be changed or removed.
# Please consider switching to the netdev trigger and confirm it
# fulfills your needs instead of fixing this driver.
depends on BROKEN
select LEDS_TRIGGERS
help
This option adds two LED triggers for packet receive and transmit
events on each supported CAN device.
Say Y here if you are working on a system with led-class supported
LEDs and you want to use them as canbus activity indicators.
config CAN_AT91 config CAN_AT91
tristate "Atmel AT91 onchip CAN controller" tristate "Atmel AT91 onchip CAN controller"
depends on (ARCH_AT91 || COMPILE_TEST) && HAS_IOMEM depends on (ARCH_AT91 || COMPILE_TEST) && HAS_IOMEM
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#define AT91_MB_MASK(i) ((1 << (i)) - 1) #define AT91_MB_MASK(i) ((1 << (i)) - 1)
...@@ -618,8 +617,6 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb) ...@@ -618,8 +617,6 @@ static void at91_read_msg(struct net_device *dev, unsigned int mb)
stats->rx_bytes += cf->len; stats->rx_bytes += cf->len;
netif_receive_skb(skb); netif_receive_skb(skb);
can_led_event(dev, CAN_LED_EVENT_RX);
} }
/** /**
...@@ -854,7 +851,6 @@ static void at91_irq_tx(struct net_device *dev, u32 reg_sr) ...@@ -854,7 +851,6 @@ static void at91_irq_tx(struct net_device *dev, u32 reg_sr)
mb - get_mb_tx_first(priv), mb - get_mb_tx_first(priv),
NULL); NULL);
dev->stats.tx_packets++; dev->stats.tx_packets++;
can_led_event(dev, CAN_LED_EVENT_TX);
} }
} }
...@@ -1101,8 +1097,6 @@ static int at91_open(struct net_device *dev) ...@@ -1101,8 +1097,6 @@ static int at91_open(struct net_device *dev)
goto out_close; goto out_close;
} }
can_led_event(dev, CAN_LED_EVENT_OPEN);
/* start chip and queuing */ /* start chip and queuing */
at91_chip_start(dev); at91_chip_start(dev);
napi_enable(&priv->napi); napi_enable(&priv->napi);
...@@ -1133,8 +1127,6 @@ static int at91_close(struct net_device *dev) ...@@ -1133,8 +1127,6 @@ static int at91_close(struct net_device *dev)
close_candev(dev); close_candev(dev);
can_led_event(dev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -1317,7 +1309,7 @@ static int at91_can_probe(struct platform_device *pdev) ...@@ -1317,7 +1309,7 @@ static int at91_can_probe(struct platform_device *pdev)
priv->pdata = dev_get_platdata(&pdev->dev); priv->pdata = dev_get_platdata(&pdev->dev);
priv->mb0_id = 0x7ff; priv->mb0_id = 0x7ff;
netif_napi_add(dev, &priv->napi, at91_poll, get_mb_rx_num(priv)); netif_napi_add_weight(dev, &priv->napi, at91_poll, get_mb_rx_num(priv));
if (at91_is_sam9263(priv)) if (at91_is_sam9263(priv))
dev->sysfs_groups[0] = &at91_sysfs_attr_group; dev->sysfs_groups[0] = &at91_sysfs_attr_group;
...@@ -1331,8 +1323,6 @@ static int at91_can_probe(struct platform_device *pdev) ...@@ -1331,8 +1323,6 @@ static int at91_can_probe(struct platform_device *pdev)
goto exit_free; goto exit_free;
} }
devm_can_led_init(dev);
dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%d)\n", dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%d)\n",
priv->reg_base, dev->irq); priv->reg_base, dev->irq);
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include <linux/can.h> #include <linux/can.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include "c_can.h" #include "c_can.h"
...@@ -759,7 +758,6 @@ static void c_can_do_tx(struct net_device *dev) ...@@ -759,7 +758,6 @@ static void c_can_do_tx(struct net_device *dev)
stats->tx_bytes += bytes; stats->tx_bytes += bytes;
stats->tx_packets += pkts; stats->tx_packets += pkts;
can_led_event(dev, CAN_LED_EVENT_TX);
tail = c_can_get_tx_tail(tx_ring); tail = c_can_get_tx_tail(tx_ring);
...@@ -906,9 +904,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) ...@@ -906,9 +904,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
quota -= n; quota -= n;
} }
if (pkts)
can_led_event(dev, CAN_LED_EVENT_RX);
return pkts; return pkts;
} }
...@@ -1182,8 +1177,6 @@ static int c_can_open(struct net_device *dev) ...@@ -1182,8 +1177,6 @@ static int c_can_open(struct net_device *dev)
if (err) if (err)
goto exit_start_fail; goto exit_start_fail;
can_led_event(dev, CAN_LED_EVENT_OPEN);
napi_enable(&priv->napi); napi_enable(&priv->napi);
/* enable status change, error and module interrupts */ /* enable status change, error and module interrupts */
c_can_irq_control(priv, true); c_can_irq_control(priv, true);
...@@ -1214,8 +1207,6 @@ static int c_can_close(struct net_device *dev) ...@@ -1214,8 +1207,6 @@ static int c_can_close(struct net_device *dev)
c_can_reset_ram(priv, false); c_can_reset_ram(priv, false);
c_can_pm_runtime_put_sync(priv); c_can_pm_runtime_put_sync(priv);
can_led_event(dev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -1246,7 +1237,8 @@ struct net_device *alloc_c_can_dev(int msg_obj_num) ...@@ -1246,7 +1237,8 @@ struct net_device *alloc_c_can_dev(int msg_obj_num)
priv->tx.tail = 0; priv->tx.tail = 0;
priv->tx.obj_num = msg_obj_tx_num; priv->tx.obj_num = msg_obj_tx_num;
netif_napi_add(dev, &priv->napi, c_can_poll, priv->msg_obj_rx_num); netif_napi_add_weight(dev, &priv->napi, c_can_poll,
priv->msg_obj_rx_num);
priv->dev = dev; priv->dev = dev;
priv->can.bittiming_const = &c_can_bittiming_const; priv->can.bittiming_const = &c_can_bittiming_const;
...@@ -1364,8 +1356,6 @@ static const struct net_device_ops c_can_netdev_ops = { ...@@ -1364,8 +1356,6 @@ static const struct net_device_ops c_can_netdev_ops = {
int register_c_can_dev(struct net_device *dev) int register_c_can_dev(struct net_device *dev)
{ {
int err;
/* Deactivate pins to prevent DRA7 DCAN IP from being /* Deactivate pins to prevent DRA7 DCAN IP from being
* stuck in transition when module is disabled. * stuck in transition when module is disabled.
* Pins are activated in c_can_start() and deactivated * Pins are activated in c_can_start() and deactivated
...@@ -1377,10 +1367,7 @@ int register_c_can_dev(struct net_device *dev) ...@@ -1377,10 +1367,7 @@ int register_c_can_dev(struct net_device *dev)
dev->netdev_ops = &c_can_netdev_ops; dev->netdev_ops = &c_can_netdev_ops;
c_can_set_ethtool_ops(dev); c_can_set_ethtool_ops(dev);
err = register_candev(dev); return register_candev(dev);
if (!err)
devm_can_led_init(dev);
return err;
} }
EXPORT_SYMBOL_GPL(register_c_can_dev); EXPORT_SYMBOL_GPL(register_c_can_dev);
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include "ctucanfd.h" #include "ctucanfd.h"
...@@ -957,9 +956,6 @@ static int ctucan_rx_poll(struct napi_struct *napi, int quota) ...@@ -957,9 +956,6 @@ static int ctucan_rx_poll(struct napi_struct *napi, int quota)
ctucan_write32(priv, CTUCANFD_COMMAND, REG_COMMAND_CDO); ctucan_write32(priv, CTUCANFD_COMMAND, REG_COMMAND_CDO);
} }
if (work_done)
can_led_event(ndev, CAN_LED_EVENT_RX);
if (!framecnt && res != 0) { if (!framecnt && res != 0) {
if (napi_complete_done(napi, work_done)) { if (napi_complete_done(napi, work_done)) {
/* Clear and enable RBNEI. It is level-triggered, so /* Clear and enable RBNEI. It is level-triggered, so
...@@ -1079,8 +1075,6 @@ static void ctucan_tx_interrupt(struct net_device *ndev) ...@@ -1079,8 +1075,6 @@ static void ctucan_tx_interrupt(struct net_device *ndev)
} }
} while (some_buffers_processed); } while (some_buffers_processed);
can_led_event(ndev, CAN_LED_EVENT_TX);
spin_lock_irqsave(&priv->tx_lock, flags); spin_lock_irqsave(&priv->tx_lock, flags);
/* Check if at least one TX buffer is free */ /* Check if at least one TX buffer is free */
...@@ -1236,7 +1230,6 @@ static int ctucan_open(struct net_device *ndev) ...@@ -1236,7 +1230,6 @@ static int ctucan_open(struct net_device *ndev)
} }
netdev_info(ndev, "ctu_can_fd device registered\n"); netdev_info(ndev, "ctu_can_fd device registered\n");
can_led_event(ndev, CAN_LED_EVENT_OPEN);
napi_enable(&priv->napi); napi_enable(&priv->napi);
netif_start_queue(ndev); netif_start_queue(ndev);
...@@ -1269,7 +1262,6 @@ static int ctucan_close(struct net_device *ndev) ...@@ -1269,7 +1262,6 @@ static int ctucan_close(struct net_device *ndev)
free_irq(ndev->irq, ndev); free_irq(ndev->irq, ndev);
close_candev(ndev); close_candev(ndev);
can_led_event(ndev, CAN_LED_EVENT_STOP);
pm_runtime_put(priv->dev); pm_runtime_put(priv->dev);
return 0; return 0;
...@@ -1434,8 +1426,6 @@ int ctucan_probe_common(struct device *dev, void __iomem *addr, int irq, unsigne ...@@ -1434,8 +1426,6 @@ int ctucan_probe_common(struct device *dev, void __iomem *addr, int irq, unsigne
goto err_deviceoff; goto err_deviceoff;
} }
devm_can_led_init(ndev);
pm_runtime_put(dev); pm_runtime_put(dev);
netdev_dbg(ndev, "mem_base=0x%p irq=%d clock=%d, no. of txt buffers:%d\n", netdev_dbg(ndev, "mem_base=0x%p irq=%d clock=%d, no. of txt buffers:%d\n",
......
...@@ -7,5 +7,3 @@ can-dev-y += length.o ...@@ -7,5 +7,3 @@ can-dev-y += length.o
can-dev-y += netlink.o can-dev-y += netlink.o
can-dev-y += rx-offload.o can-dev-y += rx-offload.o
can-dev-y += skb.o can-dev-y += skb.o
can-dev-$(CONFIG_CAN_LEDS) += led.o
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include <linux/can/can-ml.h> #include <linux/can/can-ml.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/skb.h> #include <linux/can/skb.h>
#include <linux/can/led.h>
#include <linux/gpio/consumer.h> #include <linux/gpio/consumer.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -512,8 +511,6 @@ static __init int can_dev_init(void) ...@@ -512,8 +511,6 @@ static __init int can_dev_init(void)
{ {
int err; int err;
can_led_notifier_init();
err = can_netlink_register(); err = can_netlink_register();
if (!err) if (!err)
pr_info(MOD_DESC "\n"); pr_info(MOD_DESC "\n");
...@@ -525,8 +522,6 @@ module_init(can_dev_init); ...@@ -525,8 +522,6 @@ module_init(can_dev_init);
static __exit void can_dev_exit(void) static __exit void can_dev_exit(void)
{ {
can_netlink_unregister(); can_netlink_unregister();
can_led_notifier_exit();
} }
module_exit(can_dev_exit); module_exit(can_dev_exit);
......
...@@ -70,8 +70,6 @@ static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota) ...@@ -70,8 +70,6 @@ static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota)
napi_reschedule(&offload->napi); napi_reschedule(&offload->napi);
} }
can_led_event(offload->dev, CAN_LED_EVENT_RX);
return work_done; return work_done;
} }
...@@ -337,7 +335,8 @@ static int can_rx_offload_init_queue(struct net_device *dev, ...@@ -337,7 +335,8 @@ static int can_rx_offload_init_queue(struct net_device *dev,
skb_queue_head_init(&offload->skb_queue); skb_queue_head_init(&offload->skb_queue);
__skb_queue_head_init(&offload->skb_irq_queue); __skb_queue_head_init(&offload->skb_irq_queue);
netif_napi_add(dev, &offload->napi, can_rx_offload_napi_poll, weight); netif_napi_add_weight(dev, &offload->napi, can_rx_offload_napi_poll,
weight);
dev_dbg(dev->dev.parent, "%s: skb_queue_len_max=%d\n", dev_dbg(dev->dev.parent, "%s: skb_queue_len_max=%d\n",
__func__, offload->skb_queue_len_max); __func__, offload->skb_queue_len_max);
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include <linux/can.h> #include <linux/can.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/firmware/imx/sci.h> #include <linux/firmware/imx/sci.h>
...@@ -1081,7 +1080,6 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) ...@@ -1081,7 +1080,6 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)
can_rx_offload_get_echo_skb(&priv->offload, 0, can_rx_offload_get_echo_skb(&priv->offload, 0,
reg_ctrl << 16, NULL); reg_ctrl << 16, NULL);
stats->tx_packets++; stats->tx_packets++;
can_led_event(dev, CAN_LED_EVENT_TX);
/* after sending a RTR frame MB is in RX mode */ /* after sending a RTR frame MB is in RX mode */
priv->write(FLEXCAN_MB_CODE_TX_INACTIVE, priv->write(FLEXCAN_MB_CODE_TX_INACTIVE,
...@@ -1738,8 +1736,6 @@ static int flexcan_open(struct net_device *dev) ...@@ -1738,8 +1736,6 @@ static int flexcan_open(struct net_device *dev)
flexcan_chip_interrupts_enable(dev); flexcan_chip_interrupts_enable(dev);
can_led_event(dev, CAN_LED_EVENT_OPEN);
netif_start_queue(dev); netif_start_queue(dev);
return 0; return 0;
...@@ -1785,8 +1781,6 @@ static int flexcan_close(struct net_device *dev) ...@@ -1785,8 +1781,6 @@ static int flexcan_close(struct net_device *dev)
pm_runtime_put(priv->dev); pm_runtime_put(priv->dev);
can_led_event(dev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -2189,7 +2183,6 @@ static int flexcan_probe(struct platform_device *pdev) ...@@ -2189,7 +2183,6 @@ static int flexcan_probe(struct platform_device *pdev)
} }
of_can_transceiver(dev); of_can_transceiver(dev);
devm_can_led_init(dev);
return 0; return 0;
......
...@@ -1609,7 +1609,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev, ...@@ -1609,7 +1609,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
timer_setup(&priv->hang_timer, grcan_initiate_running_reset, 0); timer_setup(&priv->hang_timer, grcan_initiate_running_reset, 0);
} }
netif_napi_add(dev, &priv->napi, grcan_poll, GRCAN_NAPI_WEIGHT); netif_napi_add_weight(dev, &priv->napi, grcan_poll, GRCAN_NAPI_WEIGHT);
SET_NETDEV_DEV(dev, &ofdev->dev); SET_NETDEV_DEV(dev, &ofdev->dev);
dev_info(&ofdev->dev, "regs=0x%p, irq=%d, clock=%d\n", dev_info(&ofdev->dev, "regs=0x%p, irq=%d, clock=%d\n",
......
...@@ -345,9 +345,6 @@ static int ifi_canfd_do_rx_poll(struct net_device *ndev, int quota) ...@@ -345,9 +345,6 @@ static int ifi_canfd_do_rx_poll(struct net_device *ndev, int quota)
rxst = readl(priv->base + IFI_CANFD_RXSTCMD); rxst = readl(priv->base + IFI_CANFD_RXSTCMD);
} }
if (pkts)
can_led_event(ndev, CAN_LED_EVENT_RX);
return pkts; return pkts;
} }
...@@ -626,7 +623,6 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id) ...@@ -626,7 +623,6 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
if (isr & IFI_CANFD_INTERRUPT_TXFIFO_REMOVE) { if (isr & IFI_CANFD_INTERRUPT_TXFIFO_REMOVE) {
stats->tx_bytes += can_get_echo_skb(ndev, 0, NULL); stats->tx_bytes += can_get_echo_skb(ndev, 0, NULL);
stats->tx_packets++; stats->tx_packets++;
can_led_event(ndev, CAN_LED_EVENT_TX);
} }
if (isr & tx_irq_mask) if (isr & tx_irq_mask)
...@@ -830,7 +826,6 @@ static int ifi_canfd_open(struct net_device *ndev) ...@@ -830,7 +826,6 @@ static int ifi_canfd_open(struct net_device *ndev)
ifi_canfd_start(ndev); ifi_canfd_start(ndev);
can_led_event(ndev, CAN_LED_EVENT_OPEN);
napi_enable(&priv->napi); napi_enable(&priv->napi);
netif_start_queue(ndev); netif_start_queue(ndev);
...@@ -853,8 +848,6 @@ static int ifi_canfd_close(struct net_device *ndev) ...@@ -853,8 +848,6 @@ static int ifi_canfd_close(struct net_device *ndev)
close_candev(ndev); close_candev(ndev);
can_led_event(ndev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -1004,8 +997,6 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev) ...@@ -1004,8 +997,6 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
goto err_reg; goto err_reg;
} }
devm_can_led_init(ndev);
dev_info(dev, "Driver registered: regs=%p, irq=%d, clock=%d\n", dev_info(dev, "Driver registered: regs=%p, irq=%d, clock=%d\n",
priv->base, ndev->irq, priv->can.clock.freq); priv->base, ndev->irq, priv->can.clock.freq);
......
...@@ -1910,7 +1910,7 @@ static int ican3_probe(struct platform_device *pdev) ...@@ -1910,7 +1910,7 @@ static int ican3_probe(struct platform_device *pdev)
mod = netdev_priv(ndev); mod = netdev_priv(ndev);
mod->ndev = ndev; mod->ndev = ndev;
mod->num = pdata->modno; mod->num = pdata->modno;
netif_napi_add(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS); netif_napi_add_weight(ndev, &mod->napi, ican3_napi, ICAN3_RX_BUFFERS);
skb_queue_head_init(&mod->echoq); skb_queue_head_init(&mod->echoq);
spin_lock_init(&mod->lock); spin_lock_init(&mod->lock);
init_completion(&mod->termination_comp); init_completion(&mod->termination_comp);
......
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright 2012, Fabio Baltieri <fabio.baltieri@gmail.com>
* Copyright 2012, Kurt Van Dijck <kurt.van.dijck@eia.be>
*/
#include <linux/module.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/netdevice.h>
#include <linux/can/dev.h>
#include <linux/can/led.h>
static unsigned long led_delay = 50;
module_param(led_delay, ulong, 0644);
MODULE_PARM_DESC(led_delay,
"blink delay time for activity leds (msecs, default: 50).");
/* Trigger a LED event in response to a CAN device event */
void can_led_event(struct net_device *netdev, enum can_led_event event)
{
struct can_priv *priv = netdev_priv(netdev);
switch (event) {
case CAN_LED_EVENT_OPEN:
led_trigger_event(priv->tx_led_trig, LED_FULL);
led_trigger_event(priv->rx_led_trig, LED_FULL);
led_trigger_event(priv->rxtx_led_trig, LED_FULL);
break;
case CAN_LED_EVENT_STOP:
led_trigger_event(priv->tx_led_trig, LED_OFF);
led_trigger_event(priv->rx_led_trig, LED_OFF);
led_trigger_event(priv->rxtx_led_trig, LED_OFF);
break;
case CAN_LED_EVENT_TX:
if (led_delay) {
led_trigger_blink_oneshot(priv->tx_led_trig,
&led_delay, &led_delay, 1);
led_trigger_blink_oneshot(priv->rxtx_led_trig,
&led_delay, &led_delay, 1);
}
break;
case CAN_LED_EVENT_RX:
if (led_delay) {
led_trigger_blink_oneshot(priv->rx_led_trig,
&led_delay, &led_delay, 1);
led_trigger_blink_oneshot(priv->rxtx_led_trig,
&led_delay, &led_delay, 1);
}
break;
}
}
EXPORT_SYMBOL_GPL(can_led_event);
static void can_led_release(struct device *gendev, void *res)
{
struct can_priv *priv = netdev_priv(to_net_dev(gendev));
led_trigger_unregister_simple(priv->tx_led_trig);
led_trigger_unregister_simple(priv->rx_led_trig);
led_trigger_unregister_simple(priv->rxtx_led_trig);
}
/* Register CAN LED triggers for a CAN device
*
* This is normally called from a driver's probe function
*/
void devm_can_led_init(struct net_device *netdev)
{
struct can_priv *priv = netdev_priv(netdev);
void *res;
res = devres_alloc(can_led_release, 0, GFP_KERNEL);
if (!res) {
netdev_err(netdev, "cannot register LED triggers\n");
return;
}
snprintf(priv->tx_led_trig_name, sizeof(priv->tx_led_trig_name),
"%s-tx", netdev->name);
snprintf(priv->rx_led_trig_name, sizeof(priv->rx_led_trig_name),
"%s-rx", netdev->name);
snprintf(priv->rxtx_led_trig_name, sizeof(priv->rxtx_led_trig_name),
"%s-rxtx", netdev->name);
led_trigger_register_simple(priv->tx_led_trig_name,
&priv->tx_led_trig);
led_trigger_register_simple(priv->rx_led_trig_name,
&priv->rx_led_trig);
led_trigger_register_simple(priv->rxtx_led_trig_name,
&priv->rxtx_led_trig);
devres_add(&netdev->dev, res);
}
EXPORT_SYMBOL_GPL(devm_can_led_init);
/* NETDEV rename notifier to rename the associated led triggers too */
static int can_led_notifier(struct notifier_block *nb, unsigned long msg,
void *ptr)
{
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
struct can_priv *priv = safe_candev_priv(netdev);
char name[CAN_LED_NAME_SZ];
if (!priv)
return NOTIFY_DONE;
if (!priv->tx_led_trig || !priv->rx_led_trig || !priv->rxtx_led_trig)
return NOTIFY_DONE;
if (msg == NETDEV_CHANGENAME) {
snprintf(name, sizeof(name), "%s-tx", netdev->name);
led_trigger_rename_static(name, priv->tx_led_trig);
snprintf(name, sizeof(name), "%s-rx", netdev->name);
led_trigger_rename_static(name, priv->rx_led_trig);
snprintf(name, sizeof(name), "%s-rxtx", netdev->name);
led_trigger_rename_static(name, priv->rxtx_led_trig);
}
return NOTIFY_DONE;
}
/* notifier block for netdevice event */
static struct notifier_block can_netdev_notifier __read_mostly = {
.notifier_call = can_led_notifier,
};
int __init can_led_notifier_init(void)
{
return register_netdevice_notifier(&can_netdev_notifier);
}
void __exit can_led_notifier_exit(void)
{
unregister_netdevice_notifier(&can_netdev_notifier);
}
...@@ -565,9 +565,6 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota) ...@@ -565,9 +565,6 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota)
rxfs = m_can_read(cdev, M_CAN_RXF0S); rxfs = m_can_read(cdev, M_CAN_RXF0S);
} }
if (pkts)
can_led_event(dev, CAN_LED_EVENT_RX);
return pkts; return pkts;
} }
...@@ -1087,8 +1084,6 @@ static irqreturn_t m_can_isr(int irq, void *dev_id) ...@@ -1087,8 +1084,6 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
if (cdev->is_peripheral) if (cdev->is_peripheral)
timestamp = m_can_get_timestamp(cdev); timestamp = m_can_get_timestamp(cdev);
m_can_tx_update_stats(cdev, 0, timestamp); m_can_tx_update_stats(cdev, 0, timestamp);
can_led_event(dev, CAN_LED_EVENT_TX);
netif_wake_queue(dev); netif_wake_queue(dev);
} }
} else { } else {
...@@ -1097,7 +1092,6 @@ static irqreturn_t m_can_isr(int irq, void *dev_id) ...@@ -1097,7 +1092,6 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
if (m_can_echo_tx_event(dev) != 0) if (m_can_echo_tx_event(dev) != 0)
goto out_fail; goto out_fail;
can_led_event(dev, CAN_LED_EVENT_TX);
if (netif_queue_stopped(dev) && if (netif_queue_stopped(dev) &&
!m_can_tx_fifo_full(cdev)) !m_can_tx_fifo_full(cdev))
netif_wake_queue(dev); netif_wake_queue(dev);
...@@ -1562,7 +1556,6 @@ static int m_can_close(struct net_device *dev) ...@@ -1562,7 +1556,6 @@ static int m_can_close(struct net_device *dev)
can_rx_offload_disable(&cdev->offload); can_rx_offload_disable(&cdev->offload);
close_candev(dev); close_candev(dev);
can_led_event(dev, CAN_LED_EVENT_STOP);
phy_power_off(cdev->transceiver); phy_power_off(cdev->transceiver);
...@@ -1806,8 +1799,6 @@ static int m_can_open(struct net_device *dev) ...@@ -1806,8 +1799,6 @@ static int m_can_open(struct net_device *dev)
/* start the m_can controller */ /* start the m_can controller */
m_can_start(dev); m_can_start(dev);
can_led_event(dev, CAN_LED_EVENT_OPEN);
if (!cdev->is_peripheral) if (!cdev->is_peripheral)
napi_enable(&cdev->napi); napi_enable(&cdev->napi);
...@@ -1995,8 +1986,6 @@ int m_can_class_register(struct m_can_classdev *cdev) ...@@ -1995,8 +1986,6 @@ int m_can_class_register(struct m_can_classdev *cdev)
goto rx_offload_del; goto rx_offload_del;
} }
devm_can_led_init(cdev->net);
of_can_transceiver(cdev->net); of_can_transceiver(cdev->net);
dev_info(cdev->dev, "%s device registered (irq=%d, version=%d)\n", dev_info(cdev->dev, "%s device registered (irq=%d, version=%d)\n",
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#define _CAN_M_CAN_H_ #define _CAN_M_CAN_H_
#include <linux/can/core.h> #include <linux/can/core.h>
#include <linux/can/led.h>
#include <linux/can/rx-offload.h> #include <linux/can/rx-offload.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/device.h> #include <linux/device.h>
......
...@@ -679,7 +679,7 @@ struct net_device *alloc_mscandev(void) ...@@ -679,7 +679,7 @@ struct net_device *alloc_mscandev(void)
dev->flags |= IFF_ECHO; /* we support local echo */ dev->flags |= IFF_ECHO; /* we support local echo */
netif_napi_add(dev, &priv->napi, mscan_rx_poll, 8); netif_napi_add_weight(dev, &priv->napi, mscan_rx_poll, 8);
priv->can.bittiming_const = &mscan_bittiming_const; priv->can.bittiming_const = &mscan_bittiming_const;
priv->can.do_set_bittiming = mscan_do_set_bittiming; priv->can.do_set_bittiming = mscan_do_set_bittiming;
......
...@@ -1189,7 +1189,7 @@ static int pch_can_probe(struct pci_dev *pdev, ...@@ -1189,7 +1189,7 @@ static int pch_can_probe(struct pci_dev *pdev,
ndev->netdev_ops = &pch_can_netdev_ops; ndev->netdev_ops = &pch_can_netdev_ops;
priv->can.clock.freq = PCH_CAN_CLK; /* Hz */ priv->can.clock.freq = PCH_CAN_CLK; /* Hz */
netif_napi_add(ndev, &priv->napi, pch_can_poll, PCH_RX_OBJ_END); netif_napi_add_weight(ndev, &priv->napi, pch_can_poll, PCH_RX_OBJ_END);
rc = pci_enable_msi(priv->dev); rc = pci_enable_msi(priv->dev);
if (rc) { if (rc) {
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/can/led.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -389,7 +388,6 @@ static void rcar_can_tx_done(struct net_device *ndev) ...@@ -389,7 +388,6 @@ static void rcar_can_tx_done(struct net_device *ndev)
/* Clear interrupt */ /* Clear interrupt */
isr = readb(&priv->regs->isr); isr = readb(&priv->regs->isr);
writeb(isr & ~RCAR_CAN_ISR_TXFF, &priv->regs->isr); writeb(isr & ~RCAR_CAN_ISR_TXFF, &priv->regs->isr);
can_led_event(ndev, CAN_LED_EVENT_TX);
} }
static irqreturn_t rcar_can_interrupt(int irq, void *dev_id) static irqreturn_t rcar_can_interrupt(int irq, void *dev_id)
...@@ -531,7 +529,6 @@ static int rcar_can_open(struct net_device *ndev) ...@@ -531,7 +529,6 @@ static int rcar_can_open(struct net_device *ndev)
ndev->irq, err); ndev->irq, err);
goto out_close; goto out_close;
} }
can_led_event(ndev, CAN_LED_EVENT_OPEN);
rcar_can_start(ndev); rcar_can_start(ndev);
netif_start_queue(ndev); netif_start_queue(ndev);
return 0; return 0;
...@@ -581,7 +578,6 @@ static int rcar_can_close(struct net_device *ndev) ...@@ -581,7 +578,6 @@ static int rcar_can_close(struct net_device *ndev)
clk_disable_unprepare(priv->can_clk); clk_disable_unprepare(priv->can_clk);
clk_disable_unprepare(priv->clk); clk_disable_unprepare(priv->clk);
close_candev(ndev); close_candev(ndev);
can_led_event(ndev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -666,8 +662,6 @@ static void rcar_can_rx_pkt(struct rcar_can_priv *priv) ...@@ -666,8 +662,6 @@ static void rcar_can_rx_pkt(struct rcar_can_priv *priv)
} }
stats->rx_packets++; stats->rx_packets++;
can_led_event(priv->ndev, CAN_LED_EVENT_RX);
netif_receive_skb(skb); netif_receive_skb(skb);
} }
...@@ -803,8 +797,8 @@ static int rcar_can_probe(struct platform_device *pdev) ...@@ -803,8 +797,8 @@ static int rcar_can_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, ndev); platform_set_drvdata(pdev, ndev);
SET_NETDEV_DEV(ndev, &pdev->dev); SET_NETDEV_DEV(ndev, &pdev->dev);
netif_napi_add(ndev, &priv->napi, rcar_can_rx_poll, netif_napi_add_weight(ndev, &priv->napi, rcar_can_rx_poll,
RCAR_CAN_NAPI_WEIGHT); RCAR_CAN_NAPI_WEIGHT);
err = register_candev(ndev); err = register_candev(ndev);
if (err) { if (err) {
dev_err(&pdev->dev, "register_candev() failed, error %d\n", dev_err(&pdev->dev, "register_candev() failed, error %d\n",
...@@ -812,8 +806,6 @@ static int rcar_can_probe(struct platform_device *pdev) ...@@ -812,8 +806,6 @@ static int rcar_can_probe(struct platform_device *pdev)
goto fail_candev; goto fail_candev;
} }
devm_can_led_init(ndev);
dev_info(&pdev->dev, "device registered (IRQ%d)\n", ndev->irq); dev_info(&pdev->dev, "device registered (IRQ%d)\n", ndev->irq);
return 0; return 0;
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/can/led.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -1128,7 +1127,6 @@ static void rcar_canfd_tx_done(struct net_device *ndev) ...@@ -1128,7 +1127,6 @@ static void rcar_canfd_tx_done(struct net_device *ndev)
/* Clear interrupt */ /* Clear interrupt */
rcar_canfd_write(priv->base, RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX), rcar_canfd_write(priv->base, RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX),
sts & ~RCANFD_CFSTS_CFTXIF); sts & ~RCANFD_CFSTS_CFTXIF);
can_led_event(ndev, CAN_LED_EVENT_TX);
} }
static void rcar_canfd_handle_global_err(struct rcar_canfd_global *gpriv, u32 ch) static void rcar_canfd_handle_global_err(struct rcar_canfd_global *gpriv, u32 ch)
...@@ -1419,7 +1417,6 @@ static int rcar_canfd_open(struct net_device *ndev) ...@@ -1419,7 +1417,6 @@ static int rcar_canfd_open(struct net_device *ndev)
if (err) if (err)
goto out_close; goto out_close;
netif_start_queue(ndev); netif_start_queue(ndev);
can_led_event(ndev, CAN_LED_EVENT_OPEN);
return 0; return 0;
out_close: out_close:
napi_disable(&priv->napi); napi_disable(&priv->napi);
...@@ -1469,7 +1466,6 @@ static int rcar_canfd_close(struct net_device *ndev) ...@@ -1469,7 +1466,6 @@ static int rcar_canfd_close(struct net_device *ndev)
napi_disable(&priv->napi); napi_disable(&priv->napi);
clk_disable_unprepare(gpriv->can_clk); clk_disable_unprepare(gpriv->can_clk);
close_candev(ndev); close_candev(ndev);
can_led_event(ndev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -1619,8 +1615,6 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv) ...@@ -1619,8 +1615,6 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
*/ */
rcar_canfd_write(priv->base, RCANFD_RFPCTR(gpriv, ridx), 0xff); rcar_canfd_write(priv->base, RCANFD_RFPCTR(gpriv, ridx), 0xff);
can_led_event(priv->ndev, CAN_LED_EVENT_RX);
if (!(cf->can_id & CAN_RTR_FLAG)) if (!(cf->can_id & CAN_RTR_FLAG))
stats->rx_bytes += cf->len; stats->rx_bytes += cf->len;
stats->rx_packets++; stats->rx_packets++;
...@@ -1789,10 +1783,9 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch, ...@@ -1789,10 +1783,9 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
priv->gpriv = gpriv; priv->gpriv = gpriv;
SET_NETDEV_DEV(ndev, &pdev->dev); SET_NETDEV_DEV(ndev, &pdev->dev);
netif_napi_add(ndev, &priv->napi, rcar_canfd_rx_poll, netif_napi_add_weight(ndev, &priv->napi, rcar_canfd_rx_poll,
RCANFD_NAPI_WEIGHT); RCANFD_NAPI_WEIGHT);
spin_lock_init(&priv->tx_lock); spin_lock_init(&priv->tx_lock);
devm_can_led_init(ndev);
gpriv->ch[priv->channel] = priv; gpriv->ch[priv->channel] = priv;
err = register_candev(ndev); err = register_candev(ndev);
if (err) { if (err) {
......
...@@ -60,7 +60,6 @@ ...@@ -60,7 +60,6 @@
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include "sja1000.h" #include "sja1000.h"
...@@ -383,8 +382,6 @@ static void sja1000_rx(struct net_device *dev) ...@@ -383,8 +382,6 @@ static void sja1000_rx(struct net_device *dev)
sja1000_write_cmdreg(priv, CMD_RRB); sja1000_write_cmdreg(priv, CMD_RRB);
netif_rx(skb); netif_rx(skb);
can_led_event(dev, CAN_LED_EVENT_RX);
} }
static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)
...@@ -531,7 +528,6 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) ...@@ -531,7 +528,6 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
stats->tx_packets++; stats->tx_packets++;
} }
netif_wake_queue(dev); netif_wake_queue(dev);
can_led_event(dev, CAN_LED_EVENT_TX);
} }
if (isrc & IRQ_RI) { if (isrc & IRQ_RI) {
/* receive interrupt */ /* receive interrupt */
...@@ -587,8 +583,6 @@ static int sja1000_open(struct net_device *dev) ...@@ -587,8 +583,6 @@ static int sja1000_open(struct net_device *dev)
/* init and start chi */ /* init and start chi */
sja1000_start(dev); sja1000_start(dev);
can_led_event(dev, CAN_LED_EVENT_OPEN);
netif_start_queue(dev); netif_start_queue(dev);
return 0; return 0;
...@@ -606,8 +600,6 @@ static int sja1000_close(struct net_device *dev) ...@@ -606,8 +600,6 @@ static int sja1000_close(struct net_device *dev)
close_candev(dev); close_candev(dev);
can_led_event(dev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -673,9 +665,6 @@ int register_sja1000dev(struct net_device *dev) ...@@ -673,9 +665,6 @@ int register_sja1000dev(struct net_device *dev)
ret = register_candev(dev); ret = register_candev(dev);
if (!ret)
devm_can_led_init(dev);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(register_sja1000dev); EXPORT_SYMBOL_GPL(register_sja1000dev);
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/can/core.h> #include <linux/can/core.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/led.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -354,8 +353,6 @@ static void hi3110_hw_rx(struct spi_device *spi) ...@@ -354,8 +353,6 @@ static void hi3110_hw_rx(struct spi_device *spi)
} }
priv->net->stats.rx_packets++; priv->net->stats.rx_packets++;
can_led_event(priv->net, CAN_LED_EVENT_RX);
netif_rx(skb); netif_rx(skb);
} }
...@@ -567,8 +564,6 @@ static int hi3110_stop(struct net_device *net) ...@@ -567,8 +564,6 @@ static int hi3110_stop(struct net_device *net)
mutex_unlock(&priv->hi3110_lock); mutex_unlock(&priv->hi3110_lock);
can_led_event(net, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -725,7 +720,6 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) ...@@ -725,7 +720,6 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)
if (priv->tx_busy && statf & HI3110_STAT_TXMTY) { if (priv->tx_busy && statf & HI3110_STAT_TXMTY) {
net->stats.tx_packets++; net->stats.tx_packets++;
net->stats.tx_bytes += can_get_echo_skb(net, 0, NULL); net->stats.tx_bytes += can_get_echo_skb(net, 0, NULL);
can_led_event(net, CAN_LED_EVENT_TX);
priv->tx_busy = false; priv->tx_busy = false;
netif_wake_queue(net); netif_wake_queue(net);
} }
...@@ -783,7 +777,6 @@ static int hi3110_open(struct net_device *net) ...@@ -783,7 +777,6 @@ static int hi3110_open(struct net_device *net)
if (ret) if (ret)
goto out_free_wq; goto out_free_wq;
can_led_event(net, CAN_LED_EVENT_OPEN);
netif_wake_queue(net); netif_wake_queue(net);
mutex_unlock(&priv->hi3110_lock); mutex_unlock(&priv->hi3110_lock);
...@@ -931,7 +924,6 @@ static int hi3110_can_probe(struct spi_device *spi) ...@@ -931,7 +924,6 @@ static int hi3110_can_probe(struct spi_device *spi)
if (ret) if (ret)
goto error_probe; goto error_probe;
devm_can_led_init(net);
netdev_info(net, "%x successfully initialized.\n", priv->model); netdev_info(net, "%x successfully initialized.\n", priv->model);
return 0; return 0;
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/can/core.h> #include <linux/can/core.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/led.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -738,8 +737,6 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx) ...@@ -738,8 +737,6 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx)
} }
priv->net->stats.rx_packets++; priv->net->stats.rx_packets++;
can_led_event(priv->net, CAN_LED_EVENT_RX);
netif_rx(skb); netif_rx(skb);
} }
...@@ -973,8 +970,6 @@ static int mcp251x_stop(struct net_device *net) ...@@ -973,8 +970,6 @@ static int mcp251x_stop(struct net_device *net)
mutex_unlock(&priv->mcp_lock); mutex_unlock(&priv->mcp_lock);
can_led_event(net, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -1177,7 +1172,6 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) ...@@ -1177,7 +1172,6 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
break; break;
if (intf & CANINTF_TX) { if (intf & CANINTF_TX) {
can_led_event(net, CAN_LED_EVENT_TX);
if (priv->tx_busy) { if (priv->tx_busy) {
net->stats.tx_packets++; net->stats.tx_packets++;
net->stats.tx_bytes += can_get_echo_skb(net, 0, net->stats.tx_bytes += can_get_echo_skb(net, 0,
...@@ -1232,8 +1226,6 @@ static int mcp251x_open(struct net_device *net) ...@@ -1232,8 +1226,6 @@ static int mcp251x_open(struct net_device *net)
if (ret) if (ret)
goto out_free_irq; goto out_free_irq;
can_led_event(net, CAN_LED_EVENT_OPEN);
netif_wake_queue(net); netif_wake_queue(net);
mutex_unlock(&priv->mcp_lock); mutex_unlock(&priv->mcp_lock);
...@@ -1403,8 +1395,6 @@ static int mcp251x_can_probe(struct spi_device *spi) ...@@ -1403,8 +1395,6 @@ static int mcp251x_can_probe(struct spi_device *spi)
if (ret) if (ret)
goto error_probe; goto error_probe;
devm_can_led_init(net);
ret = mcp251x_gpio_setup(priv); ret = mcp251x_gpio_setup(priv);
if (ret) if (ret)
goto error_probe; goto error_probe;
......
...@@ -441,7 +441,7 @@ struct mcp251xfd_hw_tef_obj { ...@@ -441,7 +441,7 @@ struct mcp251xfd_hw_tef_obj {
/* The tx_obj_raw version is used in spi async, i.e. without /* The tx_obj_raw version is used in spi async, i.e. without
* regmap. We have to take care of endianness ourselves. * regmap. We have to take care of endianness ourselves.
*/ */
struct mcp251xfd_hw_tx_obj_raw { struct __packed mcp251xfd_hw_tx_obj_raw {
__le32 id; __le32 id;
__le32 flags; __le32 flags;
u8 data[sizeof_field(struct canfd_frame, data)]; u8 data[sizeof_field(struct canfd_frame, data)];
......
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#include <linux/can.h> #include <linux/can.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -516,8 +515,6 @@ static void sun4i_can_rx(struct net_device *dev) ...@@ -516,8 +515,6 @@ static void sun4i_can_rx(struct net_device *dev)
sun4i_can_write_cmdreg(priv, SUN4I_CMD_RELEASE_RBUF); sun4i_can_write_cmdreg(priv, SUN4I_CMD_RELEASE_RBUF);
netif_rx(skb); netif_rx(skb);
can_led_event(dev, CAN_LED_EVENT_RX);
} }
static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status) static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
...@@ -664,7 +661,6 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id) ...@@ -664,7 +661,6 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
stats->tx_bytes += can_get_echo_skb(dev, 0, NULL); stats->tx_bytes += can_get_echo_skb(dev, 0, NULL);
stats->tx_packets++; stats->tx_packets++;
netif_wake_queue(dev); netif_wake_queue(dev);
can_led_event(dev, CAN_LED_EVENT_TX);
} }
if ((isrc & SUN4I_INT_RBUF_VLD) && if ((isrc & SUN4I_INT_RBUF_VLD) &&
!(isrc & SUN4I_INT_DATA_OR)) { !(isrc & SUN4I_INT_DATA_OR)) {
...@@ -729,7 +725,6 @@ static int sun4ican_open(struct net_device *dev) ...@@ -729,7 +725,6 @@ static int sun4ican_open(struct net_device *dev)
goto exit_can_start; goto exit_can_start;
} }
can_led_event(dev, CAN_LED_EVENT_OPEN);
netif_start_queue(dev); netif_start_queue(dev);
return 0; return 0;
...@@ -756,7 +751,6 @@ static int sun4ican_close(struct net_device *dev) ...@@ -756,7 +751,6 @@ static int sun4ican_close(struct net_device *dev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
close_candev(dev); close_candev(dev);
can_led_event(dev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -883,7 +877,6 @@ static int sun4ican_probe(struct platform_device *pdev) ...@@ -883,7 +877,6 @@ static int sun4ican_probe(struct platform_device *pdev)
DRV_NAME, err); DRV_NAME, err);
goto exit_free; goto exit_free;
} }
devm_can_led_init(dev);
dev_info(&pdev->dev, "device registered (base=%p, irq=%d)\n", dev_info(&pdev->dev, "device registered (base=%p, irq=%d)\n",
priv->base, dev->irq); priv->base, dev->irq);
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/can/rx-offload.h> #include <linux/can/rx-offload.h>
#define DRV_NAME "ti_hecc" #define DRV_NAME "ti_hecc"
...@@ -759,7 +758,6 @@ static irqreturn_t ti_hecc_interrupt(int irq, void *dev_id) ...@@ -759,7 +758,6 @@ static irqreturn_t ti_hecc_interrupt(int irq, void *dev_id)
can_rx_offload_get_echo_skb(&priv->offload, can_rx_offload_get_echo_skb(&priv->offload,
mbxno, stamp, NULL); mbxno, stamp, NULL);
stats->tx_packets++; stats->tx_packets++;
can_led_event(ndev, CAN_LED_EVENT_TX);
--priv->tx_tail; --priv->tx_tail;
} }
...@@ -814,8 +812,6 @@ static int ti_hecc_open(struct net_device *ndev) ...@@ -814,8 +812,6 @@ static int ti_hecc_open(struct net_device *ndev)
return err; return err;
} }
can_led_event(ndev, CAN_LED_EVENT_OPEN);
ti_hecc_start(ndev); ti_hecc_start(ndev);
can_rx_offload_enable(&priv->offload); can_rx_offload_enable(&priv->offload);
netif_start_queue(ndev); netif_start_queue(ndev);
...@@ -834,8 +830,6 @@ static int ti_hecc_close(struct net_device *ndev) ...@@ -834,8 +830,6 @@ static int ti_hecc_close(struct net_device *ndev)
close_candev(ndev); close_candev(ndev);
ti_hecc_transceiver_switch(priv, 0); ti_hecc_transceiver_switch(priv, 0);
can_led_event(ndev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -954,8 +948,6 @@ static int ti_hecc_probe(struct platform_device *pdev) ...@@ -954,8 +948,6 @@ static int ti_hecc_probe(struct platform_device *pdev)
goto probe_exit_offload; goto probe_exit_offload;
} }
devm_can_led_init(ndev);
dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%u)\n", dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%u)\n",
priv->base, (u32)ndev->irq); priv->base, (u32)ndev->irq);
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <linux/can.h> #include <linux/can.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/signal.h> #include <linux/signal.h>
...@@ -232,8 +231,6 @@ static void mcba_usb_write_bulk_callback(struct urb *urb) ...@@ -232,8 +231,6 @@ static void mcba_usb_write_bulk_callback(struct urb *urb)
netdev->stats.tx_packets++; netdev->stats.tx_packets++;
netdev->stats.tx_bytes += can_get_echo_skb(netdev, ctx->ndx, netdev->stats.tx_bytes += can_get_echo_skb(netdev, ctx->ndx,
NULL); NULL);
can_led_event(netdev, CAN_LED_EVENT_TX);
} }
if (urb->status) if (urb->status)
...@@ -452,7 +449,6 @@ static void mcba_usb_process_can(struct mcba_priv *priv, ...@@ -452,7 +449,6 @@ static void mcba_usb_process_can(struct mcba_priv *priv,
} }
stats->rx_packets++; stats->rx_packets++;
can_led_event(priv->netdev, CAN_LED_EVENT_RX);
netif_rx(skb); netif_rx(skb);
} }
...@@ -700,7 +696,6 @@ static int mcba_usb_open(struct net_device *netdev) ...@@ -700,7 +696,6 @@ static int mcba_usb_open(struct net_device *netdev)
priv->can_speed_check = true; priv->can_speed_check = true;
priv->can.state = CAN_STATE_ERROR_ACTIVE; priv->can.state = CAN_STATE_ERROR_ACTIVE;
can_led_event(netdev, CAN_LED_EVENT_OPEN);
netif_start_queue(netdev); netif_start_queue(netdev);
return 0; return 0;
...@@ -732,7 +727,6 @@ static int mcba_usb_close(struct net_device *netdev) ...@@ -732,7 +727,6 @@ static int mcba_usb_close(struct net_device *netdev)
mcba_urb_unlink(priv); mcba_urb_unlink(priv);
close_candev(netdev); close_candev(netdev);
can_led_event(netdev, CAN_LED_EVENT_STOP);
return 0; return 0;
} }
...@@ -857,8 +851,6 @@ static int mcba_usb_probe(struct usb_interface *intf, ...@@ -857,8 +851,6 @@ static int mcba_usb_probe(struct usb_interface *intf,
priv->rx_pipe = usb_rcvbulkpipe(priv->udev, in->bEndpointAddress); priv->rx_pipe = usb_rcvbulkpipe(priv->udev, in->bEndpointAddress);
priv->tx_pipe = usb_sndbulkpipe(priv->udev, out->bEndpointAddress); priv->tx_pipe = usb_sndbulkpipe(priv->udev, out->bEndpointAddress);
devm_can_led_init(netdev);
/* Start USB dev only if we have successfully registered CAN device */ /* Start USB dev only if we have successfully registered CAN device */
err = mcba_usb_start(priv); err = mcba_usb_start(priv);
if (err) { if (err) {
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include <linux/can.h> #include <linux/can.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
/* driver constants */ /* driver constants */
#define MAX_RX_URBS 20 #define MAX_RX_URBS 20
...@@ -480,8 +479,6 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv, ...@@ -480,8 +479,6 @@ static void usb_8dev_rx_can_msg(struct usb_8dev_priv *priv,
stats->rx_packets++; stats->rx_packets++;
netif_rx(skb); netif_rx(skb);
can_led_event(priv->netdev, CAN_LED_EVENT_RX);
} else { } else {
netdev_warn(priv->netdev, "frame type %d unknown", netdev_warn(priv->netdev, "frame type %d unknown",
msg->type); msg->type);
...@@ -582,8 +579,6 @@ static void usb_8dev_write_bulk_callback(struct urb *urb) ...@@ -582,8 +579,6 @@ static void usb_8dev_write_bulk_callback(struct urb *urb)
netdev->stats.tx_packets++; netdev->stats.tx_packets++;
netdev->stats.tx_bytes += can_get_echo_skb(netdev, context->echo_index, NULL); netdev->stats.tx_bytes += can_get_echo_skb(netdev, context->echo_index, NULL);
can_led_event(netdev, CAN_LED_EVENT_TX);
/* Release context */ /* Release context */
context->echo_index = MAX_TX_URBS; context->echo_index = MAX_TX_URBS;
...@@ -807,8 +802,6 @@ static int usb_8dev_open(struct net_device *netdev) ...@@ -807,8 +802,6 @@ static int usb_8dev_open(struct net_device *netdev)
if (err) if (err)
return err; return err;
can_led_event(netdev, CAN_LED_EVENT_OPEN);
/* finally start device */ /* finally start device */
err = usb_8dev_start(priv); err = usb_8dev_start(priv);
if (err) { if (err) {
...@@ -865,8 +858,6 @@ static int usb_8dev_close(struct net_device *netdev) ...@@ -865,8 +858,6 @@ static int usb_8dev_close(struct net_device *netdev)
close_candev(netdev); close_candev(netdev);
can_led_event(netdev, CAN_LED_EVENT_STOP);
return err; return err;
} }
...@@ -974,8 +965,6 @@ static int usb_8dev_probe(struct usb_interface *intf, ...@@ -974,8 +965,6 @@ static int usb_8dev_probe(struct usb_interface *intf,
(version>>8) & 0xff, version & 0xff); (version>>8) & 0xff, version & 0xff);
} }
devm_can_led_init(netdev);
return 0; return 0;
cleanup_unregister_candev: cleanup_unregister_candev:
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/can/dev.h> #include <linux/can/dev.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#define DRIVER_NAME "xilinx_can" #define DRIVER_NAME "xilinx_can"
...@@ -1209,10 +1208,8 @@ static int xcan_rx_poll(struct napi_struct *napi, int quota) ...@@ -1209,10 +1208,8 @@ static int xcan_rx_poll(struct napi_struct *napi, int quota)
XCAN_IXR_RXNEMP_MASK); XCAN_IXR_RXNEMP_MASK);
} }
if (work_done) { if (work_done)
can_led_event(ndev, CAN_LED_EVENT_RX);
xcan_update_error_state_after_rxtx(ndev); xcan_update_error_state_after_rxtx(ndev);
}
if (work_done < quota) { if (work_done < quota) {
if (napi_complete_done(napi, work_done)) { if (napi_complete_done(napi, work_done)) {
...@@ -1298,7 +1295,6 @@ static void xcan_tx_interrupt(struct net_device *ndev, u32 isr) ...@@ -1298,7 +1295,6 @@ static void xcan_tx_interrupt(struct net_device *ndev, u32 isr)
spin_unlock_irqrestore(&priv->tx_lock, flags); spin_unlock_irqrestore(&priv->tx_lock, flags);
can_led_event(ndev, CAN_LED_EVENT_TX);
xcan_update_error_state_after_rxtx(ndev); xcan_update_error_state_after_rxtx(ndev);
} }
...@@ -1420,7 +1416,6 @@ static int xcan_open(struct net_device *ndev) ...@@ -1420,7 +1416,6 @@ static int xcan_open(struct net_device *ndev)
goto err_candev; goto err_candev;
} }
can_led_event(ndev, CAN_LED_EVENT_OPEN);
napi_enable(&priv->napi); napi_enable(&priv->napi);
netif_start_queue(ndev); netif_start_queue(ndev);
...@@ -1452,7 +1447,6 @@ static int xcan_close(struct net_device *ndev) ...@@ -1452,7 +1447,6 @@ static int xcan_close(struct net_device *ndev)
free_irq(ndev->irq, ndev); free_irq(ndev->irq, ndev);
close_candev(ndev); close_candev(ndev);
can_led_event(ndev, CAN_LED_EVENT_STOP);
pm_runtime_put(priv->dev); pm_runtime_put(priv->dev);
return 0; return 0;
...@@ -1804,7 +1798,7 @@ static int xcan_probe(struct platform_device *pdev) ...@@ -1804,7 +1798,7 @@ static int xcan_probe(struct platform_device *pdev)
priv->can.clock.freq = clk_get_rate(priv->can_clk); priv->can.clock.freq = clk_get_rate(priv->can_clk);
netif_napi_add(ndev, &priv->napi, xcan_rx_poll, rx_max); netif_napi_add_weight(ndev, &priv->napi, xcan_rx_poll, rx_max);
ret = register_candev(ndev); ret = register_candev(ndev);
if (ret) { if (ret) {
...@@ -1812,8 +1806,6 @@ static int xcan_probe(struct platform_device *pdev) ...@@ -1812,8 +1806,6 @@ static int xcan_probe(struct platform_device *pdev)
goto err_disableclks; goto err_disableclks;
} }
devm_can_led_init(ndev);
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
if (priv->devtype.flags & XCAN_FLAG_CANFD_2) { if (priv->devtype.flags & XCAN_FLAG_CANFD_2) {
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <linux/can.h> #include <linux/can.h>
#include <linux/can/bittiming.h> #include <linux/can/bittiming.h>
#include <linux/can/error.h> #include <linux/can/error.h>
#include <linux/can/led.h>
#include <linux/can/length.h> #include <linux/can/length.h>
#include <linux/can/netlink.h> #include <linux/can/netlink.h>
#include <linux/can/skb.h> #include <linux/can/skb.h>
...@@ -85,15 +84,6 @@ struct can_priv { ...@@ -85,15 +84,6 @@ struct can_priv {
int (*do_get_berr_counter)(const struct net_device *dev, int (*do_get_berr_counter)(const struct net_device *dev,
struct can_berr_counter *bec); struct can_berr_counter *bec);
int (*do_get_auto_tdcv)(const struct net_device *dev, u32 *tdcv); int (*do_get_auto_tdcv)(const struct net_device *dev, u32 *tdcv);
#ifdef CONFIG_CAN_LEDS
struct led_trigger *tx_led_trig;
char tx_led_trig_name[CAN_LED_NAME_SZ];
struct led_trigger *rx_led_trig;
char rx_led_trig_name[CAN_LED_NAME_SZ];
struct led_trigger *rxtx_led_trig;
char rxtx_led_trig_name[CAN_LED_NAME_SZ];
#endif
}; };
static inline bool can_tdc_is_enabled(const struct can_priv *priv) static inline bool can_tdc_is_enabled(const struct can_priv *priv)
......
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright 2012, Fabio Baltieri <fabio.baltieri@gmail.com>
*/
#ifndef _CAN_LED_H
#define _CAN_LED_H
#include <linux/if.h>
#include <linux/leds.h>
#include <linux/netdevice.h>
enum can_led_event {
CAN_LED_EVENT_OPEN,
CAN_LED_EVENT_STOP,
CAN_LED_EVENT_TX,
CAN_LED_EVENT_RX,
};
#ifdef CONFIG_CAN_LEDS
/* keep space for interface name + "-tx"/"-rx"/"-rxtx"
* suffix and null terminator
*/
#define CAN_LED_NAME_SZ (IFNAMSIZ + 6)
void can_led_event(struct net_device *netdev, enum can_led_event event);
void devm_can_led_init(struct net_device *netdev);
int __init can_led_notifier_init(void);
void __exit can_led_notifier_exit(void);
#else
static inline void can_led_event(struct net_device *netdev,
enum can_led_event event)
{
}
static inline void devm_can_led_init(struct net_device *netdev)
{
}
static inline int can_led_notifier_init(void)
{
return 0;
}
static inline void can_led_notifier_exit(void)
{
}
#endif
#endif /* !_CAN_LED_H */
...@@ -1212,31 +1212,36 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len) ...@@ -1212,31 +1212,36 @@ static int isotp_bind(struct socket *sock, struct sockaddr *uaddr, int len)
struct net *net = sock_net(sk); struct net *net = sock_net(sk);
int ifindex; int ifindex;
struct net_device *dev; struct net_device *dev;
canid_t tx_id, rx_id; canid_t tx_id = addr->can_addr.tp.tx_id;
canid_t rx_id = addr->can_addr.tp.rx_id;
int err = 0; int err = 0;
int notify_enetdown = 0; int notify_enetdown = 0;
if (len < ISOTP_MIN_NAMELEN) if (len < ISOTP_MIN_NAMELEN)
return -EINVAL; return -EINVAL;
/* sanitize tx/rx CAN identifiers */ /* sanitize tx CAN identifier */
tx_id = addr->can_addr.tp.tx_id;
if (tx_id & CAN_EFF_FLAG) if (tx_id & CAN_EFF_FLAG)
tx_id &= (CAN_EFF_FLAG | CAN_EFF_MASK); tx_id &= (CAN_EFF_FLAG | CAN_EFF_MASK);
else else
tx_id &= CAN_SFF_MASK; tx_id &= CAN_SFF_MASK;
rx_id = addr->can_addr.tp.rx_id; /* give feedback on wrong CAN-ID value */
if (rx_id & CAN_EFF_FLAG) if (tx_id != addr->can_addr.tp.tx_id)
rx_id &= (CAN_EFF_FLAG | CAN_EFF_MASK);
else
rx_id &= CAN_SFF_MASK;
/* give feedback on wrong CAN-ID values */
if (tx_id != addr->can_addr.tp.tx_id ||
rx_id != addr->can_addr.tp.rx_id)
return -EINVAL; return -EINVAL;
/* sanitize rx CAN identifier (if needed) */
if (isotp_register_rxid(so)) {
if (rx_id & CAN_EFF_FLAG)
rx_id &= (CAN_EFF_FLAG | CAN_EFF_MASK);
else
rx_id &= CAN_SFF_MASK;
/* give feedback on wrong CAN-ID value */
if (rx_id != addr->can_addr.tp.rx_id)
return -EINVAL;
}
if (!addr->can_ifindex) if (!addr->can_ifindex)
return -ENODEV; return -ENODEV;
......
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