Richard Jonsson wrote:

Isn't Desired TX power supposed to adapt so that higher bitrates are possible, with Bit Rate going lower if that is not enough to keep a good connection?

Richard,

Please grab a new copy of the port_to_mac80211 patch, and try the patch below. It boosts the desired power by up to 5 dBm as signal - noise decreases from 20 to 0.

Larry


Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx.h
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
@@ -622,6 +622,8 @@ struct bcm43xx_wldev {
        bool short_preamble;    /* TRUE if using short preamble. */
        bool short_slot;        /* TRUE if using short slot timing. */
        bool radio_hw_enable;   /* State of radio hardware enable bit. */
+       u8 saved_signal_noise[4];
+       u8 signal_noise_index;

        /* PHY/Radio device. */
        struct bcm43xx_phy phy;
Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -2862,6 +2862,8 @@ static void setup_struct_phy_for_init(st
        phy->interfmode = BCM43xx_INTERFMODE_NONE;
        phy->channel = 0xFF;
        phy->power_level = 0;
+
+       dev->signal_noise_index = 0;
 }

 static void setup_struct_wldev_for_init(struct bcm43xx_wldev *dev)
Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
@@ -1771,6 +1771,7 @@ void bcm43xx_phy_xmitpower(struct bcm43x
        s16 desired_pwr;
        s16 estimated_pwr;
        s16 pwr_adjust;
+       s16 snadjust;
        s16 radio_att_delta;
        s16 baseband_att_delta;
        s16 radio_attenuation;
@@ -1824,6 +1825,14 @@ void bcm43xx_phy_xmitpower(struct bcm43x

        estimated_pwr = bcm43xx_phy_estimate_power_out(dev, average);

+       /* calculate any power boost from low S/N values */
+       snadjust = (dev->saved_signal_noise[0] + dev->saved_signal_noise[1] +
+                   dev->saved_signal_noise[2] + dev->saved_signal_noise[3] +
+                   2) / 4;
+       /* boost from 0 to 5 dBm as S/N decreases from 20 to 0 */
+       snadjust = limit_value(5 - snadjust/4, 0, 5);
+       snadjust *= 4; /* convert to Q5.2 format */
+
        max_pwr = dev->dev->bus->sprom.r1.maxpwr_bg;

        if ((dev->dev->bus->sprom.r1.boardflags_lo
@@ -1848,7 +1857,7 @@ void bcm43xx_phy_xmitpower(struct bcm43x
                      - 0x6, max_pwr);

        /* find the desired power in Q5.2 - power_level is in dBm */
-       desired_pwr = limit_value(phy->power_level << 2, 0, max_pwr);
+       desired_pwr = limit_value((phy->power_level << 2) + snadjust, 0, 
max_pwr);
        if (bcm43xx_debug(dev, BCM43xx_DBG_XMITPOWER))
                bcmdbg(dev->wl, "Current TX power output: " Q52_FMT
                       " dBm, Desired TX power output: " Q52_FMT
Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
@@ -526,6 +526,12 @@ void bcm43xx_rx(struct bcm43xx_wldev *de
        status.antenna = !!(phystat0 & BCM43xx_RX_PHYST0_ANT);
        status.mactime = mactime;

+       /* update S/N buffer */
+       dev->saved_signal_noise[dev->signal_noise_index++] =
+                               status.ssi - status.noise;
+       if (dev->signal_noise_index >= 4)
+               dev->signal_noise_index = 0;
+
        chanid = (chanstat & BCM43xx_RX_CHAN_ID) >> BCM43xx_RX_CHAN_ID_SHIFT;
        switch (chanstat & BCM43xx_RX_CHAN_PHYTYPE) {
        case BCM43xx_PHYTYPE_B:


Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx.h
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx.h
@@ -622,6 +622,8 @@ struct bcm43xx_wldev {
        bool short_preamble;    /* TRUE if using short preamble. */
        bool short_slot;        /* TRUE if using short slot timing. */
        bool radio_hw_enable;   /* State of radio hardware enable bit. */
+       u8 saved_signal_noise[4];
+       u8 signal_noise_index;
 
        /* PHY/Radio device. */
        struct bcm43xx_phy phy;
Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -2862,6 +2862,8 @@ static void setup_struct_phy_for_init(st
        phy->interfmode = BCM43xx_INTERFMODE_NONE;
        phy->channel = 0xFF;
        phy->power_level = 0;
+
+       dev->signal_noise_index = 0;
 }
 
 static void setup_struct_wldev_for_init(struct bcm43xx_wldev *dev)
Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_phy.c
@@ -1771,6 +1771,7 @@ void bcm43xx_phy_xmitpower(struct bcm43x
        s16 desired_pwr;
        s16 estimated_pwr;
        s16 pwr_adjust;
+       s16 snadjust;
        s16 radio_att_delta;
        s16 baseband_att_delta;
        s16 radio_attenuation;
@@ -1824,6 +1825,14 @@ void bcm43xx_phy_xmitpower(struct bcm43x
 
        estimated_pwr = bcm43xx_phy_estimate_power_out(dev, average);
 
+       /* calculate any power boost from low S/N values */
+       snadjust = (dev->saved_signal_noise[0] + dev->saved_signal_noise[1] +
+                   dev->saved_signal_noise[2] + dev->saved_signal_noise[3] +
+                   2) / 4;
+       /* boost from 0 to 5 dBm as S/N decreases from 20 to 0 */
+       snadjust = limit_value(5 - snadjust/4, 0, 5);
+       snadjust *= 4; /* convert to Q5.2 format */
+
        max_pwr = dev->dev->bus->sprom.r1.maxpwr_bg;
 
        if ((dev->dev->bus->sprom.r1.boardflags_lo
@@ -1848,7 +1857,7 @@ void bcm43xx_phy_xmitpower(struct bcm43x
                      - 0x6, max_pwr);
 
        /* find the desired power in Q5.2 - power_level is in dBm */
-       desired_pwr = limit_value(phy->power_level << 2, 0, max_pwr);
+       desired_pwr = limit_value((phy->power_level << 2) + snadjust, 0, 
max_pwr);
        if (bcm43xx_debug(dev, BCM43xx_DBG_XMITPOWER))
                bcmdbg(dev->wl, "Current TX power output: " Q52_FMT
                       " dBm, Desired TX power output: " Q52_FMT
Index: linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
===================================================================
--- linux-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
+++ linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
@@ -526,6 +526,12 @@ void bcm43xx_rx(struct bcm43xx_wldev *de
        status.antenna = !!(phystat0 & BCM43xx_RX_PHYST0_ANT);
        status.mactime = mactime;
 
+       /* update S/N buffer */
+       dev->saved_signal_noise[dev->signal_noise_index++] =
+                               status.ssi - status.noise;
+       if (dev->signal_noise_index >= 4)
+               dev->signal_noise_index = 0;
+
        chanid = (chanstat & BCM43xx_RX_CHAN_ID) >> BCM43xx_RX_CHAN_ID_SHIFT;
        switch (chanstat & BCM43xx_RX_CHAN_PHYTYPE) {
        case BCM43xx_PHYTYPE_B:

_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to