ノートPC内蔵の無線LAN(2915ABG)を使う

[サーバの実験室 Redhat/Fedora]

作成 : 2005/04/09 追記 : 2005/04/16

"サーバの実験室"の検索


ノートPC内蔵の無線LAN(2915ABG)を使う

Fedora Core 3をインストールしたノートPC(Panasonic CF-R3)で、内蔵の無線LANを使用できるようにする。

ノートPC内蔵の無線LANとドライバ

最初に、lspciでデバイスの種類を確認しておく。 Intel PRO/Wireless 2915ABGであることがわかる。

# lspci
00:00.0 Host bridge: Intel Corp. 82852/82855 GM/GME/PM/GMV Processor to I/O Controller (rev 02)
00:00.1 System peripheral: Intel Corp. 82852/82855 GM/GME/PM/GMV Processor to I/O Controller (rev 02)
00:00.3 System peripheral: Intel Corp. 82852/82855 GM/GME/PM/GMV Processor to I/O Controller (rev 02)
00:01.0 PCI bridge: Intel Corp. 82852/82855 GM/GME/PM/GMV Processor to AGP Controller (rev 02)
00:02.0 VGA compatible controller: Intel Corp. 82852/855GM Integrated Graphics Device (rev 02)
00:02.1 Display controller: Intel Corp. 82852/855GM Integrated Graphics Device (rev 02)
00:1d.0 USB Controller: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 03)
00:1d.7 USB Controller: Intel Corp. 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 03)
00:1e.0 PCI bridge: Intel Corp. 82801 Mobile PCI Bridge (rev 83)
00:1f.0 ISA bridge: Intel Corp. 82801DBM (ICH4-M) LPC Interface Bridge (rev 03)
00:1f.1 IDE interface: Intel Corp. 82801DBM (ICH4-M) IDE Controller (rev 03)
00:1f.3 SMBus: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 03)
00:1f.5 Multimedia audio controller: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 03)
00:1f.6 Modem: Intel Corp. 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (rev 03)
02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
02:04.0 Network controller: Intel Corp. PRO/Wireless 2915ABG MiniPCI Adapter (rev 05)02:05.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev 88)
02:05.1 System peripheral: Ricoh Co Ltd: Unknown device 0575

Intelのダウンロードサイトから、PRO/Wireless 2915ABGのLinux用ドライバipw2200_linux_1_0_0.tgzをダウンロードする。 このアーカイブには、ドライバとファームウェアが含まれている。

READMEを読むと、このドライバを使うためにはカーネルが 2.6.8 以降であり、Wireless Tools(v27-pre23)がインストールされていなくてはならないらしい。 カーネルのバージョンを確認する。 Fedora Core 3なら大丈夫。

# uname -r
2.6.9-1.667

Wireless Toolsがインストールされているか確認する。 ついでにバージョンも確認する。 Fedora Core 3をインストールするときに最小構成を選択しても、Wireless Toolsはインストールされるようだ。

# rpm -qa | grep wireless
sireless-tools-27-0.pre25.2

# iwconfig --version
iwconfig  Wireless-Tools version 27
          Compatible with Wireless Extension v11 to v17.

Kernel    Currently compiled with Wireless Extension v16.

ドライバとファームウェアのインストール

ダウンロードしたipw2200_linux_1_0_0.tgzを適当なディレクトリに置いて、展開する。

# tar -zxvf ipw2200_linux_1_0_0.tgz
    intel_ipw2200ディレクトリに展開される

# cd intel_ipw2200/

# ls
INSTALL            ipw2200-fw-2.2.tgz                     README.ipw2200
ipw2200-1.0.0.tgz  ipw2200_Install_and_Support_Notes.txt

ドライバのアーカイブファイルipw2200-1.0.0.tgz を展開して、インストールする。 /lib/modules/2.6.9-1.667/kernel/drivers/net/wirelessディレクトリにカーネルモジュールがインストールされる。

# tar -zxvf ipw2200-1.0.0.tgz
    ipw2200-1.0.0ディレクトリに展開される

# cd ipw2200-1.0.0

