DM9000驱动理解二(挂起和恢复)

本文详细介绍了DM9000设备的挂起与恢复过程,包括设备状态检测、挂起与恢复函数实现及关键步骤解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//pratform设备挂起函数
static int dm9000_drv_suspend(struct device *dev)
{
	//最终是用到宏container_of,让pdev,指向结构体dev里某个内存空间
	struct platform_device *pdev = to_platform_device(dev);
	//platform_get_drvdata最终调用dev_get_drvdata,是platform_set_drvdata的反过程
	struct net_device *ndev = platform_get_drvdata(pdev);
	board_info_t *db;

	if (ndev) {
		//让结构体指针指向结构体ndev内的的某个xx(xx还没搞懂是哪个变量或者结构体)
		//这个结构体在probe函数中被设置了。
		db = netdev_priv(ndev);
		db->in_suspend = 1;

		//检测网口是否被打开,主要是检测struct net_device中的state 
		if (!netif_running(ndev))
			return 0;
		//挂起设备,主要调用函数netif_tx_stop_all_queues,停止该设备所有工作队列
		netif_device_detach(ndev);

		/* only shutdown if not using WoL */
		if (!db->wake_state)
			dm9000_shutdown(ndev);
	}
	return 0;
}
//pratform设备恢复函数
static int dm9000_drv_resume(struct device *dev)
{
	//由此可看出这个几个结构体"包含"关系,struct device里"包含"struct platform_device
	//struct platform_device里面"包含"struct net_device,struct net_device里面包含board_info_t
	struct platform_device *pdev = to_platform_device(dev);
	struct net_device *ndev = platform_get_drvdata(pdev);
	board_info_t *db = netdev_priv(ndev);

	if (ndev) {
		if (netif_running(ndev)) {
			/* reset if we were not in wake mode to ensure if
			 * the device was powered off it is in a known state */
			if (!db->wake_state) {
				dm9000_reset(db);
				dm9000_init_dm9000(ndev);
			}
			//恢复设备,是netif_device_detach(ndev)的反操作,主要是恢复该设备的
			//所有工作队列。
			netif_device_attach(ndev);
		}

		db->in_suspend = 0;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值