mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
net/mlx5: Introduce access functions to modify/query vport state
In preparation for SR-IOV we add here an API to enable each e-switch manager (PF) to configure its VFs link states in e-switch preparation for ethernet sriov. Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e16aea2744
commit
e75465148b
4 changed files with 62 additions and 8 deletions
|
@ -63,7 +63,7 @@ static void mlx5e_update_carrier(struct mlx5e_priv *priv)
|
||||||
u8 port_state;
|
u8 port_state;
|
||||||
|
|
||||||
port_state = mlx5_query_vport_state(mdev,
|
port_state = mlx5_query_vport_state(mdev,
|
||||||
MLX5_QUERY_VPORT_STATE_IN_OP_MOD_VNIC_VPORT);
|
MLX5_QUERY_VPORT_STATE_IN_OP_MOD_VNIC_VPORT, 0);
|
||||||
|
|
||||||
if (port_state == VPORT_STATE_UP)
|
if (port_state == VPORT_STATE_UP)
|
||||||
netif_carrier_on(priv->netdev);
|
netif_carrier_on(priv->netdev);
|
||||||
|
|
|
@ -36,26 +36,75 @@
|
||||||
#include <linux/mlx5/vport.h>
|
#include <linux/mlx5/vport.h>
|
||||||
#include "mlx5_core.h"
|
#include "mlx5_core.h"
|
||||||
|
|
||||||
u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod)
|
static int _mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||||
|
u16 vport, u32 *out, int outlen)
|
||||||
{
|
{
|
||||||
u32 in[MLX5_ST_SZ_DW(query_vport_state_in)];
|
|
||||||
u32 out[MLX5_ST_SZ_DW(query_vport_state_out)];
|
|
||||||
int err;
|
int err;
|
||||||
|
u32 in[MLX5_ST_SZ_DW(query_vport_state_in)];
|
||||||
|
|
||||||
memset(in, 0, sizeof(in));
|
memset(in, 0, sizeof(in));
|
||||||
|
|
||||||
MLX5_SET(query_vport_state_in, in, opcode,
|
MLX5_SET(query_vport_state_in, in, opcode,
|
||||||
MLX5_CMD_OP_QUERY_VPORT_STATE);
|
MLX5_CMD_OP_QUERY_VPORT_STATE);
|
||||||
MLX5_SET(query_vport_state_in, in, op_mod, opmod);
|
MLX5_SET(query_vport_state_in, in, op_mod, opmod);
|
||||||
|
MLX5_SET(query_vport_state_in, in, vport_number, vport);
|
||||||
|
if (vport)
|
||||||
|
MLX5_SET(query_vport_state_in, in, other_vport, 1);
|
||||||
|
|
||||||
|
err = mlx5_cmd_exec_check_status(mdev, in, sizeof(in), out, outlen);
|
||||||
|
if (err)
|
||||||
|
mlx5_core_warn(mdev, "MLX5_CMD_OP_QUERY_VPORT_STATE failed\n");
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport)
|
||||||
|
{
|
||||||
|
u32 out[MLX5_ST_SZ_DW(query_vport_state_out)] = {0};
|
||||||
|
|
||||||
|
_mlx5_query_vport_state(mdev, opmod, vport, out, sizeof(out));
|
||||||
|
|
||||||
|
return MLX5_GET(query_vport_state_out, out, state);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(mlx5_query_vport_state);
|
||||||
|
|
||||||
|
u8 mlx5_query_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport)
|
||||||
|
{
|
||||||
|
u32 out[MLX5_ST_SZ_DW(query_vport_state_out)] = {0};
|
||||||
|
|
||||||
|
_mlx5_query_vport_state(mdev, opmod, vport, out, sizeof(out));
|
||||||
|
|
||||||
|
return MLX5_GET(query_vport_state_out, out, admin_state);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlx5_query_vport_admin_state);
|
||||||
|
|
||||||
|
int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||||
|
u16 vport, u8 state)
|
||||||
|
{
|
||||||
|
u32 in[MLX5_ST_SZ_DW(modify_vport_state_in)];
|
||||||
|
u32 out[MLX5_ST_SZ_DW(modify_vport_state_out)];
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(in, 0, sizeof(in));
|
||||||
|
|
||||||
|
MLX5_SET(modify_vport_state_in, in, opcode,
|
||||||
|
MLX5_CMD_OP_MODIFY_VPORT_STATE);
|
||||||
|
MLX5_SET(modify_vport_state_in, in, op_mod, opmod);
|
||||||
|
MLX5_SET(modify_vport_state_in, in, vport_number, vport);
|
||||||
|
|
||||||
|
if (vport)
|
||||||
|
MLX5_SET(modify_vport_state_in, in, other_vport, 1);
|
||||||
|
|
||||||
|
MLX5_SET(modify_vport_state_in, in, admin_state, state);
|
||||||
|
|
||||||
err = mlx5_cmd_exec_check_status(mdev, in, sizeof(in), out,
|
err = mlx5_cmd_exec_check_status(mdev, in, sizeof(in), out,
|
||||||
sizeof(out));
|
sizeof(out));
|
||||||
if (err)
|
if (err)
|
||||||
mlx5_core_warn(mdev, "MLX5_CMD_OP_QUERY_VPORT_STATE failed\n");
|
mlx5_core_warn(mdev, "MLX5_CMD_OP_MODIFY_VPORT_STATE failed\n");
|
||||||
|
|
||||||
return MLX5_GET(query_vport_state_out, out, state);
|
return err;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mlx5_query_vport_state);
|
EXPORT_SYMBOL(mlx5_modify_vport_admin_state);
|
||||||
|
|
||||||
static int mlx5_query_nic_vport_context(struct mlx5_core_dev *mdev, u16 vport,
|
static int mlx5_query_nic_vport_context(struct mlx5_core_dev *mdev, u16 vport,
|
||||||
u32 *out, int outlen)
|
u32 *out, int outlen)
|
||||||
|
|
|
@ -2946,6 +2946,7 @@ struct mlx5_ifc_query_vport_state_out_bits {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MLX5_QUERY_VPORT_STATE_IN_OP_MOD_VNIC_VPORT = 0x0,
|
MLX5_QUERY_VPORT_STATE_IN_OP_MOD_VNIC_VPORT = 0x0,
|
||||||
|
MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT = 0x1,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5_ifc_query_vport_state_in_bits {
|
struct mlx5_ifc_query_vport_state_in_bits {
|
||||||
|
|
|
@ -36,7 +36,11 @@
|
||||||
#include <linux/mlx5/driver.h>
|
#include <linux/mlx5/driver.h>
|
||||||
#include <linux/mlx5/device.h>
|
#include <linux/mlx5/device.h>
|
||||||
|
|
||||||
u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod);
|
u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport);
|
||||||
|
u8 mlx5_query_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||||
|
u16 vport);
|
||||||
|
int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||||
|
u16 vport, u8 state);
|
||||||
int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
|
int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
|
||||||
u16 vport, u8 *addr);
|
u16 vport, u8 *addr);
|
||||||
int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *dev,
|
int mlx5_modify_nic_vport_mac_address(struct mlx5_core_dev *dev,
|
||||||
|
|
Loading…
Reference in a new issue