Danny van Dyk wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi Larry,
Larry Finger schrieb:
| +/* Get wireless statistics. Called by /proc/net/wireless and by
SIOCGIWSTATS */
|
| +static struct iw_statistics *bcm43xx_get_wireless_stats(struct
net_device *net_dev)
| +{
| + struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
| + struct ieee80211softmac_device *mac = ieee80211_priv(net_dev);
~ ^^^^^^^^^
| + struct ieee80211_device *net = ieee80211_priv(net_dev);
~ ^^^^^^^^^
this doesn't seem to look right. In order to get the ieee80211_device,
use bcm->ieee please.
| + struct iw_statistics *wstats;
| +
| Index: bcm43xx.h
| ===================================================================
| --- bcm43xx.h (revision 1053)
| +++ bcm43xx.h (working copy)
| @@ -627,6 +627,7 @@
|
| struct bcm43xx_stats {
| u8 link_quality;
| + u8 noise;
| };
|
| struct bcm43xx_key {
| @@ -659,6 +660,7 @@
| firmware_norelease:1; /* Do not release the firmware. Used on
suspend. */
|
| struct bcm43xx_stats stats;
| + struct iw_statistics wstats;
~ ^^^^^^^^^^^^^^^^^^^^
I would add this to 'struct bcm43xx_stats'...
Danny
- --
I made the changes you requested. I also commented out some statements in the initialization section
that I'm not sure should be there. All have FIXME's in the line.
Thanks,
Larry
Index: bcm43xx_wx.c
===================================================================
--- bcm43xx_wx.c (revision 1113)
+++ bcm43xx_wx.c (working copy)
@@ -262,13 +262,13 @@
range->max_qual.qual = 100;
/* TODO: Real max RSSI */
- range->max_qual.level = 0;
- range->max_qual.noise = 0;
+ range->max_qual.level = 3;
+ range->max_qual.noise = 100;
range->max_qual.updated = 7;
range->avg_qual.qual = 70;
- range->avg_qual.level = 0;
- range->avg_qual.noise = 0;
+ range->avg_qual.level = 2;
+ range->avg_qual.noise = 40;
range->avg_qual.updated = 7;
range->min_rts = BCM43xx_MIN_RTS_THRESHOLD;
@@ -959,7 +959,50 @@
return err;
}
+/* Get wireless statistics. Called by /proc/net/wireless and by SIOCGIWSTATS
*/
+static struct iw_statistics *bcm43xx_get_wireless_stats(struct net_device
*net_dev)
+{
+ struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
+ struct ieee80211softmac_device *mac = ieee80211_priv(net_dev);
+ struct iw_statistics *wstats;
+
+ wstats = &bcm->stats.wstats;
+ if (!mac->associated) {
+ wstats->miss.beacon = 0;
+// bcm->ieee->ieee_stats.tx_retry_limit_exceeded = 0; //
FIXME: should this be cleared here?
+ wstats->discard.retries = 0;
+// bcm->ieee->ieee_stats.tx_discards_wrong_sa = 0; //
FIXME: same question
+ wstats->discard.nwid = 0;
+// bcm->ieee->ieee_stats.rx_discards_undecryptable = 0; //
FIXME: ditto
+ wstats->discard.code = 0;
+// bcm->ieee->ieee_stats.rx_fragments = 0; // FIXME: same
here
+ wstats->discard.fragment = 0;
+ wstats->discard.misc = 0;
+ wstats->qual.qual = 0;
+ wstats->qual.level = 0;
+ wstats->qual.noise = 0;
+ wstats->qual.updated = 7;
+ wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
+ IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
+ return wstats;
+ }
+ /* fill in the real statistics when iface associated */
+ wstats->qual.qual = 100; // TODO: get the real signal
quality
+ wstats->qual.level = 3 - bcm->stats.link_quality;
+ wstats->qual.noise = bcm->stats.noise;
+ wstats->qual.updated = IW_QUAL_QUAL_UPDATED |
IW_QUAL_LEVEL_UPDATED |
+ IW_QUAL_NOISE_UPDATED;
+ wstats->discard.code =
bcm->ieee->ieee_stats.rx_discards_undecryptable;
+ wstats->discard.retries =
bcm->ieee->ieee_stats.tx_retry_limit_exceeded;
+ wstats->discard.nwid =
bcm->ieee->ieee_stats.tx_discards_wrong_sa;
+ wstats->discard.fragment = bcm->ieee->ieee_stats.rx_fragments;
+ wstats->discard.misc = 0; // FIXME
+ wstats->miss.beacon = 0; // FIXME
+ return wstats;
+ }
+
+
#ifdef WX
# undef WX
#endif
@@ -1094,6 +1137,7 @@
.num_private_args = ARRAY_SIZE(bcm43xx_priv_wx_args),
.private = bcm43xx_priv_wx_handlers,
.private_args = bcm43xx_priv_wx_args,
+ .get_wireless_stats = bcm43xx_get_wireless_stats,
};
/* vim: set ts=8 sw=8 sts=8: */
Index: bcm43xx_main.c
===================================================================
--- bcm43xx_main.c (revision 1113)
+++ bcm43xx_main.c (working copy)
@@ -116,7 +116,6 @@
/* If you want to enable printing of PCI Config Space access, enable this */
//#define DEBUG_ENABLE_PCILOG
-
static struct pci_device_id bcm43xx_pci_tbl[] = {
/* Detailed list maintained at:
@@ -1872,6 +1871,16 @@
average *= 125;
average += 64;
average /= 128;
+
+/* In early tests, 'average' has values that ranged from 3 - 14.
+ * As a first approximation, set the noise value to 'average' with a range of
0 to 100.
+ */
+ bcm->stats.noise = average;
+
+/* The following algorithm comes from the clean-room reverse engineers. It
results
+ * in a link quality from 0 to 3 (higher is better). The granularity should
probably be
+ * increased before the driver goes "mainstream".
+ */
tmp = bcm43xx_shm_read16(bcm, BCM43xx_SHM_SHARED, 0x40C);
tmp = (tmp / 128) & 0x1F;
if (tmp >= 8)
@@ -2610,10 +2619,10 @@
bcm43xx_power_saving_ctl_bits(bcm, -1, 1);
bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
- bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
+ bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
& ~BCM43xx_SBF_MAC_ENABLED);
bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
- for (i = 1000; i > 0; i--) {
+ for (i = 2000; i > 0; i--) {
tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
if (tmp & BCM43xx_IRQ_READY) {
i = -1;
Index: bcm43xx.h
===================================================================
--- bcm43xx.h (revision 1113)
+++ bcm43xx.h (working copy)
@@ -614,6 +614,8 @@
struct bcm43xx_stats {
u8 link_quality;
+ u8 noise;
+ struct iw_statistics wstats;
/* Store the last TX/RX times here for updating the leds. */
unsigned long last_tx;
unsigned long last_rx;