This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: TDA4VM: linux error when running ethfw client

Part Number: TDA4VM


Tool/software:

SDK Version:0902

board: custom hardware

out custom board MAC <- sgmii -> switch MAC

Dear TI's experts,

We aim to establish network communication between our hardware and the peer switch  via MAC-to-MAC connection. While we've modified the ETHFW and confirmed successful link-up, the Linux encounters errors and fails to boot.

Linux Client Error message:

[   12.598152] ti_cpsw_proxy_client virtio4.ti.ethfw.ethdevice.-1.108: resending request

Linux Full Boot Log as below:

ethfwErr.log (2).txt

Change Record:

diff --git a/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_ethernet_config.c b/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_ethernet_config.c
index 5d513ea495..cd52ffb353 100755
--- a/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_ethernet_config.c
+++ b/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_ethernet_config.c
@@ -741,6 +741,27 @@ Board_STATUS Board_ethConfigCpsw9g(void)
 
     /* On J721E EVM to use all 8 ports simultaneously, we use below configuration
        RGMII Ports - 1,3,4,8. QSGMII ports - 2 (main),5,6,7 (sub)*/
+#ifdef BOARD_CMS_V2^M   
+^M
+#ifdef BOARD_CMS_V2_SGMII_1G_PORT_2_ENABLE^M
+//#error 6 test ok  ^M
+    portNum = 1;^M
+    status = Board_cpsw9gEthConfig(portNum, SGMII);^M
+    if(status != BOARD_SOK)^M
+    {^M
+        return BOARD_FAIL;^M
+    }^M
+#endif ^M
+^M
+#else^M
 
     /* Configures the CPSW9G RGMII ports */
     for(portNum = 0; portNum < BOARD_CPSW9G_PORT_MAX; portNum++)
@@ -769,7 +790,7 @@ Board_STATUS Board_ethConfigCpsw9g(void)
             return BOARD_FAIL;
         }
     }
-
+#endif^M
     return BOARD_SOK;
 }
 
diff --git a/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_serdes_cfg.c b/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_serdes_cfg.c
index ff1b329621..80f20fba8d 100755
--- a/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_serdes_cfg.c
+++ b/PDK0902M_RTOS/pdk_jacinto_09_02_00_30/packages/ti/board/src/j721e_evm/board_serdes_cfg.c
@@ -573,3 +573,87 @@ Board_STATUS Board_serdesCfg(void)
 
     return BOARD_SOK;
 }