# make
make -C /lib/modules/2.6.9-1.667/build SUBDIRS=/root/intel_ipw2200/ipw2200-1.0.0 MODVERDIR=/root/intel_ipw2200/ipw2200-1.0.0 modules
make[1]: Entering directory `/lib/modules/2.6.9-1.667/build'
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ipw2200.o
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_module.o
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_tx.o
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_rx.o
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_wx.o
  LD [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211.o
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_crypt.o
  CC [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_crypt_wep.o
  Building modules, stage 2.
  MODPOST
Warning: could not find versions for .tmp_versions/ipw2200.mod
  CC      /root/intel_ipw2200/ipw2200-1.0.0/ieee80211.mod.o
  LD [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211.ko
  CC      /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_crypt.mod.o
  LD [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_crypt.ko
  CC      /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_crypt_wep.mod.o
  LD [M]  /root/intel_ipw2200/ipw2200-1.0.0/ieee80211_crypt_wep.ko
  CC      /root/intel_ipw2200/ipw2200-1.0.0/ipw2200.mod.o
  LD [M]  /root/intel_ipw2200/ipw2200-1.0.0/ipw2200.ko
make[1]: Leaving directory `/lib/modules/2.6.9-1.667/build'

# make install
make -C /lib/modules/2.6.9-1.667/build SUBDIRS=/root/intel_ipw2200/ipw2200-1.0.0 MODVERDIR=/root/intel_ipw2200/ipw2200-1.0.0 modules
make[1]: Entering directory `/lib/modules/2.6.9-1.667/build'
  Building modules, stage 2.
  MODPOST
Warning: could not find versions for .tmp_versions/ipw2200.mod
make[1]: Leaving directory `/lib/modules/2.6.9-1.667/build'
install -d /lib/modules/2.6.9-1.667/kernel/drivers/net/wireless/
install -m 644 -c ipw2200.ko ieee80211.ko ieee80211_crypt.ko ieee80211_crypt_wep.ko /lib/modules/2.6.9-1.667/kernel/drivers/net/wireless/
/sbin/depmod -a
Don't forget to copy firmware to /usr/lib/hotplug/firmware/ and have the hotplug tools in place.
See INSTALL for more information.

ファームウェアのアーカイブファイルipw2200-fw-2.2.tgz を展開する。 同じディレクトリに*.fwファイルが作成される。

# cd ..

# tar -zxvf ipw2200-fw-2.2.tgz
LICENSE
ipw-2.2-boot.fw
ipw-2.2-bss.fw
ipw-2.2-bss_ucode.fw
ipw-2.2-ibss.fw
ipw-2.2-ibss_ucode.fw

ファームウェアファイルを置く場所は、/etc/hotplug/firmware.agentファイルに記述されている。

# /etc/hotplug/firmware.agent
....
FIRMWARE_DIR=/lib/firmware
....

*.fwファイルを/lib/firmwareディレクトリにコピーする。

# cd *.fw /lib/firmware

モジュールのロード

ドライバのインストールとファームウェアのコピーが終わったら、モジュールをロードしてみる。

# modprobe ipw2200

# lsmod | grep ipw2200
ipw2200                68108  0
ieee80211              20996  1 ipw2200

iwconfigを実行すると、eth1として認識されていることがわかる。 (eth0はLANカード) ESSIDなどを設定していないので、まだワイヤレス通信はできない。

# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

eth1      unassociated  ESSID:off/any
          Mode:Managed  Channel=0  Access Point: 00:00:00:00:00:00
          Bit Rate=0kb/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

sit0      no wireless extensions.

通信の設定(ifcfg-eth1)

ESSIDやWEP KEYなどの設定は、/etc/sysconfig/network-scriptsディレクトリのifcfg-eth1ファイルに記述する。 おそらくifcfg-eth1ファイルは存在しないので、ifcfg-eth0ファイルをコピーするとよい。

# /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=dhcp     # DHCPからIPアドレス等を取得
ONBOOT=no          # 起動時にインタフェースを無効にする(有効にするならONBOOT=yes)
ESSID=(ESSID)      # ESSIDを指定
KEY=s:(WEP KEY)    # WEP KEYを文字列で指定(16進で指定するならKEY=xxxxxxらしい)

