無線LAN

2010年1月10日 (日)

無線LAN接続 その3

苦難の歴史その1その2を経て、ついにxubuntu 9.10(karmic koala)においてWLI-CB-AMG54HPで無線LANの接続に成功した!
結論から言うとndiswrapperは不要で、無線LANカードのファームウェアだけ用意してやればカーネルに標準で用意されているb43やssbといったモジュールで動かせるらしい。
すなわち、最初からndiswrapperなどに手を出さず、b43-fwcutterをインストールするだけで無線LAN接続できたと思われる。(未確認)
何もしなくてもb43とssbのモジュールはロードされるのだが、Broadcomのチップを動作させるためにはファームウェアのインストールが必要で、ファームウェアのインストールはb43-fwcutterをインストールすると使えるようになるため。
以上、このサイトの情報から。

ndiswrapperが要らないことに気付いたきっかけは、これに基づき "/etc/udev/rules.d/70-persistent-net.rules" を書き換えたりして何度か再起動すると、ごく稀に接続に成功したこと。
接続に成功するかどうかが起動の度に変わるので、ドライバの問題だと当たりを付けて追い、判明した。

追った過程は以下の通り。なお、接続できるときはGとAのLEDが両方とも点灯するが、接続できないときはGしか点灯しなかったため、接続できるかどうかの確認は容易だった。

  • コンピュータを再起動すると接続できることもあることに気付く。この段階では接続できる確率は5%以下。
  • ドライバの問題と思われるため、ndiswrapperを手動でロードしたりアンロードしたりして調査。
  • ndiswrapperをrmmodした状態で無線LANカードを挿すと接続できることに気付く。
  • 思い切ってndiswrapperをアンインストールしてからコンピュータを再起動すると接続成功率100%となった。
  • 接続失敗時のログと成功時のログを比較した結果、原因はカーネル標準であるb43,ssbとndiswrapperの衝突だと思われる。

最初からndiswrapperを手動でロードしてもカードのLEDが点灯しない段階で気付くべきだった。
いま思えば、コンピュータを再起動しないとLEDが点灯しないというのは、ndiswrapperのロードに何らかの問題があることを示唆していたはず。

作業完了したので、試行錯誤中にインストールしたパッケージを全部削除。

% sudo modprobe -r ndiswrapper
% sudo vi /etc/modules  (最後の行の"ndiswrapper"を削除)
% sudo vi /etc/default/wpasupplicant  (最後の行の"ENABLED=0"を削除)
% sudo ndiswrapper -r bcmwl5
% cd ndiswrapper-1.55
% sudo make uninstall
% sudo rm -rf /etc/ndiswrapper
% sudo apt-get remove build-essential cvs debhelper dh-make dpkg-dev fakeroot g++ g++-4.4 gettext html2text intltool-debian libmail-sendmail-perl libstdc++6-4.4-dev libsys-hostname-long-perl patch po-debconf

b43-fwcutterをアンインストールしてもチップのファームウェアは残るためもう使わないb43-fwcutterだが、何か使うことがあるかも知れないため再度インストールしておく。

% sudo apt-get install b43-fwcutter

何はともあれ、お疲れ様でした。

2010年1月 5日 (火)

無線LAN接続 その2

前回無線LANのドライバ認識までたどり着いたので、Network Managerから WPA & WPA2 Personal の通信を試みたが、つながらない。
起動時に"Cannot find firmware file 'b43/ucode5.fw"などというエラーメッセージが出ていたので b43-fwcutter をインストールしたり、/etc/wpa_supplicant.conf あたりを編集してから手動で wpa_supplicantを実行したりしても事態は変わらず。

やっと気づいて、Network Managerで接続できないときのメッセージを調べてみるとこんな調子だった。

% tail -n 5 /var/log/messages
Jan  5 10:02:09 localhost kernel: [   38.851590] [drm] DAC-6: set mode 640x480 0
Jan  5 10:02:10 localhost kernel: [   39.476870] [drm] DAC-6: set mode 640x480 0
Jan  5 10:02:10 localhost kernel: [   39.974870] [drm] DAC-6: set mode 640x480 0
Jan  5 10:02:21 localhost kernel: [   50.704054] Clocksource tsc unstable (delta = -131017684 ns)
Jan  5 10:03:31 localhost kernel: [  120.924506] ndiswrapper (iw_set_auth:1602): invalid cmd 12

ndiswrapperの invalid cmd 12というエラーメッセージがポイントで、このサイトに解決方法が記載されていた。
よって解決を図る。その前に昨日の設定をいったん全部削除する。

% sudo apt-get remove b43-fwcutter
% sudo modprobe -r ndiswrapper
% sudo ndiswrapper -r bcmwl5
% sudo rm /etc/modprobe.d/ndiswrapper.conf
% sudo vi /etc/modules  (最後の行のndiswrapperを削除)
% sudo apt-get remove ndiswrapper-common ndiswrapper-utils-1.9

続いて解決方法を記したサイトの手順を実行。

