mwifiex: skip sending GT_REKEY_OFFLOAD_CFG if firmware has no support
authorGanapathi Bhat <gbhat@marvell.com>
Fri, 25 May 2018 20:39:22 +0000 (02:09 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 29 May 2018 07:23:50 +0000 (10:23 +0300)
If firmware does not support embedded supplicant, then it in turn
will not support GT rekey offloading. If this is the case, then
driver must not advertise WOWLAN flags related to GTK rekey and
it must also skip sending the GT_REKEY_OFFLOAD_CFG command.

Signed-off-by: Shrenik Shikhare <shrenik@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/cfg80211.c
drivers/net/wireless/marvell/mwifiex/fw.h
drivers/net/wireless/marvell/mwifiex/sta_event.c

index 54a2297010d2cab5501a6c2f94e447df0e8a2671..d04a59903e8239a8dab3985347315c305fc9627f 100644 (file)
@@ -3555,6 +3555,9 @@ static int mwifiex_set_rekey_data(struct wiphy *wiphy, struct net_device *dev,
 {
        struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
 
+       if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info))
+               return -EOPNOTSUPP;
+
        return mwifiex_send_cmd(priv, HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG,
                                HostCmd_ACT_GEN_SET, 0, data, true);
 }
@@ -4190,6 +4193,16 @@ static const struct wiphy_wowlan_support mwifiex_wowlan_support = {
        .max_pkt_offset = MWIFIEX_MAX_OFFSET_LEN,
        .max_nd_match_sets = MWIFIEX_MAX_ND_MATCH_SETS,
 };
+
+static const struct wiphy_wowlan_support mwifiex_wowlan_support_no_gtk = {
+       .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
+                WIPHY_WOWLAN_NET_DETECT,
+       .n_patterns = MWIFIEX_MEF_MAX_FILTERS,
+       .pattern_min_len = 1,
+       .pattern_max_len = MWIFIEX_MAX_PATTERN_LEN,
+       .max_pkt_offset = MWIFIEX_MAX_OFFSET_LEN,
+       .max_nd_match_sets = MWIFIEX_MAX_ND_MATCH_SETS,
+};
 #endif
 
 static bool mwifiex_is_valid_alpha2(const char *alpha2)
@@ -4308,7 +4321,10 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
                                WIPHY_FLAG_TDLS_EXTERNAL_SETUP;
 
 #ifdef CONFIG_PM
-       wiphy->wowlan = &mwifiex_wowlan_support;
+       if (ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info))
+               wiphy->wowlan = &mwifiex_wowlan_support;
+       else
+               wiphy->wowlan = &mwifiex_wowlan_support_no_gtk;
 #endif
 
        wiphy->coalesce = &mwifiex_coalesce_support;
index c5dc518f768b5373bb4e111c389fdf1c7e6335df..b73f99dc5a72e0a78478d6613c6a9b2af93a5906 100644 (file)
@@ -249,6 +249,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
 #define ISSUPP_SDIO_SPA_ENABLED(FwCapInfo) (FwCapInfo & BIT(16))
 #define ISSUPP_ADHOC_ENABLED(FwCapInfo) (FwCapInfo & BIT(25))
 #define ISSUPP_RANDOM_MAC(FwCapInfo) (FwCapInfo & BIT(27))
+#define ISSUPP_FIRMWARE_SUPPLICANT(FwCapInfo) (FwCapInfo & BIT(21))
 
 #define MWIFIEX_DEF_HT_CAP     (IEEE80211_HT_CAP_DSSSCCK40 | \
                                 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT) | \
index 93dfb76cd8a6974db8c3e6ab13cc1b3065a24c1d..03a6492662cad6a2311f5a13d21f312f45646141 100644 (file)
@@ -241,6 +241,9 @@ void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code,
        if (netif_carrier_ok(priv->netdev))
                netif_carrier_off(priv->netdev);
 
+       if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info))
+               return;
+
        mwifiex_send_cmd(priv, HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG,
                         HostCmd_ACT_GEN_REMOVE, 0, NULL, false);
 }