参考 GUI設定ツール(GNOMEのsystem-config-network)を使って設定すると、ifcfg-eth1ファイルとkeys-eth1ファイルが作成される。 keys-eth1にはWEP KEY("KEY=s:(WEP KEY)")が記述され、rootユーザしか読み取れないようになっている。

# system-config-networkによるifcfg-eth1
# Please read /usr/share/doc/initscripts-*/sysconfig.txt
# for the documentation of these parameters.
IPV6INIT=no
ONBOOT=no
USERCTL=no     # すべてのユーザにインタフェースのUP/DOWNを許可するときは'yes'
PEERDNS=yes
GATEWAY=
TYPE=Wireless
DEVICE=eth1
HWADDR=(MAC ADDRESS)
BOOTPROTO=dhcp
NETMASK=
DHCP_HOSTNAME=
IPADDR=
DOMAIN=
ESSID=(ESSID)
MODE=Managed
RATE='54 Mb/s'
CHANNEL=1
# system-config-networkによるkeys-eth1
KEY=s:(WEP KEY)

インタフェースの有効化

無線インタフェースを有効化してみる。

# ifup eth1

Determining IP information for eth1... done.

iwconfigifconfigで確認。 IPアドレスが取得できていればOK。

# iwconfig

lo        no wireless extensions.

eth0      no wireless extensions.

eth1      IEEE 802.11g  ESSID:"xxxxxxxxxxxx"  Nickname:"xxxxxx"
          Mode:Managed  Frequency:2.422GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate=54Mb/s   Tx-Power=20 dBm
          RTS thr:off   Fragment thr:off
          Encryption key:xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xx   Security mode:open
          Power Management:off
          Link Quality=45/100  Signal level=-69 dBm  Noise level=-88 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:3   Missed beacon:0

sit0      no wireless extensions.

# ifconfig -a

eth1      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:xxx.xxx.xxx.xxx  Bcast:xxx.xxx.xxx.xxx  Mask:xxx.xxx.xxx.xxx
          inet6 addr: xxxx:xxxx:xxxx:xxxx:xxxx/xx Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12 errors:0 dropped:19 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1770 (1.7 KiB)  TX bytes:912 (912.0 b)
          Interrupt:7 Base address:0xe000 Memory:e0200000-e0200fff

ちなみに、iwlistで周辺にあるAPを探すことができる。

# iwlist eth1 scan

eth1      Scan completed :
          Cell 01 - Address: xx:xx:xx:xx:xx:xx
                    ESSID:"<den>"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Channel:3
                    Encryption key:on
                    Bit Rate:54Mb/s
                    Extra: Rates (Mb/s): 1 2 5.5 6 9 11 12 18 24 36 48 54
                    Signal level=-62 dBm
                    Extra: Last beacon: 5ms ago

カーネルを2.6.10-1.770_FC3にバージョンアップすると...

カーネルを2.6.10-1.770_FC3にバージョンアップしたところ、無線インタフェースを有効化できなくなった。 lsmodで確認すると、モジュールは読み込まれている。

# ifup eth1
ipw2200 device eth1 does not seem to be present, delaying initialization.

# lsmod | grep ipw2200
ipw2200                68108  0
ieee80211              20996  1 ipw2200

/var/log/dmesgファイルを見てみると、次のようなメッセージが残っていた。 ipw2200_boot.fwファイルがロードできないらしい。

# more /var/log/dmesg
....
ipw2200: Detected Intel PRO/Wireless 2915ABG Network Connection
divert: allocating divert_blk for eth1
ipw2200: ipw2200_boot.fw load failed
ipw2200: Unable to load firmware: 0xFFFFFFFE
divert: freeing divert_blk for eth1
ipw2200: failed to register network device
ipw2200: probe of 0000:02:04.0 failed with error -5
....

/lib/modules/2.6.9-1.667/kernel/drivers/net/wirelessディレクトリにインストールしたipw2200のドライバは、カーネルを2.6.10-1.770_FC3にバージョンアップするとなくなってしまう。 そのかわり、kernel-2.6.10-1.770_FC3RPMパッケージにはipw2200用のカーネルモジュールが含まれている。

