aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx.h2
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_main.c3
-rw-r--r--drivers/net/wireless/bcm43xx/bcm43xx_wx.c52
3 files changed, 53 insertions, 4 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx.h b/drivers/net/wireless/bcm43xx/bcm43xx.h
index 57fcaafcf7dd..ae0fe5cf1d44 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx.h
+++ b/drivers/net/wireless/bcm43xx/bcm43xx.h
@@ -621,6 +621,8 @@ struct bcm43xx_noise_calculation {
621 621
622struct bcm43xx_stats { 622struct bcm43xx_stats {
623 u8 link_quality; 623 u8 link_quality;
624 u8 noise;
625 struct iw_statistics wstats;
624 /* Store the last TX/RX times here for updating the leds. */ 626 /* Store the last TX/RX times here for updating the leds. */
625 unsigned long last_tx; 627 unsigned long last_tx;
626 unsigned long last_rx; 628 unsigned long last_rx;
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
index e680d2acc44b..15deaa508e55 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -1539,6 +1539,7 @@ static void handle_irq_noise(struct bcm43xx_private *bcm)
1539 average *= 125; 1539 average *= 125;
1540 average += 64; 1540 average += 64;
1541 average /= 128; 1541 average /= 128;
1542
1542 tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x40C); 1543 tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x40C);
1543 tmp = (tmp / 128) & 0x1F; 1544 tmp = (tmp / 128) & 0x1F;
1544 if (tmp >= 8) 1545 if (tmp >= 8)
@@ -1550,6 +1551,8 @@ static void handle_irq_noise(struct bcm43xx_private *bcm)
1550 else 1551 else
1551 average -= 48; 1552 average -= 48;
1552 1553
1554/* FIXME: This is wrong, but people want fancy stats. well... */
1555bcm->stats.noise = average;
1553 if (average > -65) 1556 if (average > -65)
1554 bcm->stats.link_quality = 0; 1557 bcm->stats.link_quality = 0;
1555 else if (average > -75) 1558 else if (average > -75)
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
index 651ba6054957..e92963402852 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
@@ -244,13 +244,13 @@ static int bcm43xx_wx_get_rangeparams(struct net_device *net_dev,
244 244
245 range->max_qual.qual = 100; 245 range->max_qual.qual = 100;
246 /* TODO: Real max RSSI */ 246 /* TODO: Real max RSSI */
247 range->max_qual.level = 0; 247 range->max_qual.level = 3;
248 range->max_qual.noise = 0; 248 range->max_qual.noise = 100;
249 range->max_qual.updated = 7; 249 range->max_qual.updated = 7;
250 250
251 range->avg_qual.qual = 70; 251 range->avg_qual.qual = 70;
252 range->avg_qual.level = 0; 252 range->avg_qual.level = 2;
253 range->avg_qual.noise = 0; 253 range->avg_qual.noise = 40;
254 range->avg_qual.updated = 7; 254 range->avg_qual.updated = 7;
255 255
256 range->min_rts = BCM43xx_MIN_RTS_THRESHOLD; 256 range->min_rts = BCM43xx_MIN_RTS_THRESHOLD;
@@ -875,6 +875,49 @@ out:
875 return err; 875 return err;
876} 876}
877 877
878/* Get wireless statistics. Called by /proc/net/wireless and by SIOCGIWSTATS */
879
880static struct iw_statistics *bcm43xx_get_wireless_stats(struct net_device *net_dev)
881{
882 struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
883 struct ieee80211softmac_device *mac = ieee80211_priv(net_dev);
884 struct iw_statistics *wstats;
885
886 wstats = &bcm->stats.wstats;
887 if (!mac->associated) {
888 wstats->miss.beacon = 0;
889// bcm->ieee->ieee_stats.tx_retry_limit_exceeded = 0; // FIXME: should this be cleared here?
890 wstats->discard.retries = 0;
891// bcm->ieee->ieee_stats.tx_discards_wrong_sa = 0; // FIXME: same question
892 wstats->discard.nwid = 0;
893// bcm->ieee->ieee_stats.rx_discards_undecryptable = 0; // FIXME: ditto
894 wstats->discard.code = 0;
895// bcm->ieee->ieee_stats.rx_fragments = 0; // FIXME: same here
896 wstats->discard.fragment = 0;
897 wstats->discard.misc = 0;
898 wstats->qual.qual = 0;
899 wstats->qual.level = 0;
900 wstats->qual.noise = 0;
901 wstats->qual.updated = 7;
902 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
903 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
904 return wstats;
905 }
906 /* fill in the real statistics when iface associated */
907 wstats->qual.qual = 100; // TODO: get the real signal quality
908 wstats->qual.level = 3 - bcm->stats.link_quality;
909 wstats->qual.noise = bcm->stats.noise;
910 wstats->qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED |
911 IW_QUAL_NOISE_UPDATED;
912 wstats->discard.code = bcm->ieee->ieee_stats.rx_discards_undecryptable;
913 wstats->discard.retries = bcm->ieee->ieee_stats.tx_retry_limit_exceeded;
914 wstats->discard.nwid = bcm->ieee->ieee_stats.tx_discards_wrong_sa;
915 wstats->discard.fragment = bcm->ieee->ieee_stats.rx_fragments;
916 wstats->discard.misc = 0; // FIXME
917 wstats->miss.beacon = 0; // FIXME
918 return wstats;
919}
920
878 921
879#ifdef WX 922#ifdef WX
880# undef WX 923# undef WX
@@ -1010,6 +1053,7 @@ const struct iw_handler_def bcm43xx_wx_handlers_def = {
1010 .num_private_args = ARRAY_SIZE(bcm43xx_priv_wx_args), 1053 .num_private_args = ARRAY_SIZE(bcm43xx_priv_wx_args),
1011 .private = bcm43xx_priv_wx_handlers, 1054 .private = bcm43xx_priv_wx_handlers,
1012 .private_args = bcm43xx_priv_wx_args, 1055 .private_args = bcm43xx_priv_wx_args,
1056 .get_wireless_stats = bcm43xx_get_wireless_stats,
1013}; 1057};
1014 1058
1015/* vim: set ts=8 sw=8 sts=8: */ 1059/* vim: set ts=8 sw=8 sts=8: */