wlbt: Use cfg80211_connect_bss instead of cfg80211_connect_result MMI-PSA29.160-50 MMI-PSAS29.160-50-2
authorJaya Prakash Sangaru <j.sangaru@samsung.com>
Thu, 22 Aug 2019 10:56:27 +0000 (16:26 +0530)
committerlingsen1 <lingsen1@lenovo.com>
Fri, 23 Aug 2019 06:27:22 +0000 (14:27 +0800)
When AP is chanGing channel, cfg80211 is having 2 scan results, one
with older channel and another with new channel. cfg80211_connect_result()
API allows cfg80211 to pick bss from its scan data base and in this case
cfg80211 sometimes picks older scan result and supplicant shows wrong
channel number. So use cfg80211_connect_bss instead of cfg80211_connect_result

Change-Id: I27fb6fe37731f97c104228d8515bc211ab5bbcc0
SCSC-Bug-Id: HOST-10749
Signed-off-by: Jaya Prakash Sangaru <j.sangaru@samsung.com>
drivers/net/wireless/scsc/rx.c

index 047582479a00bad973596dfa5ce010c0ae8fa8bf..69ff1080464e1693f02a59dd6bb9a20aeda7f605 100755 (executable)
@@ -1943,9 +1943,12 @@ void slsi_rx_connect_ind(struct slsi_dev *sdev, struct net_device *dev, struct s
                if (!ndev_vif->sta.sta_bss) {
                        if (peer)
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
-                               ndev_vif->sta.sta_bss = cfg80211_get_bss(sdev->wiphy, NULL, peer->address, NULL, 0,  IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
+                               ndev_vif->sta.sta_bss = cfg80211_get_bss(sdev->wiphy, ndev_vif->chan, peer->address,
+                                                                        NULL, 0,  IEEE80211_BSS_TYPE_ANY,
+                                                                        IEEE80211_PRIVACY_ANY);
 #else
-                               ndev_vif->sta.sta_bss = cfg80211_get_bss(sdev->wiphy, NULL, peer->address, NULL, 0,  0, 0);
+                               ndev_vif->sta.sta_bss = cfg80211_get_bss(sdev->wiphy, ndev_vif->chan, peer->address,
+                                                                        NULL, 0,  0, 0);
 #endif
                        if (!ndev_vif->sta.sta_bss) {
                                SLSI_NET_ERR(dev, "sta_bss is not available, terminating the connection (peer: %p)\n", peer);
@@ -1954,14 +1957,21 @@ void slsi_rx_connect_ind(struct slsi_dev *sdev, struct net_device *dev, struct s
                }
        }
 
-       /* cfg80211_connect_result will take a copy of any ASSOC or ASSOC RSP IEs passed to it */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))
+       cfg80211_ref_bss(sdev->wiphy, ndev_vif->sta.sta_bss);
+       cfg80211_connect_bss(dev, bssid, ndev_vif->sta.sta_bss, assoc_ie, assoc_ie_len, assoc_rsp_ie,
+                            assoc_rsp_ie_len, status, GFP_KERNEL, NL80211_TIMEOUT_UNSPECIFIED);
+#else
+       /* cfg80211_connect_result will take a copy of any ASSOC or
+        * ASSOC RSP IEs passed to it
+        */
        cfg80211_connect_result(dev,
                                bssid,
                                assoc_ie, assoc_ie_len,
                                assoc_rsp_ie, assoc_rsp_ie_len,
                                status,
                                GFP_KERNEL);
-
+#endif
        if (status == WLAN_STATUS_SUCCESS) {
                ndev_vif->sta.vif_status = SLSI_VIF_STATUS_CONNECTED;