complete(&context->done);
}
+static int get_status(struct mlx4_dev *dev, u32 *status, int *go_bit,
+ int *t_bit)
+{
+ if (pci_channel_offline(dev->persist->pdev))
+ return -EIO;
+
+ *status = readl(mlx4_priv(dev)->cmd.hcr + HCR_STATUS_OFFSET);
+ *t_bit = !!(*status & swab32(1 << HCR_T_BIT));
+ *go_bit = !!(*status & swab32(1 << HCR_GO_BIT));
+
+ return 0;
+}
+
static int mlx4_cmd_wait(struct mlx4_dev *dev, u64 in_param, u64 *out_param,
int out_is_imm, u32 in_modifier, u8 op_modifier,
u16 op, unsigned long timeout)
struct mlx4_cmd *cmd = &mlx4_priv(dev)->cmd;
struct mlx4_cmd_context *context;
int err = 0;
+ int go_bit = 0, t_bit = 0, stat_err;
+ u32 status = 0;
down(&cmd->event_sem);
if (!wait_for_completion_timeout(&context->done,
msecs_to_jiffies(timeout))) {
- mlx4_warn(dev, "command 0x%x timed out (go bit not cleared)\n",
- op);
+ stat_err = get_status(dev, &status, &go_bit, &t_bit);
+ mlx4_warn(dev, "command 0x%x timed out: "
+ "get_status err=%d, status=0x%x, go_bit=%d, "
+ "t_bit=%d, toggle=0x%x\n", op, stat_err, status,
+ go_bit, t_bit, mlx4_priv(dev)->cmd.toggle);
if (op == MLX4_CMD_NOP) {
err = -EBUSY;
goto out;