struct rb_root bss_tree;
        u32 bss_generation;
        struct cfg80211_scan_request *scan_req; /* protected by RTNL */
+       unsigned long suspend_at;
 
        /* must be last because of the way we do wiphy_priv(),
         * and it should at least be aligned to NETDEV_ALIGN */
 void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby);
 
 void cfg80211_bss_expire(struct cfg80211_registered_device *dev);
+void cfg80211_bss_age(struct cfg80211_registered_device *dev,
+                      unsigned long age_secs);
 
 #endif /* __NET_WIRELESS_CORE_H */
 
        kfree(bss);
 }
 
+/* must hold dev->bss_lock! */
+void cfg80211_bss_age(struct cfg80211_registered_device *dev,
+                      unsigned long age_secs)
+{
+       struct cfg80211_internal_bss *bss;
+       unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC);
+
+       list_for_each_entry(bss, &dev->bss_list, list) {
+               bss->ts -= age_jiffies;
+       }
+}
+
 /* must hold dev->bss_lock! */
 void cfg80211_bss_expire(struct cfg80211_registered_device *dev)
 {
        }
 }
 
+static inline unsigned int elapsed_jiffies_msecs(unsigned long start)
+{
+       unsigned long end = jiffies;
+
+       if (end >= start)
+               return jiffies_to_msecs(end - start);
+
+       return jiffies_to_msecs(end + (MAX_JIFFY_OFFSET - start) + 1);
+}
 
 static char *
 ieee80211_bss(struct iw_request_info *info,
                                                  &iwe, buf);
                memset(&iwe, 0, sizeof(iwe));
                iwe.cmd = IWEVCUSTOM;
-               sprintf(buf, " Last beacon: %dms ago",
-                       jiffies_to_msecs(jiffies - bss->ts));
+               sprintf(buf, " Last beacon: %ums ago",
+                       elapsed_jiffies_msecs(bss->ts));
                iwe.u.data.length = strlen(buf);
                current_ev = iwe_stream_add_point(info, current_ev,
                                                  end_buf, &iwe, buf);
 
        struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
        int ret = 0;
 
+       rdev->suspend_at = get_seconds();
+
        if (rdev->ops->suspend) {
                rtnl_lock();
                ret = rdev->ops->suspend(&rdev->wiphy);
        struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
        int ret = 0;
 
+       /* Age scan results with time spent in suspend */
+       spin_lock_bh(&rdev->bss_lock);
+       cfg80211_bss_age(rdev, get_seconds() - rdev->suspend_at);
+       spin_unlock_bh(&rdev->bss_lock);
+
        if (rdev->ops->resume) {
                rtnl_lock();
                ret = rdev->ops->resume(&rdev->wiphy);