extern void free_ieee80211(struct net_device *dev);
 extern struct net_device *alloc_ieee80211(int sizeof_priv);
 
+extern void ieee80211_networks_age(struct ieee80211_device *ieee,
+                                  unsigned long age_secs);
+
 extern int ieee80211_set_encryption(struct ieee80211_device *ieee);
 
 /* ieee80211_tx.c */
 
        u32 lock;
        u32 ord_len = sizeof(lock);
 
-       /* Quite if manually disabled. */
+       /* Age scan list entries found before suspend */
+       if (priv->suspend_time) {
+               ieee80211_networks_age(priv->ieee, priv->suspend_time);
+               priv->suspend_time = 0;
+       }
+
+       /* Quiet if manually disabled. */
        if (priv->status & STATUS_RF_KILL_SW) {
                IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
                               "switch\n", priv->net_dev->name);
        pci_disable_device(pci_dev);
        pci_set_power_state(pci_dev, PCI_D3hot);
 
+       priv->suspend_at = get_seconds();
+
        mutex_unlock(&priv->action_mutex);
 
        return 0;
         * the queue of needed */
        netif_device_attach(dev);
 
+       priv->suspend_time = get_seconds() - priv->suspend_at;
+
        /* Bring the device back up */
        if (!(priv->status & STATUS_RF_KILL_SW))
                ipw2100_up(priv, 0);
 
 
        int user_requested_scan;
 
+       /* Track time in suspend */
+       unsigned long suspend_at;
+       unsigned long suspend_time;
+
        u32 interrupts;
        int tx_interrupts;
        int rx_interrupts;
 
 {
        int rc, i, j;
 
+       /* Age scan list entries found before suspend */
+       if (priv->suspend_time) {
+               ieee80211_networks_age(priv->ieee, priv->suspend_time);
+               priv->suspend_time = 0;
+       }
+
        if (priv->status & STATUS_EXIT_PENDING)
                return -EIO;
 
        pci_disable_device(pdev);
        pci_set_power_state(pdev, pci_choose_state(pdev, state));
 
+       priv->suspend_at = get_seconds();
+
        return 0;
 }
 
         * the queue of needed */
        netif_device_attach(dev);
 
+       priv->suspend_time = get_seconds() - priv->suspend_at;
+
        /* Bring the device back up */
        queue_work(priv->workqueue, &priv->up);
 
 
 
        s8 tx_power;
 
+       /* Track time in suspend */
+       unsigned long suspend_at;
+       unsigned long suspend_time;
+
 #ifdef CONFIG_PM
        u32 pm_state[16];
 #endif
 
        ieee->networks = NULL;
 }
 
+void ieee80211_networks_age(struct ieee80211_device *ieee,
+                            unsigned long age_secs)
+{
+       struct ieee80211_network *network = NULL;
+       unsigned long flags;
+       unsigned long age_jiffies = msecs_to_jiffies(age_secs * MSEC_PER_SEC);
+
+       spin_lock_irqsave(&ieee->lock, flags);
+       list_for_each_entry(network, &ieee->network_list, list) {
+               network->last_scanned -= age_jiffies;
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+}
+EXPORT_SYMBOL(ieee80211_networks_age);
+
 static void ieee80211_networks_initialize(struct ieee80211_device *ieee)
 {
        int i;
 
                        break;
 
                if ((oldest == NULL) ||
-                   (target->last_scanned < oldest->last_scanned))
+                   time_before(target->last_scanned, oldest->last_scanned))
                        oldest = target;
        }
 
 
        "?", "a", "b", "ab", "g", "ag", "bg", "abg"
 };
 
+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);
+}
+
 #define MAX_CUSTOM_LEN 64
 static char *ieee80211_translate_scan(struct ieee80211_device *ieee,
                                      char *start, char *stop,
        iwe.cmd = IWEVCUSTOM;
        p = custom;
        p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-                     " Last beacon: %dms ago",
-                     jiffies_to_msecs(jiffies - network->last_scanned));
+                     " Last beacon: %ums ago",
+                     elapsed_jiffies_msecs(network->last_scanned));
        iwe.u.data.length = p - custom;
        if (iwe.u.data.length)
                start = iwe_stream_add_point(info, start, stop, &iwe, custom);
                    time_after(network->last_scanned + ieee->scan_age, jiffies))
                        ev = ieee80211_translate_scan(ieee, ev, stop, network,
                                                      info);
-               else
+               else {
                        IEEE80211_DEBUG_SCAN("Not showing network '%s ("
-                                            "%pM)' due to age (%dms).\n",
+                                            "%pM)' due to age (%ums).\n",
                                             print_ssid(ssid, network->ssid,
                                                         network->ssid_len),
                                             network->bssid,
-                                            jiffies_to_msecs(jiffies -
-                                                             network->
-                                                             last_scanned));
+                                            elapsed_jiffies_msecs(
+                                                      network->last_scanned));
+               }
        }
 
        spin_unlock_irqrestore(&ieee->lock, flags);