ath9k: Display calibration data piers in debugfs
authorWojciech Dubowik <Wojciech.Dubowik@neratec.com>
Wed, 24 Jan 2018 08:02:19 +0000 (09:02 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 25 Jan 2018 05:33:50 +0000 (07:33 +0200)
Display per frequency calibration data in dump_modal
debugfs entry including reference power, voltage,
tx temperature and noise floor.

Example of chain 0 of OEM card (dump from modal_eeprom):
Chain 0
Freq  ref volt temp nf_Cal nf_Pow rx_temp
5180 -30 0 137 0 0 0
5320 -24 0 137 0 0 0
5500 -15 0 137 0 0 0
5620 -10 0 137 0 0 0
5700 -15 0 137 0 0 0
5745 -16 0 135 0 0 0
5785 -19 0 136 0 0 0
5825 -22 0 136 0 0 0

Example of a card with calibrated noise floor.
Chain 0
Freq  ref volt temp nf_Cal nf_Pow rx_temp
4890 -49 0 128 -107 -97 124
5100 -23 0 128 -101 -96 124
5180 -18 0 128 -101 -96 124
5300 -12 0 128 -102 -97 124
5500 -9 0 128 -101 -97 125
5640 -17 0 128 -101 -98 124
5785 -25 0 128 -101 -98 124
5940 -33 0 128 -106 -99 124

Signed-off-by: Wojciech Dubowik <Wojciech.Dubowik@neratec.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c

index de2e503..f019a20 100644 (file)
@@ -3436,6 +3436,60 @@ static u32 ar9003_dump_modal_eeprom(char *buf, u32 len, u32 size,
        return len;
 }
 
+static u32 ar9003_dump_cal_data(struct ath_hw *ah, char *buf, u32 len, u32 size,
+                               bool is_2g)
+{
+       struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
+       struct ar9300_base_eep_hdr *pBase;
+       struct ar9300_cal_data_per_freq_op_loop *cal_pier;
+       int cal_pier_nr;
+       int freq;
+       int i, j;
+
+       pBase = &eep->baseEepHeader;
+
+       if (is_2g)
+               cal_pier_nr = AR9300_NUM_2G_CAL_PIERS;
+       else
+               cal_pier_nr = AR9300_NUM_5G_CAL_PIERS;
+
+       for (i = 0; i < AR9300_MAX_CHAINS; i++) {
+               if (!((pBase->txrxMask >> i) & 1))
+                       continue;
+
+               len += snprintf(buf + len, size - len, "Chain %d\n", i);
+
+               len += snprintf(buf + len, size - len,
+                       "Freq\t ref\tvolt\ttemp\tnf_cal\tnf_pow\trx_temp\n");
+
+               for (j = 0; j < cal_pier_nr; j++) {
+                       if (is_2g) {
+                               cal_pier = &eep->calPierData2G[i][j];
+                               freq = 2300 + eep->calFreqPier2G[j];
+                       } else {
+                               cal_pier = &eep->calPierData5G[i][j];
+                               freq = 4800 + eep->calFreqPier5G[j] * 5;
+                       }
+
+                       len += snprintf(buf + len, size - len,
+                               "%d\t", freq);
+
+                       len += snprintf(buf + len, size - len,
+                               "%d\t%d\t%d\t%d\t%d\t%d\n",
+                               cal_pier->refPower,
+                               cal_pier->voltMeas,
+                               cal_pier->tempMeas,
+                               cal_pier->rxTempMeas ?
+                               N2DBM(cal_pier->rxNoisefloorCal) : 0,
+                               cal_pier->rxTempMeas ?
+                               N2DBM(cal_pier->rxNoisefloorPower) : 0,
+                               cal_pier->rxTempMeas);
+               }
+       }
+
+       return len;
+}
+
 static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
                                       u8 *buf, u32 len, u32 size)
 {
@@ -3447,10 +3501,18 @@ static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
                                 "%20s :\n", "2GHz modal Header");
                len = ar9003_dump_modal_eeprom(buf, len, size,
                                                &eep->modalHeader2G);
-               len += scnprintf(buf + len, size - len,
+
+               len += scnprintf(buf + len, size - len, "Calibration data\n");
+               len = ar9003_dump_cal_data(ah, buf, len, size, true);
+
+               len +=  snprintf(buf + len, size - len,
                                 "%20s :\n", "5GHz modal Header");
                len = ar9003_dump_modal_eeprom(buf, len, size,
                                                &eep->modalHeader5G);
+
+               len += snprintf(buf + len, size - len, "Calibration data\n");
+               len = ar9003_dump_cal_data(ah, buf, len, size, false);
+
                goto out;
        }