There are driver sources left by the installation, in /usr/source/mlnx-en-2.2, driver tree could instrumented, recompiled, etc.
It seems that Mellanox is using some soft of mailbox mechanism to talk to the firmware - it is very well seen from the driver sources. Responsible function to query firmware seems to be mlx4_cmd_box(), now looking into en_port.c function mlx4_en_QUERY_PORT() talks to firmware and gets 10gbps value back from the firmware. This function is executed multiple times when LKM is inserted and also when "ethtool" queries interface data.
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;
printk("%s: ENTER\n", __func__);
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,
MLX4_CMD_WRAPPED);
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);
switch (qport_context->link_speed & MLX4_EN_SPEED_MASK) {
case MLX4_EN_1G_SPEED:
state->link_speed = 1000;
break;
case MLX4_EN_10G_SPEED_XAUI:
case MLX4_EN_10G_SPEED_XFI:
printk("%s-%d: Link speed reported @10GBPS\n",
__func__, __LINE__);
state->link_speed = 10000;
break;
case MLX4_EN_20G_SPEED:
state->link_speed = 20000;
break;
case MLX4_EN_40G_SPEED:
printk("%s-%d: Link speed reported @40GBPS\n",
__func__, __LINE__);
state->link_speed = 40000;
break;
case MLX4_EN_56G_SPEED:
state->link_speed = 56000;
break;
default:
state->link_speed = -1;
break;
}
state->transciver = qport_context->transceiver;
state->autoneg = !!(qport_context->autoneg & MLX4_EN_AUTONEG_MASK);
out:
mlx4_free_cmd_mailbox(mdev->dev, mailbox);
return err;
}
Regards,
Philip