现象:
use libertas_sdio driver (2.6.24.2)
cd /sys/class/net/eth3/
/sys/devices/platform/s3c-hsmmc1.1/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/eth3
but use official driver marvell8686
eth0 is in
/sys/device/virtual/net/eth0
caused HAL can't know it is a real WLAN !
did official driver miss some issue ?
i obtain official marvell8686 driver from
http://zenvoid.org/software/qi-smartq/linux-kernel-src-2.6.24.7-smartq.tar.lzma
following use libertas_sdio driver is ok,can make HAL know it is a real
WLAN!
udi = '/org/freedesktop/Hal/devices/net_00_1a_6b_a3_0f_7a'
info.capabilities = {'net', 'net.80211'} (string list)
info.category = 'net.80211' (string)
info.parent =
'/org/freedesktop/Hal/devices/platform_s3c_hsmmc1_1_mmc_card_rca1_sdio1'
(string)
info.product = 'WLAN Interface' (string)
info.subsystem = 'net' (string)
info.udi = '/org/freedesktop/Hal/devices/net_00_1a_6b_a3_0f_7a'
(string)
linux.hotplug_type = 2 (0x2) (int)
linux.subsystem = 'net' (string)
linux.sysfs_path =
'/sys/devices/platform/s3c-hsmmc1.1/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/eth3' (st)
net.80211.mac_address = 113474998138 (0x1a6ba30f7a) (uint64)
net.address = '00:1a:6b:a3:0f:7a' (string)
net.arp_proto_hw_id = 1 (0x1) (int)
net.interface = 'eth3' (string)
net.linux.ifindex = 2 (0x2) (int)
net.originating_device =
'/org/freedesktop/Hal/devices/platform_s3c_hsmmc1_1_mmc_card_rca1_sdio1'
(strin)
use officai marvell8686 driver is
udi = '/org/freedesktop/Hal/devices/net_00_1a_6b_a3_0f_7a'
info.capabilities = {'net', 'net.80211'} (string list)
info.category = 'net.80211' (string)
info.subsystem = 'net' (string)
info.udi = '/org/freedesktop/Hal/devices/net_00_1a_6b_a3_0f_7a'
(string)
linux.subsystem = 'net' (string)
linux.sysfs_path = '/sys/devices/virtual/net/eth0' (string)
=======>virtual one
net.80211.mac_address = 113474998138 (0x1a6ba30f7a) (uint64)
net.address = '00:1a:6b:a3:0f:7a' (string)
net.arp_proto_hw_id = 1 (0x1) (int)
net.interface = 'eth0' (string)
net.linux.ifindex = 2 (0x2) (int)
net.originating_device = '/org/freedesktop/Hal/devices/computer'
(string)
解决方法:添加WIFI驱动hotplug,当总线检测代id相macth的设备或者驱动时调用,wlan_probe
->wlan_probe
->wlan_add_card
->sbi_register_dev
->priv->hotplug_device = &func->dev;这样priv->hotplug_device就指向了/sys/bus/sdio/devices下的设备节点描述结构体
而原版的驱动如果KERNEL没有选择CONFIG_SYSFS_DUPLICATE ,设备指向/sys/device/virtual,对于内核而言,这是一个虚拟设备,尽管网络协议层已经知道它是一个WLAN设备,但是KERNEL却不认识,就认为它是一个虚拟的网卡设备,导致HAL硬件抽像层获取WLAN的消息不对,使得网络管理器不工作。
代码修改:添加驱动向KERNEL的hotplug相关代码。
修改后的数据:
udi = '/org/freedesktop/Hal/devices/net_00_1a_6b_a3_0f_7a'
info.capabilities = {'net', 'net.80211'} (string list)
info.category = 'net.80211' (string)
info.subsystem = 'net' (string)
info.udi = '/org/freedesktop/Hal/devices/net_00_1a_6b_a3_0f_7a' (string)
linux.subsystem = 'net' (string)
linux.sysfs_path = '/sys/devices/platform/s3c-hsmmc1.1/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/eth3' (st)
net.80211.mac_address = 113474998138 (0x1a6ba30f7a) (uint64)
net.address = '00:1a:6b:a3:0f:7a' (string)
net.arp_proto_hw_id = 1 (0x1) (int)
net.interface = 'eth3' (string)
net.linux.ifindex = 4 (0x4) (int)
net.originating_device = '/org/freedesktop/Hal/devices/platform_s3c_hsmmc1_1_mmc_host_mmc_card_rca1_sdio1)
!
昨天下午工作效率太低,晚上上网查了一些资料,今天早上解决。