Patchwork [2/2,2/2,v2] qe: add polling timeout to qe_issue_cmd()

login
register
mail settings
Submitter Timur Tabi
Date May 26, 2009, 3:21 p.m.
Message ID <1243351302-32062-3-git-send-email-timur@freescale.com>
Download mbox | patch
Permalink /patch/27664/
State Accepted
Commit f49156ea1bf3bccf45a01351cf3db2b5f6a8597e
Delegated to: Kumar Gala
Headers show

Comments

Timur Tabi - May 26, 2009, 3:21 p.m.
The qe_issue_cmd() function (Freescale PowerPC QUICC Engine library) polls on
a register until a status bit changes, but does not include a timeout to
handle the situation if the bit never changes.  Change the code to use the new
spin_event_timeout() macro, which simplifies polling on a register without
a timeout.

Signed-off-by: Timur Tabi <timur@freescale.com>
---

This patch depends on my previous patch, "powerpc: introduce macro
spin_event_timeout()".

 arch/powerpc/sysdev/qe_lib/qe.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)
Kumar Gala - June 16, 2009, 11:58 p.m.
On May 26, 2009, at 10:21 AM, Timur Tabi wrote:

> The qe_issue_cmd() function (Freescale PowerPC QUICC Engine library)  
> polls on
> a register until a status bit changes, but does not include a  
> timeout to
> handle the situation if the bit never changes.  Change the code to  
> use the new
> spin_event_timeout() macro, which simplifies polling on a register  
> without
> a timeout.
>
> Signed-off-by: Timur Tabi <timur@freescale.com>
> ---
>
> This patch depends on my previous patch, "powerpc: introduce macro
> spin_event_timeout()".
>
> arch/powerpc/sysdev/qe_lib/qe.c |    9 ++++++---
> 1 files changed, 6 insertions(+), 3 deletions(-)

applied to next

- k

Patch

diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c
index 01bce37..05bdd43 100644
--- a/arch/powerpc/sysdev/qe_lib/qe.c
+++ b/arch/powerpc/sysdev/qe_lib/qe.c
@@ -111,6 +111,7 @@  int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
 {
 	unsigned long flags;
 	u8 mcn_shift = 0, dev_shift = 0;
+	u32 ret;
 
 	spin_lock_irqsave(&qe_lock, flags);
 	if (cmd == QE_RESET) {
@@ -138,11 +139,13 @@  int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input)
 	}
 
 	/* wait for the QE_CR_FLG to clear */
-	while(in_be32(&qe_immr->cp.cecr) & QE_CR_FLG)
-		cpu_relax();
+	ret = spin_event_timeout((in_be32(&qe_immr->cp.cecr) & QE_CR_FLG) == 0,
+			   100, 0);
+	/* On timeout (e.g. failure), the expression will be false (ret == 0),
+	   otherwise it will be true (ret == 1). */
 	spin_unlock_irqrestore(&qe_lock, flags);
 
-	return 0;
+	return ret == 1;
 }
 EXPORT_SYMBOL(qe_issue_cmd);