@@ -3310,6 +3310,12 @@ static int ar9300_eeprom_restore_internal(struct ath_hw *ah,
3310
3310
if (ar9300_check_eeprom_header (ah , read , cptr ))
3311
3311
goto found ;
3312
3312
3313
+ cptr = AR9300_BASE_ADDR_4K ;
3314
+ ath_dbg (common , EEPROM , "Trying EEPROM access at Address 0x%04x\n" ,
3315
+ cptr );
3316
+ if (ar9300_check_eeprom_header (ah , read , cptr ))
3317
+ goto found ;
3318
+
3313
3319
cptr = AR9300_BASE_ADDR_512 ;
3314
3320
ath_dbg (common , EEPROM , "Trying EEPROM access at Address 0x%04x\n" ,
3315
3321
cptr );
@@ -3430,6 +3436,60 @@ static u32 ar9003_dump_modal_eeprom(char *buf, u32 len, u32 size,
3430
3436
return len ;
3431
3437
}
3432
3438
3439
+ static u32 ar9003_dump_cal_data (struct ath_hw * ah , char * buf , u32 len , u32 size ,
3440
+ bool is_2g )
3441
+ {
3442
+ struct ar9300_eeprom * eep = & ah -> eeprom .ar9300_eep ;
3443
+ struct ar9300_base_eep_hdr * pBase ;
3444
+ struct ar9300_cal_data_per_freq_op_loop * cal_pier ;
3445
+ int cal_pier_nr ;
3446
+ int freq ;
3447
+ int i , j ;
3448
+
3449
+ pBase = & eep -> baseEepHeader ;
3450
+
3451
+ if (is_2g )
3452
+ cal_pier_nr = AR9300_NUM_2G_CAL_PIERS ;
3453
+ else
3454
+ cal_pier_nr = AR9300_NUM_5G_CAL_PIERS ;
3455
+
3456
+ for (i = 0 ; i < AR9300_MAX_CHAINS ; i ++ ) {
3457
+ if (!((pBase -> txrxMask >> i ) & 1 ))
3458
+ continue ;
3459
+
3460
+ len += snprintf (buf + len , size - len , "Chain %d\n" , i );
3461
+
3462
+ len += snprintf (buf + len , size - len ,
3463
+ "Freq\t ref\tvolt\ttemp\tnf_cal\tnf_pow\trx_temp\n" );
3464
+
3465
+ for (j = 0 ; j < cal_pier_nr ; j ++ ) {
3466
+ if (is_2g ) {
3467
+ cal_pier = & eep -> calPierData2G [i ][j ];
3468
+ freq = 2300 + eep -> calFreqPier2G [j ];
3469
+ } else {
3470
+ cal_pier = & eep -> calPierData5G [i ][j ];
3471
+ freq = 4800 + eep -> calFreqPier5G [j ] * 5 ;
3472
+ }
3473
+
3474
+ len += snprintf (buf + len , size - len ,
3475
+ "%d\t" , freq );
3476
+
3477
+ len += snprintf (buf + len , size - len ,
3478
+ "%d\t%d\t%d\t%d\t%d\t%d\n" ,
3479
+ cal_pier -> refPower ,
3480
+ cal_pier -> voltMeas ,
3481
+ cal_pier -> tempMeas ,
3482
+ cal_pier -> rxTempMeas ?
3483
+ N2DBM (cal_pier -> rxNoisefloorCal ) : 0 ,
3484
+ cal_pier -> rxTempMeas ?
3485
+ N2DBM (cal_pier -> rxNoisefloorPower ) : 0 ,
3486
+ cal_pier -> rxTempMeas );
3487
+ }
3488
+ }
3489
+
3490
+ return len ;
3491
+ }
3492
+
3433
3493
static u32 ath9k_hw_ar9003_dump_eeprom (struct ath_hw * ah , bool dump_base_hdr ,
3434
3494
u8 * buf , u32 len , u32 size )
3435
3495
{
@@ -3441,10 +3501,18 @@ static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
3441
3501
"%20s :\n" , "2GHz modal Header" );
3442
3502
len = ar9003_dump_modal_eeprom (buf , len , size ,
3443
3503
& eep -> modalHeader2G );
3444
- len += scnprintf (buf + len , size - len ,
3504
+
3505
+ len += scnprintf (buf + len , size - len , "Calibration data\n" );
3506
+ len = ar9003_dump_cal_data (ah , buf , len , size , true);
3507
+
3508
+ len += snprintf (buf + len , size - len ,
3445
3509
"%20s :\n" , "5GHz modal Header" );
3446
3510
len = ar9003_dump_modal_eeprom (buf , len , size ,
3447
3511
& eep -> modalHeader5G );
3512
+
3513
+ len += snprintf (buf + len , size - len , "Calibration data\n" );
3514
+ len = ar9003_dump_cal_data (ah , buf , len , size , false);
3515
+
3448
3516
goto out ;
3449
3517
}
3450
3518
@@ -4683,7 +4751,8 @@ static int ar9003_hw_cal_pier_get(struct ath_hw *ah,
4683
4751
int ichain ,
4684
4752
int * pfrequency ,
4685
4753
int * pcorrection ,
4686
- int * ptemperature , int * pvoltage )
4754
+ int * ptemperature , int * pvoltage ,
4755
+ int * pnf_cal , int * pnf_power )
4687
4756
{
4688
4757
u8 * pCalPier ;
4689
4758
struct ar9300_cal_data_per_freq_op_loop * pCalPierStruct ;
@@ -4725,6 +4794,10 @@ static int ar9003_hw_cal_pier_get(struct ath_hw *ah,
4725
4794
* pcorrection = pCalPierStruct -> refPower ;
4726
4795
* ptemperature = pCalPierStruct -> tempMeas ;
4727
4796
* pvoltage = pCalPierStruct -> voltMeas ;
4797
+ * pnf_cal = pCalPierStruct -> rxTempMeas ?
4798
+ N2DBM (pCalPierStruct -> rxNoisefloorCal ) : 0 ;
4799
+ * pnf_power = pCalPierStruct -> rxTempMeas ?
4800
+ N2DBM (pCalPierStruct -> rxNoisefloorPower ) : 0 ;
4728
4801
4729
4802
return 0 ;
4730
4803
}
@@ -4889,14 +4962,18 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4889
4962
int mode ;
4890
4963
int lfrequency [AR9300_MAX_CHAINS ],
4891
4964
lcorrection [AR9300_MAX_CHAINS ],
4892
- ltemperature [AR9300_MAX_CHAINS ], lvoltage [AR9300_MAX_CHAINS ];
4965
+ ltemperature [AR9300_MAX_CHAINS ], lvoltage [AR9300_MAX_CHAINS ],
4966
+ lnf_cal [AR9300_MAX_CHAINS ], lnf_pwr [AR9300_MAX_CHAINS ];
4893
4967
int hfrequency [AR9300_MAX_CHAINS ],
4894
4968
hcorrection [AR9300_MAX_CHAINS ],
4895
- htemperature [AR9300_MAX_CHAINS ], hvoltage [AR9300_MAX_CHAINS ];
4969
+ htemperature [AR9300_MAX_CHAINS ], hvoltage [AR9300_MAX_CHAINS ],
4970
+ hnf_cal [AR9300_MAX_CHAINS ], hnf_pwr [AR9300_MAX_CHAINS ];
4896
4971
int fdiff ;
4897
4972
int correction [AR9300_MAX_CHAINS ],
4898
- voltage [AR9300_MAX_CHAINS ], temperature [AR9300_MAX_CHAINS ];
4899
- int pfrequency , pcorrection , ptemperature , pvoltage ;
4973
+ voltage [AR9300_MAX_CHAINS ], temperature [AR9300_MAX_CHAINS ],
4974
+ nf_cal [AR9300_MAX_CHAINS ], nf_pwr [AR9300_MAX_CHAINS ];
4975
+ int pfrequency , pcorrection , ptemperature , pvoltage ,
4976
+ pnf_cal , pnf_pwr ;
4900
4977
struct ath_common * common = ath9k_hw_common (ah );
4901
4978
4902
4979
mode = (frequency >= 4000 );
@@ -4914,7 +4991,8 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4914
4991
for (ipier = 0 ; ipier < npier ; ipier ++ ) {
4915
4992
if (!ar9003_hw_cal_pier_get (ah , mode , ipier , ichain ,
4916
4993
& pfrequency , & pcorrection ,
4917
- & ptemperature , & pvoltage )) {
4994
+ & ptemperature , & pvoltage ,
4995
+ & pnf_cal , & pnf_pwr )) {
4918
4996
fdiff = frequency - pfrequency ;
4919
4997
4920
4998
/*
@@ -4936,6 +5014,8 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4936
5014
htemperature [ichain ] =
4937
5015
ptemperature ;
4938
5016
hvoltage [ichain ] = pvoltage ;
5017
+ hnf_cal [ichain ] = pnf_cal ;
5018
+ hnf_pwr [ichain ] = pnf_pwr ;
4939
5019
}
4940
5020
}
4941
5021
if (fdiff >= 0 ) {
@@ -4952,6 +5032,8 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4952
5032
ltemperature [ichain ] =
4953
5033
ptemperature ;
4954
5034
lvoltage [ichain ] = pvoltage ;
5035
+ lnf_cal [ichain ] = pnf_cal ;
5036
+ lnf_pwr [ichain ] = pnf_pwr ;
4955
5037
}
4956
5038
}
4957
5039
}
@@ -4960,15 +5042,20 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4960
5042
4961
5043
/* interpolate */
4962
5044
for (ichain = 0 ; ichain < AR9300_MAX_CHAINS ; ichain ++ ) {
4963
- ath_dbg (common , EEPROM , "ch=%d f=%d low=%d %d h=%d %d\n" ,
5045
+ ath_dbg (common , EEPROM ,
5046
+ "ch=%d f=%d low=%d %d h=%d %d n=%d %d p=%d %d\n" ,
4964
5047
ichain , frequency , lfrequency [ichain ],
4965
5048
lcorrection [ichain ], hfrequency [ichain ],
4966
- hcorrection [ichain ]);
5049
+ hcorrection [ichain ], lnf_cal [ichain ],
5050
+ hnf_cal [ichain ], lnf_pwr [ichain ],
5051
+ hnf_pwr [ichain ]);
4967
5052
/* they're the same, so just pick one */
4968
5053
if (hfrequency [ichain ] == lfrequency [ichain ]) {
4969
5054
correction [ichain ] = lcorrection [ichain ];
4970
5055
voltage [ichain ] = lvoltage [ichain ];
4971
5056
temperature [ichain ] = ltemperature [ichain ];
5057
+ nf_cal [ichain ] = lnf_cal [ichain ];
5058
+ nf_pwr [ichain ] = lnf_pwr [ichain ];
4972
5059
}
4973
5060
/* the low frequency is good */
4974
5061
else if (frequency - lfrequency [ichain ] < 1000 ) {
@@ -4992,23 +5079,41 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4992
5079
hfrequency [ichain ],
4993
5080
lvoltage [ichain ],
4994
5081
hvoltage [ichain ]);
5082
+
5083
+ nf_cal [ichain ] = interpolate (frequency ,
5084
+ lfrequency [ichain ],
5085
+ hfrequency [ichain ],
5086
+ lnf_cal [ichain ],
5087
+ hnf_cal [ichain ]);
5088
+
5089
+ nf_pwr [ichain ] = interpolate (frequency ,
5090
+ lfrequency [ichain ],
5091
+ hfrequency [ichain ],
5092
+ lnf_pwr [ichain ],
5093
+ hnf_pwr [ichain ]);
4995
5094
}
4996
5095
/* only low is good, use it */
4997
5096
else {
4998
5097
correction [ichain ] = lcorrection [ichain ];
4999
5098
temperature [ichain ] = ltemperature [ichain ];
5000
5099
voltage [ichain ] = lvoltage [ichain ];
5100
+ nf_cal [ichain ] = lnf_cal [ichain ];
5101
+ nf_pwr [ichain ] = lnf_pwr [ichain ];
5001
5102
}
5002
5103
}
5003
5104
/* only high is good, use it */
5004
5105
else if (hfrequency [ichain ] - frequency < 1000 ) {
5005
5106
correction [ichain ] = hcorrection [ichain ];
5006
5107
temperature [ichain ] = htemperature [ichain ];
5007
5108
voltage [ichain ] = hvoltage [ichain ];
5109
+ nf_cal [ichain ] = hnf_cal [ichain ];
5110
+ nf_pwr [ichain ] = hnf_pwr [ichain ];
5008
5111
} else { /* nothing is good, presume 0???? */
5009
5112
correction [ichain ] = 0 ;
5010
5113
temperature [ichain ] = 0 ;
5011
5114
voltage [ichain ] = 0 ;
5115
+ nf_cal [ichain ] = 0 ;
5116
+ nf_pwr [ichain ] = 0 ;
5012
5117
}
5013
5118
}
5014
5119
@@ -5019,6 +5124,16 @@ static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
5019
5124
"for frequency=%d, calibration correction = %d %d %d\n" ,
5020
5125
frequency , correction [0 ], correction [1 ], correction [2 ]);
5021
5126
5127
+ /* Store calibrated noise floor values */
5128
+ for (ichain = 0 ; ichain < AR5416_MAX_CHAINS ; ichain ++ )
5129
+ if (mode ) {
5130
+ ah -> nf_5g .cal [ichain ] = nf_cal [ichain ];
5131
+ ah -> nf_5g .pwr [ichain ] = nf_pwr [ichain ];
5132
+ } else {
5133
+ ah -> nf_2g .cal [ichain ] = nf_cal [ichain ];
5134
+ ah -> nf_2g .pwr [ichain ] = nf_pwr [ichain ];
5135
+ }
5136
+
5022
5137
return 0 ;
5023
5138
}
5024
5139
0 commit comments