diff options
Diffstat (limited to 'package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch')
-rw-r--r-- | package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch b/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch new file mode 100644 index 0000000..500f72f --- /dev/null +++ b/package/kernel/mac80211/patches/328-ath10k-log-when-longer-bmi-cmds-happen.patch @@ -0,0 +1,74 @@ +From: Ben Greear <greearb@candelatech.com> +Date: Wed, 31 May 2017 14:21:21 +0300 +Subject: [PATCH] ath10k: log when longer bmi cmds happen + +This lets one have a clue that maybe timeouts are happening +when we just aren't waiting long enough. + +Signed-off-by: Ben Greear <greearb@candelatech.com> +Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> +--- + +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -101,7 +101,8 @@ static int ath10k_pci_init_irq(struct at + static int ath10k_pci_deinit_irq(struct ath10k *ar); + static int ath10k_pci_request_irq(struct ath10k *ar); + static void ath10k_pci_free_irq(struct ath10k *ar); +-static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe, ++static int ath10k_pci_bmi_wait(struct ath10k *ar, ++ struct ath10k_ce_pipe *tx_pipe, + struct ath10k_ce_pipe *rx_pipe, + struct bmi_xfer *xfer); + static int ath10k_pci_qca99x0_chip_reset(struct ath10k *ar); +@@ -1843,7 +1844,7 @@ int ath10k_pci_hif_exchange_bmi_msg(stru + if (ret) + goto err_resp; + +- ret = ath10k_pci_bmi_wait(ce_tx, ce_rx, &xfer); ++ ret = ath10k_pci_bmi_wait(ar, ce_tx, ce_rx, &xfer); + if (ret) { + u32 unused_buffer; + unsigned int unused_nbytes; +@@ -1910,23 +1911,37 @@ static void ath10k_pci_bmi_recv_data(str + xfer->rx_done = true; + } + +-static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe, ++static int ath10k_pci_bmi_wait(struct ath10k *ar, ++ struct ath10k_ce_pipe *tx_pipe, + struct ath10k_ce_pipe *rx_pipe, + struct bmi_xfer *xfer) + { + unsigned long timeout = jiffies + BMI_COMMUNICATION_TIMEOUT_HZ; ++ unsigned long started = jiffies; ++ unsigned long dur; ++ int ret; + + while (time_before_eq(jiffies, timeout)) { + ath10k_pci_bmi_send_done(tx_pipe); + ath10k_pci_bmi_recv_data(rx_pipe); + +- if (xfer->tx_done && (xfer->rx_done == xfer->wait_for_resp)) +- return 0; ++ if (xfer->tx_done && (xfer->rx_done == xfer->wait_for_resp)) { ++ ret = 0; ++ goto out; ++ } + + schedule(); + } + +- return -ETIMEDOUT; ++ ret = -ETIMEDOUT; ++ ++out: ++ dur = jiffies - started; ++ if (dur > HZ) ++ ath10k_dbg(ar, ATH10K_DBG_BMI, ++ "bmi cmd took %lu jiffies hz %d ret %d\n", ++ dur, HZ, ret); ++ return ret; + } + + /* |