关于driver_register中一段代码的疑问

gomogomono 2016-05-03 05:34:40
有这么段过程:
driver_register-》bus_add_driver-》driver_attach-》bus_for_each_dev-》__driver_attach
之后就是要调用probe
我的疑惑是在下面代码中:
static int __driver_attach(struct device *dev, void *data)
{
struct device_driver *drv = data;

if (!driver_match_device(drv, dev))  //匹配了之后,就直接返回了,不再执行下面的probe过程了???
return 0;

if (dev->parent) /* Needed for USB */
device_lock(dev->parent);
device_lock(dev);
if (!dev->driver)
driver_probe_device(drv, dev); //真正的probe在这里
device_unlock(dev);
if (dev->parent)
device_unlock(dev->parent);

return 0;
}


上面的注释是我的疑惑,匹配之后就不调用probe了,我的理解对吗,如果对的话,probe是在哪调用啊,我看了match过程,没有调用probe
...全文
201 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2016-05-11
  • 打赏
  • 举报
回复
有些函数前面的注释会对返回值做说明,剩下的只能看上下文了或函数定义了,不过大多数情况下是0==success的。
gomogomono 2016-05-11
  • 打赏
  • 举报
回复
引用 10 楼 nswcfd 的回复:
有些函数前面的注释会对返回值做说明,剩下的只能看上下文了或函数定义了,不过大多数情况下是0==success的。
哦,谢谢你的回答
gomogomono 2016-05-10
  • 打赏
  • 举报
回复
引用 8 楼 nswcfd 的回复:
是的,返回值理解翻了,match的值是bool语义,不是通常succes==0的语义。 static int pci_bus_match(struct device *dev, struct device_driver *drv) { struct pci_dev *pci_dev = to_pci_dev(dev); struct pci_driver *pci_drv = to_pci_driver(drv); const struct pci_device_id *found_id; found_id = pci_match_device(pci_drv, pci_dev); if (found_id) return 1; return 0; }
哦,那在linux内核代码中,怎么区分返回值是bool语义还是succes==0的语义 还是说根据上下文区分
nswcfd 2016-05-06
  • 打赏
  • 举报
回复
是的,返回值理解翻了,match的值是bool语义,不是通常succes==0的语义。 static int pci_bus_match(struct device *dev, struct device_driver *drv) { struct pci_dev *pci_dev = to_pci_dev(dev); struct pci_driver *pci_drv = to_pci_driver(drv); const struct pci_device_id *found_id; found_id = pci_match_device(pci_drv, pci_dev); if (found_id) return 1; return 0; }
Eliot_shao 2016-05-05
  • 打赏
  • 举报
回复
drv->bus->match(dev, drv)匹配成功,返回1
gomogomono 2016-05-05
  • 打赏
  • 举报
回复
引用 3 楼 seek_0380 的回复:
看了一下。 ------------- if (!driver_match_device(drv, dev))  //匹配了之后,就直接返回了,不再执行下面的probe过程了??? return 0; -------------- 这句,楼主可能理解错了。如果driver_match_device(drv, dev)不匹配才会返回 0.
我说下我的分析,你看看对不对: 1。driver_match_device(drv, dev)的代码中就一条:   return drv->bus->match ? drv->bus->match(dev, drv) : 1; 2。drv->bus->match为真,那么执行drv->bus->match(dev, drv) 3。drv->bus->match(dev, drv)匹配成功,返回0 4。那么driver_match_device(drv, dev)返回0 5。if (!driver_match_device(drv, dev)){return 0},返回0 6。整个分析下来,就是匹配成功返回0 上面的分析过程错了吗?请指点
gomogomono 2016-05-05
  • 打赏
  • 举报
回复
@nswcfd
gomogomono 2016-05-05
  • 打赏
  • 举报
回复
引用 6 楼 seek_0380 的回复:
drv->bus->match(dev, drv)匹配成功,返回1
一般函数正确返回值不是0啊
Eliot_shao 2016-05-04
  • 打赏
  • 举报
回复
看了一下。 ------------- if (!driver_match_device(drv, dev))  //匹配了之后,就直接返回了,不再执行下面的probe过程了??? return 0; -------------- 这句,楼主可能理解错了。如果driver_match_device(drv, dev)不匹配才会返回 0.
gomogomono 2016-05-04
  • 打赏
  • 举报
回复
引用 1 楼 seek_0380 的回复:
我印象中调的是BUS的probe和mach函数吧,根据bus的mach函数进行匹配,一般是匹配name的字段。然后调用bus的probe,再去引用drv->probe。 仅供参考。
你说的没错,就是driver_match_device实现的,但是我看了bus的match过程(我举spi bus来说明),下面是代码:
static inline int driver_match_device(struct device_driver *drv,
				      struct device *dev)
{
	return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}
static int spi_match_device(struct device *dev, struct device_driver *drv)
{
	const struct spi_device	*spi = to_spi_device(dev);
	const struct spi_driver	*sdrv = to_spi_driver(drv);

	/* Attempt an OF style match */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then try ACPI */
	if (acpi_driver_match_device(dev, drv))
		return 1;

	if (sdrv->id_table)
		return !!spi_match_id(sdrv->id_table, spi);

	return strcmp(spi->modalias, drv->name) == 0;
}
上面的匹配过程就是比较name,匹配成功则返回0,没有调用drv->probe,不知道哪里理解错了,请教
Eliot_shao 2016-05-03
  • 打赏
  • 举报
回复
我印象中调的是BUS的probe和mach函数吧,根据bus的mach函数进行匹配,一般是匹配name的字段。然后调用bus的probe,再去引用drv->probe。 仅供参考。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