qtnfmac: inform wireless core about supported extended capabilities
authorSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Fri, 5 Oct 2018 10:11:38 +0000 (10:11 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 5 Oct 2018 11:01:24 +0000 (14:01 +0300)
Driver retrieves information about supported extended capabilities
from wireless card. However this information is not propagated
further to Linux wireless core. Fix this by setting extended
capabilities fields of wiphy structure.

Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
drivers/net/wireless/quantenna/qtnfmac/commands.c
drivers/net/wireless/quantenna/qtnfmac/core.c
drivers/net/wireless/quantenna/qtnfmac/core.h

index 8b30d651cbe3b2128989726bf3e07fe992f140b7..8ecd37ddc0f96347f48fa8252637b80bdc966605 100644 (file)
@@ -1129,6 +1129,15 @@ int qtnf_wiphy_register(struct qtnf_hw_info *hw_info, struct qtnf_wmac *mac)
                wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
        }
 
+       if (mac->macinfo.extended_capabilities_len) {
+               wiphy->extended_capabilities =
+                       mac->macinfo.extended_capabilities;
+               wiphy->extended_capabilities_mask =
+                       mac->macinfo.extended_capabilities_mask;
+               wiphy->extended_capabilities_len =
+                       mac->macinfo.extended_capabilities_len;
+       }
+
        strlcpy(wiphy->fw_version, hw_info->fw_version,
                sizeof(wiphy->fw_version));
        wiphy->hw_version = hw_info->hw_version;
index 74edb5a0ae195e43f9adece7dc5fc9c93775fb4c..8dbd6c45c23338a6b8abbbd521c446e0057cda37 100644 (file)
@@ -1273,8 +1273,7 @@ static int qtnf_parse_variable_mac_info(struct qtnf_wmac *mac,
                ext_capa_mask = NULL;
        }
 
-       kfree(mac->macinfo.extended_capabilities);
-       kfree(mac->macinfo.extended_capabilities_mask);
+       qtnf_mac_ext_caps_free(mac);
        mac->macinfo.extended_capabilities = ext_capa;
        mac->macinfo.extended_capabilities_mask = ext_capa_mask;
        mac->macinfo.extended_capabilities_len = ext_capa_len;
index aaa218eb70c837fa659e76e4e8ba1d590f8c71b3..5d18a4a917c9041cbb3ad93596128092840642f8 100644 (file)
@@ -304,6 +304,19 @@ void qtnf_mac_iface_comb_free(struct qtnf_wmac *mac)
        }
 }
 
+void qtnf_mac_ext_caps_free(struct qtnf_wmac *mac)
+{
+       if (mac->macinfo.extended_capabilities_len) {
+               kfree(mac->macinfo.extended_capabilities);
+               mac->macinfo.extended_capabilities = NULL;
+
+               kfree(mac->macinfo.extended_capabilities_mask);
+               mac->macinfo.extended_capabilities_mask = NULL;
+
+               mac->macinfo.extended_capabilities_len = 0;
+       }
+}
+
 static void qtnf_vif_reset_handler(struct work_struct *work)
 {
        struct qtnf_vif *vif = container_of(work, struct qtnf_vif, reset_work);
@@ -496,8 +509,7 @@ static void qtnf_core_mac_detach(struct qtnf_bus *bus, unsigned int macid)
        }
 
        qtnf_mac_iface_comb_free(mac);
-       kfree(mac->macinfo.extended_capabilities);
-       kfree(mac->macinfo.extended_capabilities_mask);
+       qtnf_mac_ext_caps_free(mac);
        kfree(mac->macinfo.wowlan);
        wiphy_free(wiphy);
        bus->mac[macid] = NULL;
index 1722aecf763332781780787ee52c5cc37b04bcf0..293055049caab8d5d11eff97edde4152fe38c7ac 100644 (file)
@@ -144,6 +144,7 @@ struct qtnf_hw_info {
 struct qtnf_vif *qtnf_mac_get_free_vif(struct qtnf_wmac *mac);
 struct qtnf_vif *qtnf_mac_get_base_vif(struct qtnf_wmac *mac);
 void qtnf_mac_iface_comb_free(struct qtnf_wmac *mac);
+void qtnf_mac_ext_caps_free(struct qtnf_wmac *mac);
 struct wiphy *qtnf_wiphy_allocate(struct qtnf_bus *bus);
 int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *priv,
                         const char *name, unsigned char name_assign_type);