2022-06-10 17:23:23

by Jiaqing Zhao

[permalink] [raw]
Subject: [PATCH 0/6] Configurable VLAN mode for NCSI driver

Currently kernel kernel NCSI driver only supports the "VLAN + non-VLAN"
mode (Mode #2), but this mode is an optional mode [1] defined in NCSI
specification and some NCSI devices like Intel E810 Network Adapter [2]
does not support that mode. This patchset adds a new "ncsi,vlan-mode"
device tree property for configuring the VLAN mode of NCSI device.

[1] Table 58 - VLAN Enable Modes
https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.0.0.pdf
[2] 12.6.5.4.3 VLAN
https://cdrdv2.intel.com/v1/dl/getContent/613875

Jiaqing Zhao (6):
net/ncsi: Fix value of NCSI_CAP_VLAN_ANY
net/ncsi: Rename NCSI_CAP_VLAN_NO to NCSI_CAP_VLAN_FILTERED
net/ncsi: Enable VLAN filtering when callback is registered
ftgmac100: Remove enable NCSI VLAN filtering
dt-bindings: net: Add NCSI bindings
net/ncsi: Support VLAN mode configuration

.../devicetree/bindings/net/ncsi.yaml | 34 ++++++++++++++
MAINTAINERS | 2 +
drivers/net/ethernet/faraday/ftgmac100.c | 3 --
include/dt-bindings/net/ncsi.h | 15 ++++++
net/ncsi/internal.h | 5 +-
net/ncsi/ncsi-manage.c | 46 ++++++++++++++++---
6 files changed, 93 insertions(+), 12 deletions(-)
create mode 100644 Documentation/devicetree/bindings/net/ncsi.yaml
create mode 100644 include/dt-bindings/net/ncsi.h

--
2.34.1


2022-06-10 17:32:55

by Jiaqing Zhao

[permalink] [raw]
Subject: [PATCH 6/6] net/ncsi: Support VLAN mode configuration

NCSI specification defines 4 VLAN modes, currently kernel NCSI driver
only supports the "VLAN + non-VLAN" mode (Mode #2), and there is no
way to detect which modes are supported by the device. This patch adds
support for configuring VLAN mode via the "ncsi,vlan-mode" devicetree
node.

Signed-off-by: Jiaqing Zhao <[email protected]>
---
net/ncsi/internal.h | 1 +
net/ncsi/ncsi-manage.c | 41 ++++++++++++++++++++++++++++++++++-------
2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h
index 7f384f841019..b868e07f7ffd 100644
--- a/net/ncsi/internal.h
+++ b/net/ncsi/internal.h
@@ -334,6 +334,7 @@ struct ncsi_dev_priv {
struct work_struct work; /* For channel management */
struct packet_type ptype; /* NCSI packet Rx handler */
struct list_head node; /* Form NCSI device list */
+ u32 vlan_mode; /* VLAN mode */
#define NCSI_MAX_VLAN_VIDS 15
struct list_head vlan_vids; /* List of active VLAN IDs */

diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
index 3fb95f29e3e2..a398b0eb72b2 100644
--- a/net/ncsi/ncsi-manage.c
+++ b/net/ncsi/ncsi-manage.c
@@ -10,6 +10,7 @@
#include <linux/skbuff.h>
#include <linux/of.h>
#include <linux/platform_device.h>
+#include <dt-bindings/net/ncsi.h>

#include <net/ncsi.h>
#include <net/net_namespace.h>
@@ -1042,7 +1043,11 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
nd->state = ncsi_dev_state_config_oem_gma;
break;
case ncsi_dev_state_config_oem_gma:
- nd->state = ncsi_dev_state_config_clear_vids;
+ /* Only set up hardware VLAN filters in filtered mode */
+ if (ndp->vlan_mode == NCSI_VLAN_MODE_FILTERED)
+ nd->state = ncsi_dev_state_config_clear_vids;
+ else
+ nd->state = ncsi_dev_state_config_ev;
ret = -1;

#if IS_ENABLED(CONFIG_NCSI_OEM_CMD_GET_MAC)
@@ -1094,11 +1099,15 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
nd->state = ncsi_dev_state_config_svf;
/* Enable/Disable the VLAN filter */
} else if (nd->state == ncsi_dev_state_config_ev) {
- if (list_empty(&ndp->vlan_vids)) {
- nca.type = NCSI_PKT_CMD_DV;
- } else {
+ if (ndp->vlan_mode == NCSI_VLAN_MODE_FILTERED &&
+ !list_empty(&ndp->vlan_vids)) {
nca.type = NCSI_PKT_CMD_EV;
nca.bytes[3] = NCSI_CAP_VLAN_FILTERED;
+ } else if (ndp->vlan_mode == NCSI_VLAN_MODE_ANY) {
+ nca.type = NCSI_PKT_CMD_EV;
+ nca.bytes[3] = NCSI_CAP_VLAN_ANY;
+ } else {
+ nca.type = NCSI_PKT_CMD_DV;
}
nd->state = ncsi_dev_state_config_sma;
} else if (nd->state == ncsi_dev_state_config_sma) {
@@ -1800,15 +1809,33 @@ struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
ndp->ptype.dev = dev;
dev_add_pack(&ndp->ptype);

+ /* Set default VLAN mode (filtered) */
+ ndp->vlan_mode = NCSI_VLAN_MODE_FILTERED;
+
pdev = to_platform_device(dev->dev.parent);
if (pdev) {
np = pdev->dev.of_node;
- if (np && of_get_property(np, "mlx,multi-host", NULL))
- ndp->mlx_multi_host = true;
+ if (np) {
+ u32 vlan_mode;
+
+ if (!of_property_read_u32(np, "ncsi,vlan-mode", &vlan_mode)) {
+ if (vlan_mode > NCSI_VLAN_MODE_ANY ||
+ vlan_mode == NCSI_VLAN_MODE_ONLY)
+ dev_warn(&pdev->dev, "NCSI: Unsupported VLAN mode %u",
+ vlan_mode);
+ else
+ ndp->vlan_mode = vlan_mode;
+ dev_info(&pdev->dev, "NCSI: Configured VLAN mode %u",
+ ndp->vlan_mode);
+ }
+ if (of_get_property(np, "mlx,multi-host", NULL))
+ ndp->mlx_multi_host = true;
+ }
}

/* Enable hardware VLAN filtering */
- if (dev->netdev_ops->ndo_vlan_rx_add_vid == ncsi_vlan_rx_add_vid &&
+ if (ndp->vlan_mode == NCSI_VLAN_MODE_FILTERED &&
+ dev->netdev_ops->ndo_vlan_rx_add_vid == ncsi_vlan_rx_add_vid &&
dev->netdev_ops->ndo_vlan_rx_kill_vid == ncsi_vlan_rx_kill_vid)
dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;

--
2.34.1

2022-06-10 18:00:49

by Jiaqing Zhao

[permalink] [raw]
Subject: [PATCH 4/6] ftgmac100: Remove enable NCSI VLAN filtering

Setting NETIF_F_HW_VLAN_CTAG_FILTER flag to enable NCSI VLAN filtering
has been moved to the NCSI driver, the logic in ftgmac100 driver is no
longer needed.

Signed-off-by: Jiaqing Zhao <[email protected]>
---
drivers/net/ethernet/faraday/ftgmac100.c | 3 ---
1 file changed, 3 deletions(-)

diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 5231818943c6..18821ca38795 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -1922,9 +1922,6 @@ static int ftgmac100_probe(struct platform_device *pdev)
NETIF_F_GRO | NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX |
NETIF_F_HW_VLAN_CTAG_TX;

- if (priv->use_ncsi)
- netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
-
/* AST2400 doesn't have working HW checksum generation */
if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac")))
netdev->hw_features &= ~NETIF_F_HW_CSUM;
--
2.34.1