--- /dev/null
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=qca-nss-dp
+PKG_RELEASE:=1
+
+PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/nss-dp.git
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_DATE:=2022-04-30
+PKG_SOURCE_VERSION:=72e9ec4187414461cbcf6ccff100e8b5ebe5f40b
+PKG_MIRROR_HASH:=805f16e59c75511132922f97740ebf6bf953845b0bbfd2089c4615456893bb37
+
+PKG_BUILD_PARALLEL:=1
+PKG_FLAGS:=nonshared
+
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/package.mk
+
+define KernelPackage/qca-nss-dp
+ SECTION:=kernel
+ CATEGORY:=Kernel modules
+ SUBMENU:=Network Devices
+ DEPENDS:=@TARGET_ipq807x +kmod-qca-ssdk
+ TITLE:=Qualcom NSS dataplane ethernet driver
+ FILES:=$(PKG_BUILD_DIR)/qca-nss-dp.ko
+ AUTOLOAD:=$(call AutoLoad,31,qca-nss-dp,1)
+endef
+
+define KernelPackage/qca-nss-dp/Description
+ NSS dataplane ethernet driver for Qualcom SoCs.
+endef
+
+define Build/InstallDev
+ mkdir -p $(1)/usr/include/qca-nss-dp
+ $(CP) $(PKG_BUILD_DIR)/exports/* $(1)/usr/include/qca-nss-dp/
+endef
+
+EXTRA_CFLAGS+= \
+ -I$(STAGING_DIR)/usr/include/qca-ssdk
+
+NSS_DP_HAL_DIR:=$(PKG_BUILD_DIR)/hal
+define Build/Configure
+ $(LN) $(NSS_DP_HAL_DIR)/soc_ops/$(CONFIG_TARGET_BOARD)/nss_$(CONFIG_TARGET_BOARD).h \
+ $(PKG_BUILD_DIR)/exports/nss_dp_arch.h
+endef
+
+define Build/Compile
+ +$(MAKE) -C "$(LINUX_DIR)" \
+ CROSS_COMPILE="$(TARGET_CROSS)" \
+ ARCH="$(LINUX_KARCH)" \
+ M="$(PKG_BUILD_DIR)" \
+ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" SoC="$(CONFIG_TARGET_BOARD)" \
+ $(KERNEL_MAKE_FLAGS) \
+ $(PKG_JOBS) \
+ modules
+endef
+
+$(eval $(call KernelPackage,qca-nss-dp))
--- /dev/null
+From 40979666b4371012405715ffa61ab5760fcdc6b3 Mon Sep 17 00:00:00 2001
+Message-Id: <40979666b4371012405715ffa61ab5760fcdc6b3.1620066716.git.baruch@tkos.co.il>
+From: Baruch Siach <baruch@tkos.co.il>
+Date: Mon, 3 May 2021 20:07:36 +0300
+Subject: [PATCH 1/3] edma_tx_rx: support newer kernels time stamping API
+
+---
+ hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
+@@ -227,10 +227,16 @@ void nss_phy_tstamp_rx_buf(__attribute__
+ * set to the correct PTP class value by calling ptp_classify_raw
+ * in drv->rxtstamp function.
+ */
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0))
+ if (ndev && ndev->phydev && ndev->phydev->drv &&
+ ndev->phydev->drv->rxtstamp)
+ if(ndev->phydev->drv->rxtstamp(ndev->phydev, skb, 0))
+ return;
++#else
++ if (ndev && phy_has_rxtstamp(ndev->phydev))
++ if (phy_rxtstamp(ndev->phydev, skb, 0))
++ return;
++#endif
+
+ netif_receive_skb(skb);
+ }
+@@ -248,9 +254,14 @@ void nss_phy_tstamp_tx_buf(struct net_de
+ * set to the correct PTP class value by calling ptp_classify_raw
+ * in the drv->txtstamp function.
+ */
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 0))
+ if (ndev && ndev->phydev && ndev->phydev->drv &&
+ ndev->phydev->drv->txtstamp)
+ ndev->phydev->drv->txtstamp(ndev->phydev, skb, 0);
++#else
++ if (ndev && phy_has_txtstamp(ndev->phydev))
++ phy_rxtstamp(ndev->phydev, skb, 0);
++#endif
+ }
+ EXPORT_SYMBOL(nss_phy_tstamp_tx_buf);
+
--- /dev/null
+From cef7873a2d77df13ee702d902ed4e06b2248904b Mon Sep 17 00:00:00 2001
+Message-Id: <cef7873a2d77df13ee702d902ed4e06b2248904b.1620066716.git.baruch@tkos.co.il>
+In-Reply-To: <40979666b4371012405715ffa61ab5760fcdc6b3.1620066716.git.baruch@tkos.co.il>
+References: <40979666b4371012405715ffa61ab5760fcdc6b3.1620066716.git.baruch@tkos.co.il>
+From: Baruch Siach <baruch@tkos.co.il>
+Date: Mon, 3 May 2021 20:17:22 +0300
+Subject: [PATCH 2/3] nss_dp_main: make phy mode code compatible with newer
+ kernels
+
+---
+ include/nss_dp_dev.h | 4 ++--
+ nss_dp_main.c | 4 ++++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+--- a/include/nss_dp_dev.h
++++ b/include/nss_dp_dev.h
+@@ -22,7 +22,7 @@
+ #include <linux/etherdevice.h>
+ #include <linux/netdevice.h>
+ #include <linux/platform_device.h>
+-#include <linux/switch.h>
++#include <linux/phy.h>
+ #include <linux/version.h>
+
+ #include "nss_dp_api_if.h"
+@@ -99,7 +99,7 @@ struct nss_dp_dev {
+ /* Phy related stuff */
+ struct phy_device *phydev; /* Phy device */
+ struct mii_bus *miibus; /* MII bus */
+- uint32_t phy_mii_type; /* RGMII/SGMII/QSGMII */
++ phy_interface_t phy_mii_type; /* RGMII/SGMII/QSGMII */
+ uint32_t phy_mdio_addr; /* Mdio address */
+ bool link_poll; /* Link polling enable? */
+ uint32_t forced_speed; /* Forced speed? */
+--- a/nss_dp_main.c
++++ b/nss_dp_main.c
+@@ -584,7 +584,11 @@ static int32_t nss_dp_of_get_pdata(struc
+ hal_pdata->netdev = netdev;
+ hal_pdata->macid = dp_priv->macid;
+
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 5, 0))
+ dp_priv->phy_mii_type = of_get_phy_mode(np);
++#else
++ of_get_phy_mode(np, &dp_priv->phy_mii_type);
++#endif
+ dp_priv->link_poll = of_property_read_bool(np, "qcom,link-poll");
+ if (of_property_read_u32(np, "qcom,phy-mdio-addr",
+ &dp_priv->phy_mdio_addr) && dp_priv->link_poll) {
--- /dev/null
+From c8c52512ff48bee578901c381a42f027e79eadf9 Mon Sep 17 00:00:00 2001
+Message-Id: <c8c52512ff48bee578901c381a42f027e79eadf9.1620066716.git.baruch@tkos.co.il>
+In-Reply-To: <40979666b4371012405715ffa61ab5760fcdc6b3.1620066716.git.baruch@tkos.co.il>
+References: <40979666b4371012405715ffa61ab5760fcdc6b3.1620066716.git.baruch@tkos.co.il>
+From: Baruch Siach <baruch@tkos.co.il>
+Date: Mon, 3 May 2021 20:20:29 +0300
+Subject: [PATCH 3/3] Drop _nocache variants of ioremap()
+
+Recent kernels removed them.
+---
+ hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c | 2 +-
+ hal/gmac_ops/qcom/qcom_if.c | 2 +-
+ hal/gmac_ops/syn/xgmac/syn_if.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
+@@ -279,7 +279,7 @@ int edma_init(void)
+ /*
+ * Remap register resource
+ */
+- edma_hw.reg_base = ioremap_nocache((edma_hw.reg_resource)->start,
++ edma_hw.reg_base = ioremap((edma_hw.reg_resource)->start,
+ resource_size(edma_hw.reg_resource));
+ if (!edma_hw.reg_base) {
+ pr_warn("Unable to remap EDMA register memory.\n");
+--- a/hal/gmac_ops/qcom/qcom_if.c
++++ b/hal/gmac_ops/qcom/qcom_if.c
+@@ -418,7 +418,7 @@ static void *qcom_init(struct nss_gmac_h
+ qhd->nghd.mac_id = gmacpdata->macid;
+
+ /* Populate the mac base addresses */
+- qhd->nghd.mac_base = devm_ioremap_nocache(&dp_priv->pdev->dev,
++ qhd->nghd.mac_base = devm_ioremap(&dp_priv->pdev->dev,
+ res->start, resource_size(res));
+ if (!qhd->nghd.mac_base) {
+ netdev_dbg(ndev, "ioremap fail.\n");
+--- a/hal/gmac_ops/syn/xgmac/syn_if.c
++++ b/hal/gmac_ops/syn/xgmac/syn_if.c
+@@ -432,7 +432,7 @@ static void *syn_init(struct nss_gmac_ha
+
+ /* Populate the mac base addresses */
+ shd->nghd.mac_base =
+- devm_ioremap_nocache(&dp_priv->pdev->dev, res->start,
++ devm_ioremap(&dp_priv->pdev->dev, res->start,
+ resource_size(res));
+ if (!shd->nghd.mac_base) {
+ netdev_dbg(ndev, "ioremap fail.\n");
--- /dev/null
+From d74920e2a7c413ef40eed72f9cf287cf6fbd5fb8 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Thu, 20 May 2021 14:56:46 +0200
+Subject: [PATCH 1/2] EDMA: Fix NAPI packet counting
+
+There is a bug in the NAPI packet counting that will
+cause NAPI over budget warnings.
+
+Signed-off-by: Baruch Siach <baruch@tkos.co.il>
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
+@@ -459,12 +459,12 @@ int edma_napi(struct napi_struct *napi,
+
+ for (i = 0; i < ehw->txcmpl_rings; i++) {
+ txcmpl_ring = &ehw->txcmpl_ring[i];
+- work_done += edma_clean_tx(ehw, txcmpl_ring);
++ edma_clean_tx(ehw, txcmpl_ring);
+ }
+
+ for (i = 0; i < ehw->rxfill_rings; i++) {
+ rxfill_ring = &ehw->rxfill_ring[i];
+- work_done += edma_alloc_rx_buffer(ehw, rxfill_ring);
++ edma_alloc_rx_buffer(ehw, rxfill_ring);
+ }
+
+ /*
--- /dev/null
+From 44a30d94abcbb10aacc21db29be212518a6b1bf7 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Thu, 20 May 2021 14:57:46 +0200
+Subject: [PATCH] EDMA: Use NAPI_POLL_WEIGHT as NAPI weight
+
+Currently a weight of 100 is used by the EDMA, according
+to upstream max of 64 should be used and that is used for
+almost any driver.
+
+They also introduced NAPI_POLL_WEIGHT define which equals
+to 64.
+
+So use NAPI_POLL_WEIGHT as the weight.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c | 2 +-
+ hal/dp_ops/edma_dp/edma_v1/edma_data_plane.h | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
+@@ -837,7 +837,7 @@ static int edma_register_netdevice(struc
+ */
+ if (!edma_hw.napi_added) {
+ netif_napi_add(netdev, &edma_hw.napi, edma_napi,
+- EDMA_NAPI_WORK);
++ NAPI_POLL_WEIGHT);
+ /*
+ * Register the interrupt handlers and enable interrupts
+ */
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.h
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.h
+@@ -26,7 +26,6 @@
+ #define EDMA_RX_PREHDR_SIZE (sizeof(struct edma_rx_preheader))
+ #define EDMA_TX_PREHDR_SIZE (sizeof(struct edma_tx_preheader))
+ #define EDMA_RING_SIZE 128
+-#define EDMA_NAPI_WORK 100
+ #define EDMA_START_GMACS NSS_DP_HAL_START_IFNUM
+ #define EDMA_MAX_GMACS NSS_DP_HAL_MAX_PORTS
+ #define EDMA_TX_PKT_MIN_SIZE 33 /* IPQ807x EDMA needs a minimum packet size of 33 bytes */
--- /dev/null
+From cadeb62a42296563141d6954eec58e34ef86778d Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Fri, 13 Aug 2021 20:12:08 +0200
+Subject: [PATCH] NSS-DP: fix of_get_mac_address()
+
+Recently OpenWrt backported the updated of_get_mac_address()
+function which returns and error code instead.
+
+So, patch the SSDK to use it and fix the compilation error.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ nss_dp_main.c | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+--- a/nss_dp_main.c
++++ b/nss_dp_main.c
+@@ -555,9 +555,10 @@ static int32_t nss_dp_of_get_pdata(struc
+ struct net_device *netdev,
+ struct nss_gmac_hal_platform_data *hal_pdata)
+ {
+- uint8_t *maddr;
++ u8 maddr[ETH_ALEN];
+ struct nss_dp_dev *dp_priv;
+ struct resource memres_devtree = {0};
++ int ret;
+
+ dp_priv = netdev_priv(netdev);
+
+@@ -600,14 +601,8 @@ static int32_t nss_dp_of_get_pdata(struc
+ of_property_read_u32(np, "qcom,forced-speed", &dp_priv->forced_speed);
+ of_property_read_u32(np, "qcom,forced-duplex", &dp_priv->forced_duplex);
+
+- maddr = (uint8_t *)of_get_mac_address(np);
+-#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 4, 0))
+- if (IS_ERR((void *)maddr)) {
+- maddr = NULL;
+- }
+-#endif
+-
+- if (maddr && is_valid_ether_addr(maddr)) {
++ ret = of_get_mac_address(np, maddr);
++ if (!ret && is_valid_ether_addr(maddr)) {
+ ether_addr_copy(netdev->dev_addr, maddr);
+ } else {
+ random_ether_addr(netdev->dev_addr);
--- /dev/null
+From 5da62ba19f554bf437752a44360fb5ae9f1a7f5e Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Tue, 8 Mar 2022 10:48:32 +0100
+Subject: [PATCH] NSS-DP: implement ethernet IOCTL-s
+
+Since kernel 5.15 ethernet/PHY related IOCTL-s have been split from the
+generic IOCTL netdev op.
+So, implement the new op instead of the generic one which is considered
+for private IOCTL-s only now for 5.15+.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ nss_dp_main.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/nss_dp_main.c
++++ b/nss_dp_main.c
+@@ -532,7 +532,11 @@ static const struct net_device_ops nss_d
+ .ndo_set_mac_address = nss_dp_set_mac_address,
+ .ndo_validate_addr = eth_validate_addr,
+ .ndo_change_mtu = nss_dp_change_mtu,
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0))
+ .ndo_do_ioctl = nss_dp_do_ioctl,
++#else
++ .ndo_eth_ioctl = nss_dp_do_ioctl,
++#endif
+
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0))
+ .ndo_bridge_setlink = switchdev_port_bridge_setlink,
--- /dev/null
+From c9afdcdd2642485a6476906be9da2e811090fc7a Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Fri, 18 Mar 2022 18:06:03 +0100
+Subject: [PATCH] switchdev: remove the transaction structure
+
+Since 5.12 there is no transaction structure anymore, so drop it for
+5.12 and newer.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ nss_dp_switchdev.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/nss_dp_switchdev.c
++++ b/nss_dp_switchdev.c
+@@ -279,13 +279,19 @@ void nss_dp_switchdev_setup(struct net_d
+ * Sets attributes
+ */
+ static int nss_dp_port_attr_set(struct net_device *dev,
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0))
+ const struct switchdev_attr *attr,
+ struct switchdev_trans *trans)
++#else
++ const struct switchdev_attr *attr)
++#endif
+ {
+ struct nss_dp_dev *dp_priv = (struct nss_dp_dev *)netdev_priv(dev);
+
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0))
+ if (switchdev_trans_ph_prepare(trans))
+ return 0;
++#endif
+
+ switch (attr->id) {
+ case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
+@@ -309,8 +315,12 @@ static int nss_dp_switchdev_port_attr_se
+ {
+ int err;
+
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0))
+ err = nss_dp_port_attr_set(netdev, port_attr_info->attr,
+ port_attr_info->trans);
++#else
++ err = nss_dp_port_attr_set(netdev, port_attr_info->attr);
++#endif
+
+ port_attr_info->handled = true;
+ return notifier_from_errno(err);
--- /dev/null
+From f95868d54301c0f54e968ec9d978c9caa02ee425 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Fri, 18 Mar 2022 18:24:18 +0100
+Subject: [PATCH] switchdev: use new switchdev flags
+
+Since kernel 5.12 switched utilizes a new way of setting the flags by
+using a dedicated structure with flags and mask.
+
+So fix using kernels 5.12 and later.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ include/nss_dp_dev.h | 7 +++++++
+ nss_dp_switchdev.c | 2 +-
+ 2 files changed, 8 insertions(+), 1 deletion(-)
+
+--- a/include/nss_dp_dev.h
++++ b/include/nss_dp_dev.h
+@@ -24,6 +24,9 @@
+ #include <linux/platform_device.h>
+ #include <linux/phy.h>
+ #include <linux/version.h>
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0))
++#include <net/switchdev.h>
++#endif
+
+ #include "nss_dp_api_if.h"
+ #include "nss_dp_hal_if.h"
+@@ -126,7 +129,11 @@ struct nss_dp_dev {
+ /* switchdev related attributes */
+ #ifdef CONFIG_NET_SWITCHDEV
+ u8 stp_state; /* STP state of this physical port */
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0))
+ unsigned long brport_flags; /* bridge port flags */
++#else
++ struct switchdev_brport_flags brport_flags; /* bridge port flags */
++#endif
+ #endif
+ uint32_t rx_page_mode; /* page mode for Rx processing */
+ uint32_t rx_jumbo_mru; /* Jumbo mru value for Rx processing */
+--- a/nss_dp_switchdev.c
++++ b/nss_dp_switchdev.c
+@@ -296,7 +296,7 @@ static int nss_dp_port_attr_set(struct n
+ switch (attr->id) {
+ case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
+ dp_priv->brport_flags = attr->u.brport_flags;
+- netdev_dbg(dev, "set brport_flags %lu\n", attr->u.brport_flags);
++ netdev_dbg(dev, "set brport_flags %lu\n", attr->u.brport_flags.val);
+ return 0;
+ case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
+ return nss_dp_stp_state_set(dp_priv, attr->u.stp_state);
--- /dev/null
+From d16102cad769f430144ca8094d928762b445e9b0 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Fri, 18 Mar 2022 22:02:01 +0100
+Subject: [PATCH] switchdev: fix FDB roaming
+
+Try and solve the roaming issue by trying to replicate what NSS bridge
+module is doing, but by utilizing switchdev FDB notifiers instead of
+adding new notifiers to the bridge code.
+
+We register a new non-blocking switchdev notifier and simply wait for
+notification, and then process the SWITCHDEV_FDB_DEL_TO_DEVICE
+notifications.
+
+Those tell us that a certain FDB entry should be removed, then a VSI ID
+is fetched for the physical PPE port and using that VSI ID and the
+notification provided MAC adress existing FDB entry gets removed.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ nss_dp_switchdev.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 61 insertions(+)
+
+--- a/nss_dp_switchdev.c
++++ b/nss_dp_switchdev.c
+@@ -24,6 +24,8 @@
+ #include "nss_dp_dev.h"
+ #include "fal/fal_stp.h"
+ #include "fal/fal_ctrlpkt.h"
++#include "fal/fal_fdb.h"
++#include "ref/ref_vsi.h"
+
+ #define NSS_DP_SWITCH_ID 0
+ #define NSS_DP_SW_ETHTYPE_PID 0 /* PPE ethtype profile ID for slow protocols */
+@@ -348,10 +350,64 @@ static int nss_dp_switchdev_event(struct
+ return NOTIFY_DONE;
+ }
+
++static int nss_dp_switchdev_fdb_del_event(struct net_device *netdev,
++ struct switchdev_notifier_fdb_info *fdb_info)
++{
++ struct nss_dp_dev *dp_priv = (struct nss_dp_dev *)netdev_priv(netdev);
++ fal_fdb_entry_t entry;
++ a_uint32_t vsi_id;
++ sw_error_t rv;
++
++ netdev_dbg(netdev, "FDB DEL %pM port %d\n", fdb_info->addr, dp_priv->macid);
++
++ rv = ppe_port_vsi_get(NSS_DP_SWITCH_ID, dp_priv->macid, &vsi_id);
++ if (rv) {
++ netdev_err(netdev, "cannot get VSI ID for port %d\n", dp_priv->macid);
++ return notifier_from_errno(rv);
++ }
++
++ memset(&entry, 0, sizeof(entry));
++ memcpy(&entry.addr, fdb_info->addr, ETH_ALEN);
++ entry.fid = vsi_id;
++
++ rv = fal_fdb_entry_del_bymac(NSS_DP_SWITCH_ID, &entry);
++ if (rv) {
++ netdev_err(netdev, "FDB entry delete failed with MAC %pM and fid %d\n",
++ &entry.addr, entry.fid);
++ return notifier_from_errno(rv);
++ }
++
++ return notifier_from_errno(rv);
++}
++
++static int nss_dp_fdb_switchdev_event(struct notifier_block *nb,
++ unsigned long event, void *ptr)
++{
++ struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
++
++ /*
++ * Handle switchdev event only for physical devices
++ */
++ if (!nss_dp_is_phy_dev(dev)) {
++ return NOTIFY_DONE;
++ }
++
++ switch (event) {
++ case SWITCHDEV_FDB_DEL_TO_DEVICE:
++ return nss_dp_switchdev_fdb_del_event(dev, ptr);
++ }
++
++ return NOTIFY_DONE;
++}
++
+ static struct notifier_block nss_dp_switchdev_notifier = {
+ .notifier_call = nss_dp_switchdev_event,
+ };
+
++static struct notifier_block nss_dp_switchdev_fdb_notifier = {
++ .notifier_call = nss_dp_fdb_switchdev_event,
++};
++
+ static bool switch_init_done;
+
+ /*
+@@ -366,6 +422,11 @@ void nss_dp_switchdev_setup(struct net_d
+ return;
+ }
+
++ err = register_switchdev_notifier(&nss_dp_switchdev_fdb_notifier);
++ if (err) {
++ netdev_dbg(dev, "%px:Failed to register switchdev FDB notifier\n", dev);
++ }
++
+ err = register_switchdev_blocking_notifier(&nss_dp_switchdev_notifier);
+ if (err) {
+ netdev_dbg(dev, "%px:Failed to register switchdev notifier\n", dev);
--- /dev/null
+From 7e4ae2d6285095794d73d2f2ce61404f61d4e633 Mon Sep 17 00:00:00 2001
+From: Ansuel Smith <ansuelsmth@gmail.com>
+Date: Tue, 17 May 2022 15:55:36 +0200
+Subject: [PATCH 11/11] treewide: fix confusing printing of registered netdev
+
+Net core implementation changed and now printing the netdev name cause
+confusing printing if done before register_netdev. Move the old printing
+to dbg and add an additional info log right after register_netdev to
+give the user some info on correct nss-dp probe.
+
+Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+---
+ hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c | 4 ++--
+ nss_dp_main.c | 3 +++
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
+@@ -822,8 +822,8 @@ static int edma_register_netdevice(struc
+ return -EINVAL;
+ }
+
+- netdev_info(netdev, "nss_dp_edma: Registering netdev %s(qcom-id:%d) with EDMA\n",
+- netdev->name, macid);
++ netdev_dbg(netdev, "nss_dp_edma: Registering netdev %s(qcom-id:%d) with EDMA\n",
++ netdev->name, macid);
+
+ /*
+ * We expect 'macid' to correspond to ports numbers on
+--- a/nss_dp_main.c
++++ b/nss_dp_main.c
+@@ -875,6 +875,9 @@ static int32_t nss_dp_probe(struct platf
+ goto phy_setup_fail;
+ }
+
++ netdev_info(netdev, "Registered netdev %s(qcom-id:%d)\n",
++ netdev->name, port_id);
++
+ dp_global_ctx.nss_dp[dp_priv->macid - 1] = dp_priv;
+ dp_global_ctx.slowproto_acl_bm = 0;
+
--- /dev/null
+From fee52ef165e9fab2fca15492677082fd8e9e891f Mon Sep 17 00:00:00 2001
+From: Ansuel Smith <ansuelsmth@gmail.com>
+Date: Thu, 19 May 2022 23:40:24 +0200
+Subject: [PATCH 12/12] gmac: syn: xgmac: silence debug log on probe
+
+Silence debug log set as info in xgmac port probe.
+
+Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+---
+ hal/gmac_ops/syn/xgmac/syn_if.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/hal/gmac_ops/syn/xgmac/syn_if.c
++++ b/hal/gmac_ops/syn/xgmac/syn_if.c
+@@ -445,7 +445,7 @@ static void *syn_init(struct nss_gmac_ha
+
+ spin_lock_init(&shd->nghd.slock);
+
+- netdev_info(ndev, "ioremap OK.Size 0x%x Ndev base 0x%lx macbase 0x%px\n",
++ netdev_dbg(ndev, "ioremap OK.Size 0x%x Ndev base 0x%lx macbase 0x%px\n",
+ gmacpdata->reg_len,
+ ndev->base_addr,
+ shd->nghd.mac_base);
--- /dev/null
+From 8293a26ca56ee2e9a88e4efb5dcc7f647803cd8c Mon Sep 17 00:00:00 2001
+From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
+Date: Sun, 5 Jun 2022 21:45:09 -0500
+Subject: [PATCH] nss_dp_main: Use a 'phy-handle' property to connect to the
+ PHY
+
+The original method of connecting a PHY to the ethernet controller
+requires the "qcom,link-poll", and "qcom,phy-mdio-addr" devicetree
+properties. This is redundant. The PHY node already contains the MDIO
+address, and attaching a PHY implies "link-poll".
+
+Allow using a "phy-handle" property. Remove the following properties,
+as they are no longer used:
+ * "qcom,link-poll"
+ * "qcom,phy-mdio-addr"
+ * "mdio-bus"
+ * "qcom,forced-speed"
+ * "qcom,forced-duplex"
+
+Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
+---
+ include/nss_dp_dev.h | 5 +--
+ nss_dp_main.c | 91 +++++---------------------------------------
+ 2 files changed, 10 insertions(+), 86 deletions(-)
+
+--- a/include/nss_dp_dev.h
++++ b/include/nss_dp_dev.h
+@@ -100,13 +100,10 @@ struct nss_dp_dev {
+ unsigned long drv_flags; /* Driver specific feature flags */
+
+ /* Phy related stuff */
++ struct device_node *phy_node;
+ struct phy_device *phydev; /* Phy device */
+ struct mii_bus *miibus; /* MII bus */
+ phy_interface_t phy_mii_type; /* RGMII/SGMII/QSGMII */
+- uint32_t phy_mdio_addr; /* Mdio address */
+- bool link_poll; /* Link polling enable? */
+- uint32_t forced_speed; /* Forced speed? */
+- uint32_t forced_duplex; /* Forced duplex? */
+ uint32_t link_state; /* Current link state */
+ uint32_t pause; /* Current flow control settings */
+
+--- a/nss_dp_main.c
++++ b/nss_dp_main.c
+@@ -399,7 +399,7 @@ static int nss_dp_open(struct net_device
+
+ netif_start_queue(netdev);
+
+- if (!dp_priv->link_poll) {
++ if (!dp_priv->phydev) {
+ /* Notify data plane link is up */
+ if (dp_priv->data_plane_ops->link_state(dp_priv->dpc, 1)) {
+ netdev_dbg(netdev, "Data plane set link failed\n");
+@@ -576,6 +576,8 @@ static int32_t nss_dp_of_get_pdata(struc
+ return -EFAULT;
+ }
+
++ dp_priv->phy_node = of_parse_phandle(np, "phy-handle", 0);
++
+ if (of_property_read_u32(np, "qcom,mactype", &hal_pdata->mactype)) {
+ pr_err("%s: error reading mactype\n", np->name);
+ return -EFAULT;
+@@ -594,16 +596,6 @@ static int32_t nss_dp_of_get_pdata(struc
+ #else
+ of_get_phy_mode(np, &dp_priv->phy_mii_type);
+ #endif
+- dp_priv->link_poll = of_property_read_bool(np, "qcom,link-poll");
+- if (of_property_read_u32(np, "qcom,phy-mdio-addr",
+- &dp_priv->phy_mdio_addr) && dp_priv->link_poll) {
+- pr_err("%s: mdio addr required if link polling is enabled\n",
+- np->name);
+- return -EFAULT;
+- }
+-
+- of_property_read_u32(np, "qcom,forced-speed", &dp_priv->forced_speed);
+- of_property_read_u32(np, "qcom,forced-duplex", &dp_priv->forced_duplex);
+
+ ret = of_get_mac_address(np, maddr);
+ if (!ret && is_valid_ether_addr(maddr)) {
+@@ -636,50 +628,6 @@ static int32_t nss_dp_of_get_pdata(struc
+ return 0;
+ }
+
+-/*
+- * nss_dp_mdio_attach()
+- */
+-static struct mii_bus *nss_dp_mdio_attach(struct platform_device *pdev)
+-{
+- struct device_node *mdio_node;
+- struct platform_device *mdio_plat;
+- struct ipq40xx_mdio_data *mdio_data;
+-
+- /*
+- * Find mii_bus using "mdio-bus" handle.
+- */
+- mdio_node = of_parse_phandle(pdev->dev.of_node, "mdio-bus", 0);
+- if (mdio_node) {
+- return of_mdio_find_bus(mdio_node);
+- }
+-
+- mdio_node = of_find_compatible_node(NULL, NULL, "qcom,qca-mdio");
+- if (!mdio_node) {
+- mdio_node = of_find_compatible_node(NULL, NULL,
+- "qcom,ipq40xx-mdio");
+- if (!mdio_node) {
+- dev_err(&pdev->dev, "cannot find mdio node by phandle\n");
+- return NULL;
+- }
+- }
+-
+- mdio_plat = of_find_device_by_node(mdio_node);
+- if (!mdio_plat) {
+- dev_err(&pdev->dev, "cannot find platform device from mdio node\n");
+- of_node_put(mdio_node);
+- return NULL;
+- }
+-
+- mdio_data = dev_get_drvdata(&mdio_plat->dev);
+- if (!mdio_data) {
+- dev_err(&pdev->dev, "cannot get mii bus reference from device data\n");
+- of_node_put(mdio_node);
+- return NULL;
+- }
+-
+- return mdio_data->mii_bus;
+-}
+-
+ #ifdef CONFIG_NET_SWITCHDEV
+ /*
+ * nss_dp_is_phy_dev()
+@@ -738,7 +686,6 @@ static int32_t nss_dp_probe(struct platf
+ struct device_node *np = pdev->dev.of_node;
+ struct nss_gmac_hal_platform_data gmac_hal_pdata;
+ int32_t ret = 0;
+- uint8_t phy_id[MII_BUS_ID_SIZE + 3];
+ #if defined(NSS_DP_PPE_SUPPORT)
+ uint32_t vsi_id;
+ fal_port_t port_id;
+@@ -813,37 +760,17 @@ static int32_t nss_dp_probe(struct platf
+
+ dp_priv->drv_flags |= NSS_DP_PRIV_FLAG(INIT_DONE);
+
+- if (dp_priv->link_poll) {
+- dp_priv->miibus = nss_dp_mdio_attach(pdev);
+- if (!dp_priv->miibus) {
+- netdev_dbg(netdev, "failed to find miibus\n");
+- goto phy_setup_fail;
+- }
+- snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT,
+- dp_priv->miibus->id, dp_priv->phy_mdio_addr);
+-
++ if (dp_priv->phy_node) {
+ SET_NETDEV_DEV(netdev, &pdev->dev);
+-
+- dp_priv->phydev = phy_connect(netdev, phy_id,
+- &nss_dp_adjust_link,
+- dp_priv->phy_mii_type);
++ dp_priv->phydev = of_phy_connect(netdev, dp_priv->phy_node,
++ &nss_dp_adjust_link, 0,
++ dp_priv->phy_mii_type);
+ if (IS_ERR(dp_priv->phydev)) {
+- netdev_dbg(netdev, "failed to connect to phy device\n");
++ dev_err(&pdev->dev, "Could not attach to PHY\n");
+ goto phy_setup_fail;
+ }
+
+-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0))
+- dp_priv->phydev->advertising |=
+- (ADVERTISED_Pause | ADVERTISED_Asym_Pause);
+- dp_priv->phydev->supported |=
+- (SUPPORTED_Pause | SUPPORTED_Asym_Pause);
+-#else
+- linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, dp_priv->phydev->advertising);
+- linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, dp_priv->phydev->advertising);
+-
+- linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, dp_priv->phydev->supported);
+- linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, dp_priv->phydev->supported);
+-#endif
++ phy_attached_info(dp_priv->phydev);
+ }
+
+ #if defined(NSS_DP_PPE_SUPPORT)
--- /dev/null
+From ae4fe8fb79b68f4cf4a887434ab6a8a9a1c65bfc Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Thu, 23 Jun 2022 14:18:50 +0200
+Subject: [PATCH] nss-dp: edma-v1: use NAPI GRO by default
+
+Utilize napi_gro_receive instead of plain netif_receive_skb on EDMA v1.
+
+Usually it provides quite a lot of RX speed improvements, however in some
+cases it may lead to decreased performance as there is no checksum
+offloading implemented.
+
+In cases where reduced performance is experienced its possible to disable
+GRO by using ethtool.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c | 10 ++++++----
+ hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c | 8 ++++++--
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+diff --git a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
+index 1d748db..e81c461 100644
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c
+@@ -589,10 +589,12 @@ drop:
+ */
+ static void edma_if_set_features(struct nss_dp_data_plane_ctx *dpc)
+ {
+- /*
+- * TODO - add flags to support HIGHMEM/cksum offload VLAN
+- * the features are enabled.
+- */
++ struct net_device *netdev = dpc->dev;
++
++ netdev->features |= NETIF_F_GRO;
++ netdev->hw_features |= NETIF_F_GRO;
++ netdev->vlan_features |= NETIF_F_GRO;
++ netdev->wanted_features |= NETIF_F_GRO;
+ }
+
+ /* TODO - check if this is needed */
+diff --git a/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c b/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
+index 5780a30..a002a79 100644
+--- a/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
++++ b/hal/dp_ops/edma_dp/edma_v1/edma_tx_rx.c
+@@ -410,8 +410,12 @@ static uint32_t edma_clean_rx(struct edma_hw *ehw,
+ if (unlikely(EDMA_RXPH_SERVICE_CODE_GET(rxph) ==
+ NSS_PTP_EVENT_SERVICE_CODE))
+ nss_phy_tstamp_rx_buf(ndev, skb);
+- else
+- netif_receive_skb(skb);
++ else {
++ if (likely(ndev->features & NETIF_F_GRO))
++ napi_gro_receive(&ehw->napi, skb);
++ else
++ netif_receive_skb(skb);
++ }
+
+ next_rx_desc:
+ /*
+--
+2.38.1
+
--- /dev/null
+From 358b93e40d0c6b6d381fe0e9d2a63c45a10321b3 Mon Sep 17 00:00:00 2001
+From: Robert Marko <robimarko@gmail.com>
+Date: Sun, 4 Dec 2022 18:41:36 +0100
+Subject: [PATCH] nss-dp: allow setting netdev name from DTS
+
+Allow reading the desired netdev name from DTS like DSA allows and then
+set it as the netdev name during registration.
+
+If label is not defined, simply fallback to kernel ethN enumeration.
+
+Signed-off-by: Robert Marko <robimarko@gmail.com>
+---
+ nss_dp_main.c | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/nss_dp_main.c b/nss_dp_main.c
+index 18e1088..19e14fb 100644
+--- a/nss_dp_main.c
++++ b/nss_dp_main.c
+@@ -685,18 +685,29 @@ static int32_t nss_dp_probe(struct platform_device *pdev)
+ struct nss_dp_dev *dp_priv;
+ struct device_node *np = pdev->dev.of_node;
+ struct nss_gmac_hal_platform_data gmac_hal_pdata;
++ const char *name = of_get_property(np, "label", NULL);
+ int32_t ret = 0;
++ int assign_type;
+ #if defined(NSS_DP_PPE_SUPPORT)
+ uint32_t vsi_id;
+ fal_port_t port_id;
+ #endif
+
++ if (name) {
++ assign_type = NET_NAME_PREDICTABLE;
++ } else {
++ name = "eth%d";
++ assign_type = NET_NAME_ENUM;
++ }
++
+ /* TODO: See if we need to do some SoC level common init */
+
+- netdev = alloc_etherdev_mqs(sizeof(struct nss_dp_dev),
+- NSS_DP_NETDEV_TX_QUEUE_NUM, NSS_DP_NETDEV_RX_QUEUE_NUM);
++ netdev = alloc_netdev_mqs(sizeof(struct nss_dp_dev),
++ name, assign_type,
++ ether_setup,
++ NSS_DP_NETDEV_TX_QUEUE_NUM, NSS_DP_NETDEV_RX_QUEUE_NUM);
+ if (!netdev) {
+- pr_info("alloc_etherdev() failed\n");
++ dev_err(&pdev->dev, "alloc_netdev_mqs() failed\n");
+ return -ENOMEM;
+ }
+
+--
+2.38.1
+