作者rz600000 (suedeN    )
看板LinuxDev
标题Re: [问题] 请问net device driver的小问题 烦请帮忙
时间Fri Jan 11 04:17:54 2008
我去看e1000这个网卡 中有说到
930 netdev->open = &e1000_open;
931 netdev->stop = &e1000_close;
932 netdev->hard_start_xmit = &e1000_xmit_frame;
933 netdev->get_stats = &e1000_get_stats;
934 netdev->set_multicast_list = &e1000_set_multi;
935 netdev->set_mac_address = &e1000_set_mac;
936 netdev->change_mtu = &e1000_change_mtu;
937 netdev->do_ioctl = &e1000_ioctl;
938 e1000_set_ethtool_ops(netdev);
939 netdev->tx_timeout = &e1000_tx_timeout;
940 netdev->watchdog_timeo = 5 * HZ;
941 #ifdef CONFIG_E1000_NAPI
_^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这里他有提到假若我 def NAPI 才去定义 dev的poll为 &e1000_clean;
942 netdev->poll = &e1000_clean;
943 netdev->weight = 64;
944 #endif
945 netdev->vlan_rx_register = e1000_vlan_rx_register;
946 netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;
947 netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;
但是 我看了一下 /net/core/dev.c里面的 code 他有提到
__netif_rx_schdule ->__raise_softing_irq -> net_rx_action
在net_rx_action 中会去找寻 这一装置的 poll function
即 net_rx_action -> dev->poll
但是我今天没有定义 要使用NAPI 所以在上面再做 e1000的初始化动作的时候
就不会去def netdev->poll = &e1000_clean
那到底kernel 怎麽知道我要call哪个 function
感恩
※ 引述《Spig (Spig)》之铭言:
: ※ 引述《rz600000 (suedeN    )》之铭言:
: 不好意思, 之前的回答是依照 linux 2.4 的经验...
: 刚刚才打开 2.6.16 的 kernel source 来看
: 在 rtl8139_interrupt() 里如果查到 interrupt source 有包含 RxAckBits
: 会去呼叫 __netif_rx_schedule()
: 然後上层会以 poll 的方式呼叫下来
: 详细的文件请参考 Documentation/networking/NAPI_HOWTO.txt
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.117.176.182
1F:→ mefuck:首先 你得厘清一件事情 传送封包是主动的 而接收是被动 01/11 16:56
2F:→ mefuck:所以 传送封包可以透过常见的hard_start_xmit来传送 01/11 16:58
3F:→ mefuck:但是 接收包封 乃是不预期的事情 通常有采用两种方式接收 01/11 16:59
4F:→ mefuck:一种是polling 一种是中断 01/11 17:00
5F:→ mefuck:我们是藉由中断去呼叫你的接收函式 01/11 17:02
6F:→ mefuck:kernel则是透过中断的方式 才知道要去呼叫接收封包的函式 01/11 17:04
7F:→ mefuck:也就是说 一般接收函式并没有注册的动作(不采用CALLBACK) 01/11 17:07
8F:→ mefuck:你要在你的中断处理函式内去呼叫接收函式 01/11 17:09
9F:→ mefuck:大致上是这样 不知道这样说你是否清楚 01/11 17:09
10F:→ rz600000:..我所说的是 自动收近来的封包 之後处理的function 01/11 23:55
11F:→ rz600000:是收进来到DMA後 ISR 中会呼叫到的处理封包function. 01/11 23:57