]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/mlx4/cmd.c
niu: Add TX multiqueue support.
[linux-2.6-omap-h63xx.git] / drivers / net / mlx4 / cmd.c
index c1f81a993f5da3ab5ff21fb06fed712f682dbad6..70dff94a8bc616f11e984559a91fbf6db1598294 100644 (file)
@@ -95,7 +95,7 @@ enum {
 };
 
 enum {
-       GO_BIT_TIMEOUT          = 10000
+       GO_BIT_TIMEOUT_MSECS    = 10000
 };
 
 struct mlx4_cmd_context {
@@ -106,7 +106,8 @@ struct mlx4_cmd_context {
        u16                     token;
 };
 
-static int mlx4_status_to_errno(u8 status) {
+static int mlx4_status_to_errno(u8 status)
+{
        static const int trans_table[] = {
                [CMD_STAT_INTERNAL_ERR]   = -EIO,
                [CMD_STAT_BAD_OP]         = -EPERM,
@@ -155,7 +156,7 @@ static int mlx4_cmd_post(struct mlx4_dev *dev, u64 in_param, u64 out_param,
 
        end = jiffies;
        if (event)
-               end += HZ * 10;
+               end += msecs_to_jiffies(GO_BIT_TIMEOUT_MSECS);
 
        while (cmd_pending(dev)) {
                if (time_after_eq(jiffies, end))
@@ -184,6 +185,13 @@ static int mlx4_cmd_post(struct mlx4_dev *dev, u64 in_param, u64 out_param,
                                               (event ? (1 << HCR_E_BIT) : 0)   |
                                               (op_modifier << HCR_OPMOD_SHIFT) |
                                               op),                       hcr + 6);
+
+       /*
+        * Make sure that our HCR writes don't get mixed in with
+        * writes from another CPU starting a FW command.
+        */
+       mmiowb();
+
        cmd->toggle = cmd->toggle ^ 1;
 
        ret = 0;
@@ -246,8 +254,6 @@ void mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param)
        context->result    = mlx4_status_to_errno(status);
        context->out_param = out_param;
 
-       context->token += priv->cmd.token_mask + 1;
-
        complete(&context->done);
 }
 
@@ -264,6 +270,7 @@ static int mlx4_cmd_wait(struct mlx4_dev *dev, u64 in_param, u64 *out_param,
        spin_lock(&cmd->context_lock);
        BUG_ON(cmd->free_head < 0);
        context = &cmd->context[cmd->free_head];
+       context->token += cmd->token_mask + 1;
        cmd->free_head = context->next;
        spin_unlock(&cmd->context_lock);