//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;
}
DM9000驱动理解二(挂起和恢复)
最新推荐文章于 2022-05-29 15:14:28 发布