On September 5, 2006, Johannes Berg changed the specifications for RSSI processing. Implementing those changes involves specifying the bytes in the RX header that contain the LNA (low-noise amplifier) bits, adding a new argument to bcm43xx_rssi_postprocess, and the actual changes in the rssi processing.
Signed-off-by: Larry Finger <[EMAIL PROTECTED]> --- Index: wireless-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c =================================================================== --- wireless-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c +++ wireless-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.c @@ -382,8 +382,8 @@ void bcm43xx_generate_txhdr(struct bcm43 } static s8 bcm43xx_rssi_postprocess(struct bcm43xx_private *bcm, - u8 in_rssi, int ofdm, - int adjust_2053, int adjust_2050) + u8 in_rssi, int ofdm, int adjust_2053, + int adjust_2050, u8 lna) { struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm); struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm); @@ -395,12 +395,10 @@ static s8 bcm43xx_rssi_postprocess(struc tmp = in_rssi; if (tmp > 127) tmp -= 256; - tmp *= 73; - tmp /= 64; if (adjust_2050) - tmp += 25; + tmp += 17; else - tmp -= 3; + tmp -= 4; } else { if (bcm->sprom.boardflags & BCM43xx_BFL_RSSI) { if (in_rssi > 63) @@ -409,7 +407,7 @@ static s8 bcm43xx_rssi_postprocess(struc tmp = 31 - tmp; tmp *= -131; tmp /= 128; - tmp -= 57; + tmp -= 67; } else { tmp = in_rssi; tmp = 31 - tmp; @@ -418,8 +416,23 @@ static s8 bcm43xx_rssi_postprocess(struc tmp -= 68; } if (phy->type == BCM43xx_PHYTYPE_G && - adjust_2050) + adjust_2050) { + tmp += 20; + switch (lna) { + case 0: + tmp += 2; + break; + case 1: + tmp -= 19; + break; + case 2: + tmp -= 13; + break; + case 3: + tmp -= 25; + } tmp += 25; + } } break; case 0x2060: @@ -454,7 +467,7 @@ static s8 bcm43xx_rssinoise_postprocess( //TODO: Incomplete specs. ret = 0; } else - ret = bcm43xx_rssi_postprocess(bcm, in_rssi, 0, 1, 1); + ret = bcm43xx_rssi_postprocess(bcm, in_rssi, 0, 1, 1, 0); return ret; } @@ -476,6 +489,7 @@ int bcm43xx_rx(struct bcm43xx_private *b const u16 rxflags2 = le16_to_cpu(rxhdr->flags2); const u16 rxflags3 = le16_to_cpu(rxhdr->flags3); const int is_ofdm = !!(rxflags1 & BCM43xx_RXHDR_FLAGS1_OFDM); + u8 lna; if (rxflags2 & BCM43xx_RXHDR_FLAGS2_TYPE2FRAME) { plcp = (struct bcm43xx_plcp_hdr4 *)(skb->data + 2); @@ -493,9 +507,11 @@ int bcm43xx_rx(struct bcm43xx_private *b memset(&stats, 0, sizeof(stats)); stats.mac_time = le16_to_cpu(rxhdr->mactime); stats.rssi = rxhdr->rssi; + lna = (rxhdr->phy_rx_status2 & 0xc0000) >> 14; stats.signal = bcm43xx_rssi_postprocess(bcm, rxhdr->rssi, is_ofdm, !!(rxflags1 & BCM43xx_RXHDR_FLAGS1_2053RSSIADJ), - !!(rxflags3 & BCM43xx_RXHDR_FLAGS3_2050RSSIADJ)); + !!(rxflags3 & BCM43xx_RXHDR_FLAGS3_2050RSSIADJ), + lna); stats.noise = bcm->stats.noise; if (is_ofdm) stats.rate = bcm43xx_plcp_get_bitrate_ofdm(plcp); Index: wireless-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h =================================================================== --- wireless-2.6.orig/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h +++ wireless-2.6/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h @@ -94,7 +94,7 @@ struct bcm43xx_rxhdr { __le16 flags1; u8 rssi; u8 signal_quality; - PAD_BYTES(2); + __le16 phy_rx_status2; /* Flags field 3 */ __le16 flags3; /* Flags field 2 */ - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html