GMAC接口(3)——传输描述符

描述符

以太网子系统中的DMA基于描述符的链表来传输数据。该应用程序将在系统内存中创建这些描述符。
支持以下两种类型的描述符:
Normal descriptor
Context descriptor

Normal descriptor

普通描述符用于包数据,并提供适用于要传输的包的控制信息。
每个普通描述符包含两个缓冲区和两个地址指针。这些缓冲区使适配器端口能够与各种类型的内存管理方案兼容。
Normal descriptor根据传输方向又可分为:
Transmit Normal descriptor
Receive Normal descriptor

Context descriptor

上下文描述符用于提供适用于要传输的数据包的控制信息。

描述符列表

描述符环和链结构如下图所示:
在这里插入图片描述
在环状结构中,描述符由在DMA_CH#_Control寄存器的DSL字段中编程的Word、DWord或LWord号分隔。该应用程序需要对总环的长度进行编程,即在一个DMA信道的以下寄存器中,环跨度中的描述符的总数:
Transmit Descriptor Ring Length Register(DMA_CH#_TxDesc_Ring_Lenth)
Receive Descriptor Ring Length Register(DMA_CH#_RxDesc_Ring_Lenth)
描述符尾指针寄存器包含指向描述符地址(N)的指针。基本地址和当前描述符指针决定了DMA可以处理的当前描述符的地址。比描述符尾指针(N-1)所指示的位置小于一个位置的描述符为DMA所有。DMA会继续处理描述符,直到出现以下情况:
当前描述符指针==描述符尾指针;

当此情况发生时,DMA将进入暂停模式。应用程序必须执行对描述符尾指针寄存器的写入,并更新尾指针,以便满足以下条件:
当前描述符指针<描述符尾指针;

当到达环的末端时,DMA会自动封装基本地址。
对于应用程序拥有的描述符,DES3的OWN位被重置为0;
对于DMA拥有的描述符,OWN位被设置为1。
如果应用程序在开头只有一个描述符,则应用程序将最后一个描述符地址(尾指针)设置为描述符基本地址+1。DMA处理第一个描述符,然后等待应用程序推进尾指针。

Transmit Descriptor

DWC_ether_qos中的DMA需要一个传输数据包的至少一个描述符。除了两个缓冲区、两个字节计数缓冲区和两个地址指针外,传输描述符还具有控制字段,可用于控制每个传输包的MAC操作。

Transmit Normal Descriptor

传输普通描述符有两种格式:
读取格式(Read Format)
回写格式(Write-Back Format)

Transmit Normal Descriptor(Read Format)

在这里插入图片描述
TDES0
缓冲区1地址指针或TSO(TCP Segmentation Offload,TCP分段分载)标头地址指针这些位表示缓冲区1的物理地址。

TDES1
缓冲区2或缓冲区1地址指针。
此位表示在使用描述符环结构时,缓冲区2的物理地址。(对缓冲区地址对齐没有任何限制)

TDES2

IOC:完成时中断。
(此位控制在DMA_CH#_Status寄存器中的TI和ETI状态位的设置。当ETIC=1和TDES2[LD]=0时,此位设置ETI位。当TDES3[LD]=1时,该位将设置TI状态位。)
TTSE/TMWD:启用传输时间戳或启用外部TSO内存写入。
(如果没有设置TSE位,该位启用了由描述符引用的传输包的IEEE1588时间戳。如果设置了TSE位并且启用了外部TSO内存,则设置此位将禁用此数据包的外部TSO内存写入)
B2L:缓冲区2长度。(驱动程序将设置此字段。设置后,此字段表示缓冲区2的长度。)
VTIR:VLAN标签插入或替换器。(这些比特请求MAC在传输数据包之前执行VLAN标记或取消标记。当为数据包启用VLAN标签插入、替换或删除时,应用程序必须适当地设置CRC垫片控制位)
HL/B1L:标头长度或缓冲区1长度。(对于报头长度,只取几位。尺寸13:0仅适用于解释缓冲区1的长度。如果通过TDES3的TSE位启用了TCP分段卸载特性,则该字段等于报头长度。当在TDES3中设置TSE位时,头长度包括从以太网源地址到TCP头结束的字节长度。TSO特性支持的最大标头长度为1023字节。TSO特性支持的最大标头长度为1023字节。如果未启用TCP分段卸载功能,则此字段等于缓冲区1的长度。)
TDES3

OWN:归属位。(当设置此位时,它表示DMA拥有该描述符。当复位时,它表示应用程序拥有描述符。DMA在完成关联缓冲区中给出的数据的传输后清除此位。)
CTXT:上下文类型。(对于普通描述符,这个位应该设置为1‘b0。对于上下文描述符,这个位应该被设置为1‘b1。)
FD:第一个描述符。(当设置此位时,它表示缓冲区包含数据包的第一段。)
LD:最后一个描述符。(当设置此位时,它表示缓冲区包含数据包的最后一段。当设置此位时,B1L或B2L字段应具有非零值。)
CPC:CRC垫控制。(此字段控制Tx数据包的CRC和垫子插入。此字段仅在设置了第一个描述符位(TDES3[29])时有效。)
SAIO:SA插入控制。(这些位请求MAC将以太网数据包中的源地址字段添加或替换为MAC地址0寄存器中给出的值字段。当为数据包启用SA插入控制时,应用程序必须适当地设置CRC垫控制位。第25位指定用于源地址插入或替换的MAC地址寄存器(1或0)值。)
SLOTNUM/THL:AV模式下的槽号控制位。(这些位表示应该从TDES0或TDES1寻址的相应缓冲区中获取数据的插槽间隔。当获取传输描述符时,DMA将此字段中的槽号值与RSN字段DMA_CH#_Slot_Function_Control_Status中保持的槽号间隔进行比较。只有当一个值匹配时,它才会从缓冲区获取数据。这些位仅对AV通道有效。)TCP/UDP标题长度(如果设置了TSE位,则此字段包含TCP/UDP标头的长度。对于TCP报头,该字段的最小值必须为5。UDP标头的值必须等于2。此字段仅对第一个描述符有效)
TSE:TCP分段使能。(当设置这个位时,DMA对数据包执行TCP/UDP分割或UDP分割,这取决于DMA_CH(#i)_Tx_Control寄存器的TSE_MODE[1:0]位。此位仅在设置了FD位时才有效)
CIC/TPL:校验和插入控制或TCP有效负载长度。()
TPL:预留长度或TCP有效载荷长度。
FL/TPL:帧长度或TCP有效载荷长度。(此字段等于要以字节为单位传输的数据包的长度。当未设置TSE位时,该字段等于要传输的数据包的总长度。当设置TSE位时,该字段在分段时等于TCP有效载荷长度的下15位,在UDP分段时等于IP有效载荷长度。在分段的情况下,此长度不包括以太网头或TCP/UDP/IP头长度。如果碎片,此长度不包括以太网头和IP头。当未启用DWRR/WFQ算法时,当TSE=0时,不使用写入此字段的值。)

Transmit Normal Descriptor(Write-Back Format)

在这里插入图片描述
传输描述符的回写格式包括时间戳低、时间戳高、OWN和状态位。回写格式仅适用于相应数据包的最后一个描述符。LD位(TDES3[28])设置在描述符中,其中DMA写回相应的传输包的状态和时间戳信息。
TDES0
TTSL:传输数据包时间戳低。(DMA用为相应的传输包捕获的至少32位的时间戳更新此字段。只有当在数据包的第一个描述符中设置了TDES2的TTSE位时,DMA才会写入时间戳。仅当设置了描述符中的最后一个字段位(LS)并且设置了时间戳状态(TTSS)位时,此字段才具有时间戳。)

TDES1
TTSH:传输数据包时间戳高。(DMA用为相应的传输数据包捕获的最重要的32位时间戳来更新此字段。只有当TDES2的TTSE位被设置在数据包的第一个描述符中时,DMA才会写入时间戳。只有当设置了描述符中的最后一个段位(LS)并且设置了时间戳状态(TTSS)位时,此字段才具有时间戳。)

TDES2
Reserved:保留。

TDES3
在这里插入图片描述
OWN:归属位。
CTXT:上下文类型。
FD:第一个描述符。
LD:最后一个描述符。
Rsvd[27:24]:Reserved,保留。
DE[23]:描述符错误。(当设置此位时,它表示描述符内容不正确。DMA在关闭描述符时进行回写时设置此位。)
Rsvd[22:18]:Reserved,保留。
TTSS:Tx时间戳状态。(此状态位表示已为相应的传输数据包捕获了一个时间戳。当设置此位时,TDES0和TDES1具有为传输数据包捕获的时间戳值。只有当设置了描述符中的最后一个节段控制位(TDES3[28])时,此字段才有效。此位仅在启用IEEE1588时间戳功能时有效,否则将保留)
EUE:ECC不可校正错误状态。(表示TSO内存中的ECC不可纠正的错误。注意:使用(位13)FF=1报告了传输FIFO内存中的不可纠正错误。这是因为,所有这些数据包都被DWC_ether_qos刷新了。)
ES:错误概要。
JT:jabber timeout,超时。(这位表示MAC发射机经历了抖动超时。只有在未设置MAC_Configuration寄存器的JD位时才会设置此位。)
FF:Packet Flushed,包刷新。(此位表示DMA或MTL由于CPU给出的软件刷新命令而刷新了数据包。)
PCE:Payload Checksum Error,有效载荷校验和错误。(此位表示校验和卸载引擎发生故障,并且没有将任何校验和插入到封装的TCP、UDP或ICMP有效载荷中。此故障可能是由于字节不足,如IP头的有效载荷长度字段所示,或者是MTL在没有计算校验和的情况下开始以存储和转发模式将数据包转发到MAC发送器。第二个错误条件只发生在传输FIFO深度小于被传输的以太网包的长度以避免死锁时,MTL在FIFO满时开始转发包,即使在存储转发模式。当在数据包传输期间检测到总线错误时,也可能发生此错误。当未启用完全校验和卸载引擎时,将保留此位。)
LoC:Loss of Carrior,负载损失。(这个位表示在包传输期间发生了载波丢失(即gmii_crs_i信号在包传输期间的一个或多个传输时钟周期内不活动)。这只对没有碰撞传输的数据包和MAC在半双工模式下工作时有效。)
NC:No Carrior,无负载。(该位表示在传输期间没有声明来自PHY的载波感知信号。)
LC:Late Collision,晚碰撞。(这个位表示包传输中止,因为碰撞窗口后发生了碰撞(64字节包括MII模式下的前导,512字节包括GMII模式下的前导和载波扩展)。如果设置了底流错误,则此位无效。)
EC:Excessive Collision,过度碰撞。(此位表示在尝试传输当前数据包时,连续16次碰撞后传输中止。如果在MAC_Configuration寄存器中设置了DR位,则在第一次碰撞后就设置了该位,并中止了数据包的传输。)
CC:Collision Count,碰撞计数。(这个4位计数器值表示在传输数据包之前发生的碰撞次数。当设置了EC位时,该计数无效。)
ED:Excessive Deferral,过度延迟。(该位表示,如果在MAC_Configuration寄存器中设置DC位,由于过度延迟超过24288位次(1000Mbps模式或大包启用模式为155680位次),传输结束。当TBS在全双工模式下启用并设置了此位时,它表示在达到到期时间后,该帧已被删除。)
UF:Underfolw Error,下流错误。(这位表示MAC中止了数据包,因为数据从系统内存延迟到达)
DB:Deferred Bit,延迟位。(该位表示MAC由于存在载波而在传输前延迟。此位仅在半双工模式下有效。)
IHE:IP Header Error,IP头错误。(当设置IP标头错误时,此位表示校验和卸载引擎检测到IP标头错误。此位仅在启用Tx校验和卸载时有效。否则,它是保留的。如果COE检测到IP报头错误,则如果以太网类型字段表示有IPv4有效负载,则它仍然会插入IPv4报头校验和。在全双工模式下,当启用EST/Qbv并设置此位时,它表示由于帧大小错误或调度错误而导致的帧下降状态)

Transmit Context Descriptor

在这里插入图片描述
上下文描述符用于提供针对一步式时间戳校正的时间戳,即针对VLAN插入特性的VLAN标记ID。
在上下文描述符之前可以在任何时间提供传输上下文描述符。该上下文对当前数据包和后续数据包都有效。

TDES0
TTSL:传输数据包时间戳低。

TDES1
TTSH:传输数据包时间戳高。

TDES2
IVT:Inner VLAN Tag,内部VLAN标签。(当设置TDES3上下文描述符的IVLTV位并重置TDES3上下文描述符的TCMSSV和OSTC位时,TDES2[31:16]包含要插入到后续发送包中的内部VLAN标记。)
Rsvd:Reserved,保留。
MSS:Maximum Segment Size,最大段大小。(当选择“为TCP/IP数据包启用TCP分段卸载”选项时,驱动程序可以在此字段中提供最大的数据段大小。在分割TCP/IP有效载荷时使用此段大小。只有当设置了TDES3上下文描述符的TCMSSV位,并且重置了TDES3上下文描述符的OSTC位时,此字段才有效。)

TDES3
OWN:归属位。
CTXT:上下文类型。
Rsvd[29:28]:Reserved,保留。
OSTC:One-Step Timestamp Correction Enable,一步式时间戳校正使能。(当设置此位时,DMA参照TDES0和TDES1中提供的时间戳值执行一步时间戳校正)
TCMSSV:One-Step Timestamp Correction Input or MSS Valid,一步式时间戳校正输入或MSS有效。(当设置此位和OSTC位时,它表示在TDES0和TDES1中提供的时间戳校正输入有效。当复置OSTC位复位,在TDES2中设置TDES3的TSE位时,表示TDES2中的MSS输入有效。)
Rsvd[25:24]:Reserved,保留。
CDE:Context Descriptor Error,上下文描述符错误。(当设置此位时,它表示描述符内容不正确。DMA在关闭上下文描述符时进行回写时设置这个位。)
Rsvd[22:20]:Reserved,保留。
IVLTV:Inner VLAN Tag Valid,内部VLAN标签有效。(当设置此位时,表示TDES2的IVT字段有效。)
VLTV:VLAN Tag Valid,VLAN标签有效。(当设置此位时,表示TDES3的VT字段有效)
VT:VLAN Tag,VLAN标签。(此字段包含要在数据包中插入或替换的VLAN标记。只有当MAC_VLAN_Incl寄存器的VLTI位被重置时,此字段才被用作VLAN标记。)

Receive Descriptor

DWC_ether_qos中的DMA只有在尾指针与基本指针或当前指针不同时,才会尝试读取描述符。建议有一个长度的描述符环,可以容纳MAC接收到的至少两个完整的数据包。否则,由于描述符不可用,DMA的性能会受到很大影响。在这种情况下,MTL中的RxFIFO变满并开始丢弃数据包。

现在提供了以下接收描述符:
Normal Descriptor
Context Descriptor

所有RX描述符均由软件准备,并作为“普通”描述符交给DMA,内容如接收正常描述符(读取格式)所示。DMA读取此描述符,在将接收到的包(或部分)传输到描述符指示的缓冲区后,RxDMA以相应的包状态关闭描述符。此状态的格式为“接收正常描述符(回写格式)”。

对于某些数据包,普通的描述符位不足以写入完整的状态。对于这样的数据包,RXDMA会将扩展状态写入下一个描述符(不需要处理或使用嵌入在该描述符中的缓冲区/指针)。描述符回写的格式和内容在“接收上下文描述符”中进行了描述。

Receive Normal Descriptor

接收普通描述符有两种格式:
读取格式(Read Format)
回写格式(Write-Back Format)

Receive Normal Descriptor(Read Format)

接收正常描述符的读取格式由头或缓冲区1地址、保留字段、有效负载或缓冲区2或下一个描述符地址、30位保留文件、OWN位和中断位组成。
TDES0
BUF1AP:标题或缓冲区1地址指针。(当信道的控制寄存器的SPH位复位时,这些位表示缓冲器1的物理地址。当设置SPH位时,这些位表示头缓冲区的物理地址,RxDMA写入接收包的L2/L3/L4头字节。应用程序可以为这个缓冲区编程一个字节对齐的地址,这意味着这个字段的LS位可以是非零的。但是,在传输数据包的开始时,DMA使用RDES01:0执行写操作。但是,数据包数据会根据缓冲区地址指针给出的实际偏移量进行偏移。如果地址指针指向存储数据包中间或最后一部分的缓冲区,DMA将忽略偏移地址,并写入数据宽度所指示的完整位置。)

TDES1
Reserved/BUF1AP:保留或缓冲区1地址指针。(在64位寻址模式下,该字段包含缓冲区1地址指针的最重要的32位。否则,将保留此字段。)

TDES2
BUF2AP:缓冲区2地址指针。(这些位表示缓冲区2的物理地址。当设置了DMA_CH#_Control寄存器的SPH位时,缓冲区地址指针必须是总线宽度对齐的,即RDES2[3:0、2:0或1:0]=0,对应于128、64或32总线宽度。lsb在内部被忽略。当重置DMA_CH#_Control寄存器的SPH位时,对RDES2的值没有限制。但是,RxDMA仅在传输数据包的起始字节时使用指针地址的LS位。如果BUF2AP给出了存储数据包的中间或最后一部分的缓冲区的地址,那么DMA将忽略BUF2AP[3:0或2:0或1:0](对应于128位或64位或32位的数据总线),并写入完整的位置。)

TDES3
OWN:归属位。
IOC:完成中断使能。(当设置此位时,DMA关闭此描述符时向应用程序发出中断)
Rsvd[29:26]:Reserved,保留。
BUF2V:缓冲区2地址有效。(当设置此位时,它向DMA表示RDES2中指定的缓冲区2地址有效。应用程序必须设置这个位,以便DMA能够使用RDES2中的缓冲区2地址所指向的地址来写入接收到的数据包数据。)
BUF1V:缓冲区1地址有效。(当设置时,这表明DMA在RDES1中指定的缓冲区1地址是有效的。如果RDES1中缓冲区1地址所指向的地址可以被DMA用来写入接收到的数据包数据,则应用程序必须设置此值)
Rsvd[23:16]:Reserved,保留。
BUF2AP:缓冲区2地址指针。(在64位寻址模式中,此字段包含缓冲区2地址指针的最重要的16位。否则,将保留此字段。)

Receive Normal Descriptor(Write-Back Format)

Receive Context Descriptor

此描述符对于该应用程序是只读的。只有DMA可以写入此描述符。上下文描述符提供与最后接收的包相关的扩展状态的信息。RDES3的第30位表示上下文类型描述符。
TDES0
RTSL:接收数据包时间戳低。(DMA用为相应的接收包捕获的最重要的32位时间戳更新此字段。当此字段和RDES1的RTSH字段显示所有的值时,必须认为时间戳已损坏。)

TDES1
RTSH:接收数据包时间戳高。(DMA用为相应的接收数据包捕获的最重要的32位时间戳来更新此字段。当此字段和RDES0的RTSL字段显示所有的值时,必须认为时间戳已损坏。)

TDES2
Reserved:保留。

TDES3
OWN:归属位。
CTXT:上下文类型。
DE:Descriptor Error,描述符错误。
Rsvd[28:0]:Reserved,保留。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值