2011-05-19 3 views
0

J'essaie de comprendre comment le modèle de périphérique/pilote Linux fonctionne et pour ce faire j'ai écrit un petit module. Ce module est simple, récupère un pointeur vers un struct net_device (appelons-le netdev) par la fonction dev_get_by_name(&init_net, "eth0"). Pourquoi la valeur de netdev->dev.bus est NULL? Ce pointeur doit-il représenter la structure bus_type sur laquelle mon périphérique est connecté? Le champ netdev->parent->bus n'est cependant pas NULL mais il devrait représenter le bus pour eth controller ... une explication?Pourquoi dev.bus est NULL dans mon appareil?

Répondre

3

C'est parce que votre périphérique eth, ou mieux son dispositif « objet » dans le noyau, est pas un bus, et donc sa valeur de bus reste non initialisée. Mais son périphérique parent est généralement sur un bus et il suffit que le périphérique parent connaisse le bus sur lequel il se trouve, car les deux périphériques sont éventuellement liés lors de l'initialisation du pilote.

Jetons un oeil à un exemple: voici ce que j'ai dans sysfs pour mon appareil eth0 (notez le champ de l'appareil):

$ ll /sys/class/net/eth0/ 
total 0 
-r--r--r-- 1 root root 4096 May 20 11:10 address 
-r--r--r-- 1 root root 4096 May 20 11:10 addr_len 
-r--r--r-- 1 root root 4096 May 20 11:10 broadcast 
-r--r--r-- 1 root root 4096 May 20 11:10 carrier 
lrwxrwxrwx 1 root root 0 May 20 11:10 device -> ../../../devices/pci0000:00/0000:00:19.0 
-r--r--r-- 1 root root 4096 May 20 11:10 dev_id 
-r--r--r-- 1 root root 4096 May 20 11:10 dormant 
-r--r--r-- 1 root root 4096 May 20 11:10 features 
-rw-r--r-- 1 root root 4096 May 20 11:10 flags 
-rw-r--r-- 1 root root 4096 May 20 11:10 ifalias 
-r--r--r-- 1 root root 4096 May 20 11:10 ifindex 
-r--r--r-- 1 root root 4096 May 20 11:10 iflink 
-r--r--r-- 1 root root 4096 May 20 11:10 link_mode 
-rw-r--r-- 1 root root 4096 May 20 11:10 mtu 
-r--r--r-- 1 root root 4096 May 20 11:10 operstate 
drwxr-xr-x 2 root root 0 May 20 11:10 power 
drwxr-xr-x 2 root root 0 May 20 11:10 statistics 
lrwxrwxrwx 1 root root 0 May 20 11:10 subsystem -> ../../net 
-rw-r--r-- 1 root root 4096 May 20 11:10 tx_queue_len 
-r--r--r-- 1 root root 4096 May 20 11:10 type 
-rw-r--r-- 1 root root 4096 May 20 11:10 uevent 

Le lien pour le périphérique est créé à partir de ce code du pilote fonction sonde, où netdev est le dispositif de réseau, et PDEV le dispositif PCI associé:

SET_NETDEV_DEV(netdev, &pdev->dev); 

qui selon la documentation est:

/* Set the sysfs physical device reference for the network logical device 
* if set prior to registration will cause a symlink during initialization. 
*/ 
#define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) 

Et voici ce que j'ai dans le dispositif PCI correspondant, qui a été fixé par SET_NETDEV_DEV (où vous pouvez remarquer le champ de bus):

$ ll /sys/devices/pci0000\:00/0000\:00\:19.0/ 
total 0 
-rw-r--r-- 1 root root 4096 May 20 11:54 broken_parity_status 
lrwxrwxrwx 1 root root  0 May 20 11:22 bus -> ../../../bus/pci 
-r--r--r-- 1 root root 4096 May 20 11:07 class 
-rw-r--r-- 1 root root 256 May 20 11:22 config 
-r--r--r-- 1 root root 4096 May 20 11:54 device 
lrwxrwxrwx 1 root root  0 May 20 11:22 driver -> ../../../bus/pci/drivers/e1000e 
-rw------- 1 root root 4096 May 20 11:22 enable 
-r--r--r-- 1 root root 4096 May 20 11:07 irq 
-r--r--r-- 1 root root 4096 May 20 11:54 local_cpulist 
-r--r--r-- 1 root root 4096 May 20 11:07 local_cpus 
-r--r--r-- 1 root root 4096 May 20 11:22 modalias 
-rw-r--r-- 1 root root 4096 May 20 11:22 msi_bus 
lrwxrwxrwx 1 root root  0 May 20 11:22 net:eth0 -> ../../../class/net/eth0 
drwxr-xr-x 2 root root  0 May 20 11:11 power 
-r--r--r-- 1 root root 4096 May 20 11:22 resource 
-rw------- 1 root root 131072 May 20 11:22 resource0 
-rw------- 1 root root 4096 May 20 11:22 resource1 
-rw------- 1 root root  32 May 20 11:22 resource2 
lrwxrwxrwx 1 root root  0 May 20 11:22 subsystem -> ../../../bus/pci 
-r--r--r-- 1 root root 4096 May 20 11:22 subsystem_device 
-r--r--r-- 1 root root 4096 May 20 11:22 subsystem_vendor 
-rw-r--r-- 1 root root 4096 May 20 11:22 uevent 
-r--r--r-- 1 root root 4096 May 20 11:22 vendor 

J'espère que cela clarifie la situtation.

+0

Merci Longfield la réponse Mon système est en cours d'exécution sur une carte basée sur un processeur MPC8306 et regarder/sys/class/net/eth0 j'ai le lien suivant pour le dispositif: 'appareil -> ../ .. /../ devices/e0100000.qe/e0102000.ethernet' et en regardant '/ sys/devices/e0100000.qe' et'/sys/devices/e0100000/e0102000.ethernet' j'ai trouvé que ceux-ci partagent le bus '/ sys /bus/of_platform'... Je dois utiliser le même bus sur lequel eth0 est en particulier un bus mii/mdio. Depuis le bus est vu comment firmware ouvert dois-je utiliser of_mii et of_mdio interface? Un petit exemple serait très utile! Merci beaucoup! – MirkoBanchi

Questions connexes