struct mthca_cmd_context {
        struct completion done;
-       struct timer_list timer;
        int               result;
        int               next;
        u64               out_param;
        complete(&context->done);
 }
 
-static void event_timeout(unsigned long context_ptr)
-{
-       struct mthca_cmd_context *context =
-               (struct mthca_cmd_context *) context_ptr;
-
-       context->result = -EBUSY;
-       complete(&context->done);
-}
-
 static int mthca_cmd_wait(struct mthca_dev *dev,
                          u64 in_param,
                          u64 *out_param,
        if (err)
                goto out;
 
-       context->timer.expires  = jiffies + timeout;
-       add_timer(&context->timer);
-
-       wait_for_completion(&context->done);
-       del_timer_sync(&context->timer);
+       if (!wait_for_completion_timeout(&context->done, timeout)) {
+               err = -EBUSY;
+               goto out;
+       }
 
        err = context->result;
        if (err)
        for (i = 0; i < dev->cmd.max_cmds; ++i) {
                dev->cmd.context[i].token = i;
                dev->cmd.context[i].next = i + 1;
-               init_timer(&dev->cmd.context[i].timer);
-               dev->cmd.context[i].timer.data     =
-                       (unsigned long) &dev->cmd.context[i];
-               dev->cmd.context[i].timer.function = event_timeout;
        }
 
        dev->cmd.context[dev->cmd.max_cmds - 1].next = -1;