免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: skyprince
打印 上一主题 下一主题

请教:网卡驱动报文发送理解,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-10 11:52 |显示全部楼层 |倒序浏览
查看tg3驱动源码,对报文发送部分不太理解。
1、pci_map_single这个函数是要实现什么功能?把要发送的报文数据DMA到网卡设备上吗?
2、tg3_set_txd函数又实现了什么功能呢?

谢谢。

static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
……
mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);

        tp->tx_buffers[entry].skb = skb;
        pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);

        tg3_set_txd(tp, entry, mapping, len, base_flags,
                    (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));

        entry = NEXT_TX(entry);
……
}

论坛徽章:
0
2 [报告]
发表于 2009-08-10 16:07 |显示全部楼层
非常感谢eexplorer  的解答。

是不是可以这样理解 pci_map_single 只是执行了地址映射,还没有执行实际的 memory copy操作。
到了tg3_set_txd函数时,才触发memory copy操作?

那启动DMA操作的主体是网卡还是驱动呢?是网卡实现将数据从 physical memory -> device。还是由驱动来完成?

论坛徽章:
0
3 [报告]
发表于 2009-08-21 16:30 |显示全部楼层

新的疑问:报文发送流程

看Linux设备驱动程序时,提到内核传输数据包是调用驱动程序hard_start_transmit函数执行发送操作。
tg3_start_xmit函数就是tg3驱动的hard_start_transmit函数。驱动中还有一个tg3_tx函数。

我在这两个函数中通过printk打印提示信息。加载驱动后,在命令行执行ping操作。
printk("===start tg3_tx==\n")
printk("===start tg3_start_xmit===\n")

然后执行dmesg查看系统信息,发现只打印了“===start tg3_tx==”信息。

很迷惑:ping执行了发包操作,那应该调用驱动中的发包函数。怎么记录的是它进入的是 tg3_tx函数,而没有进入tg3_start_xmit函数呢?
或者说tg3_start_xmit函数和tg3_tx函数分别实现什么功能?数据发送时调用的是哪个函数?

谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP