ath10k: Add BMI parameters to fix calibration from DT/pre-cal
diff mbox

Message ID 1495709483-29793-1-git-send-email-akolli@qti.qualcomm.com
State Accepted
Commit a9f5f287fa1d47d61dfa8b60f94831174b2ea4d0
Delegated to: Kalle Valo
Headers show

Commit Message

akolli@qti.qualcomm.com May 25, 2017, 10:51 a.m. UTC
From: Anilkumar Kolli <akolli@qti.qualcomm.com>

QCA99X0, QCA9888, QCA9984 supports calibration data in
either OTP or DT/pre-cal file. Current ath10k supports
Calibration data from OTP only.

If caldata is loaded from DT/pre-cal file, fetching board id
and applying calibration parameters like tx power gets failed.

error log:
[   15.733663] ath10k_pci 0000:01:00.0: failed to fetch board file: -2
[   15.741474] ath10k_pci 0000:01:00.0: could not probe fw (-2)

This patch adds calibration data support from DT/pre-cal
file.  Below parameters are used to get board id and
applying calibration parameters from cal data.

		EEPROM[OTP]	FLASH[DT/pre-cal file]
Cal param	0x700		0x10000
Board id	0x10		0x8000

Tested on QCA9888 with pre-cal file.

Signed-off-by: Anilkumar Kolli <akolli@qti.qualcomm.com>
---
 drivers/net/wireless/ath/ath10k/bmi.h  |    2 ++
 drivers/net/wireless/ath/ath10k/core.c |   16 +++++++++++++---
 2 files changed, 15 insertions(+), 3 deletions(-)

Comments

Kalle Valo June 1, 2017, 12:59 p.m. UTC | #1
akolli@qti.qualcomm.com wrote:

> QCA99X0, QCA9888, QCA9984 supports calibration data in
> either OTP or DT/pre-cal file. Current ath10k supports
> Calibration data from OTP only.
> 
> If caldata is loaded from DT/pre-cal file, fetching board id
> and applying calibration parameters like tx power gets failed.
> 
> error log:
> [   15.733663] ath10k_pci 0000:01:00.0: failed to fetch board file: -2
> [   15.741474] ath10k_pci 0000:01:00.0: could not probe fw (-2)
> 
> This patch adds calibration data support from DT/pre-cal
> file.  Below parameters are used to get board id and
> applying calibration parameters from cal data.
> 
> 		EEPROM[OTP]	FLASH[DT/pre-cal file]
> Cal param	0x700		0x10000
> Board id	0x10		0x8000
> 
> Tested on QCA9888 with pre-cal file.
> 
> Signed-off-by: Anilkumar Kolli <akolli@qti.qualcomm.com>
> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>

Patch applied to ath-next branch of ath.git, thanks.

a9f5f287fa1d ath10k: add BMI parameters to fix calibration from DT/pre-cal
Sven Eckelmann Dec. 8, 2017, 12:12 p.m. UTC | #2
On Donnerstag, 25. Mai 2017 16:21:23 CET akolli@qti.qualcomm.com wrote:
> From: Anilkumar Kolli <akolli@qti.qualcomm.com>
> 
> QCA99X0, QCA9888, QCA9984 supports calibration data in
> either OTP or DT/pre-cal file. Current ath10k supports
> Calibration data from OTP only.
> 
> If caldata is loaded from DT/pre-cal file, fetching board id
> and applying calibration parameters like tx power gets failed.
> 
> error log:
> [   15.733663] ath10k_pci 0000:01:00.0: failed to fetch board file: -2
> [   15.741474] ath10k_pci 0000:01:00.0: could not probe fw (-2)
> 
> This patch adds calibration data support from DT/pre-cal
> file.  Below parameters are used to get board id and
> applying calibration parameters from cal data.
> 
> 		EEPROM[OTP]	FLASH[DT/pre-cal file]
> Cal param	0x700		0x10000
> Board id	0x10		0x8000
> 
> Tested on QCA9888 with pre-cal file.
> 
> Signed-off-by: Anilkumar Kolli <akolli@qti.qualcomm.com>
> ---
>  drivers/net/wireless/ath/ath10k/bmi.h  |    2 ++
>  drivers/net/wireless/ath/ath10k/core.c |   16 +++++++++++++---
>  2 files changed, 15 insertions(+), 3 deletions(-)

