82599网卡驱动rx descriptor结构体分析

82599 datasheet: 7.1.6  节    大概位于314页
对驱动的理解关键是对数据结构的理解。
The 82599 posts receive packets into data buffers in system memory.
The following controls are provided for the data buffers:
• The SRRCTL[n].BSIZEPACKET field defines the data buffer size. See section
Section 7.1.2for packet filtering by size.
• The SRRCTL.BSIZEHEADER field defines the size of the buffers allocated to headers
(advanced descriptors only).
Each queue is provided with a separate SRRCTL register.
Receive memory buffer addresses are word (2x byte) aligned (both data and headers).

每个queue都有单独的SRRCTL寄存器
n表示的是queue id
rx packet或者header buffer的内存地址必须两字节对齐,这样的话可以保证地址的最低位(LSB)为0.

结构体的声明如下:

/* Receive Descriptor - Advanced */
union  ixgbe_adv_rx_desc {
                  struct  {
                                __le64 pkt_addr;  /* Packet buffer address */
                                __le64 hdr_addr;  /* Header buffer address */
                } read;
                  struct  {
                                  struct  {
                                                  union  {
                                                                __le32 data;
                                                                  struct  {
                                                                                __le16 pkt_info;  /* RSS, Pkt type */
                                                                                __le16 hdr_info;  /* Splithdr, hdrlen */
                                                                } hs_rss;
                                                } lo_dword;
                                                  union  {
                                                                __le32 rss;  /* RSS Hash */
                                                                  struct  {
                                                                                __le16 ip_id;  /* IP id */
                                                                                __le16 csum;  /* Packet Checksum */
                                                                } csum_ip;
                                                } hi_dword;
                                } lower;
                                  struct  {
                                                __le32 status_error;  /* ext status/error */
                                                __le16 length;  /* Packet length */
                                                __le16 vlan;  /* VLAN tag */
                                } upper;
                } wb;   /* writeback */
};

根据datasheet来看这个union结构体,这个union包括两个struct,一个是
struct  {
                                __le64 pkt_addr;  /* Packet buffer address */
                                __le64 hdr_addr;  /* Header buffer address */
                } read;

这个struct对应的datasheet中的table 7-15:

      63                                                                                                                                1     0
 0                            Packet Buffer Address [63:1]    A0
 8                          Header Buffer Address [63:1]    DD

这个数据结构是在驱动中修改的。就两个64bit地址。这两个地址都是物理地址,当一个数据包接收完成时,驱动就将对应的存放当前数据包的dma ring buffer的物理地址写到这个数据结构中。
header buffer的物理地址的最低位被用来表示当前的buffer是否可用。
DD的意思是Descriptor Done。
驱动每次要接收数据包的时候就检查这个DD是不是1,如果是1, 那么这个描述符对应的packet buffer中就有一个新来的数据包,然后就取出来数据包,取完之后就设置为0,这样硬件下次就可以继续使用。如果检查发现DD为0,驱动会认为当前packet fifo为空,没有新的数据包了。直接就会返回。
网卡每次来了新的数据包,就检查当前这个buffer的DD位是否为0,如果为0那么表示当前buffer可以使用,就让DMA将数据包copy到这个buffer中,设置DD为1,这样驱动就可以根据DD 1读取这个新来的数据包了。如果硬件检查为1,那么硬件就认为fifo满了,可能直接就将这个包给丢弃掉了。
典型的生产者---消费者模型。

在驱动代码中并没有发现单独的代码来设置DD为0。这是因为结构体中的这两个物理地址必须2字节对齐,也就是说最低位一定是0.所以直接通过下面的地址写回就可以置0了,不需要再单独的设置一下。
rxdp->read.hdr_addr = dma_addr;
rxdp->read.pkt_addr = dma_addr;

下面接着分析union中的另一个结构体:抓狂


完整修订整理版请前往个人blog阅读:82599 advanced receive descriptor 详解

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值