qtnfmac: remove VIF in firmware in case of error
authorIgor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Mon, 18 Nov 2019 08:23:04 +0000 (08:23 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 20 Nov 2019 07:42:55 +0000 (09:42 +0200)
Currently in case of error when registering network device with the
kernel, we won't properly cleanup VIF state in firmware due to DEL_VIF
command will not be send to wifi card. Make sure it does.

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
drivers/net/wireless/quantenna/qtnfmac/core.c

index aa0ed0f..4f02159 100644 (file)
@@ -238,22 +238,20 @@ static struct wireless_dev *qtnf_add_virtual_intf(struct wiphy *wiphy,
                pr_err("VIF%u.%u: FW reported bad MAC: %pM\n",
                       mac->macid, vif->vifid, vif->mac_addr);
                ret = -EINVAL;
-               goto err_mac;
+               goto error_del_vif;
        }
 
        ret = qtnf_core_net_attach(mac, vif, name, name_assign_t);
        if (ret) {
                pr_err("VIF%u.%u: failed to attach netdev\n", mac->macid,
                       vif->vifid);
-               goto err_net;
+               goto error_del_vif;
        }
 
        vif->wdev.netdev = vif->netdev;
        return &vif->wdev;
 
-err_net:
-       vif->netdev = NULL;
-err_mac:
+error_del_vif:
        qtnf_cmd_send_del_intf(vif);
 err_cmd:
        vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
index 8116b22..9ccc17a 100644 (file)
@@ -465,10 +465,8 @@ int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *vif,
 
        dev = alloc_netdev_mqs(sizeof(struct qtnf_vif *), name,
                               name_assign_type, ether_setup, 1, 1);
-       if (!dev) {
-               vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
+       if (!dev)
                return -ENOMEM;
-       }
 
        vif->netdev = dev;
 
@@ -491,7 +489,7 @@ int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *vif,
        ret = register_netdevice(dev);
        if (ret) {
                free_netdev(dev);
-               vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
+               vif->netdev = NULL;
        }
 
        return ret;
@@ -588,19 +586,19 @@ static int qtnf_core_mac_attach(struct qtnf_bus *bus, unsigned int macid)
        ret = qtnf_cmd_send_get_phy_params(mac);
        if (ret) {
                pr_err("MAC%u: failed to get PHY settings\n", macid);
-               goto error;
+               goto error_del_vif;
        }
 
        ret = qtnf_mac_init_bands(mac);
        if (ret) {
                pr_err("MAC%u: failed to init bands\n", macid);
-               goto error;
+               goto error_del_vif;
        }
 
        ret = qtnf_wiphy_register(&bus->hw_info, mac);
        if (ret) {
                pr_err("MAC%u: wiphy registration failed\n", macid);
-               goto error;
+               goto error_del_vif;
        }
 
        mac->wiphy_registered = 1;
@@ -612,15 +610,16 @@ static int qtnf_core_mac_attach(struct qtnf_bus *bus, unsigned int macid)
 
        if (ret) {
                pr_err("MAC%u: failed to attach netdev\n", macid);
-               vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
-               vif->netdev = NULL;
-               goto error;
+               goto error_del_vif;
        }
 
        pr_debug("MAC%u initialized\n", macid);
 
        return 0;
 
+error_del_vif:
+       qtnf_cmd_send_del_intf(vif);
+       vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 error:
        qtnf_core_mac_detach(bus, macid);
        return ret;