Just tried this on an QCA9984 which doesn't seem to have the calibration data in the PCI EEPROM.

    [   71.728929] ath10k_pci 0000:01:00.0: qca9984/qca9994 hw1.0 target 0x01000000 chip_id 0x00000000 sub 168c:cafe
    [   71.732926] ath10k_pci 0000:01:00.0: kconfig debug 1 debugfs 1 tracing 0 dfs 1 testmode 1
    [   71.752282] ath10k_pci 0000:01:00.0: firmware ver 10.4-ct-9984-fW-009-dfa0083 api 5 features peer-flow-ctrl crc32 7198d117
    [   73.805730] ath10k_pci 0000:01:00.0: unable to read from the device
    [   73.805769] ath10k_pci 0000:01:00.0: could not execute otp for board id check: -110

It works when I use the pre-cal data as calibration data. The checksum in the 
pre-cal seems to be correct. Also the pre-cal data from 0:ART for the 2.4GHz 
and 5GHz QCA4019 seem to work perfectly fine.

Anything which I could have missed or what I could test? Btw. I've also tested 
the non-ct firmware (aka the official one from QCA).

Kind
Anilkumar Kolli Dec. 8, 2017, 12:35 p.m. UTC | #3
On 2017-12-08 17:42, Sven Eckelmann wrote:
> On Donnerstag, 25. Mai 2017 16:21:23 CET akolli@qti.qualcomm.com wrote:
>> From: Anilkumar Kolli <akolli@qti.qualcomm.com>
>> 
>> QCA99X0, QCA9888, QCA9984 supports calibration data in
>> either OTP or DT/pre-cal file. Current ath10k supports
>> Calibration data from OTP only.
>> 
>> If caldata is loaded from DT/pre-cal file, fetching board id
>> and applying calibration parameters like tx power gets failed.
>> 
>> error log:
>> [   15.733663] ath10k_pci 0000:01:00.0: failed to fetch board file: -2
>> [   15.741474] ath10k_pci 0000:01:00.0: could not probe fw (-2)
>> 
>> This patch adds calibration data support from DT/pre-cal
>> file.  Below parameters are used to get board id and
>> applying calibration parameters from cal data.
>> 
>> 		EEPROM[OTP]	FLASH[DT/pre-cal file]
>> Cal param	0x700		0x10000
>> Board id	0x10		0x8000
>> 
>> Tested on QCA9888 with pre-cal file.
>> 
>> Signed-off-by: Anilkumar Kolli <akolli@qti.qualcomm.com>
>> ---
>>  drivers/net/wireless/ath/ath10k/bmi.h  |    2 ++
>>  drivers/net/wireless/ath/ath10k/core.c |   16 +++++++++++++---
>>  2 files changed, 15 insertions(+), 3 deletions(-)
> 
> Just tried this on an QCA9984 which doesn't seem to have the
> calibration data in the PCI EEPROM.
> 
>     [   71.728929] ath10k_pci 0000:01:00.0: qca9984/qca9994 hw1.0
> target 0x01000000 chip_id 0x00000000 sub 168c:cafe
>     [   71.732926] ath10k_pci 0000:01:00.0: kconfig debug 1 debugfs 1
> tracing 0 dfs 1 testmode 1
>     [   71.752282] ath10k_pci 0000:01:00.0: firmware ver
> 10.4-ct-9984-fW-009-dfa0083 api 5 features peer-flow-ctrl crc32
> 7198d117
>     [   73.805730] ath10k_pci 0000:01:00.0: unable to read from the 
> device
>     [   73.805769] ath10k_pci 0000:01:00.0: could not execute otp for
> board id check: -110
> 

