aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Nissler <mattias.nissler@gmx.de>2007-11-27 15:50:26 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:05:09 -0500
commit61af43c56bef2cfcb8f1d9aab4e766e0f7bdd893 (patch)
treee6f4ab65e7d88fdbd9fa30c6e5c92c48b9fb6d27
parentd28c2561fb09dcc0b47ae0ba12083cf0d988495f (diff)
rt2x00: Only update rssi average approximation on receiving beacon frames.
Restrict rssi average updating to beacon frames of the bssid the interface is associated with. Without this restriction, strong signals belonging to other BSS, e.g. beacon frames coming from a nearby AP, would cause incorrectly high rssi approximation values. This would then cause the link tuner to reduce sensitivity, resulting in transmissions from the BSS associated to to be missed. Signed-off-by: Mattias Nissler <mattias.nissler@gmx.de> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h7
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c19
2 files changed, 25 insertions, 1 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 103a122bc9c..218068bf0ef 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -32,6 +32,7 @@
32#include <linux/workqueue.h> 32#include <linux/workqueue.h>
33#include <linux/firmware.h> 33#include <linux/firmware.h>
34#include <linux/mutex.h> 34#include <linux/mutex.h>
35#include <linux/etherdevice.h>
35 36
36#include <net/mac80211.h> 37#include <net/mac80211.h>
37 38
@@ -149,6 +150,12 @@ static inline int is_probe_resp(u16 fc)
149 ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP)); 150 ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP));
150} 151}
151 152
153static inline int is_beacon(u16 fc)
154{
155 return (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
156 ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON));
157}
158
152/* 159/*
153 * Chipset identification 160 * Chipset identification
154 * The chipset on the device is composed of a RT and RF chip. 161 * The chipset on the device is composed of a RT and RF chip.
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index bd7b73824d0..a771a092434 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -526,11 +526,14 @@ void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb,
526 struct rxdata_entry_desc *desc) 526 struct rxdata_entry_desc *desc)
527{ 527{
528 struct rt2x00_dev *rt2x00dev = entry->ring->rt2x00dev; 528 struct rt2x00_dev *rt2x00dev = entry->ring->rt2x00dev;
529 struct interface *intf = &rt2x00dev->interface;
529 struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status; 530 struct ieee80211_rx_status *rx_status = &rt2x00dev->rx_status;
530 struct ieee80211_hw_mode *mode; 531 struct ieee80211_hw_mode *mode;
531 struct ieee80211_rate *rate; 532 struct ieee80211_rate *rate;
533 struct ieee80211_hdr *hdr;
532 unsigned int i; 534 unsigned int i;
533 int val = 0; 535 int val = 0;
536 u16 fc;
534 537
535 /* 538 /*
536 * Update RX statistics. 539 * Update RX statistics.
@@ -555,7 +558,21 @@ void rt2x00lib_rxdone(struct data_entry *entry, struct sk_buff *skb,
555 } 558 }
556 } 559 }
557 560
558 rt2x00lib_update_link_stats(&rt2x00dev->link, desc->rssi); 561 /*
562 * Only update link status if this is a beacon frame carrying our
563 * bssid.
564 */
565 hdr = (struct ieee80211_hdr *) skb->data;
566 if (skb->len >= sizeof(struct ieee80211_hdr *)) {
567 fc = le16_to_cpu(hdr->frame_control);
568 if ((intf->type == IEEE80211_IF_TYPE_STA
569 || intf->type == IEEE80211_IF_TYPE_IBSS)
570 && is_beacon(fc)
571 && compare_ether_addr(hdr->addr3, intf->bssid) == 0)
572 rt2x00lib_update_link_stats(&rt2x00dev->link,
573 desc->rssi);
574 }
575
559 rt2x00dev->link.qual.rx_success++; 576 rt2x00dev->link.qual.rx_success++;
560 577
561 rx_status->rate = val; 578 rx_status->rate = val;