All of lore.kernel.org
 help / color / mirror / Atom feed
* [ath9k-devel] [PATCH] ath10k: avoid infinite loop
       [not found] <87wqrhcqxq.fsf@kamboji.qca.qualcomm.com>
@ 2013-05-06  7:33 ` Michal Kazior
  2013-05-07 14:00   ` Kalle Valo
  2013-05-06  7:47 ` [ath9k-devel] [RFT] ath10k: retry target reset Michal Kazior
  1 sibling, 1 reply; 6+ messages in thread
From: Michal Kazior @ 2013-05-06  7:33 UTC (permalink / raw)
  To: ath9k-devel

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath10k/pci.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index ca09a44..41e58da 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -457,9 +457,11 @@ void ath10k_do_pci_wake(struct ath10k *ar)
 			break;
 		}
 
-		if (tot_delay > PCIE_WAKE_TIMEOUT)
-			ath10k_warn("keep_awake_count %d\n",
+		if (tot_delay > PCIE_WAKE_TIMEOUT) {
+			ath10k_warn("target takes too long to wake up (awake count %d)\n",
 				    atomic_read(&ar_pci->keep_awake_count));
+			break;
+		}
 
 		udelay(curr_delay);
 		tot_delay += curr_delay;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [ath9k-devel] [RFT] ath10k: retry target reset
       [not found] <87wqrhcqxq.fsf@kamboji.qca.qualcomm.com>
  2013-05-06  7:33 ` [ath9k-devel] [PATCH] ath10k: avoid infinite loop Michal Kazior
@ 2013-05-06  7:47 ` Michal Kazior
  2013-05-09  6:57   ` Kalle Valo
  1 sibling, 1 reply; 6+ messages in thread
From: Michal Kazior @ 2013-05-06  7:47 UTC (permalink / raw)
  To: ath9k-devel

Sometimes the device just won't reset cleanly
without retrying. This seems to depend on the host
hardware.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---

I can't reproduce the issue on my hw. Can someone
confirm if this fixes the problem?


 drivers/net/wireless/ath/ath10k/pci.c |   48 +++++++++++++++++++++++++--------
 1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index 41e58da..3ae9298 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -422,15 +422,19 @@ static bool ath10k_pci_target_is_awake(struct ath10k *ar)
 	return (RTC_STATE_V_GET(val) == RTC_STATE_V_ON);
 }
 
-static void ath10k_pci_wait(struct ath10k *ar)
+static int ath10k_pci_wait(struct ath10k *ar)
 {
 	int n = 100;
 
 	while (n-- && !ath10k_pci_target_is_awake(ar))
 		msleep(10);
 
-	if (n < 0)
+	if (n < 0) {
 		ath10k_warn("Unable to wakeup target\n");
+		return -EIO;
+	}
+
+	return 0;
 }
 
 void ath10k_do_pci_wake(struct ath10k *ar)
@@ -1931,7 +1935,12 @@ static int ath10k_pci_start_intr_legacy(struct ath10k *ar)
 		  ar_pci->mem + PCIE_LOCAL_BASE_ADDRESS +
 		  PCIE_SOC_WAKE_ADDRESS);
 
-	ath10k_pci_wait(ar);
+	ret = ath10k_pci_wait(ar);
+	if (ret) {
+		ath10k_err("target did not wake up\n");
+		free_irq(ar_pci->pdev->irq, ar);
+		return ret;
+	}
 
 	/*
 	 * A potential race occurs here: The CORE_BASE write
@@ -2019,13 +2028,18 @@ static int ath10k_pci_reset_target(struct ath10k *ar)
 {
 	struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
 	int wait_limit = 300; /* 3 sec */
+	int ret = 0;
 
 	/* Wait for Target to finish initialization before we proceed. */
 	iowrite32(PCIE_SOC_WAKE_V_MASK,
 		  ar_pci->mem + PCIE_LOCAL_BASE_ADDRESS +
 		  PCIE_SOC_WAKE_ADDRESS);
 
