dm9000 初始化函数调用流程及堆栈

函数实现
static const struct net_device_ops dm9000_netdev_ops = {                             
    .ndo_init      	 	= dm9000_init,                                                   
    .ndo_open       	= dm9000_open,                                                   
    .ndo_stop       	= dm9000_stop,                                                   
    .ndo_start_xmit     = dm9000_start_xmit,
}
register_netdev 之后的 函数调用顺序
-----------------------------------STEP1

dm9000_init  // dm9000_probe->register_netdev->register_netdevice->dm9000_init

-----------------------------------STEP2

dm9000_open	 // ip_auto_config->dev_change_flags->__dev_change_flags->__dev_open->dm9000_open
dm9000_poll_work // dm9000_open->schedule_delayed_work(&db->phy_poll, 1);
				 // process_one_work -> dm9000_poll_work

dm9000_interrupt // 是由dm9000_open 开了中断后引起的
dm9000_poll_work

-----------------------------------STEP3

dm9000_start_xmit // process_one_work -> xs_tcp_setup_socket-> ... -> dev_hard_start_xmit -> dm9000_start_xmit 
				  // Workqueue: xprtiod xs_tcp_setup_socket
				  // 参考 为什么网卡注册了之后 会一直不断 xmit
...
dm9000_start_xmit
...
dm9000_start_xmit
为什么网卡注册了之后 会一直不断 xmit
因为会有很多工作工作队列和工作任务做 xmit
Workqueue: events xprt_destroy_cb
Workqueue: rpciod rpc_async_schedule
Workqueue: xprtiod xs_tcp_setup_socket
-------------------------------------------------
下面以 xs_tcp_setup_socket 为例,介绍一下流程
xs_tcp_setup_socket
  • init
fs_initcall(init_sunrpc);
init_sunrpc
	init_socket_xprt
		xprt_register_transport(&xs_tcp_transport);
			xs_setup_tcp
				INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_setup_socket);
  • 运行时 发起侧
	rpc_async_schedule
		__rpc_execute
			call_connect
				xprt_connect
					xs_connect
						queue_delayed_work(xprtiod_workqueue, &transport->connect_worker, delay);
  • 运行时 被动侧
Workqueue: xprtiod xs_tcp_setup_socket

ret_from_fork->kthread->worker_thread
worker_thread
	xs_tcp_setup_socket
		kernel_connect
			inet_stream_connect
				__inet_stream_connect
					tcp_v4_connect
						tcp_connect
							ip_queue_xmit4
								__ip_queue_xmit
									ip_local_out
										ip_output
											__ip_finish_output
												ip_finish_output2
													neigh_resolve_output
														__neigh_event_send
															neigh_probe
																arp_solicit
																	arp_send_dst.part.1
																		dev_queue_xmit
																			__dev_queue_xmit
																				__qdisc_run
																					sch_direct_xmit
																						dev_hard_start_xmit
																							dm9000_start_xmit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值