'ATH10K driver <-> 10.4 firmware' expects cal data to be either in 
EEPROM or pre-cal-file or DT.
Hope the error is observed when there is no cal data loaded.

> It works when I use the pre-cal data as calibration data. The checksum 
> in the
> pre-cal seems to be correct. Also the pre-cal data from 0:ART for the 
> 2.4GHz
> and 5GHz QCA4019 seem to work perfectly fine.
> 

Do you mean this patch works for only QCA4019 and not working for 
QCA9984 ?

> Anything which I could have missed or what I could test? Btw. I've also 
> tested
> the non-ct firmware (aka the official one from QCA).
> 

Thanks,
Anil.
Sven Eckelmann Dec. 8, 2017, 1:40 p.m. UTC | #4
On Freitag, 8. Dezember 2017 18:05:38 CET akolli@codeaurora.org wrote:
> On 2017-12-08 17:42, Sven Eckelmann wrote:
> > On Donnerstag, 25. Mai 2017 16:21:23 CET akolli@qti.qualcomm.com wrote:
> >> From: Anilkumar Kolli <akolli@qti.qualcomm.com>
> >> 
> >> QCA99X0, QCA9888, QCA9984 supports calibration data in
> >> either OTP or DT/pre-cal file. Current ath10k supports
> >> Calibration data from OTP only.
[...]
> > Just tried this on an QCA9984 which doesn't seem to have the
> > calibration data in the PCI EEPROM.
> > 
> >     [   71.728929] ath10k_pci 0000:01:00.0: qca9984/qca9994 hw1.0
> > target 0x01000000 chip_id 0x00000000 sub 168c:cafe
> >     [   71.732926] ath10k_pci 0000:01:00.0: kconfig debug 1 debugfs 1
> > tracing 0 dfs 1 testmode 1
> >     [   71.752282] ath10k_pci 0000:01:00.0: firmware ver
> > 10.4-ct-9984-fW-009-dfa0083 api 5 features peer-flow-ctrl crc32
> > 7198d117
> >     [   73.805730] ath10k_pci 0000:01:00.0: unable to read from the 
> > device
> >     [   73.805769] ath10k_pci 0000:01:00.0: could not execute otp for
> > board id check: -110
> > 
> 
> 'ATH10K driver <-> 10.4 firmware' expects cal data to be either in 
> EEPROM or pre-cal-file or DT.
> Hope the error is observed when there is no cal data loaded.

The problem happens when pre-cal data file is loaded using the userspace 
helper on the QCA9984. I was only able to use the device when I (for a test) 
used the pre-cal data as cal-data (file).

The EEPROM on the on the PCI device doesn't seem to be populated with a valid 
pre-cal data. I've already tested it with a QCA9984 device which had pre-cal 
data in the PCI device's EEPROM and this worked fine (without cal file and 
without pre-cal file).

> > It works when I use the pre-cal data as calibration data. The checksum 
> > in the
> > pre-cal seems to be correct. Also the pre-cal data from 0:ART for the 
> > 2.4GHz
> > and 5GHz QCA4019 seem to work perfectly fine.
> > 
> 
> Do you mean this patch works for only QCA4019 and not working for 
> QCA9984 ?

Worked fine for QCA4019 and QCA9888 - but I had no luck with QCA9984. The 
error shown above it the only thing I get.

Kind regards,
	Sven
