Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[pandora-kernel.git] / drivers / net / mlx4 / en_port.c
index a249887..7f5a322 100644 (file)
@@ -142,6 +142,38 @@ int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,
        return err;
 }
 
+int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port)
+{
+       struct mlx4_en_query_port_context *qport_context;
+       struct mlx4_en_priv *priv = netdev_priv(mdev->pndev[port]);
+       struct mlx4_en_port_state *state = &priv->port_state;
+       struct mlx4_cmd_mailbox *mailbox;
+       int err;
+
+       mailbox = mlx4_alloc_cmd_mailbox(mdev->dev);
+       if (IS_ERR(mailbox))
+               return PTR_ERR(mailbox);
+       memset(mailbox->buf, 0, sizeof(*qport_context));
+       err = mlx4_cmd_box(mdev->dev, 0, mailbox->dma, port, 0,
+                          MLX4_CMD_QUERY_PORT, MLX4_CMD_TIME_CLASS_B);
+       if (err)
+               goto out;
+       qport_context = mailbox->buf;
+
+       /* This command is always accessed from Ethtool context
+        * already synchronized, no need in locking */
+       state->link_state = !!(qport_context->link_up & MLX4_EN_LINK_UP_MASK);
+       if ((qport_context->link_speed & MLX4_EN_SPEED_MASK) ==
+           MLX4_EN_1G_SPEED)
+               state->link_speed = 1000;
+       else
+               state->link_speed = 10000;
+       state->transciver = qport_context->transceiver;
+
+out:
+       mlx4_free_cmd_mailbox(mdev->dev, mailbox);
+       return err;
+}
 
 int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
 {