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.

[参考译文] 66AK2E05:以太网流量控制

Guru**** 2605645 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584233/66ak2e05-flow-control-for-ethernet

器件型号:66AK2E05

好的、那么简单的问题。 我无法完全了解 PA_EMAC 示例(接收设置)中的流控制是如何发生的、即 RX_fdq (1-3)_qnum/qmgr 的用法是什么

我的印象是、如果由于某种原因、自由描述符不足以处理大量传入的数据包、那么我可以制作多个自由描述符、这些描述符将并行运行、并在描述符不能为时充当冗余 传入数据包的数量。

因此、我创建了多个"rxFreeQInfo"、如以下代码所示、用于实现上述理念

rxFlowCfg.flowIdNum = CPPI_PARAM_NOT _specified;

rxFlowCfg.rx_dest_qmgr = rxQInfo.qMgr;
rxFlowCfg.rx_dest_qnum = rxQInfo.qNum;
rxFlowCfg.rx_desc_type = Cppi_DescType_host;

rxFlowCfg.rx_ps_location = Cppi_PSLoc_PS_in_Desc;
rxFlowCfg.rx_psinfo_present = 1;/*启用 PS 信息*/

rxFlowCfg.rx_error_handling = 1;默认情况下、//在饥饿时重试
rxFlowCfg.rx_einfo_present = 1;/* EPIB 信息存在*/

rxFlowCfg.rx_dest_tag_lo_SEL = 0;//禁用标记
rxFlowCfg.rx_dest_tag_hi_SEL = 0;
rxFlowCfg.rx_src_tag_lo_SEL = 0;
rxFlowCfg.rx_src_tag_hi_SEL = 0;

rxFlowCfg.rx_size_thresh_en = 0;//默认情况下,我们禁用 Rx 阈值*
rxFlowCfg.rx_size_thresh1_en = 0;//默认情况下,我们禁用 Rx 阈值*
rxFlowCfg.rx_size_thresh2_en = 0;//默认情况下,我们禁用 Rx 阈值*/
rxFlowCfg.rx_size_thresh0 = 0x0;
rxFlowCfg.rx_size_thresh1 = 0x0;
rxFlowCfg.rx_size_thresh2 = 0x0;

rxFlowCfg.rx_fdq0_sz0_qmgr = rxFreeQInfo.qMgr;//设置流程的接收空闲队列*/
rxFlowCfg.rx_fdq0_sz0_qnum = rxFreeQInfo.qNum;
rxFlowCfg.rx_fdq0_sz1_qnum = 0x0;
rxFlowCfg.rx_fdq0_sz1_qmgr = 0x0;
rxFlowCfg.rx_fdq0_sz2_qnum = 0x0;
rxFlowCfg.rx_fdq0_sz2_qmgr = 0x0;
rxFlowCfg.rx_fdq0_sz3_qnum = 0x0;
rxFlowCfg.rx_fdq0_sz3_qmgr = 0x0;

rxFlowCfg.rx_fdq1_qnum = rxFreeQInfo1.qNum;//使用 Rx Queue 选择描述符*/
rxFlowCfg.rx_fdq1_qmgr = rxFreeQInfo1.qMgr;
rxFlowCfg.rx_fdq2_qnum = rxFreeQInfo2.qNum;//使用 Rx Queue 选择描述符*/
rxFlowCfg.rx_fdq2_qmgr = rxFreeQInfo2.qMgr;
rxFlowCfg.rx_fdq3_qnum = rxFreeQInfo3.qNum;//使用 Rx Queue 选择描述符*/
rxFlowCfg.rx_fdq3_qmgr = rxFreeQInfo3.qMgr;

/*配置 Rx 流*/
if ((gRxFlowHnd = Cppi_configureRxFlow (gCpdmaHnd、&rxFlowCfg、&isAllocated))= NULL)
{
UART_printf ("配置 Rx 流时出错\n");
返回-1;
} 

