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.

[参考译文] LP-AM243:成功接收到多个 mac2mac 帧后、cpsw 无法再进入 EnetUdma_rxCqIsr。

Guru**** 1796350 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1394537/lp-am243-cpsw-can-no-longer-enter-enetudma_rxcqisr-after-successfully-received-several-mac2mac-frames

器件型号:LP-AM243

工具与软件:

您好、TI

我们刚刚移除了 am243x-lp 板中的以太网 phy 芯片、并将 RGMII TX 连接到 RGMII Rx 通道、以简单地测试 mac2mac 功能。 我们成功地收到了几个帧,并可以进入 EnetUdma_rxCqIsr ,但之后我们无法再进入 EnetUdma_rxCqIsr ,但我们可以看到 Rx 寄存器不断增大。

我认为 cpsw 模块已收到数据包、但为什么 无法 生成中断处理程序? 我需要检查哪种配置、请提供一些建议。 非常感谢。   

我们 在 SDK 中使用 enet_lwip_cpsw 示例、我们发现另一个网络端口在发生这种情况时工作不正常、对它执行 ping 操作、但在发生这种情况后不会得到响应。

我们进行了更多测试、发现我们只能接收堆栈中的32个帧、如果我们每秒发送一个帧、我们将在32秒内进入错误状态;如果我们在一秒内发送100个帧、我们将立即进入错误状态。

当我们将 Number of packets 字段更改为16时、只能接收16个数据包、然后进入错误状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 

    感谢您的提问。

    我会检查一下、然后回复给您。

    此致

    Ashwani

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Ashwani

    感谢您的帮助。

    err_t
    ethernet_input(struct pbuf *p, struct netif *netif)
    {
      struct eth_hdr *ethhdr;
      u16_t type;
    #if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6
      u16_t next_hdr_offset = SIZEOF_ETH_HDR;
    #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */
    
      LWIP_ASSERT_CORE_LOCKED();
    
      if (p->len <= SIZEOF_ETH_HDR) {
        /* a packet with only an ethernet header (or less) is not valid for us */
        ETHARP_STATS_INC(etharp.proterr);
        ETHARP_STATS_INC(etharp.drop);
        MIB2_STATS_NETIF_INC(netif, ifinerrors);
        goto free_and_return;
      }
    
      /* points to packet payload, which starts with an Ethernet header */
      ethhdr = (struct eth_hdr *)p->payload;
      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,
                  ("ethernet_input: dest:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", src:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", type:%"X16_F"\n",
                   (unsigned char)ethhdr->dest.addr[0], (unsigned char)ethhdr->dest.addr[1], (unsigned char)ethhdr->dest.addr[2],
                   (unsigned char)ethhdr->dest.addr[3], (unsigned char)ethhdr->dest.addr[4], (unsigned char)ethhdr->dest.addr[5],
                   (unsigned char)ethhdr->src.addr[0],  (unsigned char)ethhdr->src.addr[1],  (unsigned char)ethhdr->src.addr[2],
                   (unsigned char)ethhdr->src.addr[3],  (unsigned char)ethhdr->src.addr[4],  (unsigned char)ethhdr->src.addr[5],
                   lwip_htons(ethhdr->type)));
    
      type = ethhdr->type;
    #if ETHARP_SUPPORT_VLAN
      if (type == PP_HTONS(ETHTYPE_VLAN)) {
        struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr *)(((char *)ethhdr) + SIZEOF_ETH_HDR);
        next_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR;
        if (p->len <= SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) {
          /* a packet with only an ethernet/vlan header (or less) is not valid for us */
          ETHARP_STATS_INC(etharp.proterr);
          ETHARP_STATS_INC(etharp.drop);
          MIB2_STATS_NETIF_INC(netif, ifinerrors);
          goto free_and_return;
        }
    #if defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) /* if not, allow all VLANs */
    #ifdef LWIP_HOOK_VLAN_CHECK
        if (!LWIP_HOOK_VLAN_CHECK(netif, ethhdr, vlan)) {
    #elif defined(ETHARP_VLAN_CHECK_FN)
        if (!ETHARP_VLAN_CHECK_FN(ethhdr, vlan)) {
    #elif defined(ETHARP_VLAN_CHECK)
        if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) {
    #endif
          /* silently ignore this packet: not for our VLAN */
          pbuf_free(p);
          return ERR_OK;
        }
    #endif /* defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) */
        type = vlan->tpid;
      }
    #endif /* ETHARP_SUPPORT_VLAN */
    
    #if LWIP_ARP_FILTER_NETIF
      netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, lwip_htons(type));
    #endif /* LWIP_ARP_FILTER_NETIF*/
    
      if (p->if_idx == NETIF_NO_INDEX) {
        p->if_idx = netif_get_index(netif);
        DebugP_log("%d", p->if_idx);
        if (1 == p->if_idx)
        {
          goto free_and_return;
        }
      }

    我们添加代码  

      if (1 == p->if_idx)
      
       /*我们在这里处理帧*/
       转至 FREE_AND_RETURN
      }
    在函数  Ethernet_input 中、现在运行良好。 我认为堆栈并没有释放从 RGMII1接收到的 pbuf、但我们可以在这里使用接收到的数据包、而不会将其传递到上层堆栈、在本例中是可以的。
    感谢您的支持、我们 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在我们的案例中可以。

    很高兴听到这个消息。

    此致

    Ashwani