265 u16 op, unsigned long timeout)
266{
267 struct mlx4_cmd *cmd = &mlx4_priv(dev)->cmd;
268 struct mlx4_cmd_context *context;
269 int err = 0;
270
271 down(&cmd->event_sem);
272
273 spin_lock(&cmd->context_lock);
274 BUG_ON(cmd->free_head < 0);
275 context = &cmd->context[cmd->free_head];
276 context->token += cmd->token_mask + 1;
277 cmd->free_head = context->next;
278 spin_unlock(&cmd->context_lock);
279
280 init_completion(&context->done);
281
282 mlx4_cmd_post(dev, in_param, out_param ? *out_param : 0,
283 in_modifier, op_modifier, op, context->token, 1);
284
285 if (!wait_for_completion_timeout(&context->done, msecs_to_jiffies(timeout))) {
286 err = -EBUSY;
287 goto out;
288 }
289
290 err = context->result;
291 if (err)
292 goto out;
293
294 if (out_is_imm)
295 *out_param = context->out_param;
296
297out:
298 spin_lock(&cmd->context_lock);
299 context->next = cmd->free_head;
300 cmd->free_head = context - cmd->context;
301 spin_unlock(&cmd->context_lock);
302
303 up(&cmd->event_sem);
304 return err;
305}