我的假设和实施是否正确、如果是、我为什么无法正确接收数据、我会如何以及在何处推送使用过的描述符  

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

    我已将此事转发给以太网专家。 他们的反馈应发布在此处。

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

    这是 CPPI 的 Rx 流管理、您可以参阅 cppi_drv.h 以了解 Cppi_RxFlowCfg 结构。 它用于将大小不同的接收帧放入不同的队列中。 请参阅 PA\TEST\PAUnitTest\src\c66x\BIOS\framework.c 中的 setupFlows ()

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

    你好,Eric!!

    我的印象是

    /**此字段指定在大小为的数据包中,第一个 Rx 缓冲区应使用哪个队列
    *小于或等于 RX_size0值*/
    uint16_t RX_fdq0_sz1_qnum;
    /**此字段指定应将哪个队列管理器用于大小较大的数据包中的第一个 Rx 缓冲区
    *小于或等于 RX_size0值*/
    uint16_t rx_fdq0_sz1_qmgr; 

    ETC 负责分配具有可变大小的缓冲区

    /**此字段指定应将哪个自由描述符队列用于主机类型数据包中的第2个 Rx 缓冲区*/
    uint16_t RX_fdq1_qnum;
    /**此字段指定应将哪个队列管理器用于主机类型数据包中的第2个 Rx 缓冲区*/
    uint16_t rx_fdq1_qmgr; 

    指定其他内容。

    但是、您说的 rx_fdq1_sz1_qnum 和 rx_fdq_qnum 是相同的吗?

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

    请参阅此主题以了解 e2e.ti.com/.../1462274的说明

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的快速响应!

    现在、只是为了澄清
    rxFlowCfg.rx_fdq1_qmgr = rxFreeQInfo1.qMgr;
    rxFlowCfg.rx_fdq2_qnum = rxFreeQInfo2.qNum;
    rxFlowCfg.rx_fdq2_qmgr = rxFreeQInfo2.qMgr;
    rxFlowCfg.rx_fdq3_qnum = rxFreeQInfo3.qNum;
    rxFlowCfg.rx_fdq3_qmgr = rxFreeQInfo3.qMgr;

    如果我使用的缓冲区(在 setData()中)大于数据包字节,则不会使用该缓冲区?

    我还想问的另一件事是"rxFreeQInfo.q."如果无法足够快地释放自己、我可以通过某种方式使用 rxFreeQInfo1/2/3简化数据包、直到我的主要 FDQ 可用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有这方面的最新情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    如果您使用:

    rxFlowCfg.rx_size_thresh_en = 0;//默认情况下,我们禁用 Rx 阈值*

    rxFlowCfg.rx_size_thresh1_en = 0;//默认情况下,我们禁用 Rx 阈值*

    rxFlowCfg.rx_size_thresh2_en = 0;//默认情况下,我们禁用 Rx 阈值*/

    然后所有数据包进入 rx_fdq0_sz0_qmgr/qnum、没有数据包进入 rx_fdq1/2/3_qmgr/qnum。

    如果不能足够快地释放自己,我可以使用 rxFreeQInfo1/2/3来促进数据包的传输,直到我的主 FDQ 为 FREE==>是,“NoBody 表明与 RX_FDQ0_SZ#_QNUM/QMGR 中描述符链接的缓冲区的大小是>=相应的 RX_SIZE (#-1)。 因此、如果空闲描述符队列具有"小"缓冲区、则仍需要多个描述符来完成数据包。 无论大小如何、DMA 都将始终从 RX_FDQ1_QMGR/QNUM、RX_FDQ2_QMGR/QNUM 和 RX_FDQ3_QMGR/QNUM 获取第二个、第三个、第四个和后续描述符。 第一个描述符将使用数据包的大小和大小阈值来选择第一个(SOP)描述符。 DMA 将采用尽可能多的描述符来适应数据包(不限于4个)。"

    此致、Eric