+^M
+#ifdef BOARD_CMS_V2 
+static Board_STATUS Board_CfglhSgmii(void)^M
+{^M
+    CSL_SerdesResult result;^M
+    CSL_SerdesLaneEnableStatus laneRetVal = CSL_SERDES_LANE_ENABLE_NO_ERR;^M
+    CSL_SerdesLaneEnableParams serdesLane0EnableParams  = {0};^M
+^M
+    memset(&serdesLane0EnableParams, 0, sizeof(serdesLane0EnableParams));^M
+^M
+    /* SGMII Config */^M
+    serdesLane0EnableParams.serdesInstance    = (CSL_SerdesInstance)0;^M
+    serdesLane0EnableParams.baseAddr          = CSL_SERDES_16G0_BASE;^M
+    serdesLane0EnableParams.refClock          = CSL_SERDES_REF_CLOCK_100M;^M
+    serdesLane0EnableParams.refClkSrc         = CSL_SERDES_REF_CLOCK_INT;^M
+    serdesLane0EnableParams.linkRate          = CSL_SERDES_LINK_RATE_1p25G;^M
+    serdesLane0EnableParams.numLanes          = 0x1;^M
+    serdesLane0EnableParams.laneMask          = 0x2; // lane1^M
+    serdesLane0EnableParams.SSC_mode          = CSL_SERDES_NO_SSC;^M
+    serdesLane0EnableParams.phyType           = CSL_SERDES_PHY_TYPE_SGMII;^M
+    serdesLane0EnableParams.operatingMode     = CSL_SERDES_FUNCTIONAL_MODE;^M
+    serdesLane0EnableParams.phyInstanceNum    = SERDES_LANE_SELECT_CPSW;^M
+    serdesLane0EnableParams.pcieGenType        = CSL_SERDES_PCIE_GEN3;^M
+^M
+    serdesLane0EnableParams.laneCtrlRate[1]   = CSL_SERDES_LANE_FULL_RATE;^M
+    serdesLane0EnableParams.loopbackMode[1]   = CSL_SERDES_LOOPBACK_DISABLED;^M
+^M
+    CSL_serdesPorReset(serdesLane0EnableParams.baseAddr);^M
+^M
+    /* Select the IP type, IP instance num, Serdes Lane Number */^M
+    CSL_serdesIPSelect(CSL_CTRL_MMR0_CFG0_BASE,^M
+                       serdesLane0EnableParams.phyType,^M
+                       serdesLane0EnableParams.phyInstanceNum,^M
+                       serdesLane0EnableParams.serdesInstance,^M
+                       SGMII_LANE_NUM);^M
+^M
+^M
+    result = CSL_serdesRefclkSel(CSL_CTRL_MMR0_CFG0_BASE,^M
+                                 serdesLane0EnableParams.baseAddr,^M
+                                 serdesLane0EnableParams.refClock,^M
+                                 serdesLane0EnableParams.refClkSrc,^M
+                                 serdesLane0EnableParams.serdesInstance,^M
+                                 serdesLane0EnableParams.phyType);^M
+^M
+    if (result != CSL_SERDES_NO_ERR)^M
+    {^M
+        return BOARD_FAIL;^M
+    }^M
+    /* Assert PHY reset and disable all lanes */^M
+    CSL_serdesDisablePllAndLanes(serdesLane0EnableParams.baseAddr, 2, serdesLane0EnableParams.laneMask);^M
+^M
+    /* Load the Serdes Config File */^M
+    result = CSL_serdesEthernetInit(&serdesLane0EnableParams);^M
+    /* Return error if input params are invalid */^M
+    if (result != CSL_SERDES_NO_ERR)^M
+    {^M
+        return BOARD_FAIL;^M
+    }^M
+^M
+    /* Common Lane Enable API for lane enable, pll enable etc */^M
+    laneRetVal = CSL_serdesLaneEnable(&serdesLane0EnableParams);^M
+    if (laneRetVal != 0)^M
+    {^M
+        return BOARD_FAIL;^M
+    }^M
+^M
+    return BOARD_SOK;^M
+}^M
+^M
+Board_STATUS Board_serdesCfglh(void)^M
+{^M
+    Board_STATUS ret;^M
+^M
+    ret = Board_CfglhSgmii();^M
+    if(ret != BOARD_SOK)^M
+    {^M
+        return ret;^M
+    }^M
+^M
+    return BOARD_SOK;^M
+}^M
+#endif^M
+
diff --git a/PDK0902M_RTOS/vision_apps/utils/ethfw/src/app_ethfw_freertos.c b/PDK0902M_RTOS/vision_apps/utils/ethfw/src/app_ethfw_freertos.c
index f0d8969c4b..e88eb31079 100644
--- a/PDK0902M_RTOS/vision_apps/utils/ethfw/src/app_ethfw_freertos.c
+++ b/PDK0902M_RTOS/vision_apps/utils/ethfw/src/app_ethfw_freertos.c
@@ -151,6 +151,18 @@ static EthAppObj gEthAppObj =
 static Enet_MacPort gEthAppPorts[] =
 {
 #if defined(SOC_J721E)
+#ifdef BOARD_CMS_V2 
+#ifdef BOARD_CMS_V2_SGMII_1G_PORT_2_ENABLE
+     ENET_MAC_PORT_2, /* SGMII */
+#endif 
+
+#else
+
     /* On J721E EVM to use all 8 ports simultaneously, we use below configuration
        RGMII Ports - 1,3,4,8. QSGMII ports - 2,5,6,7 */
     ENET_MAC_PORT_1, /* RGMII */
@@ -163,6 +175,7 @@ static Enet_MacPort gEthAppPorts[] =
     ENET_MAC_PORT_6, /* QSGMII sub */
     ENET_MAC_PORT_7, /* QSGMII sub */
 #endif
+#endif
 #elif defined(SOC_J784S4)
     ENET_MAC_PORT_1, /* QSGMII main */
     ENET_MAC_PORT_3, /* QSGMII sub */
@@ -175,6 +188,9 @@ static Enet_MacPort gEthAppPorts[] =
 static Enet_MacPort gEthAppSwitchPorts[]=
 {
 #if defined(SOC_J721E)
+#ifdef BOARD_CMS_V2_SGMII_1G_PORT_2_ENABLE
+    ENET_MAC_PORT_2, /* SGMII */
+#else
     ENET_MAC_PORT_3,
     ENET_MAC_PORT_8,
 #if defined(ENABLE_QSGMII_PORTS)
@@ -182,6 +198,7 @@ static Enet_MacPort gEthAppSwitchPorts[]=
     ENET_MAC_PORT_5,
 #endif
 #endif
+#endif
 
 #if defined(SOC_J784S4)
     ENET_MAC_PORT_3,
@@ -275,6 +292,7 @@ static EthFw_VirtPortCfg gEthApp_virtPortCfg[] =
         .numMacAddress = 1U,
         .clientIdMask  = ETHFW_BIT(ETHREMOTECFG_CLIENTID_AUTOSAR) | ETHFW_BIT(ETHREMOTECFG_CLIENTID_RTOS),
     },
+#ifndef BOARD_CMS_V2
     {
         .remoteCoreId  = IPC_MPU1_0,
         .portId        = ETHREMOTECFG_MAC_PORT_1,
@@ -297,6 +315,7 @@ static EthFw_VirtPortCfg gEthApp_virtPortCfg[] =
         .numMacAddress = 1U,
         .clientIdMask  = ETHFW_BIT(ETHREMOTECFG_CLIENTID_RTOS),
     },
+#endif
 };
 
 static EthFw_AllocCfg gEthApp_allocCfg[] =