-	ath10k_pci_wait(ar);
+	ret = ath10k_pci_wait(ar);
+	if (ret) {
+		ath10k_warn("target did not wake up\n");
+		goto exit;
+	}
 
 	while (wait_limit-- &&
 	       !(ioread32(ar_pci->mem + FW_INDICATOR_ADDRESS) &
@@ -2040,18 +2054,19 @@ static int ath10k_pci_reset_target(struct ath10k *ar)
 	}
 
 	if (wait_limit < 0) {
-		ath10k_err("Target stalled\n");
+		ath10k_warn("target stalled\n");
 		iowrite32(PCIE_SOC_WAKE_RESET,
 			  ar_pci->mem + PCIE_LOCAL_BASE_ADDRESS +
 			  PCIE_SOC_WAKE_ADDRESS);
-		return -EIO;
+		ret = -EIO;
+		goto exit;
 	}
 
+exit:
 	iowrite32(PCIE_SOC_WAKE_RESET,
 		  ar_pci->mem + PCIE_LOCAL_BASE_ADDRESS +
 		  PCIE_SOC_WAKE_ADDRESS);
-
-	return 0;
+	return ret;
 }
 
 static void ath10k_pci_device_reset(struct ath10k_pci *ar_pci)
@@ -2128,6 +2143,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
 	struct ath10k *ar;
 	struct ath10k_pci *ar_pci;
 	u32 lcr_val;
+	int reset_retries = 3;
 
 	ath10k_dbg(ATH10K_DBG_PCI, "%s\n", __func__);
 
@@ -2252,11 +2268,21 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
 	 * is in an unexpected state. We try to catch that here in order to
 	 * reset the Target and retry the probe.
 	 */
-	ath10k_pci_device_reset(ar_pci);
+	while (reset_retries-- > 0) {
+		ath10k_pci_device_reset(ar_pci);
 
-	ret = ath10k_pci_reset_target(ar);
-	if (ret)
+		ret = ath10k_pci_reset_target(ar);
+		if (ret == 0)
+			break;
+
+		ath10k_warn("retrying to reset target (%d tries left)\n",
+			    reset_retries);
+	}
+
+	if (ret) {
+		ath10k_err("could not reset target (%d)\n", ret);
 		goto err_intr;
+	}
 
 	if (ath10k_target_ps) {
 		ath10k_dbg(ATH10K_DBG_PCI, "on-chip power save enabled\n");
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [ath9k-devel] [PATCH] ath10k: avoid infinite loop
  2013-05-06  7:33 ` [ath9k-devel] [PATCH] ath10k: avoid infinite loop Michal Kazior
@ 2013-05-07 14:00   ` Kalle Valo
  0 siblings, 0 replies; 6+ messages in thread
From: Kalle Valo @ 2013-05-07 14:00 UTC (permalink / raw)
  To: ath9k-devel

Michal Kazior <michal.kazior@tieto.com> writes:

> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>

Thanks, applied.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ath9k-devel] [RFT] ath10k: retry target reset
  2013-05-06  7:47 ` [ath9k-devel] [RFT] ath10k: retry target reset Michal Kazior
@ 2013-05-09  6:57   ` Kalle Valo
  2013-05-09  7:22     ` Michal Kazior
  0 siblings, 1 reply; 6+ messages in thread
From: Kalle Valo @ 2013-05-09  6:57 UTC (permalink / raw)
  To: ath9k-devel

Michal Kazior <michal.kazior@tieto.com> writes:

> Sometimes the device just won't reset cleanly
> without retrying. This seems to depend on the host
> hardware.
>
> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
> ---
>
> I can't reproduce the issue on my hw. Can someone
> confirm if this fixes the problem?

If you are referencing to the crash I reported to you privately, I have
seen that problem only once and haven't been able to reproduce since. So
I can't really test this patch.

> @@ -1931,7 +1935,12 @@ static int ath10k_pci_start_intr_legacy(struct ath10k *ar)
>  		  ar_pci->mem + PCIE_LOCAL_BASE_ADDRESS +
>  		  PCIE_SOC_WAKE_ADDRESS);
>  
> -	ath10k_pci_wait(ar);
> +	ret = ath10k_pci_wait(ar);
> +	if (ret) {
> +		ath10k_err("target did not wake up\n");
> +		free_irq(ar_pci->pdev->irq, ar);
> +		return ret;
> +	}
>  
>  	/*
>  	 * A potential race occurs here: The CORE_BASE write
> @@ -2019,13 +2028,18 @@ static int ath10k_pci_reset_target(struct ath10k *ar)
>  {
>  	struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
>  	int wait_limit = 300; /* 3 sec */
> +	int ret = 0;
>  
>  	/* Wait for Target to finish initialization before we proceed. */
>  	iowrite32(PCIE_SOC_WAKE_V_MASK,
>  		  ar_pci->mem + PCIE_LOCAL_BASE_ADDRESS +
>  		  PCIE_SOC_WAKE_ADDRESS);
>  
> -	ath10k_pci_wait(ar);
> +	ret = ath10k_pci_wait(ar);
> +	if (ret) {
> +		ath10k_warn("target did not wake up\n");
> +		goto exit;

You have same warnings messages in different places now. I recommend
adding "..for start" and "...for reset", or something like that, to
exactly identify the warning location. Example:

ath10k_warn("target did not wake up for reset\n");

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ath9k-devel] [RFT] ath10k: retry target reset
  2013-05-09  6:57   ` Kalle Valo
