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;

Reply via email to