@@ -546,7 +565,9 @@ int32_t appEthFwInit()
 #elif defined(SOC_J784S4)
     flags |= (ETHFW_BOARD_QENET_ENABLE | ETHFW_BOARD_SERDES_CONFIG);
 #endif
-
+#ifdef BOARD_CMS_V2
+    flags = ETHFW_BOARD_SERDES_CONFIG;
+#endif
     /* Board related initialization */
     status = EthFwBoard_init(flags);
     if (status != ENET_SOK)
@@ -948,36 +969,38 @@ static void EthApp_netifStatusCb(struct netif *netif)
 {
     Enet_MacPort macPort = ENET_MAC_PORT_1;
     int32_t status;
-
-    if (netif_is_up(netif))
+    if(0)//set no ENET_MAC_PORT_3 for gptp
     {
-        const ip4_addr_t *ipAddr = netif_ip4_addr(netif);
-
-        appLogPrintf("Added interface '%c%c%d', IP is %s\n",
-                     netif->name[0], netif->name[1], netif->num, ip4addr_ntoa(ipAddr));
-
-        if (ipAddr->addr != 0)
-        {
-#if defined(ETHFW_DEMO_SUPPORT)
-            /* Assign functions that are to be called based on actions in GUI.
-             * These cannot be dynamically pushed to function pointer array, as the
-             * index is used in GUI as command */
-            EnetCfgServer_fxn_table[9] = &EthApp_startSwInterVlan;
-            EnetCfgServer_fxn_table[10] = &EthApp_startHwInterVlan;
-
-            /* Start Configuration server */
-            status = EnetCfgServer_init(gEthAppObj.enetType, gEthAppObj.instId);
-            EnetAppUtils_assert(ENET_SOK == status);
-
-            /* Start the software-based interVLAN routing */
-            EthSwInterVlan_setupRouting(gEthAppObj.enetType, ETH_SWINTERVLAN_TASK_PRI);
-#endif
-        }
-    }
-    else
-    {
-        appLogPrintf("Removed interface '%c%c%d'\n", netif->name[0], netif->name[1], netif->num);
-    }
+           if (netif_is_up(netif))
+           {
+               const ip4_addr_t *ipAddr = netif_ip4_addr(netif);
+
+               appLogPrintf("Added interface '%c%c%d', IP is %s\n",
+                            netif->name[0], netif->name[1], netif->num, ip4addr_ntoa(ipAddr));
+
+               if (ipAddr->addr != 0)
+               {
+       #if defined(ETHFW_DEMO_SUPPORT)
+                   /* Assign functions that are to be called based on actions in GUI.
+                    * These cannot be dynamically pushed to function pointer array, as the
+                    * index is used in GUI as command */
+                   EnetCfgServer_fxn_table[9] = &EthApp_startSwInterVlan;
+                   EnetCfgServer_fxn_table[10] = &EthApp_startHwInterVlan;
+
+                   /* Start Configuration server */
+                   status = EnetCfgServer_init(gEthAppObj.enetType, gEthAppObj.instId);
+                   EnetAppUtils_assert(ENET_SOK == status);
+
+                   /* Start the software-based interVLAN routing */
+                   EthSwInterVlan_setupRouting(gEthAppObj.enetType, ETH_SWINTERVLAN_TASK_PRI);
+       #endif
+               }
+           }
+           else
+           {
+               appLogPrintf("Removed interface '%c%c%d'\n", netif->name[0], netif->name[1], netif->num);
+           }
+       }
 }
 
 #if defined(ETHFW_MONITOR_SUPPORT)

  • Hi,

    Is this port the SGMII2 which you are using as switch port?

    Have you made any changes to the linux device-tree overlay?

    Regards,
    Tanmay

  • Is this port the SGMII2 which you are using as switch port? 

    YES

    Have you made any changes to the linux device-tree overlay?

    YES

    We found that gEthApp_virtPortCfg must retain at least one MAC_PORT; otherwise, the Linux client will repeatedly print "resending request". Regarding this, we have questions, If a CPU core needs to receive packets from an external port, does it require both SWITCH_PORT and MAC_PORT to be defined for that CPU?

  • Hi,

     If a CPU core needs to receive packets from an external port, does it require both SWITCH_PORT and MAC_PORT to be defined for that CPU?

    No, both are independent.

    Can you share you configuration changes for device-tree

    Regards,
    Tanmay