% sudo apt-get install linux-headers-$(uname -r) dh-make fakeroot gcc-4.4 build-essential

これによってインストールされたパッケージは以下の通り。

  • build-essential
  • cvs
  • debhelper
  • dh-make
  • dpkg-dev
  • fakeroot
  • g++
  • g++-4.4
  • gettext
  • html2text
  • intltool-debian
  • libmail-sendmail-perl
  • libstdc++6-4.4-dev
  • libsys-hostname-long-perl
  • patch
  • po-debconf

これらも勧められるがとりあえず無視。

  • debian-keyring
  • debian-maintainers
  • g++-multilib
  • g++-4.4-multilib
  • gcc-4.4-doc
  • libstdc++6-4.4-dbg
  • gettext-doc
  • libstdc++6-4.4-doc
  • diff-doc
  • libmail-box-perl

ここからndiswrapper-1.55を取得。

解凍してそのディレクトリに移動。

% gunzip -c ndiswrapper-1.55.tar.gz | tar -xf -
% cd ndiswrapper-1.55/driver

ここから iw_ndis.c.diff ("Attached File"をクリックすると登場) を取得して ndiswrapper/driver に置き、以下のコマンドを実行してパッチを当てる。

% patch < iw_ndis.c.diff

ここからndiswrapper-2.6.31.patchを取得して ndiswrapper/drivers に置き、以下のコマンドを実行してパッチを当てる。

% patch < ndiswrapper-2.6.31.patch

過去の遺物があれば削除する。

% cd ..
% sudo make uninstall

ndiswrapperをインストールする。

% make
% fakeroot
% sudo make install
% exit

改めて Windowsのドライバを ndiswrapperにインストールする。

% cd SWSetup/sp33008a
% sudo ndiswrapper -i bcmwl5.inf
% ndiswrapper -l
bcmwl5 : driver installed
device (14E4:4319) present (alternate driver: ssb)
% sudo depmod -a
% sudo modprobe ndiswrapper
% sudo ndiswrapper -m
% echo 'ndiswrapper' | sudo tee -a /etc/modules
% sudo mv /etc/modprobe.d/ndiswrapper /etc/modeprobe.d/ndiswrapper.conf

ここで再起動して、無線LANカード(子機)のLEDが付けばいったん成功。しかし、またしてもNetwork Managerでの接続に失敗。

続く

2010年1月 4日 (月)

無線LAN接続 その1

無線LANを使えるようにしたくなった。
親機は Baffalo WHR-HP-AMPG (ルータモード), 子機はWLI-CB-AMG54HP。
設定にあたってはここここを参考にした。

子機はそのままでは Ubuntuから認識されなかったので ndiswrapper を使うことにした。
そのためには、まずカーネルモジュール bcm43xx のロードを止める必要があるのだが、最初から /etc/modprobe.d/blacklist.conf に "blacklist bcm43xx" という記述があったため、モジュールのロードについては特に対処不要だった。

続いて ndiswrapperをインストールする。

% sudo apt-get install ndiswrapper-common ndiswrapper-utils-1.9

このとき recommended packages としてndiswrapper-sourceも勧められるがインストールしない。

参考サイトに従い、正確なチップセットIDを調べる。

% lspci | grep 'Broadcom Corporation'
02:00.0 Network controller: Broadcom Corporation BCM4311 [AirForce 54g] 802.11a/b/g PCI Express Transceiver (rev 02)
% lspci -n | grep '14e4:43'
02:00.0 0280: 14e4:4319 (rev 02)

参考サイトによると、このチップセットでは sp33008のドライバをインストールすれば良いとのこと。まず入手する。

% wget ftp://ftp.hp.com/pub/softpaq/sp33001-33500/sp33008.exe

解凍ソフトのインストールは面倒だったので Windows上で実行して解凍した。副作用でドライバがインストールされてしまったのでWindows上で「プログラムの追加と削除」からアンインストールしてから再度Linuxを起動。

続いて以下のコマンドを順に実行してWindowsのドライバをndiswrapperにインストールする。

% cd SWSetup/sp33008a
% sudo ndiswrapper -i bcmwl5.inf
% ndiswrapper -l
bcmwl5 : driver installed
	device (14E4:4319) present (alternate driver: ssb)
% sudo depmod -a
% sudo modprobe ndiswrapper

参考サイトでは /etc/network/interfaces の編集が要ると書いてあるが、元からその通りの内容だったので編集しなかった。

さらに続いて以下のコマンドを実行。

% sudo ndiswrapper -m 
% echo 'ndiswrapper' | sudo tee -a /etc/modules
% echo 'ENABLED=0' | sudo tee -a /etc/default/wpasupplicant
% sudo mv /etc/modprobe.d/ndiswrapper /etc/modprobe.d/ndiswrapper.conf

ここで再起動。無線LANカードのLEDが点灯すれば成功。
あとは WPA & WPA2 Personalで接続するだけ、のはずだったのだが…。
次回へ続く。