| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * This file contains the major functions in WLAN |
|---|
| 3 | 4 | * driver. It includes init, exit, open, close and main |
|---|
| .. | .. |
|---|
| 216 | 217 | |
|---|
| 217 | 218 | spin_lock_irqsave(&priv->driver_lock, flags); |
|---|
| 218 | 219 | priv->iface_running = false; |
|---|
| 219 | | - kfree_skb(priv->currenttxskb); |
|---|
| 220 | + dev_kfree_skb_irq(priv->currenttxskb); |
|---|
| 220 | 221 | priv->currenttxskb = NULL; |
|---|
| 221 | 222 | priv->tx_pending_len = 0; |
|---|
| 222 | 223 | spin_unlock_irqrestore(&priv->driver_lock, flags); |
|---|
| .. | .. |
|---|
| 720 | 721 | * lbs_cmd_timeout_handler - handles the timeout of command sending. |
|---|
| 721 | 722 | * It will re-send the same command again. |
|---|
| 722 | 723 | * |
|---|
| 723 | | - * @data: &struct lbs_private pointer |
|---|
| 724 | + * @t: Context from which to retrieve a &struct lbs_private pointer |
|---|
| 724 | 725 | */ |
|---|
| 725 | 726 | static void lbs_cmd_timeout_handler(struct timer_list *t) |
|---|
| 726 | 727 | { |
|---|
| .. | .. |
|---|
| 754 | 755 | * to the hardware. This is known to frequently happen with SD8686 when |
|---|
| 755 | 756 | * waking up after a Wake-on-WLAN-triggered resume. |
|---|
| 756 | 757 | * |
|---|
| 757 | | - * @data: &struct lbs_private pointer |
|---|
| 758 | + * @t: Context from which to retrieve a &struct lbs_private pointer |
|---|
| 758 | 759 | */ |
|---|
| 759 | 760 | static void lbs_tx_lockup_handler(struct timer_list *t) |
|---|
| 760 | 761 | { |
|---|
| .. | .. |
|---|
| 776 | 777 | /** |
|---|
| 777 | 778 | * auto_deepsleep_timer_fn - put the device back to deep sleep mode when |
|---|
| 778 | 779 | * timer expires and no activity (command, event, data etc.) is detected. |
|---|
| 779 | | - * @data: &struct lbs_private pointer |
|---|
| 780 | + * @t: Context from which to retrieve a &struct lbs_private pointer |
|---|
| 780 | 781 | * returns: N/A |
|---|
| 781 | 782 | */ |
|---|
| 782 | 783 | static void auto_deepsleep_timer_fn(struct timer_list *t) |
|---|
| .. | .. |
|---|
| 869 | 870 | ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL); |
|---|
| 870 | 871 | if (ret) { |
|---|
| 871 | 872 | pr_err("Out of memory allocating event FIFO buffer\n"); |
|---|
| 873 | + lbs_free_cmd_buffer(priv); |
|---|
| 872 | 874 | goto out; |
|---|
| 873 | 875 | } |
|---|
| 874 | 876 | |
|---|
| .. | .. |
|---|
| 907 | 909 | struct net_device *dev; |
|---|
| 908 | 910 | struct wireless_dev *wdev; |
|---|
| 909 | 911 | struct lbs_private *priv = NULL; |
|---|
| 912 | + int err; |
|---|
| 910 | 913 | |
|---|
| 911 | 914 | /* Allocate an Ethernet device and register it */ |
|---|
| 912 | 915 | wdev = lbs_cfg_alloc(dmdev); |
|---|
| 913 | 916 | if (IS_ERR(wdev)) { |
|---|
| 917 | + err = PTR_ERR(wdev); |
|---|
| 914 | 918 | pr_err("cfg80211 init failed\n"); |
|---|
| 915 | | - goto done; |
|---|
| 919 | + goto err_cfg; |
|---|
| 916 | 920 | } |
|---|
| 917 | 921 | |
|---|
| 918 | 922 | wdev->iftype = NL80211_IFTYPE_STATION; |
|---|
| 919 | 923 | priv = wdev_priv(wdev); |
|---|
| 920 | 924 | priv->wdev = wdev; |
|---|
| 921 | 925 | |
|---|
| 922 | | - if (lbs_init_adapter(priv)) { |
|---|
| 926 | + err = lbs_init_adapter(priv); |
|---|
| 927 | + if (err) { |
|---|
| 923 | 928 | pr_err("failed to initialize adapter structure\n"); |
|---|
| 924 | 929 | goto err_wdev; |
|---|
| 925 | 930 | } |
|---|
| 926 | 931 | |
|---|
| 927 | 932 | dev = alloc_netdev(0, "wlan%d", NET_NAME_UNKNOWN, ether_setup); |
|---|
| 928 | 933 | if (!dev) { |
|---|
| 934 | + err = -ENOMEM; |
|---|
| 929 | 935 | dev_err(dmdev, "no memory for network device instance\n"); |
|---|
| 930 | 936 | goto err_adapter; |
|---|
| 931 | 937 | } |
|---|
| .. | .. |
|---|
| 949 | 955 | init_waitqueue_head(&priv->waitq); |
|---|
| 950 | 956 | priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main"); |
|---|
| 951 | 957 | if (IS_ERR(priv->main_thread)) { |
|---|
| 958 | + err = PTR_ERR(priv->main_thread); |
|---|
| 952 | 959 | lbs_deb_thread("Error creating main thread.\n"); |
|---|
| 953 | 960 | goto err_ndev; |
|---|
| 954 | 961 | } |
|---|
| .. | .. |
|---|
| 961 | 968 | priv->wol_gap = 20; |
|---|
| 962 | 969 | priv->ehs_remove_supported = true; |
|---|
| 963 | 970 | |
|---|
| 964 | | - goto done; |
|---|
| 971 | + return priv; |
|---|
| 965 | 972 | |
|---|
| 966 | 973 | err_ndev: |
|---|
| 967 | 974 | free_netdev(dev); |
|---|
| .. | .. |
|---|
| 972 | 979 | err_wdev: |
|---|
| 973 | 980 | lbs_cfg_free(priv); |
|---|
| 974 | 981 | |
|---|
| 975 | | - priv = NULL; |
|---|
| 976 | | - |
|---|
| 977 | | -done: |
|---|
| 978 | | - return priv; |
|---|
| 982 | + err_cfg: |
|---|
| 983 | + return ERR_PTR(err); |
|---|
| 979 | 984 | } |
|---|
| 980 | 985 | EXPORT_SYMBOL_GPL(lbs_add_card); |
|---|
| 981 | 986 | |
|---|
| .. | .. |
|---|
| 1042 | 1047 | int lbs_start_card(struct lbs_private *priv) |
|---|
| 1043 | 1048 | { |
|---|
| 1044 | 1049 | struct net_device *dev = priv->dev; |
|---|
| 1045 | | - int ret = -1; |
|---|
| 1050 | + int ret; |
|---|
| 1046 | 1051 | |
|---|
| 1047 | 1052 | /* poke the firmware */ |
|---|
| 1048 | 1053 | ret = lbs_setup_firmware(priv); |
|---|