[2/2] net/mlx5: add support for set and get MTU in Windows
Checks
Commit Message
Mlx5Devx library has new API's for setting and getting MTU.
Added new glue functions that wrap the new mlx5devx lib API's.
Implemented the os_ethdev callbacks to use the new glue
functions in Windows.
Signed-off-by: Adham Masarwah <adham@nvidia.com>
Tested-by: Idan Hackmon <idanhac@nvidia.com>
Acked-by: Matan Azard <matan@nvidia.com>
---
drivers/common/mlx5/windows/mlx5_glue.c | 55 +++++++++++++++++++++++++++++++
drivers/common/mlx5/windows/mlx5_glue.h | 2 ++
drivers/net/mlx5/windows/mlx5_ethdev_os.c | 31 ++++++++++++++---
3 files changed, 84 insertions(+), 4 deletions(-)
@@ -358,6 +358,59 @@ mlx5_glue_devx_set_promisc_vport(void *ctx, uint32_t promisc_type, uint8_t f_ena
#endif
}
+static int
+mlx5_glue_devx_get_mtu(void *ctx, uint32_t *mtu)
+{
+ int err = 0;
+ struct mlx5_context *mlx5_ctx;
+
+ if (!ctx) {
+ errno = EINVAL;
+ return errno;
+ }
+ mlx5_ctx = (struct mlx5_context *)ctx;
+#ifdef HAVE_DEVX_SET_GET_MTU_SUPPORT
+ err = devx_get_mtu(mlx5_ctx->devx_ctx, mtu);
+ if (err) {
+ errno = err;
+ return errno;
+ }
+#else
+ *mtu = mlx5_ctx->mlx5_dev.mtu_bytes;
+#endif
+
+ return err;
+}
+
+static int
+mlx5_glue_devx_set_mtu(void *ctx, uint32_t mtu)
+{
+#ifdef HAVE_DEVX_SET_GET_MTU_SUPPORT
+ struct mlx5_context *mlx5_ctx;
+ int err;
+
+ if (!ctx) {
+ errno = EINVAL;
+ return errno;
+ }
+ mlx5_ctx = (struct mlx5_context *)ctx;
+ err = devx_set_mtu(mlx5_ctx->devx_ctx, mtu);
+ if (err) {
+ errno = err;
+ return errno;
+ }
+ return 0;
+#else
+ (void)mtu;
+ (void)ctx;
+ DRV_LOG(WARNING, "%s: is not supported", __func__);
+ return -ENOTSUP;
+#endif
+
+}
+
+
+
alignas(RTE_CACHE_LINE_SIZE)
const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
.version = MLX5_GLUE_VERSION,
@@ -382,4 +435,6 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
.query_rt_values = mlx5_glue_query_rt_values,
.devx_init_showdown_event = mlx5_glue_devx_init_showdown_event,
.devx_set_promisc_vport = mlx5_glue_devx_set_promisc_vport,
+ .devx_get_mtu = mlx5_glue_devx_get_mtu,
+ .devx_set_mtu = mlx5_glue_devx_set_mtu,
};
@@ -93,6 +93,8 @@ struct mlx5_glue {
int (*query_rt_values)(void *ctx, void *devx_clock);
int (*devx_init_showdown_event)(void *ctx);
int (*devx_set_promisc_vport)(void *ctx, uint32_t promisc_type, uint8_t f_enable);
+ int (*devx_get_mtu)(void *ctx, uint32_t *mtu);
+ int (*devx_set_mtu)(void *ctx, uint32_t mtu);
};
extern const struct mlx5_glue *mlx5_glue;
@@ -85,6 +85,8 @@ mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[MLX5_NAMESIZE])
int
mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu)
{
+ int err;
+ uint32_t curr_mtu;
struct mlx5_priv *priv;
mlx5_context_st *context_obj;
@@ -94,7 +96,14 @@ mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu)
}
priv = dev->data->dev_private;
context_obj = (mlx5_context_st *)priv->sh->cdev->ctx;
- *mtu = context_obj->mlx5_dev.mtu_bytes;
+
+ err = mlx5_glue->devx_get_mtu(context_obj, &curr_mtu);
+ if (err != 0) {
+ DRV_LOG(WARNING, "Could not get the MTU!");
+ return err;
+ }
+ *mtu = (uint16_t)curr_mtu;
+
return 0;
}
@@ -112,9 +121,23 @@ mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu)
int
mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
{
- RTE_SET_USED(dev);
- RTE_SET_USED(mtu);
- return -ENOTSUP;
+ int err;
+ struct mlx5_priv *priv;
+ mlx5_context_st *context_obj;
+
+ if (!dev) {
+ rte_errno = EINVAL;
+ return -rte_errno;
+ }
+ priv = dev->data->dev_private;
+ context_obj = (mlx5_context_st *)priv->sh->cdev->ctx;
+
+ err = mlx5_glue->devx_set_mtu(context_obj, mtu);
+ if (err != 0) {
+ DRV_LOG(WARNING, "Could not set the MTU!");
+ return err;
+ }
+ return 0;
}
/*