ath10k: avoid consecutive OTP download to reduce boot time
authorVikas Patel <vikpatel@codeaurora.org>
Tue, 7 Jan 2020 06:23:15 +0000 (11:53 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 11 Mar 2020 16:29:50 +0000 (18:29 +0200)
Currently, OTP is downloaded twice in case of "pre-cal-dt"
and "pre-cal-file" to fetch the board ID and takes around
~2 sec more boot uptime.

First OTP download happens in "ath10k_core_probe_fw" and
second in ath10k_core_start. First boot does not need OTP
download in core start when valid board id acquired.

The second OTP download is required upon core stop/start.

This patch skips the OTP download when first OTP download
has acquired a valid board id. This patch also marks board
id invalid in "ath10k_core_stop", which will force the OTP
download in ath10k_core_start and fetches valid board id.

Tested HW: QCA9984
Tested FW: 10.4-3.6-00104

Signed-off-by: Vikas Patel <vikpatel@codeaurora.org>
Signed-off-by: Maharaja Kennadyrajan <mkenna@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/core.c

index 5712e28..f561b8b 100644 (file)
@@ -874,6 +874,13 @@ static int ath10k_core_get_board_id_from_otp(struct ath10k *ar)
                return -ENODATA;
        }
 
+       if (ar->id.bmi_ids_valid) {
+               ath10k_dbg(ar, ATH10K_DBG_BOOT,
+                          "boot already acquired valid otp board id,skip download, board_id %d chip_id %d\n",
+                          ar->id.bmi_board_id, ar->id.bmi_chip_id);
+               goto skip_otp_download;
+       }
+
        ath10k_dbg(ar, ATH10K_DBG_BOOT,
                   "boot upload otp to 0x%x len %zd for board id\n",
                   address, ar->normal_mode_fw.fw_file.otp_len);
@@ -921,6 +928,8 @@ static int ath10k_core_get_board_id_from_otp(struct ath10k *ar)
        ar->id.bmi_board_id = board_id;
        ar->id.bmi_chip_id = chip_id;
 
+skip_otp_download:
+
        return 0;
 }
 
@@ -2905,6 +2914,8 @@ void ath10k_core_stop(struct ath10k *ar)
        ath10k_htt_tx_stop(&ar->htt);
        ath10k_htt_rx_free(&ar->htt);
        ath10k_wmi_detach(ar);
+
+       ar->id.bmi_ids_valid = false;
 }
 EXPORT_SYMBOL(ath10k_core_stop);