#include <linux/workqueue.h>
 #include <linux/firmware.h>
 #include <linux/mutex.h>
+#include <linux/etherdevice.h>
 
 #include <net/mac80211.h>
 
                ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP));
 }
 
+static inline int is_beacon(u16 fc)
+{
+       return (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
+               ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON));
+}
+
 /*
  * Chipset identification
  * The chipset on the device is composed of a RT and RF chip.
 
                      struct rxdata_entry_desc *desc)
 {
        struct rt2x00_dev *rt2x00dev = entry->ring->rt2x00dev;
+       struct interface *intf = &rt2x00dev->interface;
        struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
        struct ieee80211_hw_mode *mode;
        struct ieee80211_rate *rate;
+       struct ieee80211_hdr *hdr;
        unsigned int i;
        int val = 0;
+       u16 fc;
 
        /*
         * Update RX statistics.
                }
        }
 
-       rt2x00lib_update_link_stats(&rt2x00dev->link, desc->rssi);
+       /*
+        * Only update link status if this is a beacon frame carrying our
+        * bssid.
+        */
+       hdr = (struct ieee80211_hdr *) skb->data;
+       if (skb->len >= sizeof(struct ieee80211_hdr *)) {
+               fc = le16_to_cpu(hdr->frame_control);
+               if ((intf->type == IEEE80211_IF_TYPE_STA
+                    || intf->type == IEEE80211_IF_TYPE_IBSS)
+                   && is_beacon(fc)
+                   && compare_ether_addr(hdr->addr3, intf->bssid) == 0)
+                       rt2x00lib_update_link_stats(&rt2x00dev->link,
+                                                   desc->rssi);
+       }
+
        rt2x00dev->link.qual.rx_success++;
 
        rx_status->rate = val;