@ 2013-05-09  7:22     ` Michal Kazior
  2013-05-09  8:27       ` Kalle Valo
  0 siblings, 1 reply; 6+ messages in thread
From: Michal Kazior @ 2013-05-09  7:22 UTC (permalink / raw)
  To: ath9k-devel

On 09/05/13 08:57, Kalle Valo wrote:
> Michal Kazior <michal.kazior@tieto.com> writes:
>
>> Sometimes the device just won't reset cleanly
>> without retrying. This seems to depend on the host
>> hardware.
>>
>> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
>> ---
>>
>> I can't reproduce the issue on my hw. Can someone
>> confirm if this fixes the problem?
>
> If you are referencing to the crash I reported to you privately, I have
> seen that problem only once and haven't been able to reproduce since. So
> I can't really test this patch.

Yes. This is both fortunate, and unfortunate :) The patch is actually my 
best guess what that issue might've been related to.


> You have same warnings messages in different places now. I recommend
> adding "..for start" and "...for reset", or something like that, to
> exactly identify the warning location. Example:
>
> ath10k_warn("target did not wake up for reset\n");

Good catch. Thanks!


-- Pozdrawiam / Best regards, Michal Kazior.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [ath9k-devel] [RFT] ath10k: retry target reset
  2013-05-09  7:22     ` Michal Kazior
@ 2013-05-09  8:27       ` Kalle Valo
  0 siblings, 0 replies; 6+ messages in thread
From: Kalle Valo @ 2013-05-09  8:27 UTC (permalink / raw)
  To: ath9k-devel

Michal Kazior <michal.kazior@tieto.com> writes:

> On 09/05/13 08:57, Kalle Valo wrote:
>> Michal Kazior <michal.kazior@tieto.com> writes:
>>
>>> Sometimes the device just won't reset cleanly
>>> without retrying. This seems to depend on the host
>>> hardware.
>>>
>>> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
>>> ---
>>>
>>> I can't reproduce the issue on my hw. Can someone
>>> confirm if this fixes the problem?
>>
>> If you are referencing to the crash I reported to you privately, I have
>> seen that problem only once and haven't been able to reproduce since. So
>> I can't really test this patch.
>
> Yes. This is both fortunate, and unfortunate :) The patch is actually
> my best guess what that issue might've been related to.

At least your patch should help with the symptoms after the problem
appears. I will let you know if I see the problem again.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-05-09  8:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <87wqrhcqxq.fsf@kamboji.qca.qualcomm.com>
2013-05-06  7:33 ` [ath9k-devel] [PATCH] ath10k: avoid infinite loop Michal Kazior
2013-05-07 14:00   ` Kalle Valo
2013-05-06  7:47 ` [ath9k-devel] [RFT] ath10k: retry target reset Michal Kazior
2013-05-09  6:57   ` Kalle Valo
2013-05-09  7:22     ` Michal Kazior
2013-05-09  8:27       ` Kalle Valo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.