在Ubuntu 7.04版本中iwl3945驱动是正常的,可用的。在我升级到Ubuntu 8.04 alpha5之后,该驱动不可用了。尝试各种方法,查阅国外N多论坛网站,终于解决了此问题,特把解决过程记录于此,留给大家参考。
Ubuntu 7.04版本都支持了这个驱动,说明Ubuntu对这款无线网卡的支持还是做得到位的,一般来说也不能把它从后续版本中拿掉。所以,问题可能出在某些配置冲突方面,比如内核和驱动冲突,驱动之间依赖冲突,等等。
首先,检查内核和驱动的冲突,驱动是否装全了。
$ uname -r
2.6.24-11-generic
说明当前内核的版本号是2.6.24-11
$ dpkg -l |grep linux-Ubuntu-modules
pc linux-Ubuntu-modules-2.6.22-10-generic 2.6.22-10.25 Ubuntu supplied Linux modules for version 2.
pc linux-Ubuntu-modules-2.6.22-11-generic 2.6.22-11.28 Ubuntu supplied Linux modules for version 2.
pc linux-Ubuntu-modules-2.6.22-12-generic 2.6.22-12.32 Ubuntu supplied Linux modules for version 2.
rc linux-Ubuntu-modules-2.6.22-13-generic 2.6.22-13.34 Ubuntu supplied Linux modules for version 2.
pc linux-Ubuntu-modules-2.6.22-14-generic 2.6.22-14.38 Ubuntu supplied Linux modules for version 2.
ii linux-Ubuntu-modules-2.6.24-11-generic 2.6.24-11.15 Ubuntu supplied Linux modules for version 2.
rc linux-Ubuntu-modules-2.6.24-7-generic 2.6.24-7.12 Ubuntu supplied Linux modules for version 2.
ii linux-Ubuntu-modules-2.6.24-8-generic 2.6.24-8.13 Ubuntu supplied Linux modules for version 2.
上述列表中有2.6.24-11,说明对应的驱动版本是配套的。(注意,里面有一些module是以前装过现在删掉的,从新立得里面可以看得更仔细些。)
$ ls -l /lib/modules/`uname -r`/Ubuntu/wireless/iwlwifi/iwlwifi/compatible
总用量 316
-rw-r–r– 1 root root 145472 2008-03-02 00:36 iwl3945.ko
-rw-r–r– 1 root root 166744 2008-03-02 00:36 iwl4965.ko
$ ls -l /lib/modules/`uname -r`/Ubuntu/wireless/iwlwifi/mac80211/compatible/net/mac80211
总用量 360
-rw-r–r– 1 root root 349760 2008-03-02 00:36 iwlwifi_mac80211.ko
-rw-r–r– 1 root root 12192 2008-03-02 00:36 iwlwifi_rc80211_simple.ko
上面两个命令,说明驱动里面有iwl3945的驱动,以及运行这个驱动所需的mac80211子系统。注意看iwlwifi_mac80211.ko,这个驱动说明iwlwifi和mac80211的驱动是放在一起编译出来的。目前iwl3945有两种编译方式,一种是单独编译mac80211、 ieee80211、ipw3945(iwl3945)并放在一起用,另外一种就是iwlwifi_mac80211.ko这种从一开始就是放在一起编译的。这两种方法产生的驱动不能混着用,会有冲突,我遇到的问题就是这种冲突。
在我的机器上,如果执行modprobe iwl3945,会存在如下错误:
FATAL: Error inserting iwl3945 (/lib/modules/2.6.22-14-generic/Ubuntu/wireless/iwlwifi/iwlwifi/origin/iwl3945.ko): Unknown symbol in module, or unknown parameter (see dmesg)
dmesg:
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_rx_irqsafe
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_get_hdrlen
[ 112.528000] iwl3945: Unknown symbol iwlwifi_iwlwifi_ieee80211_tx_status_irqsafe
[ 112.528000] iwl3945: Unknown symbol iwlwifi_iwlwifi_ieee80211_stop_queues
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_tx_status
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_rate_control_unregister
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_stop_queue
[ 112.528000] iwl3945: Unknown symbol iwlwifi_sta_info_put
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_free_hw
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_beacon_get
[ 112.528000] iwl3945: Unknown symbol iwlwifi_sta_info_get
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_alloc_hw
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_scan_completed
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_register_hw
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_wake_queue
[ 112.528000] iwl3945: Unknown symbol iwlwifi_ieee80211_rate_control_register
[ 112.528000] iwl3945: Unknown symbol iwlwifi_iwlwifi_ieee80211_register_hwmode
[ 112.532000] iwl3945: Unknown symbol iwlwifi_ieee80211_unregister_hw
[ 112.532000] iwl3945: Unknown symbol iwlwifi_ieee80211_start_queues
如果把第一种方式编译的驱动卸载掉,并加载第二种方式的驱动,就解决了问题:
sudo modprobe -r ipw3945
sudo modprobe -r ieee80211
sudo modprobe -r ieee80211_crypt
sudo modprobe -r mac80211
sudo modprobe iwlwifi_mac80211
sudo modprobe iwl3945
成功。好了,试试看:
% ifconfig wlan0_rename up
% iwconfig wlan0_rename
可以看到:
wlan0_rename: unassociated ESSID:off/any
Mode:Managed Channel=0 Access Point: 00:00:00:00:00:00
Bit Rate=0 kb/s Tx-Power=20 dBm
RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
okey,驱动已经没问题了,按平常操作的方式配置无线网络即可。