From: Jun Zhang <[email protected]> This reverts commit 9363cece406bdf2231444ca06074efb7f2a65f9e.
Signed-off-by: Wenlin Kang <[email protected]> --- drivers/net/can/llce/llce_can.c | 281 ++---------------------- drivers/net/can/llce/llce_can_common.c | 37 +--- include/linux/can/dev/llce_can_common.h | 2 - 3 files changed, 27 insertions(+), 293 deletions(-) diff --git a/drivers/net/can/llce/llce_can.c b/drivers/net/can/llce/llce_can.c index 468fa37b366d..92cf166807d0 100644 --- a/drivers/net/can/llce/llce_can.c +++ b/drivers/net/can/llce/llce_can.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause -/* Copyright 2020-2022 NXP */ +/* Copyright 2020-2021 NXP */ #include <linux/can/dev.h> #include <linux/can/dev/llce_can_common.h> #include <linux/clk.h> @@ -28,8 +28,6 @@ #define LLCE_CAN_MAX_TX_MB 16U -#define LLCE_CAN_MAX_IF 16U - struct llce_can { struct llce_can_dev common; /* Must be the first member */ @@ -39,17 +37,10 @@ struct llce_can { struct mbox_chan *config, *tx; struct clk *clk; - - int basic_filter_addr; - int advanced_filter_addr; - - bool filter_setup_done; - bool logger_iface_up; }; -/* Used to protect access to llce_can_interfaces[i] */ -static DEFINE_MUTEX(llce_can_interfaces_lock); -static struct llce_can *llce_can_interfaces[LLCE_CAN_MAX_IF]; +static bool logging; +module_param(logging, bool, 0660); static const struct can_bittiming_const llce_can_bittiming = { .name = LLCE_CAN_DRV_NAME, @@ -75,8 +66,6 @@ static const struct can_bittiming_const llce_can_data_bittiming = { .brp_inc = 1, }; -static bool is_canfd_dev(struct can_priv *can); - static void config_rx_callback(struct mbox_client *cl, void *msg) { struct llce_can *llce = container_of(cl, struct llce_can, @@ -167,114 +156,6 @@ static int llce_can_deinit(struct llce_can *llce) return 0; } -static int llce_can_interfaces_set(struct llce_can *llce) -{ - int id = llce->common.id; - - if (id >= LLCE_CAN_MAX_IF) - return -EINVAL; - - mutex_lock(&llce_can_interfaces_lock); - llce_can_interfaces[id] = llce; - mutex_unlock(&llce_can_interfaces_lock); - - return 0; -} - -static struct llce_can *llce_can_interfaces_get_unsafe(int id) -{ - struct llce_can *llce; - - if (id >= LLCE_CAN_MAX_IF) - return NULL; - - llce = llce_can_interfaces[id]; - - return llce; -} - -static void llce_can_interfaces_cleanup(struct llce_can *llce) -{ - int id = llce->common.id; - - if (id >= LLCE_CAN_MAX_IF) - return; - - mutex_lock(&llce_can_interfaces_lock); - llce_can_interfaces[id] = NULL; - mutex_unlock(&llce_can_interfaces_lock); -} - -static int llce_can_remove_filter(struct llce_can *llce, int filter) -{ - struct device *dev = llce->config_client.dev; - struct mbox_chan *conf_chan = llce->config; - struct llce_can_command cmd; - int ret; - - if (filter == -EINVAL) - return 0; - - cmd = (struct llce_can_command) { - .cmd_id = LLCE_CAN_CMD_REMOVE_FILTER, - .cmd_list.change_filter.filter_addr = filter, - }; - - ret = send_cmd_msg(conf_chan, &cmd); - if (ret) - dev_err(dev, "Failed to remove filter %d\n", filter); - - return ret; -} - -static void llce_can_filters_cleaup(struct llce_can *llce) -{ - if (!llce->filter_setup_done) - return; - - /* The return value is ignored on purpose. - * We should try to remove all the filters. - */ - llce_can_remove_filter(llce, llce->basic_filter_addr); - llce_can_remove_filter(llce, llce->advanced_filter_addr); -} - -static int llce_can_set_filter_status(struct llce_can *llce, int filter, - bool enabled) -{ - struct device *dev = llce->config_client.dev; - struct mbox_chan *conf_chan = llce->config; - struct llce_can_command cmd; - int ret; - - if (filter == -EINVAL) - return 0; - - cmd = (struct llce_can_command) { - .cmd_id = LLCE_CAN_CMD_SETFILTERENABLESTATUS, - .cmd_list.change_filter.filter_addr = filter, - .cmd_list.change_filter.filter_enabled = !!enabled, - }; - - ret = send_cmd_msg(conf_chan, &cmd); - if (ret) - dev_err(dev, "Failed to set filter status\n"); - - return ret; -} - -static int llce_can_configure_filter(struct llce_can *llce, bool ifup) -{ - if (llce->logger_iface_up) - return llce_can_set_filter_status(llce, - llce->advanced_filter_addr, - ifup); - else - return llce_can_set_filter_status(llce, - llce->basic_filter_addr, - ifup); -} - static void set_rx_filter(struct llce_can_rx_filter *rx_filter, u8 intf, bool canfd) { @@ -329,62 +210,31 @@ static void set_advanced_filter(struct llce_can_command *cmd, u8 intf, .host_receive = LLCE_AF_HOSTRECEIVE_ENABLED, .can2can_routing_table_idx = (u8)0x0U, .can2eth_routing_table_idx = (u8)0x0U, + }; set_rx_filter(&afilt->llce_can_Rx_filter, intf, canfd); } -static int can_add_open_filter(struct net_device *dev) +static int can_add_open_filter(struct mbox_chan *conf_chan, bool canfd) { - struct llce_can *llce = netdev_priv(dev); - struct mbox_chan *conf_chan = llce->config; + struct device *dev = llce_can_chan_dev(conf_chan); struct llce_chan_priv *priv = conf_chan->con_priv; - struct llce_can_advanced_filter *afilt; - struct llce_can_rx_filter *filt; struct llce_can_command cmd; - bool canfd = is_canfd_dev(&llce->common.can); int ret; - if (llce->filter_setup_done) - return llce_can_configure_filter(llce, true); - - set_basic_filter(&cmd, priv->index, canfd); + if (logging) + set_advanced_filter(&cmd, priv->index, canfd); + else + set_basic_filter(&cmd, priv->index, canfd); ret = send_cmd_msg(conf_chan, &cmd); if (ret) { - netdev_err(dev, "Failed to set basic RX filter\n"); + dev_err(dev, "Failed to set RX filter\n"); return ret; } - filt = &cmd.cmd_list.set_filter.rx_filters[0]; - llce->basic_filter_addr = filt->filter_addr; - set_advanced_filter(&cmd, priv->index, canfd); - ret = send_cmd_msg(conf_chan, &cmd); - if (ret) { - netdev_err(dev, "Failed to set advanced RX filter\n"); - llce->advanced_filter_addr = -EINVAL; - llce->filter_setup_done = true; - /* Return 0 on purpose. - * Adding an advanced filter with logging enabled will fail if - * the firmware does not support logging or if the firmware does - * not have enough filters assigned to the current interface, - * which is not the case. - */ - return 0; - } - afilt = &cmd.cmd_list.set_advanced_filter.advanced_filters[0]; - llce->advanced_filter_addr = afilt->llce_can_Rx_filter.filter_addr; - - llce->filter_setup_done = true; - - if (llce->logger_iface_up) - return llce_can_set_filter_status(llce, - llce->basic_filter_addr, - false); - else - return llce_can_set_filter_status(llce, - llce->advanced_filter_addr, - false); + return 0; } static bool state_transition(struct mbox_chan *conf_chan, @@ -542,76 +392,6 @@ static int llce_set_data_bittiming(struct net_device *dev) return 0; } -static int llce_can_device_event(struct notifier_block *nb, - unsigned long action, void *data) -{ - struct net_device *dev = netdev_notifier_info_to_dev(data); - struct llce_can_dev *common = netdev_priv(dev); - bool adv_filter_en, base_filter_en; - struct net_device *llce_can_netdev; - struct llce_can *llce; - int ret; - - if (!strstr(dev->name, "llcelogger")) - goto llce_can_event_out; - - if (common->id >= LLCE_CAN_MAX_IF) - goto llce_can_event_out; - - mutex_lock(&llce_can_interfaces_lock); - llce = llce_can_interfaces_get_unsafe(common->id); - - if (!llce) - goto llce_can_event_out_unlock; - - switch (action) { - case NETDEV_DOWN: - llce->logger_iface_up = false; - break; - case NETDEV_UP: - llce->logger_iface_up = true; - break; - } - - if (!llce->filter_setup_done) - goto llce_can_event_out_unlock; - - if (!(common->can.dev->flags & IFF_UP)) - goto llce_can_event_out_unlock; - - if (llce->logger_iface_up) { - adv_filter_en = true; - base_filter_en = false; - } else { - adv_filter_en = false; - base_filter_en = true; - } - - llce_can_netdev = llce->common.can.dev; - - ret = llce_can_set_filter_status(llce, llce->basic_filter_addr, - base_filter_en); - if (ret) - netdev_err(llce_can_netdev, - "Failed to set basic filter status when %s goes %s\n", - dev->name, llce->logger_iface_up ? "up" : "down"); - ret = llce_can_set_filter_status(llce, llce->advanced_filter_addr, - adv_filter_en); - if (ret) - netdev_err(llce_can_netdev, - "Failed to set advanced filter status when %s goes %s\n", - dev->name, llce->logger_iface_up ? "up" : "down"); - -llce_can_event_out_unlock: - mutex_unlock(&llce_can_interfaces_lock); -llce_can_event_out: - return NOTIFY_DONE; -} - -static struct notifier_block llce_can_notifier = { - .notifier_call = llce_can_device_event, -}; - static int llce_can_open(struct net_device *dev) { struct llce_can *llce = netdev_priv(dev); @@ -630,7 +410,7 @@ static int llce_can_open(struct net_device *dev) if (ret) goto close_dev; - ret = can_add_open_filter(dev); + ret = can_add_open_filter(llce->config, is_canfd_dev(can)); if (ret) goto can_deinit; @@ -691,8 +471,6 @@ static int llce_can_close(struct net_device *dev) struct llce_can_dev *common = &llce->common; int ret, ret1; - llce_can_configure_filter(llce, false); - netif_stop_queue(dev); ret = stop_llce_can(llce); @@ -893,23 +671,12 @@ static int llce_can_probe(struct platform_device *pdev) enable_llce_napi(common); - llce->filter_setup_done = false; - ret = llce_can_interfaces_set(llce); - if (ret) { - dev_err(dev, "LLCE interface ID %d equal or greather than %d\n", - LLCE_CAN_MAX_IF, common->id); - goto free_conf_chan; - } - ret = register_candev(netdev); if (ret) { dev_err(dev, "Failed to register %s\n", netdev->name); - goto free_conf_chan; + mbox_free_channel(llce->config); } -free_conf_chan: - if (ret) - mbox_free_channel(llce->config); free_mem: if (ret) free_llce_netdev(common); @@ -923,9 +690,6 @@ static int llce_can_remove(struct platform_device *pdev) struct llce_can *llce = netdev_priv(netdev); struct llce_can_dev *common = &llce->common; - llce_can_interfaces_cleanup(llce); - llce_can_filters_cleaup(llce); - unregister_candev(netdev); netif_napi_del(&common->napi); @@ -989,22 +753,7 @@ static struct platform_driver llce_can_driver = { .pm = &llce_can_pm_ops, }, }; - -static __init int llce_can_drv_init(void) -{ - register_netdevice_notifier(&llce_can_notifier); - - return platform_driver_register(&llce_can_driver); -} - -static void __exit llce_can_drv_exit(void) -{ - unregister_netdevice_notifier(&llce_can_notifier); - platform_driver_unregister(&llce_can_driver); -} - -module_init(llce_can_drv_init); -module_exit(llce_can_drv_exit); +module_platform_driver(llce_can_driver) MODULE_AUTHOR("Ghennadi Procopciuc <[email protected]>"); MODULE_DESCRIPTION("NXP LLCE CAN"); diff --git a/drivers/net/can/llce/llce_can_common.c b/drivers/net/can/llce/llce_can_common.c index 9a92fb62bbbe..06d8a5f44020 100644 --- a/drivers/net/can/llce/llce_can_common.c +++ b/drivers/net/can/llce/llce_can_common.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause -/* Copyright 2021-2022 NXP */ +/* Copyright 2021 NXP */ #include <linux/can/dev.h> #include <linux/can/dev/llce_can_common.h> #include <linux/ctype.h> @@ -128,42 +128,36 @@ static const struct llce_error llce_errors[] = { LLCE_CAN_ERROR_ENTRY(LLCE_NOTIF_BUSOFF_DONE), }; -static int get_llce_can_id(const char *node_name, int *id) +static int get_llce_can_id(const char *node_name, unsigned long *id) { const char *p = node_name + strlen(node_name) - 1; while (isdigit(*p)) p--; - return kstrtoint(p + 1, 10, id); + return kstrtoul(p + 1, 10, id); } -static int get_netdev_id(struct device *dev) +static void *get_netdev_name(struct device *dev, const char *basename) { + unsigned long id; + char *dev_name; const char *node_name; - int id; + size_t name_len; node_name = dev->of_node->name; if (get_llce_can_id(node_name, &id)) { dev_err(dev, "Failed to detect node id for: %s\n", node_name); - return -EIO; + return ERR_PTR(-EIO); } - return id; -} - -static void *get_netdev_name(struct device *dev, const char *basename, int id) -{ - char *dev_name; - size_t name_len; - /* 0-99 device ids + \0 */ name_len = strlen(basename) + 3; dev_name = devm_kmalloc(dev, name_len, GFP_KERNEL); if (!dev_name) return ERR_PTR(-ENOMEM); - snprintf(dev_name, name_len, "%s%d", basename, id); + snprintf(dev_name, name_len, "%s%lu", basename, id); return dev_name; } @@ -556,19 +550,13 @@ struct llce_can_dev *init_llce_can_dev(struct device *dev, size_t priv_size, char *dev_name; struct llce_can_dev *llce; struct net_device *netdev; - int id, ret = 0; + int ret = 0; netdev = alloc_candev(priv_size, 1); if (!netdev) return ERR_PTR(-ENOMEM); - id = get_netdev_id(dev); - if (id < 0) { - ret = id; - goto free_mem; - } - - dev_name = get_netdev_name(dev, basename, id); + dev_name = get_netdev_name(dev, basename); if (IS_ERR_VALUE(dev_name)) { ret = PTR_ERR(dev_name); goto free_mem; @@ -578,7 +566,7 @@ struct llce_can_dev *init_llce_can_dev(struct device *dev, size_t priv_size, SET_NETDEV_DEV(netdev, dev); llce = netdev_priv(netdev); - llce->id = id; + llce->stats = devm_kcalloc(dev, ARRAY_SIZE(llce_errors), sizeof(*llce->stats), GFP_KERNEL); if (!llce->stats) { @@ -589,7 +577,6 @@ struct llce_can_dev *init_llce_can_dev(struct device *dev, size_t priv_size, init_llce_rx_client(llce, dev); netdev->ethtool_ops = &llce_can_ethtool_ops; - free_mem: if (ret) { free_candev(netdev); diff --git a/include/linux/can/dev/llce_can_common.h b/include/linux/can/dev/llce_can_common.h index 9565c73f6263..9bb85df7f2f2 100644 --- a/include/linux/can/dev/llce_can_common.h +++ b/include/linux/can/dev/llce_can_common.h @@ -22,8 +22,6 @@ struct llce_can_dev { struct mbox_chan *config, *rx; u64 *stats; atomic_t rx_processing; - - int id; }; static inline bool is_llce_rx_busy(struct llce_can_dev *dev) -- 2.25.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#13659): https://lists.yoctoproject.org/g/linux-yocto/message/13659 Mute This Topic: https://lists.yoctoproject.org/mt/104804619/21656 Group Owner: [email protected] Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
