summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx5/core/cmd.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/cmd.c44
1 files changed, 9 insertions, 35 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index 20768ef2e..4957412ff 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -969,32 +969,19 @@ static void cmd_work_handler(struct work_struct *work)
bool poll_cmd = ent->polling;
struct mlx5_cmd_layout *lay;
struct mlx5_core_dev *dev;
- unsigned long timeout;
+ unsigned long cb_timeout;
+ struct semaphore *sem;
unsigned long flags;
int alloc_ret;
int cmd_mode;
- complete(&ent->handling);
-
dev = container_of(cmd, struct mlx5_core_dev, cmd);
- timeout = msecs_to_jiffies(mlx5_tout_ms(dev, CMD));
+ cb_timeout = msecs_to_jiffies(mlx5_tout_ms(dev, CMD));
+ complete(&ent->handling);
+ sem = ent->page_queue ? &cmd->vars.pages_sem : &cmd->vars.sem;
+ down(sem);
if (!ent->page_queue) {
- if (down_timeout(&cmd->vars.sem, timeout)) {
- mlx5_core_warn(dev, "%s(0x%x) timed out while waiting for a slot.\n",
- mlx5_command_str(ent->op), ent->op);
- if (ent->callback) {
- ent->callback(-EBUSY, ent->context);
- mlx5_free_cmd_msg(dev, ent->out);
- free_msg(dev, ent->in);
- cmd_ent_put(ent);
- } else {
- ent->ret = -EBUSY;
- complete(&ent->done);
- }
- complete(&ent->slotted);
- return;
- }
alloc_ret = cmd_alloc_index(cmd, ent);
if (alloc_ret < 0) {
mlx5_core_err_rl(dev, "failed to allocate command entry\n");
@@ -1007,11 +994,10 @@ static void cmd_work_handler(struct work_struct *work)
ent->ret = -EAGAIN;
complete(&ent->done);
}
- up(&cmd->vars.sem);
+ up(sem);
return;
}
} else {
- down(&cmd->vars.pages_sem);
ent->idx = cmd->vars.max_reg_cmds;
spin_lock_irqsave(&cmd->alloc_lock, flags);
clear_bit(ent->idx, &cmd->vars.bitmask);
@@ -1019,8 +1005,6 @@ static void cmd_work_handler(struct work_struct *work)
spin_unlock_irqrestore(&cmd->alloc_lock, flags);
}
- complete(&ent->slotted);
-
lay = get_inst(cmd, ent->idx);
ent->lay = lay;
memset(lay, 0, sizeof(*lay));
@@ -1039,7 +1023,7 @@ static void cmd_work_handler(struct work_struct *work)
ent->ts1 = ktime_get_ns();
cmd_mode = cmd->mode;
- if (ent->callback && schedule_delayed_work(&ent->cb_timeout_work, timeout))
+ if (ent->callback && schedule_delayed_work(&ent->cb_timeout_work, cb_timeout))
cmd_ent_get(ent);
set_bit(MLX5_CMD_ENT_STATE_PENDING_COMP, &ent->state);
@@ -1159,9 +1143,6 @@ static int wait_func(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent)
ent->ret = -ECANCELED;
goto out_err;
}
-
- wait_for_completion(&ent->slotted);
-
if (cmd->mode == CMD_MODE_POLLING || ent->polling)
wait_for_completion(&ent->done);
else if (!wait_for_completion_timeout(&ent->done, timeout))
@@ -1176,9 +1157,6 @@ out_err:
} else if (err == -ECANCELED) {
mlx5_core_warn(dev, "%s(0x%x) canceled on out of queue timeout.\n",
mlx5_command_str(ent->op), ent->op);
- } else if (err == -EBUSY) {
- mlx5_core_warn(dev, "%s(0x%x) timeout while waiting for command semaphore.\n",
- mlx5_command_str(ent->op), ent->op);
}
mlx5_core_dbg(dev, "err %d, delivery status %s(%d)\n",
err, deliv_status_to_str(ent->status), ent->status);
@@ -1230,7 +1208,6 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
ent->polling = force_polling;
init_completion(&ent->handling);
- init_completion(&ent->slotted);
if (!callback)
init_completion(&ent->done);
@@ -1248,7 +1225,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
return 0; /* mlx5_cmd_comp_handler() will put(ent) */
err = wait_func(dev, ent);
- if (err == -ETIMEDOUT || err == -ECANCELED || err == -EBUSY)
+ if (err == -ETIMEDOUT || err == -ECANCELED)
goto out_free;
ds = ent->ts2 - ent->ts1;
@@ -1634,9 +1611,6 @@ static int cmd_comp_notifier(struct notifier_block *nb,
dev = container_of(cmd, struct mlx5_core_dev, cmd);
eqe = data;
- if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR)
- return NOTIFY_DONE;
-
mlx5_cmd_comp_handler(dev, be32_to_cpu(eqe->data.cmd.vector), false);
return NOTIFY_OK;