if (!priv->cmd.context)
                return -ENOMEM;
 
+       if (mlx4_is_mfunc(dev))
+               mutex_lock(&priv->cmd.slave_cmd_mutex);
        down_write(&priv->cmd.switch_sem);
        for (i = 0; i < priv->cmd.max_cmds; ++i) {
                priv->cmd.context[i].token = i;
        down(&priv->cmd.poll_sem);
        priv->cmd.use_events = 1;
        up_write(&priv->cmd.switch_sem);
+       if (mlx4_is_mfunc(dev))
+               mutex_unlock(&priv->cmd.slave_cmd_mutex);
 
        return err;
 }
        struct mlx4_priv *priv = mlx4_priv(dev);
        int i;
 
+       if (mlx4_is_mfunc(dev))
+               mutex_lock(&priv->cmd.slave_cmd_mutex);
        down_write(&priv->cmd.switch_sem);
        priv->cmd.use_events = 0;
 
 
        up(&priv->cmd.poll_sem);
        up_write(&priv->cmd.switch_sem);
+       if (mlx4_is_mfunc(dev))
+               mutex_unlock(&priv->cmd.slave_cmd_mutex);
 }
 
 struct mlx4_cmd_mailbox *mlx4_alloc_cmd_mailbox(struct mlx4_dev *dev)