@@ -1167,6 +1167,63 @@ static bool ath10k_htt_rx_h_channel(struct ath10k *ar,
return true;
}
+static int ath10k_sum_sigs(int p20, int e20, int e40, int e80) {
+ int rv = p20;
+ int diff;
+ int accum = 0;
+
+ /* Hacky attempt at summing dbm without resorting to log(10) business */
+
+ /* Find strongest signal, that is our baseline */
+ if ((e20 != 0x80) && (p20 < e20))
+ rv = e20;
+ if ((e40 != 0x80) && (rv < e40))
+ rv = e40;
+ if ((e80 != 0x80) && (rv < e80))
+ rv = e80;
+
+ if (e20 != 0x80) {
+ diff = rv - e20;
+ if (diff == 0)
+ rv += 3;
+ else if (diff == 1)
+ rv += 2;
+ else if (diff == 2)
+ rv += 1;
+ else if (diff < 6)
+ accum++;
+ }
+
+ if (e40 != 0x80) {
+ diff = rv - e40;
+ if (diff == 0)
+ rv += 3;
+ else if (diff == 1)
+ rv += 2;
+ else if (diff == 2)
+ rv += 1;
+ else if (diff < 6)
+ accum++;
+ }
+
+ if (e80 != 0x80) {
+ diff = rv - e80;
+ if (diff == 0)
+ rv += 3;
+ else if (diff == 1)
+ rv += 2;
+ else if (diff == 2)
+ rv += 1;
+ else if (diff < 6)
+ accum++;
+ }
+
+ if (accum >= 2)
+ rv++;
+
+ return rv;
+}
+
static void ath10k_htt_rx_h_signal(struct ath10k *ar,
struct ieee80211_rx_status *status,
struct htt_rx_desc *rxd)
@@ -1177,18 +1234,32 @@ static void ath10k_htt_rx_h_signal(struct ath10k *ar,
status->chains &= ~BIT(i);
if (rxd->ppdu_start.rssi_chains[i].pri20_mhz != 0x80) {
- status->chain_signal[i] = ATH10K_DEFAULT_NOISE_FLOOR +
- rxd->ppdu_start.rssi_chains[i].pri20_mhz;
+ status->chain_signal[i] = ATH10K_DEFAULT_NOISE_FLOOR
+ + ath10k_sum_sigs(rxd->ppdu_start.rssi_chains[i].pri20_mhz,
+ rxd->ppdu_start.rssi_chains[i].ext20_mhz,
+ rxd->ppdu_start.rssi_chains[i].ext40_mhz,
+ rxd->ppdu_start.rssi_chains[i].ext80_mhz);
+ //ath10k_warn(ar, "rx-h-sig, chain[%i] pri20: %d ext20: %d ext40: %d ext80: %d\n",
+ // i, rxd->ppdu_start.rssi_chains[i].pri20_mhz, rxd->ppdu_start.rssi_chains[i].ext20_mhz,
+ // rxd->ppdu_start.rssi_chains[i].ext40_mhz, rxd->ppdu_start.rssi_chains[i].ext80_mhz);
status->chains |= BIT(i);
}
}
/* FIXME: Get real NF */
- status->signal = ATH10K_DEFAULT_NOISE_FLOOR +
- rxd->ppdu_start.rssi_comb;
- /* ath10k_warn(ar, "rx-h-sig, signal: %d chains: 0x%x chain[0]: %d chain[1]: %d chan[2]: %d\n",
- status->signal, status->chains, status->chain_signal[0], status->chain_signal[1], status->chain_signal[2]); */
+ if (rxd->ppdu_start.rssi_comb_ht != 0x80) {
+ status->signal = ATH10K_DEFAULT_NOISE_FLOOR +
+ rxd->ppdu_start.rssi_comb_ht;
+ }
+ else {
+ status->signal = ATH10K_DEFAULT_NOISE_FLOOR +
+ rxd->ppdu_start.rssi_comb;
+ }
+
+ //ath10k_warn(ar, "rx-h-sig, signal: %d chains: 0x%x chain[0]: %d chain[1]: %d chain[2]: %d chain[3]: %d\n",
+ // status->signal, status->chains, status->chain_signal[0],
+ // status->chain_signal[1], status->chain_signal[2], status->chain_signal[3]);
status->flag &= ~RX_FLAG_NO_SIGNAL_VAL;
}
@@ -726,7 +726,8 @@ struct rx_ppdu_start {
u8 ext80_mhz;
} rssi_chains[4];
u8 rssi_comb;
- __le16 rsvd0;
+ u8 rsvd0; /* first two bits are bandwidth, other 6 are reserved */
+ u8 rssi_comb_ht;
u8 info0; /* %RX_PPDU_START_INFO0_ */
__le32 info1; /* %RX_PPDU_START_INFO1_ */
__le32 info2; /* %RX_PPDU_START_INFO2_ */