[Intel-wired-lan] [PATCH net-next v2 01/12] ice: basic support for eswitch mode management
Paul Menzel
pmenzel at molgen.mpg.de
Wed Jun 23 05:58:00 UTC 2021
Dear Michal, dear Grzegorz,
Am 22.06.21 um 23:21 schrieb Michal Swiatkowski:
> Write set and get eswitch mode functions used by devlink
Commit 08f4b5918b2 (net/devlink: Add E-Switch mode control) spells it
E-Switch mode.
To make the commit summary a statement, maybe use:
> ice: Support basic E-Switch mode control
> ops. Use new pf struct member eswitch_mode to track current
> eswitch mode in driver.
>
> Changing eswitch mode is only allowed when there are no
> VFs created.
>
> Create new file for eswitch related code.
>
> Add config flag ICE_SWITCHDEV to allow user to choose if
> switchdev support should be enabled or disabled.
>
> Use case examples:
> - show current eswitch mode ('legacy' is the default one)
> [root at localhost]# devlink dev eswitch show pci/0000:03:00.1
>> pci/0000:03:00.1: mode legacy
At least Mozilla Thunderbird displays this as a quote. Is your `devlink`
command really prepending a >?
> - move to 'switchdev' mode
> [root at localhost]# devlink dev eswitch set pci/0000:03:00.1 mode
> switchdev
> [root at localhost]# devlink dev eswitch show pci/0000:03:00.1
>> pci/0000:03:00.1: mode switchdev
>
> - create 2 VFs
> [root at localhost]# echo 2 > /sys/class/net/ens4f1/device/sriov_numvfs
>
> - unsuccessful attempt to change eswitch mode while VFs are created
> [root at localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
>> devlink answers: Operation not supported
>
> - destroy VFs
> [root at localhost]# echo 0 > /sys/class/net/ens4f1/device/sriov_numvfs
>
> - restore 'legacy' mode
> [root at localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
> [root at localhost]# devlink dev eswitch show pci/0000:03:00.1
>> pci/0000:03:00.1: mode legacy
Thank you for adding these examples to the commit message. I’d put some
of them into the Kconfig description of `ICE_SWITCHDEV`.
Kind regards,
Paul
> Co-developed-by: Grzegorz Nitka <grzegorz.nitka at intel.com>
> Signed-off-by: Grzegorz Nitka <grzegorz.nitka at intel.com>
> Signed-off-by: Michal Swiatkowski <michal.swiatkowski at linux.intel.com>
> ---
> drivers/net/ethernet/intel/Kconfig | 10 ++++
> drivers/net/ethernet/intel/ice/Makefile | 1 +
> drivers/net/ethernet/intel/ice/ice.h | 1 +
> drivers/net/ethernet/intel/ice/ice_devlink.c | 3 +
> drivers/net/ethernet/intel/ice/ice_eswitch.c | 62 ++++++++++++++++++++
> drivers/net/ethernet/intel/ice/ice_eswitch.h | 34 +++++++++++
> 6 files changed, 111 insertions(+)
> create mode 100644 drivers/net/ethernet/intel/ice/ice_eswitch.c
> create mode 100644 drivers/net/ethernet/intel/ice/ice_eswitch.h
>
> diff --git a/drivers/net/ethernet/intel/Kconfig b/drivers/net/ethernet/intel/Kconfig
> index 3639cf79cfae..4da8b3930f6e 100644
> --- a/drivers/net/ethernet/intel/Kconfig
> +++ b/drivers/net/ethernet/intel/Kconfig
> @@ -313,6 +313,16 @@ config ICE
> To compile this driver as a module, choose M here. The module
> will be called ice.
>
> +config ICE_SWITCHDEV
> + bool "Switchdev Support"
> + default y
> + depends on ICE && NET_SWITCHDEV
> + help
> + Say Y here if you want to use Switchdev in the
> + driver.
> +
> + If unsure, say N.
> +
> config FM10K
> tristate "Intel(R) FM10000 Ethernet Switch Host Interface Support"
> default n
> diff --git a/drivers/net/ethernet/intel/ice/Makefile b/drivers/net/ethernet/intel/ice/Makefile
> index 4f538cdf42c1..0545594c80ba 100644
> --- a/drivers/net/ethernet/intel/ice/Makefile
> +++ b/drivers/net/ethernet/intel/ice/Makefile
> @@ -33,3 +33,4 @@ ice-$(CONFIG_PTP_1588_CLOCK) += ice_ptp.o ice_ptp_hw.o
> ice-$(CONFIG_DCB) += ice_dcb.o ice_dcb_nl.o ice_dcb_lib.o
> ice-$(CONFIG_RFS_ACCEL) += ice_arfs.o
> ice-$(CONFIG_XDP_SOCKETS) += ice_xsk.o
> +ice-$(CONFIG_ICE_SWITCHDEV) += ice_eswitch.o
> diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
> index f4729caccbe9..729d375fbebc 100644
> --- a/drivers/net/ethernet/intel/ice/ice.h
> +++ b/drivers/net/ethernet/intel/ice/ice.h
> @@ -430,6 +430,7 @@ struct ice_pf {
>
> struct ice_vsi **vsi; /* VSIs created by the driver */
> struct ice_sw *first_sw; /* first switch created by firmware */
> + u16 eswitch_mode; /* current mode of eswitch */
> /* Virtchnl/SR-IOV config info */
> struct ice_vf *vf;
> u16 num_alloc_vfs; /* actual number of VFs allocated */
> diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
> index d69507d57de1..de6d0a8ba1a8 100644
> --- a/drivers/net/ethernet/intel/ice/ice_devlink.c
> +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
> @@ -4,6 +4,7 @@
> #include "ice.h"
> #include "ice_lib.h"
> #include "ice_devlink.h"
> +#include "ice_eswitch.h"
> #include "ice_fw_update.h"
>
> /* context for devlink info version reporting */
> @@ -423,6 +424,8 @@ ice_devlink_flash_update(struct devlink *devlink,
>
> static const struct devlink_ops ice_devlink_ops = {
> .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
> + .eswitch_mode_get = ice_eswitch_mode_get,
> + .eswitch_mode_set = ice_eswitch_mode_set,
> .info_get = ice_devlink_info_get,
> .flash_update = ice_devlink_flash_update,
> };
> diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.c b/drivers/net/ethernet/intel/ice/ice_eswitch.c
> new file mode 100644
> index 000000000000..1370c41b77ab
> --- /dev/null
> +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.c
> @@ -0,0 +1,62 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (C) 2019-2021, Intel Corporation. */
> +
> +#include "ice.h"
> +#include "ice_eswitch.h"
> +#include "ice_devlink.h"
> +
> +/**
> + * ice_eswitch_mode_set - set new eswitch mode
> + * @devlink: pointer to devlink structure
> + * @mode: eswitch mode to switch to
> + * @extack: pointer to extack structure
> + */
> +int
> +ice_eswitch_mode_set(struct devlink *devlink, u16 mode,
> + struct netlink_ext_ack *extack)
> +{
> + struct ice_pf *pf = devlink_priv(devlink);
> +
> + if (pf->eswitch_mode == mode)
> + return 0;
> +
> + if (pf->num_alloc_vfs) {
> + dev_info(ice_pf_to_dev(pf), "Changing eswitch mode is allowed only if there is no VFs created");
> + NL_SET_ERR_MSG_MOD(extack, "Changing eswitch mode is allowed only if there is no VFs created");
> + return -EOPNOTSUPP;
> + }
> +
> + switch (mode) {
> + case DEVLINK_ESWITCH_MODE_LEGACY:
> + dev_info(ice_pf_to_dev(pf), "PF %d changed eswitch mode to legacy",
> + pf->hw.pf_id);
> + NL_SET_ERR_MSG_MOD(extack, "Changed eswitch mode to legacy");
> + break;
> + case DEVLINK_ESWITCH_MODE_SWITCHDEV:
> + {
> + dev_info(ice_pf_to_dev(pf), "PF %d changed eswitch mode to switchdev",
> + pf->hw.pf_id);
> + NL_SET_ERR_MSG_MOD(extack, "Changed eswitch mode to switchdev");
> + break;
> + }
> + default:
> + NL_SET_ERR_MSG_MOD(extack, "Unknown eswitch mode");
> + return -EINVAL;
> + }
> +
> + pf->eswitch_mode = mode;
> + return 0;
> +}
> +
> +/**
> + * ice_eswitch_mode_get - get current eswitch mode
> + * @devlink: pointer to devlink structure
> + * @mode: output parameter for current eswitch mode
> + */
> +int ice_eswitch_mode_get(struct devlink *devlink, u16 *mode)
> +{
> + struct ice_pf *pf = devlink_priv(devlink);
> +
> + *mode = pf->eswitch_mode;
> + return 0;
> +}
> diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.h b/drivers/net/ethernet/intel/ice/ice_eswitch.h
> new file mode 100644
> index 000000000000..0aa6fb7e0c4e
> --- /dev/null
> +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.h
> @@ -0,0 +1,34 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/* Copyright (C) 2019-2021, Intel Corporation. */
> +
> +#ifndef _ICE_ESWITCH_H_
> +#define _ICE_ESWITCH_H_
> +#include <net/devlink.h>
> +
> +#ifdef CONFIG_ICE_SWITCHDEV
> +int ice_eswitch_mode_get(struct devlink *devlink, u16 *mode);
> +int
> +ice_eswitch_mode_set(struct devlink *devlink, u16 mode,
> + struct netlink_ext_ack *extack);
> +bool ice_is_eswitch_mode_switchdev(struct ice_pf *pf);
> +#else /* CONFIG_ICE_SWITCHDEV */
> +static inline int
> +ice_eswitch_mode_get(struct devlink *devlink, u16 *mode)
> +{
> + return DEVLINK_ESWITCH_MODE_LEGACY;
> +}
> +
> +static inline int
> +ice_eswitch_mode_set(struct devlink *devlink, u16 mode,
> + struct netlink_ext_ack *extack)
> +{
> + return -EOPNOTSUPP;
> +}
> +
> +static inline bool
> +ice_is_eswitch_mode_switchdev(struct ice_pf *pf)
> +{
> + return false;
> +}
> +#endif /* CONFIG_ICE_SWITCHDEV */
> +#endif
>
More information about the Intel-wired-lan
mailing list