Anilkumar Kolli Dec. 11, 2017, 1:20 p.m. UTC | #5
On 2017-12-08 19:10, Sven Eckelmann wrote:
> On Freitag, 8. Dezember 2017 18:05:38 CET akolli@codeaurora.org wrote:
>> On 2017-12-08 17:42, Sven Eckelmann wrote:
>> > On Donnerstag, 25. Mai 2017 16:21:23 CET akolli@qti.qualcomm.com wrote:
>> >> From: Anilkumar Kolli <akolli@qti.qualcomm.com>
>> >>
>> >> QCA99X0, QCA9888, QCA9984 supports calibration data in
>> >> either OTP or DT/pre-cal file. Current ath10k supports
>> >> Calibration data from OTP only.
> [...]
>> > Just tried this on an QCA9984 which doesn't seem to have the
>> > calibration data in the PCI EEPROM.
>> >
>> >     [   71.728929] ath10k_pci 0000:01:00.0: qca9984/qca9994 hw1.0
>> > target 0x01000000 chip_id 0x00000000 sub 168c:cafe
>> >     [   71.732926] ath10k_pci 0000:01:00.0: kconfig debug 1 debugfs 1
>> > tracing 0 dfs 1 testmode 1
>> >     [   71.752282] ath10k_pci 0000:01:00.0: firmware ver
>> > 10.4-ct-9984-fW-009-dfa0083 api 5 features peer-flow-ctrl crc32
>> > 7198d117
>> >     [   73.805730] ath10k_pci 0000:01:00.0: unable to read from the
>> > device
>> >     [   73.805769] ath10k_pci 0000:01:00.0: could not execute otp for
>> > board id check: -110
>> >
>> 
>> 'ATH10K driver <-> 10.4 firmware' expects cal data to be either in
>> EEPROM or pre-cal-file or DT.
>> Hope the error is observed when there is no cal data loaded.
> 
> The problem happens when pre-cal data file is loaded using the 
> userspace
> helper on the QCA9984. I was only able to use the device when I (for a 
> test)
> used the pre-cal data as cal-data (file).
> 
> The EEPROM on the on the PCI device doesn't seem to be populated with a 
> valid
> pre-cal data. I've already tested it with a QCA9984 device which had 
> pre-cal
> data in the PCI device's EEPROM and this worked fine (without cal file 
> and
> without pre-cal file).
> 
>> > It works when I use the pre-cal data as calibration data. The checksum
>> > in the
>> > pre-cal seems to be correct. Also the pre-cal data from 0:ART for the
>> > 2.4GHz
>> > and 5GHz QCA4019 seem to work perfectly fine.
>> >
>> 
>> Do you mean this patch works for only QCA4019 and not working for
>> QCA9984 ?
> 
> Worked fine for QCA4019 and QCA9888 - but I had no luck with QCA9984. 
> The
> error shown above it the only thing I get.
> 

I tested this on QCA9984 and it worked with below config,

pre-cal file location: /lib/firmware/ath10k/pre-cal-pci-0000:01:00.0.bin
FW: 
https://github.com/kvalo/ath10k-firmware/raw/master/QCA9984/hw1.0/firmware-5.bin_10.4-3.2-00072
BDF: 
https://github.com/kvalo/ath10k-firmware/raw/master/QCA9984/hw1.0/board-2.bin

Logs:

ath10k_pci 0000:01:00.0: found calibration file 
ath10k/pre-cal-pci-0000:01:00.0.bin
ath10k_pci 0000:01:00.0: found fw version 10.4-3.2-00072
ath10k_pci 0000:01:00.0: boot cal file downloaded
ath10k_pci 0000:01:00.0: boot using calibration mode pre-cal-file
ath10k_pci 0000:01:00.0: boot upload otp to 0x1234 len 8919 for board id
bmi execute address 0x1234 param 0x8000
ath10k_pci 0000:01:00.0: bmi execute result 0x2800
ath10k_pci 0000:01:00.0: boot get otp board id result 0x00002800 
board_id 10 chip_id 0
ath10k_pci 0000:01:00.0: boot using board name 
'bus=pci,bmi-chip-id=0,bmi-board-id=10'
ath10k_pci 0000:01:00.0: Firmware loaded from user helper succesfully
ath10k_pci 0000:01:00.0: boot fw request 
'ath10k/QCA9984/hw1.0/board-2.bin': 0

Kindly try with the latest firmware from Kalle's git mentioned above.