# ls /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee82011
ieee80211_crypt_ccmp.ko  ieee80211_crypt_tkip.ko  ieee80211.ko
ieee80211_crypt.ko       ieee80211_crypt_wep.ko

# ls /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ipw2200
ipw2200.ko

# rpm -qf /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ipw2200/ipw2200.ko
kernel-2.6.10-1.770_FC3

ファームウェアファイルは、/lib/firmwareディレクトリにそのまま残っている。 しかし、ファイルの名前がログに記録されたものと異なっている。

# ls /lib/firmware
BCM2033-FW.bin  BCM-LEGAL.txt    ipw-2.2-bss.fw        ipw-2.2-ibss.fw
BCM2033-MD.hex  ipw-2.2-boot.fw  ipw-2.2-bss_ucode.fw  ipw-2.2-ibss_ucode.fw

ファームウェアファイルの名前を変更してみる

/lib/firmwareディレクトリには、ipw2200_boot.fwという名前のファイルはない。 単純にリネームして解決するか、試してみる。

必要なファームウェアファイルは、ipw2200_boot.fwipw2200_ucode.fwipw2200_bss.fwipw2200_ibss.fwの4つらしい。 しかし、ipw2200_ucode.fwに対応しそうなファイルは、ipw-2.2-bss_ucode.fwipw-2.2-ibss_ucode.fwのふたつが存在する。 まず、ipw-2.2-bss_ucode.fwipw2200_ucode.fwにリネームしてみる。

# ls /lib/firmware
BCM2033-FW.bin  BCM-LEGAL.txt    ipw-2.2-bss.fw        ipw-2.2-ibss.fw
BCM2033-MD.hex  ipw-2.2-boot.fw  ipw-2.2-bss_ucode.fw  ipw-2.2-ibss_ucode.fw

# cp ipw-2.2-boot.fw ipw2200_boot.fw
# cp ipw-2.2-bss_ucode.fw ipw2200_ucode.fw
# cp ipw-2.2-bss.fw ipw2200_bss.fw
# cp ipw-2.2-ibss.fw ipw2200_bss.fw

一度モジュールをアンロードし、再度読み込んでみると、コンソールとログにエラーを出し続けてしまう。 無線インタフェースを有効化すると、ちゃんと通信はできるのだが。

# rmmod ipw2200

# rmmod ieee80211

# modprobe ipw2200
ipw2200: Unknown notification: subtype=25,flags=0xa0,size=4
ipw2200: Unknown notification: subtype=25,flags=0xa0,size=4
ipw2200: Unknown notification: subtype=25,flags=0xa0,size=4
....

# ifup eth1

Determining IP information for eth1... done.

次に、ipw-2.2-ibss_ucode.fwipw2200_ucode.fwにリネームしてみる。

# cp ipw-2.2-boot.fw ipw2200_boot.fw
# cp ipw-2.2-ibss_ucode.fw ipw2200_ucode.fw
# cp ipw-2.2-bss.fw ipw2200_bss.fw
# cp ipw-2.2-ibss.fw ipw2200_bss.fw

一度モジュールをアンロードし、再度読み込むと、今度はエラーが出ない。 しかし、無線インタフェースを有効化すると、DHCPサーバからIPアドレスが取得できない。

# rmmod ipw2200

# rmmod ieee80211

# modprobe ipw2200

# ifup eth1

Determining IP information for eth1...PING X.X.X.X (X.X.X.X) from X.X.X.X eth1: 56(84) bytes of data.

--- X.X.X.X ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2999ms
, pipe 4
 failed.

ifcfg-eth1ファイルでIPアドレスをスタティックに指定すると、ちゃんと通信できる。 うーん、いまいち...

ドライバとファームウェアファイルを再度インストールしてみる

ドライバとファームウェアを再度インストールしてみる。 やりかたは、Fedora Core 3 インストール直後 kernel-2.6.9-1.667 編と同じ。 モジュールをアンロードして、再度ロードしようとすると、また違うエラー。

# rmmod ipw2200

