From d4fbe94b4adb16a5cc094a50215dc39496c9fc66 Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Tue, 28 Jul 2020 05:35:13 +0000 Subject: [PATCH] MLX4 patch for vf --- drivers/net/ethernet/mellanox/mlx4/fw.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 6e501af0e..2d52e29fd 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c @@ -1411,7 +1411,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, { struct mlx4_priv *priv = mlx4_priv(dev); u64 def_mac; - u8 port_type; + u8 port_type, vlan, field; u16 short_field; int err; int admin_link_state; @@ -1479,6 +1479,16 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, short_field = dev->caps.pkey_table_len[vhcr->in_modifier]; MLX4_PUT(outbox->buf, short_field, QUERY_PORT_CUR_MAX_PKEY_OFFSET); + + /* Change the mac table size for the VF */ + MLX4_GET(field, outbox, QUERY_PORT_MAX_MACVLAN_OFFSET); + /* keep the origin vlan of the VF */ + vlan = field >> 4; + /* set the field with the prev vlan and the mac defined quota */ + field = vlan << 4; + field |= ilog2(mlx4_get_port_free_macs(dev, + priv->port->port + 1)); + MLX4_PUT(outbox->buf, field, QUERY_PORT_MAX_MACVLAN_OFFSET); } out: return err; -- 2.27.0 From 98cc63cd92b23d8545ad1832d55bcae935fb2f24 Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Tue, 28 Jul 2020 06:27:20 +0000 Subject: [PATCH 2/2] MLX4 get macs --- drivers/net/ethernet/mellanox/mlx4/mlx4.h | 1 + drivers/net/ethernet/mellanox/mlx4/port.c | 57 +++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 527b52e48..71ab05246 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h @@ -740,6 +740,7 @@ struct mlx4_catas_err { #define MLX4_MAX_MAC_NUM 128 #define MLX4_MAC_TABLE_SIZE (MLX4_MAX_MAC_NUM << 3) +#define MLX4_VF_MAC_QUOTA 2 struct mlx4_mac_table { __be64 entries[MLX4_MAX_MAC_NUM]; diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c index ba6ac31a3..7ea7b9db9 100644 --- a/drivers/net/ethernet/mellanox/mlx4/port.c +++ b/drivers/net/ethernet/mellanox/mlx4/port.c @@ -2227,3 +2227,60 @@ int mlx4_max_tc(struct mlx4_dev *dev) return num_tc; } EXPORT_SYMBOL(mlx4_max_tc); + +static int mlx4_get_port_reserved_mac_num(struct mlx4_dev *mdev, int port) +{ + struct mlx4_priv *priv = mlx4_priv(mdev); + struct resource_allocator *res_alloc; + int reserved; + + if (mlx4_is_slave(mdev)) + return 0; + + res_alloc = &priv->mfunc.master.res_tracker.res_alloc[RES_MAC]; + + reserved = (port > 0) ? res_alloc->res_port_rsvd[port - 1] : + res_alloc->res_reserved; + + return reserved; +} + +int mlx4_get_port_max_macs(struct mlx4_dev *mdev, int port) +{ + struct mlx4_port_info *info = &mlx4_priv(mdev)->port[port]; + + /* The maximum value should considers the reserved macs for the vfs */ + return info->mac_table.max - mlx4_get_port_reserved_mac_num(mdev, port); +} +EXPORT_SYMBOL(mlx4_get_port_max_macs); + +int mlx4_get_port_total_macs(struct mlx4_dev *mdev, int port) +{ + struct mlx4_port_info *info = &mlx4_priv(mdev)->port[port]; + + return info->mac_table.total; +} +EXPORT_SYMBOL(mlx4_get_port_total_macs); + +int mlx4_get_port_free_macs(struct mlx4_dev *mdev, int port) +{ + /* slave will get the free macs (log2) from its master */ + if (mlx4_is_slave(mdev)) { + struct mlx4_port_cap port_cap; + + mlx4_QUERY_PORT(mdev, port, &port_cap); + return (1 << port_cap.log_max_macs); + } + + return (mlx4_get_port_max_macs(mdev, port) - + mlx4_get_port_total_macs(mdev, port)); +} +EXPORT_SYMBOL(mlx4_get_port_free_macs); + +bool mlx4_is_available_mac(struct mlx4_dev *mdev, int port) +{ + int free_macs = mlx4_get_port_free_macs(mdev, port); + + return free_macs >= MLX4_VF_MAC_QUOTA; +} +EXPORT_SYMBOL(mlx4_is_available_mac); -- 2.27.0 From fd2e45a02d177e71f2b2d6ea509d25bc3757ac1b Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Tue, 28 Jul 2020 06:42:41 +0000 Subject: [PATCH 3/3] MLX4 get macs headers --- include/linux/mlx4/device.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 36e412c3d..c5ef47a5f 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -1516,6 +1516,10 @@ int mlx4_phys_to_slave_port(struct mlx4_dev *dev, int slave, int port); int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port); int mlx4_config_vxlan_port(struct mlx4_dev *dev, __be16 udp_port); +int mlx4_get_port_max_macs(struct mlx4_dev *mdev, int port); +int mlx4_get_port_total_macs(struct mlx4_dev *mdev, int port); +int mlx4_get_port_free_macs(struct mlx4_dev *mdev, int port); +bool mlx4_is_available_mac(struct mlx4_dev *mdev, int port); int mlx4_disable_rx_port_check(struct mlx4_dev *dev, bool dis); int mlx4_config_roce_v2_port(struct mlx4_dev *dev, u16 udp_port); int mlx4_virt2phy_port_map(struct mlx4_dev *dev, u32 port1, u32 port2); -- 2.27.0 From 77037f4e53732f69001634359086b369d51cf6c0 Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Tue, 28 Jul 2020 07:16:40 +0000 Subject: [PATCH 4/4] MLX4 fix header --- drivers/net/ethernet/mellanox/mlx4/port.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c index 7ea7b9db9..616a3b73b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/port.c +++ b/drivers/net/ethernet/mellanox/mlx4/port.c @@ -39,6 +39,7 @@ #include "mlx4.h" #include "mlx4_stats.h" +#include "fw.h" #define MLX4_MAC_VALID (1ull << 63) -- 2.27.0 From 3011ace4fd230fec377e62aa1e9386cf0b1ab9e8 Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Tue, 28 Jul 2020 12:04:37 +0000 Subject: [PATCH 5/5] MLX4 testing --- drivers/net/ethernet/mellanox/mlx4/fw.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 2d52e29fd..90d4bac3c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c @@ -820,6 +820,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) #define QUERY_DEV_CAP_DIAG_RPRT_PER_PORT 0x9c #define QUERY_DEV_CAP_FW_REASSIGN_MAC 0x9d #define QUERY_DEV_CAP_VXLAN 0x9e +#define QUERY_DEV_CAP_ADD_MAC 0x9f #define QUERY_DEV_CAP_MAD_DEMUX_OFFSET 0xb0 #define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_BASE_OFFSET 0xa8 #define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_RANGE_OFFSET 0xac @@ -1330,6 +1331,11 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, field &= 0xd7; MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_VXLAN); + /* For guests report additional-mac query not available */ + MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_ADD_MAC); + field &= 0xfb; + MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_ADD_MAC); + /* For guests, disable port BEACON */ MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_PORT_BEACON_OFFSET); field &= 0x7f; @@ -1430,7 +1436,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, * QUERY_PORT general query. */ if (vhcr->op_modifier || vhcr->in_modifier & ~0xFF) - return -EINVAL; + return -23; vhcr->in_modifier = port; -- 2.27.0 From 5193521e6e26ece2b4a9a69e3031dbf9a46a9a5d Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Tue, 28 Jul 2020 13:07:20 +0000 Subject: [PATCH 6/6] MLX4 stats --- .../net/ethernet/mellanox/mlx4/resource_tracker.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 1187ef137..9bcaa1517 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c @@ -4560,6 +4560,16 @@ enum { BUSY_MAX_RETRIES = 10 }; +static void mlx4_if_stat_zeroes(struct mlx4_counter *if_cnt) +{ + u8 temp; + temp = if_cnt->counter_mode; + + memset(if_cnt, 0, sizeof(*if_cnt)); + if_cnt->counter_mode = temp; + if_cnt->num_ifc = cpu_to_be32(1); +} + int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave, struct mlx4_vhcr *vhcr, struct mlx4_cmd_mailbox *inbox, @@ -4569,6 +4579,11 @@ int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave, int err; int index = vhcr->in_modifier & 0xffff; + if (index == MLX4_SINK_COUNTER_INDEX(dev)) { + mlx4_if_stat_zeroes(outbox->buf); + return 0; + } + err = get_res(dev, slave, index, RES_COUNTER, NULL); if (err) return err; -- 2.27.0 From 14f69590cb72ba3cdadfdad43585e95931db86b7 Mon Sep 17 00:00:00 2001 From: Mikko Hissa Date: Wed, 29 Jul 2020 13:25:12 +0000 Subject: [PATCH 7/7] MLX4 stat wrapper --- drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 9bcaa1517..cc0cb76cd 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c @@ -4576,7 +4576,7 @@ int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave, struct mlx4_cmd_mailbox *outbox, struct mlx4_cmd_info *cmd) { - int err; + int err = 0; int index = vhcr->in_modifier & 0xffff; if (index == MLX4_SINK_COUNTER_INDEX(dev)) { @@ -4585,8 +4585,10 @@ int mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave, } err = get_res(dev, slave, index, RES_COUNTER, NULL); - if (err) - return err; + if (err) { + mlx4_if_stat_zeroes(outbox->buf); + err = 0; + } err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); put_res(dev, slave, index, RES_COUNTER); -- 2.27.0