*     case.
  * @bssid: The BSSID of the AP (may be %NULL)
  * @bss: Entry of bss to which STA got connected to, can be obtained through
- *     cfg80211_get_bss() (may be %NULL). Only one parameter among @bssid and
- *     @bss needs to be specified.
+ *     cfg80211_get_bss() (may be %NULL). But it is recommended to store the
+ *     bss from the connect_request and hold a reference to it and return
+ *     through this param to avoid a warning if the bss is expired during the
+ *     connection, esp. for those drivers implementing connect op.
+ *     Only one parameter among @bssid and @bss needs to be specified.
  * @req_ie: Association request IEs (may be %NULL)
  * @req_ie_len: Association request IEs length
  * @resp_ie: Association response IEs (may be %NULL)
  *
  * @dev: network device
  * @bssid: the BSSID of the AP
- * @bss: entry of bss to which STA got connected to, can be obtained
- *     through cfg80211_get_bss (may be %NULL)
+ * @bss: Entry of bss to which STA got connected to, can be obtained through
+ *     cfg80211_get_bss() (may be %NULL). But it is recommended to store the
+ *     bss from the connect_request and hold a reference to it and return
+ *     through this param to avoid a warning if the bss is expired during the
+ *     connection, esp. for those drivers implementing connect op.
+ *     Only one parameter among @bssid and @bss needs to be specified.
  * @req_ie: association request IEs (maybe be %NULL)
  * @req_ie_len: association request IEs length
  * @resp_ie: association response IEs (may be %NULL)
 
 void cfg80211_stop_nan(struct cfg80211_registered_device *rdev,
                       struct wireless_dev *wdev);
 
+struct cfg80211_internal_bss *
+cfg80211_bss_update(struct cfg80211_registered_device *rdev,
+                   struct cfg80211_internal_bss *tmp,
+                   bool signal_valid, unsigned long ts);
 #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
 #define CFG80211_DEV_WARN_ON(cond)     WARN_ON(cond)
 #else
 
 };
 
 /* Returned bss is reference counted and must be cleaned up appropriately. */
-static struct cfg80211_internal_bss *
+struct cfg80211_internal_bss *
 cfg80211_bss_update(struct cfg80211_registered_device *rdev,
                    struct cfg80211_internal_bss *tmp,
-                   bool signal_valid)
+                   bool signal_valid, unsigned long ts)
 {
        struct cfg80211_internal_bss *found = NULL;
 
        if (WARN_ON(!tmp->pub.channel))
                return NULL;
 
-       tmp->ts = jiffies;
+       tmp->ts = ts;
 
        spin_lock_bh(&rdev->bss_lock);
 
 
        signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
                wiphy->max_adj_channel_rssi_comp;
-       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
+       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid,
+                                 jiffies);
        if (!res)
                return NULL;
 
 
        signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
                wiphy->max_adj_channel_rssi_comp;
-       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
+       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid,
+                                 jiffies);
        if (!res)
                return NULL;
 
 
        u8 *next;
 
        if (params->bss) {
-               /* Make sure the bss entry provided by the driver is valid. */
                struct cfg80211_internal_bss *ibss = bss_from_pub(params->bss);
 
-               if (WARN_ON(list_empty(&ibss->list))) {
-                       cfg80211_put_bss(wdev->wiphy, params->bss);
-                       return;
+               if (list_empty(&ibss->list)) {
+                       struct cfg80211_bss *found = NULL, *tmp = params->bss;
+
+                       found = cfg80211_get_bss(wdev->wiphy, NULL,
+                                                params->bss->bssid,
+                                                wdev->ssid, wdev->ssid_len,
+                                                wdev->conn_bss_type,
+                                                IEEE80211_PRIVACY_ANY);
+                       if (found) {
+                               /* The same BSS is already updated so use it
+                                * instead, as it has latest info.
+                                */
+                               params->bss = found;
+                       } else {
+                               /* Update with BSS provided by driver, it will
+                                * be freshly added and ref cnted, we can free
+                                * the old one.
+                                *
+                                * signal_valid can be false, as we are not
+                                * expecting the BSS to be found.
+                                *
+                                * keep the old timestamp to avoid confusion
+                                */
+                               cfg80211_bss_update(rdev, ibss, false,
+                                                   ibss->ts);
+                       }
+
+                       cfg80211_put_bss(wdev->wiphy, tmp);
                }
        }