Thanks
Anil.
Sven Eckelmann Dec. 11, 2017, 2:28 p.m. UTC | #6
On Montag, 11. Dezember 2017 18:50:09 CET akolli@codeaurora.org wrote:
[...]
> >> > Just tried this on an QCA9984 which doesn't seem to have the
> >> > calibration data in the PCI EEPROM.
> >> >
> >> >     [   71.728929] ath10k_pci 0000:01:00.0: qca9984/qca9994 hw1.0
> >> > target 0x01000000 chip_id 0x00000000 sub 168c:cafe
> >> >     [   71.732926] ath10k_pci 0000:01:00.0: kconfig debug 1 debugfs 1
> >> > tracing 0 dfs 1 testmode 1
> >> >     [   71.752282] ath10k_pci 0000:01:00.0: firmware ver
> >> > 10.4-ct-9984-fW-009-dfa0083 api 5 features peer-flow-ctrl crc32
> >> > 7198d117
> >> >     [   73.805730] ath10k_pci 0000:01:00.0: unable to read from the
> >> > device
> >> >     [   73.805769] ath10k_pci 0000:01:00.0: could not execute otp for
> >> > board id check: -110
[...]
> 
> I tested this on QCA9984 and it worked with below config,
[...]
> 
> Kindly try with the latest firmware from Kalle's git mentioned above.

This didn't change the behavior. It was actually the OTP timeout problem on 
the QCA9984 which Ben Greear fixed [1]. Luckily, LEDE added this patch with 
your patch [2]

Kind regards,
	Sven

[1] https://git.lede-project.org/?p=source.git;a=blob;f=package/kernel/mac80211/patches/327-ath10k-increase-BMI-timeout.patch;h=c9f493bcd8fe29afe1e08dc31b6370507b95fc72;hb=025cb640cdf27f7c68fc1d89d0698605daa06c43
[2] https://git.lede-project.org/?p=source.git;a=commit;h=025cb640cdf27f7c68fc1d89d0698605daa06c43

Patch
diff mbox

diff --git a/drivers/net/wireless/ath/ath10k/bmi.h b/drivers/net/wireless/ath/ath10k/bmi.h
index 0342073ed397..9834f351807e 100644
--- a/drivers/net/wireless/ath/ath10k/bmi.h
+++ b/drivers/net/wireless/ath/ath10k/bmi.h
@@ -83,6 +83,8 @@  enum bmi_cmd_id {
 #define BMI_NVRAM_SEG_NAME_SZ 16
 
 #define BMI_PARAM_GET_EEPROM_BOARD_ID 0x10
+#define BMI_PARAM_GET_FLASH_BOARD_ID 0x8000
+#define BMI_PARAM_FLASH_SECTION_ALL 0x10000
 
 #define ATH10K_BMI_BOARD_ID_FROM_OTP_MASK   0x7c00
 #define ATH10K_BMI_BOARD_ID_FROM_OTP_LSB    10
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index eea111d704c5..fb859a0c197a 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -691,7 +691,7 @@  static int ath10k_core_get_board_id_from_otp(struct ath10k *ar)
 {
 	u32 result, address;
 	u8 board_id, chip_id;
-	int ret;
+	int ret, bmi_board_id_param;
 
 	address = ar->hw_params.patch_load_addr;
 
@@ -715,8 +715,13 @@  static int ath10k_core_get_board_id_from_otp(struct ath10k *ar)
 		return ret;
 	}
 
-	ret = ath10k_bmi_execute(ar, address, BMI_PARAM_GET_EEPROM_BOARD_ID,
-				 &result);
+	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
+	    ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
+		bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
+	else
+		bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
+
+	ret = ath10k_bmi_execute(ar, address, bmi_board_id_param, &result);
 	if (ret) {
 		ath10k_err(ar, "could not execute otp for board id check: %d\n",
 			   ret);
@@ -845,6 +850,11 @@  static int ath10k_download_and_run_otp(struct ath10k *ar)
 		return ret;
 	}
 
+	/* As of now pre-cal is valid for 10_4 variants */
+	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
+	    ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
+		bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
+
 	ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
 	if (ret) {
 		ath10k_err(ar, "could not execute otp (%d)\n", ret);