# rmmod ieee80211

# modprobe ipw2200
WARNING: Error inserting ieee80211 (/lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211/ieee80211.ko): Unknown symbol in module, or unknown parameter (see dmesg)
ieee80211: disagrees about version of symbol ieee80211_crypt_deinit_entries
ieee80211: Unknown symbol ieee80211_crypt_deinit_entries
ieee80211: disagrees about version of symbol ieee80211_crypt_delayed_deinit
ieee80211: Unknown symbol ieee80211_crypt_delayed_deinit
ipw2200: Unknown symbol ieee80211_wx_set_encode
ipw2200: Unknown symbol ieee80211_wx_get_encode
ipw2200: Unknown symbol ieee80211_txb_free
ipw2200: Unknown symbol ieee80211_wx_get_scan
ipw2200: Unknown symbol ieee80211_alloc
ipw2200: Unknown symbol ieee80211_rx
ipw2200: Unknown symbol ieee80211_rx_mgt
ipw2200: Unknown symbol ieee80211_skb_to_txb
ipw2200: Unknown symbol ieee80211_free
FATAL: Error inserting ipw2200 (/lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ipw2200/ipw2200.ko): Unknown symbol in module, or unknown parameter (see dmesg)
ieee80211: disagrees about version of symbol ieee80211_crypt_deinit_entries
ieee80211: Unknown symbol ieee80211_crypt_deinit_entries
ieee80211: disagrees about version of symbol ieee80211_crypt_delayed_deinit
ieee80211: Unknown symbol ieee80211_crypt_delayed_deinit
ipw2200: Unknown symbol ieee80211_wx_set_encode
ipw2200: Unknown symbol ieee80211_wx_get_encode
ipw2200: Unknown symbol ieee80211_txb_free
ipw2200: Unknown symbol ieee80211_wx_get_scan
ipw2200: Unknown symbol ieee80211_alloc
ipw2200: Unknown symbol ieee80211_rx
ipw2200: Unknown symbol ieee80211_rx_mgt
ipw2200: Unknown symbol ieee80211_skb_to_txb
ipw2200: Unknown symbol ieee80211_free

これは、/lib/modules/2.6.10-1.770_FC3/modules.depファイルに記述されたカーネルモジュールの依存関係がおかしいためのようだ。 kernelパッケージに含まれるドライバと、Intelのサイトからもらってきたドライバが、ごちゃまぜになっている。

# /lib/modules/2.6.10-1.770_FC3/modules.dep
# がkernelパッケージに含まれるモジュール
# がIntelのサイトからもらってきたモジュール

......
/lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ipw2200/ipw2200.ko: /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211/ieee80211.ko /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211_crypt.ko
......
/lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ipw2200.ko: /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211/ieee80211.ko /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211.ko /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211_crypt.ko
......

/lib/modules/2.6.10-1.770_FC3/modules.depからipw2200関連の行を一度削除し、Intelからもらってきたドライバだけ使用するよう、次の1行を追加する。

# /lib/modules/2.6.10-1.770_FC3/modules.dep

......
/lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ipw2200.ko: /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211.ko /lib/modules/2.6.10-1.770_FC3/kernel/drivers/net/wireless/ieee80211_crypt.ko
......

一度モジュールをアンロードし、再度読み込むと、今度はエラーが出ない。 無線インタフェースの有効化も成功。

# rmmod ipw2200

# rmmod ieee80211

# modprobe ipw2200

# ifup eth1

Determining IP information for eth1... done.

難点は、カーネルをバージョンアップするたびにドライバのインストールと/lib/modules/2.6.10-1.770_FC3/modules.depファイルを編集しなければならないこと。 また、depmodを実行すると、/lib/modules/2.6.10-1.770_FC3/modules.depファイルが書き換わってしまうので、再編集が必要。


カーネルを2.6.11-1.14_FC3にバージョンアップすると...

カーネルパッケージkernel-2.6.11-1.14_FC3に含まれるデバイスドライバで正常に動作した。 ファームウェアファイルを、/lib/firmwareディレクトリに置くだけでいいみたい。


[サーバの実験室 Redhat/Fedora]