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