diff --git a/package/kernel/qca-nss-dp/Makefile b/package/kernel/qca-nss-dp/Makefile index 08cf4712283..f0cd4605550 100644 --- a/package/kernel/qca-nss-dp/Makefile +++ b/package/kernel/qca-nss-dp/Makefile @@ -3,11 +3,11 @@ 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_URL:=https://github.com/openwrt/qca-nss-dp.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2024-11-18 -PKG_SOURCE_VERSION:=4c9f671a84c866999fe938b900e76e197b62ee02 -PKG_MIRROR_HASH:=45568d7f1268b67d752f7085f6ef8397ca8ee4e5456ef121b8a285bded99dc82 +PKG_SOURCE_DATE:=2025-05-09 +PKG_SOURCE_VERSION:=b65a3bc9747e6725f48f55f1a1769b7599dccfc9 +PKG_MIRROR_HASH:=ef5f35b4eb4da712a9fb9861b4cffc7a7bbe1317c7464cc3ac516e76fe5b634a PKG_BUILD_PARALLEL:=1 PKG_FLAGS:=nonshared diff --git a/package/kernel/qca-nss-dp/patches/0001-nss-dp-Drop-_nocache-variants-of-ioremap.patch b/package/kernel/qca-nss-dp/patches/0001-nss-dp-Drop-_nocache-variants-of-ioremap.patch deleted file mode 100644 index c998874d4e6..00000000000 --- a/package/kernel/qca-nss-dp/patches/0001-nss-dp-Drop-_nocache-variants-of-ioremap.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 946381fd6fdabedf2b5a1d8647a49e3da8f1894e Mon Sep 17 00:00:00 2001 -From: Baruch Siach -Date: Fri, 23 Jun 2023 11:28:02 +0200 -Subject: [PATCH 1/8] nss-dp: Drop _nocache variants of ioremap() - -ioremap_nocache was made equivelant to ioremap and was dropped. - -Signed-off-by: Baruch Siach -Signed-off-by: Robert Marko ---- - hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c | 2 +- - hal/gmac_ops/syn/gmac/syn_if.c | 2 +- - hal/soc_ops/ipq50xx/nss_ipq50xx.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/syn/gmac/syn_if.c -+++ b/hal/gmac_ops/syn/gmac/syn_if.c -@@ -806,7 +806,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"); ---- a/hal/soc_ops/ipq50xx/nss_ipq50xx.c -+++ b/hal/soc_ops/ipq50xx/nss_ipq50xx.c -@@ -89,7 +89,7 @@ static void nss_dp_hal_tcsr_set(void) - pr_err("%s: SCM TCSR write error: %d\n", __func__, err); - } - } else { -- tcsr_addr = ioremap_nocache((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), -+ tcsr_addr = ioremap((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), - TCSR_GMAC_AXI_CACHE_OVERRIDE_REG_SIZE); - if (!tcsr_addr) { - pr_err("%s: ioremap failed\n", __func__); diff --git a/package/kernel/qca-nss-dp/patches/0002-edma_tx_rx-support-newer-kernels-time-stamping-API.patch b/package/kernel/qca-nss-dp/patches/0002-edma_tx_rx-support-newer-kernels-time-stamping-API.patch deleted file mode 100644 index d091311b975..00000000000 --- a/package/kernel/qca-nss-dp/patches/0002-edma_tx_rx-support-newer-kernels-time-stamping-API.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 3357c64b3fc63fe003d5ef02ba7f6abca64d80bf Mon Sep 17 00:00:00 2001 -From: Baruch Siach -Date: Mon, 3 May 2021 20:07:36 +0300 -Subject: [PATCH 2/8] edma_tx_rx: support newer kernels time stamping API - -Timestamping API has changed in kernel 5.6, so update the implementation -for newer kernels. - -Signed-off-by: Baruch Siach ---- - 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_txtstamp(ndev->phydev, skb, 0); -+#endif - } - EXPORT_SYMBOL(nss_phy_tstamp_tx_buf); - diff --git a/package/kernel/qca-nss-dp/patches/0003-EDMA-Fix-NAPI-packet-counting.patch b/package/kernel/qca-nss-dp/patches/0003-EDMA-Fix-NAPI-packet-counting.patch deleted file mode 100644 index a2268010d4c..00000000000 --- a/package/kernel/qca-nss-dp/patches/0003-EDMA-Fix-NAPI-packet-counting.patch +++ /dev/null @@ -1,31 +0,0 @@ -From c36420c219bf0e03842a11f69193c802eb42030a Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Thu, 20 May 2021 14:56:46 +0200 -Subject: [PATCH 3/8] 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 -Signed-off-by: Robert Marko ---- - 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); - } - - /* diff --git a/package/kernel/qca-nss-dp/patches/0004-EDMA-Use-NAPI_POLL_WEIGHT-as-NAPI-weight.patch b/package/kernel/qca-nss-dp/patches/0004-EDMA-Use-NAPI_POLL_WEIGHT-as-NAPI-weight.patch deleted file mode 100644 index 84fb02a92a5..00000000000 --- a/package/kernel/qca-nss-dp/patches/0004-EDMA-Use-NAPI_POLL_WEIGHT-as-NAPI-weight.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 158032d3d4e5089afa2aa38c27c6e222ac427820 Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Thu, 20 May 2021 14:57:46 +0200 -Subject: [PATCH 4/8] 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 ---- - 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 -@@ -845,7 +845,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 */ diff --git a/package/kernel/qca-nss-dp/patches/0005-nss-dp-adapt-to-netif_napi_add-changes.patch b/package/kernel/qca-nss-dp/patches/0005-nss-dp-adapt-to-netif_napi_add-changes.patch deleted file mode 100644 index d5b0f624783..00000000000 --- a/package/kernel/qca-nss-dp/patches/0005-nss-dp-adapt-to-netif_napi_add-changes.patch +++ /dev/null @@ -1,46 +0,0 @@ -From e46c4d526d77916c00fff4fff3237b9c9d0d774d Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Fri, 23 Jun 2023 12:04:11 +0200 -Subject: [PATCH 5/8] nss-dp: adapt to netif_napi_add() changes - -netif_napi_add() removed the weight argument and just uses the default -NAPI_POLL_WEIGHT in background, so for those requiring custom weight use -netif_napi_add_weight() instead. - -Signed-off-by: Robert Marko ---- - hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c | 4 ++++ - hal/dp_ops/syn_gmac_dp/syn_dp.c | 5 +++++ - 2 files changed, 9 insertions(+) - ---- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c -+++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c -@@ -844,8 +844,12 @@ static int edma_register_netdevice(struc - * NAPI add - */ - if (!edma_hw.napi_added) { -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0)) - netif_napi_add(netdev, &edma_hw.napi, edma_napi, - NAPI_POLL_WEIGHT); -+#else -+ netif_napi_add(netdev, &edma_hw.napi, edma_napi); -+#endif - /* - * Register the interrupt handlers and enable interrupts - */ ---- a/hal/dp_ops/syn_gmac_dp/syn_dp.c -+++ b/hal/dp_ops/syn_gmac_dp/syn_dp.c -@@ -189,8 +189,13 @@ static int syn_dp_if_init(struct nss_dp_ - } - - if (!dev_info->napi_added) { -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0)) - netif_napi_add(netdev, &rx_info->napi_rx, syn_dp_napi_poll_rx, SYN_DP_NAPI_BUDGET_RX); - netif_napi_add(netdev, &tx_info->napi_tx, syn_dp_napi_poll_tx, SYN_DP_NAPI_BUDGET_TX); -+#else -+ netif_napi_add_weight(netdev, &rx_info->napi_rx, syn_dp_napi_poll_rx, SYN_DP_NAPI_BUDGET_RX); -+ netif_napi_add_weight(netdev, &tx_info->napi_tx, syn_dp_napi_poll_tx, SYN_DP_NAPI_BUDGET_TX); -+#endif - - /* - * Requesting irq. Set IRQ_DISABLE_UNLAZY flag, this flag diff --git a/package/kernel/qca-nss-dp/patches/0006-nss_dp_main-Use-a-phy-handle-property-to-connect-to-.patch b/package/kernel/qca-nss-dp/patches/0006-nss_dp_main-Use-a-phy-handle-property-to-connect-to-.patch deleted file mode 100644 index e78ee6da2f4..00000000000 --- a/package/kernel/qca-nss-dp/patches/0006-nss_dp_main-Use-a-phy-handle-property-to-connect-to-.patch +++ /dev/null @@ -1,183 +0,0 @@ -From 5b05b1d7a2d2001d9711856608f61abaf7b9a9a5 Mon Sep 17 00:00:00 2001 -From: Alexandru Gagniuc -Date: Fri, 23 Jun 2023 13:34:56 +0200 -Subject: [PATCH 6/8] 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 -Signed-off-by: Robert Marko ---- - include/nss_dp_dev.h | 5 +-- - nss_dp_main.c | 91 +++++++------------------------------------- - 2 files changed, 14 insertions(+), 82 deletions(-) - ---- a/include/nss_dp_dev.h -+++ b/include/nss_dp_dev.h -@@ -225,13 +225,10 @@ struct nss_dp_dev { - unsigned long drv_flags; /* Driver specific feature flags */ - - /* Phy related stuff */ -+ struct device_node *phy_node; /* Phy device OF node */ - struct phy_device *phydev; /* Phy device */ - struct mii_bus *miibus; /* MII bus */ - uint32_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 -@@ -464,7 +464,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"); -@@ -661,6 +661,12 @@ static int32_t nss_dp_of_get_pdata(struc - return -EFAULT; - } - -+ dp_priv->phy_node = of_parse_phandle(np, "phy-handle", 0); -+ if (!dp_priv->phy_node) { -+ pr_err("%s: error parsing phy-handle\n", np->name); -+ return -EFAULT; -+ } -+ - if (of_property_read_u32(np, "qcom,mactype", &hal_pdata->mactype)) { - pr_err("%s: error reading mactype\n", np->name); - return -EFAULT; -@@ -681,18 +687,6 @@ static int32_t nss_dp_of_get_pdata(struc - return -EFAULT; - #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); -- -- - #if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0)) - maddr = (uint8_t *)of_get_mac_address(np); - #if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 4, 0)) -@@ -781,56 +775,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; --#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,1,0)) -- struct ipq40xx_mdio_data *mdio_data; --#endif -- -- /* -- * 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; -- } -- --#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0)) -- return dev_get_drvdata(&mdio_plat->dev); --#else -- 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; --#endif --} -- - #ifdef CONFIG_NET_SWITCHDEV - /* - * nss_dp_is_phy_dev() -@@ -889,7 +833,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; -@@ -968,22 +911,16 @@ 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) { - -- dp_priv->phydev = phy_connect(netdev, phy_id, -- &nss_dp_adjust_link, -- dp_priv->phy_mii_type); -- if (IS_ERR(dp_priv->phydev)) { -- netdev_dbg(netdev, "failed to connect to phy device\n"); -- goto phy_setup_fail; -- } -+ dp_priv->phydev = of_phy_connect(netdev, dp_priv->phy_node, -+ &nss_dp_adjust_link, 0, -+ dp_priv->phy_mii_type); -+ if (!(dp_priv->phydev)) { -+ netdev_err(netdev, "failed to connect to phy device\n"); -+ goto phy_setup_fail; -+ } -+ phy_attached_info(dp_priv->phydev); - } - - #if defined(NSS_DP_PPE_SUPPORT) diff --git a/package/kernel/qca-nss-dp/patches/0007-nss-dp-edma-v1-use-NAPI-GRO-by-default.patch b/package/kernel/qca-nss-dp/patches/0007-nss-dp-edma-v1-use-NAPI-GRO-by-default.patch deleted file mode 100644 index 6fbe75dc1c4..00000000000 --- a/package/kernel/qca-nss-dp/patches/0007-nss-dp-edma-v1-use-NAPI-GRO-by-default.patch +++ /dev/null @@ -1,56 +0,0 @@ -From c2df713569fe3bb671d1444c7bf758681081053c Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Thu, 23 Jun 2022 14:18:50 +0200 -Subject: [PATCH 7/8] 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 ---- - 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(-) - ---- a/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c -+++ b/hal/dp_ops/edma_dp/edma_v1/edma_data_plane.c -@@ -597,10 +597,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 */ ---- 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 edm - 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: - /* diff --git a/package/kernel/qca-nss-dp/patches/0008-nss-dp-allow-setting-netdev-name-from-DTS.patch b/package/kernel/qca-nss-dp/patches/0008-nss-dp-allow-setting-netdev-name-from-DTS.patch deleted file mode 100644 index 9af770fccae..00000000000 --- a/package/kernel/qca-nss-dp/patches/0008-nss-dp-allow-setting-netdev-name-from-DTS.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 53b044f7a21d5cd65ada90a228910e6efbad00fa Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Sun, 4 Dec 2022 18:41:36 +0100 -Subject: [PATCH 8/8] 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 ---- - nss_dp_main.c | 17 ++++++++++++++--- - 1 file changed, 14 insertions(+), 3 deletions(-) - ---- a/nss_dp_main.c -+++ b/nss_dp_main.c -@@ -832,18 +832,29 @@ static int32_t nss_dp_probe(struct platf - 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; - } - diff --git a/package/kernel/qca-nss-dp/patches/0009-nss-dp-switchdev-fix-FDB-roaming.patch b/package/kernel/qca-nss-dp/patches/0009-nss-dp-switchdev-fix-FDB-roaming.patch deleted file mode 100644 index e0c85fb860c..00000000000 --- a/package/kernel/qca-nss-dp/patches/0009-nss-dp-switchdev-fix-FDB-roaming.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 25ca3308edb67aa0c6c70b83edf0e22b8ae7533f Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Thu, 29 Jun 2023 13:52:58 +0200 -Subject: [PATCH] nss-dp: 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 ---- - nss_dp_switchdev.c | 73 +++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 72 insertions(+), 1 deletion(-) - ---- a/nss_dp_switchdev.c -+++ b/nss_dp_switchdev.c -@@ -29,6 +29,10 @@ - #include "nss_dp_dev.h" - #include "fal/fal_stp.h" - #include "fal/fal_ctrlpkt.h" -+#if defined(NSS_DP_PPE_SUPPORT) -+#include "fal/fal_fdb.h" -+#include "ref/ref_vsi.h" -+#endif - - #define NSS_DP_SWITCH_ID 0 - #define NSS_DP_SW_ETHTYPE_PID 0 /* PPE ethtype profile ID for slow protocols */ -@@ -534,8 +538,82 @@ static struct notifier_block *nss_dp_sw_ - - #else - -+#if defined(NSS_DP_PPE_SUPPORT) -+/* -+ * nss_dp_switchdev_fdb_del_event -+ * -+ * Used for EDMA v1 to remove old MAC in order to preventing having -+ * duplicate MAC entries in FDB thus and avoid roaming issues. -+ */ -+ -+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); -+} -+ -+/* -+ * nss_dp_switchdev_event_nb -+ * -+ * Non blocking switchdev event for netdevice. -+ * Used for EDMA v1 to remove old MAC and avoid roaming issues. -+ */ -+static int nss_dp_switchdev_event_nb(struct notifier_block *unused, -+ 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); -+ default: -+ netdev_dbg(dev, "Switchdev event %lu is not supported\n", event); -+ } -+ -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block nss_dp_switchdev_notifier_nb = { -+ .notifier_call = nss_dp_switchdev_event_nb, -+}; -+ -+static struct notifier_block *nss_dp_sw_ev_nb = &nss_dp_switchdev_notifier_nb; -+ -+#else - static struct notifier_block *nss_dp_sw_ev_nb; - -+#endif - /* - * nss_dp_bridge_attr_set() - * Sets bridge attributes diff --git a/package/kernel/qca-nss-dp/patches/0012-01-syn-gmac-use-standard-DMA-api.patch b/package/kernel/qca-nss-dp/patches/0012-01-syn-gmac-use-standard-DMA-api.patch deleted file mode 100644 index 654f6ef99ff..00000000000 --- a/package/kernel/qca-nss-dp/patches/0012-01-syn-gmac-use-standard-DMA-api.patch +++ /dev/null @@ -1,234 +0,0 @@ -From 5ad8cf24897ff903112967a9662cb13ed4cbbf57 Mon Sep 17 00:00:00 2001 -From: Ziyang Huang -Date: Mon, 22 Apr 2024 21:47:58 +0800 -Subject: [PATCH] syn-gmac: use standard DMA api - -The SSDK uses several old DMA API calls based on raw assembly which have -been deprecated. So let's convert to and use the standard Linux DMA API -instead. - -Signed-off-by: Ziyang Huang -Signed-off-by: George Moussalem ---- - hal/dp_ops/syn_gmac_dp/syn_dp_cfg_rx.c | 14 ++++++-- - hal/dp_ops/syn_gmac_dp/syn_dp_cfg_tx.c | 2 ++ - hal/dp_ops/syn_gmac_dp/syn_dp_rx.c | 47 +++++++++++++------------- - hal/dp_ops/syn_gmac_dp/syn_dp_tx.c | 23 ++++--------- - 4 files changed, 42 insertions(+), 44 deletions(-) - ---- a/hal/dp_ops/syn_gmac_dp/syn_dp_cfg_rx.c -+++ b/hal/dp_ops/syn_gmac_dp/syn_dp_cfg_rx.c -@@ -26,6 +26,7 @@ static int syn_dp_cfg_rx_setup_desc_queu - { - struct syn_dp_info_rx *rx_info = &dev_info->dp_info_rx; - struct dma_desc_rx *first_desc = NULL; -+ dma_addr_t dma_addr; - struct net_device *netdev = rx_info->netdev; - - netdev_dbg(netdev, "Total size of memory required for Rx Descriptors in Ring Mode = %u\n", (uint32_t)((sizeof(struct dma_desc_rx) * SYN_DP_RX_DESC_SIZE))); -@@ -33,13 +34,15 @@ static int syn_dp_cfg_rx_setup_desc_queu - /* - * Allocate cacheable descriptors for Rx - */ -- first_desc = kzalloc(sizeof(struct dma_desc_rx) * SYN_DP_RX_DESC_SIZE, GFP_KERNEL); -+ first_desc = dma_alloc_coherent(rx_info->dev, -+ sizeof(struct dma_desc_rx) * SYN_DP_RX_DESC_SIZE, -+ &dma_addr, GFP_KERNEL); - if (!first_desc) { - netdev_dbg(netdev, "Error in Rx Descriptor Memory allocation in Ring mode\n"); - return -ENOMEM; - } - -- dev_info->rx_desc_dma_addr = (dma_addr_t)virt_to_phys(first_desc); -+ dev_info->rx_desc_dma_addr = dma_addr; - rx_info->rx_desc = first_desc; - syn_dp_gmac_rx_desc_init_ring(rx_info->rx_desc, SYN_DP_RX_DESC_SIZE); - -@@ -98,6 +101,10 @@ void syn_dp_cfg_rx_cleanup_rings(struct - for (i = 0; i < rx_info->busy_rx_desc_cnt; i++) { - rx_skb_index = (rx_skb_index + i) & SYN_DP_RX_DESC_MAX_INDEX; - rxdesc = rx_info->rx_desc; -+ -+ dma_unmap_single(rx_info->dev, rxdesc->buffer1, -+ rxdesc->length, DMA_FROM_DEVICE); -+ - skb = rx_info->rx_buf_pool[rx_skb_index].skb; - if (unlikely(skb != NULL)) { - dev_kfree_skb_any(skb); -@@ -105,7 +112,8 @@ void syn_dp_cfg_rx_cleanup_rings(struct - } - } - -- kfree(rx_info->rx_desc); -+ dma_free_coherent(rx_info->dev, (sizeof(struct dma_desc_rx) * SYN_DP_RX_DESC_SIZE), -+ rx_info->rx_desc, dev_info->rx_desc_dma_addr); - rx_info->rx_desc = NULL; - dev_info->rx_desc_dma_addr = (dma_addr_t)0; - } ---- a/hal/dp_ops/syn_gmac_dp/syn_dp_cfg_tx.c -+++ b/hal/dp_ops/syn_gmac_dp/syn_dp_cfg_tx.c -@@ -91,6 +91,8 @@ void syn_dp_cfg_tx_cleanup_rings(struct - tx_skb_index = syn_dp_tx_inc_index(tx_skb_index, i); - txdesc = tx_info->tx_desc; - -+ dma_unmap_single(tx_info->dev, txdesc->buffer1, txdesc->length, DMA_TO_DEVICE); -+ - skb = tx_info->tx_buf_pool[tx_skb_index].skb; - if (unlikely(skb != NULL)) { - dev_kfree_skb_any(skb); ---- a/hal/dp_ops/syn_gmac_dp/syn_dp_rx.c -+++ b/hal/dp_ops/syn_gmac_dp/syn_dp_rx.c -@@ -73,16 +73,6 @@ static inline void syn_dp_rx_refill_one_ - */ - static inline void syn_dp_rx_inval_and_flush(struct syn_dp_info_rx *rx_info, uint32_t start, uint32_t end) - { -- /* -- * Batched flush and invalidation of the rx descriptors -- */ -- if (end > start) { -- dmac_flush_range_no_dsb((void *)&rx_info->rx_desc[start], (void *)&rx_info->rx_desc[end] + sizeof(struct dma_desc_rx)); -- } else { -- dmac_flush_range_no_dsb((void *)&rx_info->rx_desc[start], (void *)&rx_info->rx_desc[SYN_DP_RX_DESC_MAX_INDEX] + sizeof(struct dma_desc_rx)); -- dmac_flush_range_no_dsb((void *)&rx_info->rx_desc[0], (void *)&rx_info->rx_desc[end] + sizeof(struct dma_desc_rx)); -- } -- - dsb(st); - } - -@@ -124,15 +114,19 @@ int syn_dp_rx_refill_page_mode(struct sy - break; - } - -+ skb_fill_page_desc(skb, 0, pg, 0, PAGE_SIZE); -+ - /* - * Get virtual address of allocated page. - */ - page_addr = page_address(pg); -- dma_addr = (dma_addr_t)virt_to_phys(page_addr); -- -- skb_fill_page_desc(skb, 0, pg, 0, PAGE_SIZE); -+ dma_addr = dma_map_page(rx_info->dev, pg, 0, PAGE_SIZE, DMA_FROM_DEVICE); -+ if (unlikely(dma_mapping_error(rx_info->dev, dma_addr))) { -+ dev_kfree_skb(skb); -+ netdev_dbg(netdev, "DMA mapping failed for empty buffer\n"); -+ break; -+ } - -- dmac_inv_range_no_dsb(page_addr, (page_addr + PAGE_SIZE)); - rx_refill_idx = rx_info->rx_refill_idx; - rx_desc = rx_info->rx_desc + rx_refill_idx; - -@@ -181,8 +175,15 @@ int syn_dp_rx_refill(struct syn_dp_info_ - - skb_reserve(skb, SYN_DP_SKB_HEADROOM + NET_IP_ALIGN); - -- dma_addr = (dma_addr_t)virt_to_phys(skb->data); -- dmac_inv_range_no_dsb((void *)skb->data, (void *)(skb->data + inval_len)); -+ dma_addr = dma_map_single(rx_info->dev, skb->data, -+ inval_len, -+ DMA_FROM_DEVICE); -+ if (unlikely(dma_mapping_error(rx_info->dev, dma_addr))) { -+ dev_kfree_skb(skb); -+ netdev_dbg(netdev, "DMA mapping failed for empty buffer\n"); -+ break; -+ } -+ - rx_refill_idx = rx_info->rx_refill_idx; - rx_desc = rx_info->rx_desc + rx_refill_idx; - -@@ -407,12 +408,6 @@ int syn_dp_rx(struct syn_dp_info_rx *rx_ - * this code is executing. - */ - end = syn_dp_rx_inc_index(rx_info->rx_idx, busy); -- if (end > start) { -- dmac_inv_range_no_dsb((void *)&rx_info->rx_desc[start], (void *)&rx_info->rx_desc[end] + sizeof(struct dma_desc_rx)); -- } else { -- dmac_inv_range_no_dsb((void *)&rx_info->rx_desc[start], (void *)&rx_info->rx_desc[SYN_DP_RX_DESC_MAX_INDEX] + sizeof(struct dma_desc_rx)); -- dmac_inv_range_no_dsb((void *)&rx_info->rx_desc[0], (void *)&rx_info->rx_desc[end] + sizeof(struct dma_desc_rx)); -- } - - dsb(st); - -@@ -439,8 +434,12 @@ int syn_dp_rx(struct syn_dp_info_rx *rx_ - * speculative prefetch by CPU may have occurred. - */ - frame_length = syn_dp_gmac_get_rx_desc_frame_length(status); -- dmac_inv_range((void *)rx_buf->map_addr_virt, -- (void *)(((uint8_t *)rx_buf->map_addr_virt) + frame_length)); -+ if (likely(!rx_info->page_mode)) -+ dma_unmap_single(rx_info->dev, rx_desc->buffer1, -+ rx_info->alloc_buf_len, DMA_FROM_DEVICE); -+ else -+ dma_unmap_page(rx_info->dev, rx_desc->buffer1, -+ PAGE_SIZE, DMA_FROM_DEVICE); - prefetch((void *)rx_buf->map_addr_virt); - - rx_next_idx = syn_dp_rx_inc_index(rx_idx, 1); ---- a/hal/dp_ops/syn_gmac_dp/syn_dp_tx.c -+++ b/hal/dp_ops/syn_gmac_dp/syn_dp_tx.c -@@ -104,9 +104,7 @@ static inline struct dma_desc_tx *syn_dp - BUG_ON(!length); - #endif - -- dma_addr = (dma_addr_t)virt_to_phys(frag_addr); -- -- dmac_clean_range_no_dsb(frag_addr, frag_addr + length); -+ dma_addr = dma_map_single(tx_info->dev, frag_addr, length, DMA_TO_DEVICE); - - *total_length += length; - tx_desc = syn_dp_tx_set_desc_sg(tx_info, dma_addr, length, DESC_OWN_BY_DMA); -@@ -150,8 +148,7 @@ int syn_dp_tx_nr_frags(struct syn_dp_inf - /* - * Flush the dma for non-paged skb data - */ -- dma_addr = (dma_addr_t)virt_to_phys(skb->data); -- dmac_clean_range_no_dsb((void *)skb->data, (void *)(skb->data + length)); -+ dma_addr = dma_map_single(tx_info->dev, skb->data, length, DMA_TO_DEVICE); - - total_len = length; - -@@ -256,12 +253,7 @@ int syn_dp_tx_frag_list(struct syn_dp_in - return NETDEV_TX_BUSY; - } - -- dma_addr = (dma_addr_t)virt_to_phys(skb->data); -- -- /* -- * Flush the data area of the head skb -- */ -- dmac_clean_range_no_dsb((void *)skb->data, (void *)(skb->data + length)); -+ dma_addr = dma_map_single(tx_info->dev, skb->data, length, DMA_TO_DEVICE); - - total_len = length; - -@@ -290,9 +282,7 @@ int syn_dp_tx_frag_list(struct syn_dp_in - BUG_ON(!length); - #endif - -- dma_addr = (dma_addr_t)virt_to_phys(iter_skb->data); -- -- dmac_clean_range_no_dsb((void *)iter_skb->data, (void *)(iter_skb->data + length)); -+ dma_addr = dma_map_single(tx_info->dev, iter_skb->data, length, DMA_TO_DEVICE); - - total_len += length; - -@@ -445,6 +435,7 @@ int syn_dp_tx_complete(struct syn_dp_inf - break; - } - -+ dma_unmap_single(tx_info->dev, desc->buffer1, desc->length, DMA_TO_DEVICE); - - if (likely(status & DESC_TX_LAST)) { - tx_skb_index = syn_dp_tx_comp_index_get(tx_info); -@@ -571,9 +562,7 @@ int syn_dp_tx(struct syn_dp_info_tx *tx_ - return NETDEV_TX_BUSY; - } - -- dma_addr = (dma_addr_t)virt_to_phys(skb->data); -- -- dmac_clean_range_no_dsb((void *)skb->data, (void *)(skb->data + skb->len)); -+ dma_addr = dma_map_single(tx_info->dev, skb->data, skb->len, DMA_TO_DEVICE); - - /* - * Queue packet to the GMAC rings diff --git a/package/kernel/qca-nss-dp/patches/0012-02-ipq50xx-use-corrent-scm-function-to-write-tcsr.patch b/package/kernel/qca-nss-dp/patches/0012-02-ipq50xx-use-corrent-scm-function-to-write-tcsr.patch deleted file mode 100644 index 25fef48fcea..00000000000 --- a/package/kernel/qca-nss-dp/patches/0012-02-ipq50xx-use-corrent-scm-function-to-write-tcsr.patch +++ /dev/null @@ -1,41 +0,0 @@ -From ba430b1a512dc1972807a1dd5a8d31a78ac572ff Mon Sep 17 00:00:00 2001 -From: Ziyang Huang -Date: Mon, 22 Apr 2024 21:49:18 +0800 -Subject: [PATCH] ipq50xx: use corrent scm function to write tcsr - -QCA leverages its own API function to write to the TCSR register space, -not available upstream. As such, convert to the upstream qcom SCM IO -write function. - -Signed-off-by: Ziyang Huang -Signed-off-by: George Moussalem ---- - hal/soc_ops/ipq50xx/nss_ipq50xx.c | 9 ++------- - 1 file changed, 2 insertions(+), 7 deletions(-) - ---- a/hal/soc_ops/ipq50xx/nss_ipq50xx.c -+++ b/hal/soc_ops/ipq50xx/nss_ipq50xx.c -@@ -18,7 +18,7 @@ - - #include - #include --#include -+#include - #include "nss_dp_hal.h" - - /* -@@ -78,13 +78,8 @@ static void nss_dp_hal_tcsr_set(void) - * If TZ is not enabled, we can write to the register directly. - */ - if (qcom_scm_is_available()) { --#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) -- err = qcom_scm_tcsr_reg_write((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), -+ err = qcom_scm_io_writel((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), - TCSR_GMAC_AXI_CACHE_OVERRIDE_VALUE); --#else -- err = qti_scm_tcsr_reg_write((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), -- TCSR_GMAC_AXI_CACHE_OVERRIDE_VALUE); --#endif - if (err) { - pr_err("%s: SCM TCSR write error: %d\n", __func__, err); - } diff --git a/package/kernel/qca-nss-dp/patches/0013-nss_dp_main-support-fixed-link.patch b/package/kernel/qca-nss-dp/patches/0013-nss_dp_main-support-fixed-link.patch deleted file mode 100644 index 37504b87a80..00000000000 --- a/package/kernel/qca-nss-dp/patches/0013-nss_dp_main-support-fixed-link.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 309a1a330ccaa103a7648e944d97a0032116b338 Mon Sep 17 00:00:00 2001 -From: Ziyang Huang -Date: Mon, 22 Apr 2024 21:50:39 +0800 -Subject: [PATCH] nss_dp_main: support fixed-link - -Add support for "fixed link" to support ethernet MACs which are not -connected to an MDIO managed PHY. For example, IPQ5018 has two internal -MACs, one connected to a GE PHY and the other connected to a Uniphy to -support connections to an external switch over a fixed link. As such, -check for a fixed link in absence of a phy-handle and return an error -when no phy-handle and fixed link is found. - -Signed-off-by: Ziyang Huang -Signed-off-by: George Moussalem ---- - nss_dp_main.c | 15 ++++++++++++--- - 1 file changed, 12 insertions(+), 3 deletions(-) - ---- a/nss_dp_main.c -+++ b/nss_dp_main.c -@@ -662,11 +662,20 @@ static int32_t nss_dp_of_get_pdata(struc - } - - dp_priv->phy_node = of_parse_phandle(np, "phy-handle", 0); -- if (!dp_priv->phy_node) { -- pr_err("%s: error parsing phy-handle\n", np->name); -- return -EFAULT; -+ if(!dp_priv->phy_node) { -+ if(of_phy_is_fixed_link(np)) { -+ int ret = of_phy_register_fixed_link(np); -+ if(ret < 0) { -+ pr_err("%s: fail to register fixed-link: %d\n", np->name, ret); -+ return -EFAULT; -+ } -+ } -+ dp_priv->phy_node = of_node_get(np); - } - -+ if(!dp_priv->phy_node) -+ pr_err("%s: no phy-handle or fixed-link found\n", np->name); -+ - if (of_property_read_u32(np, "qcom,mactype", &hal_pdata->mactype)) { - pr_err("%s: error reading mactype\n", np->name); - return -EFAULT;