<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2900.5512" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial size=2>Index: 
V:/svn/winib/trunk/hw/mlx4/kernel/bus/net/cmd.c<BR>===================================================================<BR>--- 
V:/svn/winib/trunk/hw/mlx4/kernel/bus/net/cmd.c (revision 5038)<BR>+++ 
V:/svn/winib/trunk/hw/mlx4/kernel/bus/net/cmd.c (revision 5039)<BR>@@ 
-102,6 +102,7 
@@<BR>  int   next;<BR>  u64   out_param;<BR>  u16   token;<BR>+ u8   status;<BR> };<BR> <BR> static 
int mlx4_status_to_errno(u8 status) {<BR>@@ -137,13 +138,13 
@@<BR>  return trans_table[status];<BR> }<BR> <BR>-static 
int cmd_pending(struct mlx4_dev *dev)<BR>+static int cmd_pending(struct mlx4_dev 
*dev, u32 *p_status)<BR> {<BR>- u32 status = 
readl(mlx4_priv(dev)->cmd.hcr + HCR_STATUS_OFFSET);<BR>+ *p_status = 
readl(mlx4_priv(dev)->cmd.hcr + 
HCR_STATUS_OFFSET);<BR> <BR>- return (status & swab32(1 << 
HCR_GO_BIT)) ||<BR>+ return (*p_status & swab32(1 << HCR_GO_BIT)) 
||<BR>   (mlx4_priv(dev)->cmd.toggle ==<BR>-   
!!(status & swab32(1 << HCR_T_BIT)));<BR>+   !!(*p_status 
& swab32(1 << HCR_T_BIT)));<BR> }<BR> <BR> static int 
mlx4_cmd_post(struct mlx4_dev *dev, u64 in_param, u64 out_param,<BR>@@ -154,6 
+155,7 @@<BR>  u32 __iomem *hcr = (u32 __iomem 
*)cmd->hcr;<BR>  int ret = -EAGAIN;<BR>  u64 
end;<BR>+ u32 
hcr_status;<BR> <BR>  mutex_lock(&cmd->hcr_mutex);<BR> <BR>@@ 
-161,9 +163,12 @@<BR>  if (event)<BR>   end += 
msecs_to_jiffies(GO_BIT_TIMEOUT_MSECS);<BR> <BR>- while 
(cmd_pending(dev)) {<BR>-  if (time_after_eq(jiffies, 
end))<BR>+ while (cmd_pending(dev, &hcr_status)) {<BR>+  if 
(time_after_eq(jiffies, end)) {<BR>+   mlx4_err(dev, "Failed to 
post command %02x during %d msecs, hcr_status %#x, toggle 
%#x\n",<BR>+    op, GO_BIT_TIMEOUT_MSECS, hcr_status, 
mlx4_priv(dev)->cmd.toggle );<BR>    goto 
out;<BR>+  }<BR>   cond_resched();<BR>  }<BR> <BR>@@ 
-212,8 +217,9 @@<BR>  u8 __iomem *hcr = 
priv->cmd.hcr;<BR>  int err = 0;<BR>  u64 
end;<BR>- u8 status;<BR>+ u8 status = 0xff; /* means "unknown" 
*/<BR>  long do_reset;<BR>+ u32 
hcr_status;<BR> <BR>  down(&priv->cmd.poll_sem);<BR> <BR>@@ 
-223,13 +229,13 @@<BR>   goto out;<BR> <BR>  end = 
msecs_to_jiffies(timeout) + jiffies;<BR>- while (cmd_pending(dev) 
&& time_before(jiffies, end))<BR>+ while (cmd_pending(dev, 
&hcr_status) && time_before(jiffies, 
end))<BR>   cond_resched();<BR> <BR>- if 
(cmd_pending(dev)) {<BR>+ if (cmd_pending(dev, &hcr_status)) 
{<BR>   err = -ETIMEDOUT;<BR>-  mlx4_err(dev, 
"mlx4_cmd_poll: Command %02x completed with timeout after %d msecs 
\n",<BR>-     op, timeout);<BR>+  mlx4_err(dev, 
"mlx4_cmd_poll: Command %02x: timeout after %d msecs, hcr_status %#x, toggle %#x 
\n",<BR>+     op, timeout, hcr_status, 
mlx4_priv(dev)->cmd.toggle);<BR> <BR>   do_reset = 
InterlockedCompareExchange(&dev->reset_pending, 1, 
0);<BR>   if (!do_reset) {<BR>@@ -258,11 +264,11 
@@<BR> <BR>  status = (u8)(be32_to_cpu((__force 
__be32)__raw_readl(hcr + HCR_STATUS_OFFSET)) >> 24);<BR>  err = 
mlx4_status_to_errno(status);<BR>+<BR>+out:<BR>  if (status && 
status != 0x50)<BR>-  mlx4_err(dev, "Command failed: op %#hx, status 
%#02x, errno %d.\n", <BR>+  mlx4_err(dev, "mlx4_cmd_poll: Command 
failed: op %#hx, status %#02x, errno %d.\n", <BR>    op, 
status, 
err);<BR>-<BR>-out:<BR>  up(&priv->cmd.poll_sem);<BR>  return 
err;<BR> }<BR>@@ -274,14 +280,14 
@@<BR>   &priv->cmd.context[token & 
priv->cmd.token_mask];<BR> <BR>  /* previously timed out 
command completing at long last */<BR>- if (token != 
context->token)<BR>+ if (token != context->token) 
{<BR>+  mlx4_err(dev, "mlx4_cmd_event: Command skipped: token %#hx, 
ctx_token %#hx\n", <BR>+   token, 
context->token);<BR>   return;<BR>+ }<BR> <BR>  context->result    
= mlx4_status_to_errno(status);<BR>- <BR>- if 
(status)<BR>-  mlx4_err(dev, "Command failed: token %#hx, status 
%#02x, errno %d.\n", <BR>-   token, status, 
context->result);<BR>+ context->status    = 
status;<BR>  context->out_param = 
out_param;<BR> <BR>  complete(&context->done);<BR>@@ 
-296,6 +302,7 @@<BR>  int err = 0;<BR>  u64 out_prm = 
out_param ? *out_param : 0;<BR>  long do_reset;<BR>+ u8 status = 
0xff; /* means "unknown" 
*/<BR> <BR>  down(&cmd->event_sem);<BR>  if ( 
dev->flags & MLX4_FLAG_RESET_DRIVER ) {<BR>@@ -312,8 +319,10 
@@<BR> <BR>  init_completion(&context->done);<BR> <BR>- mlx4_cmd_post(dev, 
in_param, out_prm,<BR>+ err = mlx4_cmd_post(dev, in_param, 
out_prm,<BR>   in_modifier, op_modifier, op, context->token, 
1);<BR>+ if (err)<BR>+  goto out;<BR> <BR>  if 
(wait_for_completion_timeout(&context->done, msecs_to_jiffies(timeout))) 
{<BR>   if (!context->done.done) {<BR>@@ -348,12 +357,14 
@@<BR>   }<BR>   else 
{<BR>    err = -EFAULT;<BR>-   mlx4_err(dev, 
"mlx4_cmd_wait: Unexpected end of waiting for a comand 
\n");<BR>+   mlx4_err(dev, "mlx4_cmd_wait: Unexpected end of 
waiting for a command 
\n");<BR>    ASSERT(0);<BR>   }<BR>  }<BR>- else<BR>+ else 
{<BR>   err = context->result;<BR>+  status = 
context->status;<BR>+ }<BR>  <BR>  if 
(err)<BR>   goto out;<BR>@@ -366,6 +377,9 
@@<BR>  context->next = 
cmd->free_head;<BR>  cmd->free_head = (int)(context - 
cmd->context);<BR>  spin_unlock(&cmd->context_lock);<BR>+ if 
(status && status != 0x50)<BR>+  mlx4_err(dev, "mlx4_cmd_wait: 
Command failed: op %#hx, status %#02x, errno %d, token %#hx.\n", 
<BR>+   op, status, err, 
context->token);<BR> <BR> exit: <BR>  up(&cmd->event_sem);<BR></FONT></DIV></BODY></HTML>