2012年9月24日月曜日

無線LANでハマったです

5月頃だったですか.... 出先のいつもの席に座って、Debian GNU/Linux(6.0.5 squeeze amd64)をインストールしたSDHCカードを外出専用機Gateway EC19C-N52C/Sのカードスロットに突っ込んで電源オン、Debianがサクッと起動してログインすると、ふつうに無線LAN接続して使えたですが、nm-appletのアンテナが2本しか立ってない.... 切断・接続を繰り返しても、再起動させても、アンテナは2本しか立たない。おかしい、数日前はこんなではなかったはずだけど.... すぐそこに無線APがあるのに.... と思ったものの、とりあえず気にしないことにしたです。
その1週間後くらいに、無線APの担当者に直接会う機会があったので、最近無線APの設定を変更したのかと聞いてみたところ、「どうも電波干渉が起きているようなので、チャンネルを変更し、電波出力も調整した」との事。そして、手持ちのWindowsパソコンを起動して無線接続し、inSSIDerの表示を見せてくれたです。自分も、近くにあるMacBook Proを起動させて、Mac OS XとBootCampのWindowsで無線接続してみたですが、どちらも電波状態は良好だったです。
ということは、自分が使っているパソコン本体か、そのパソコン上で動かしているDebianに問題がある? いやっそんなはずはっ、とか思って調査を開始。Debianを終了させてWindoows 7を起動、無線接続して電波状態が良好であることを確認した上でコレを使ってみたり、MacBook Proでコレをやったりしたところ、指定席(?)直近の無線APは12chになっていることがわかったです。この無線APに接続したいぞと、Debianの設定を(よく調べもせず)連日弄くり続けたところ、なんとなく環境がおかしくなってきたような気がしてきたので、自宅で実験機のGateway EC19C-N52C/Sを使って、SDHCカードにDebianを再インストールしたですが.... 動作がモッサリ.... 以前と同じように「小型のCD」でインストールして、Xfce4とSlimを追加したですが、ブートメッセージの表示が終わってログインマネージャが起動するまで、真っ暗の画面のまま30秒くらい待たされる、ウインドウの起動が遅い、キー入力に表示が追いつかないことがある、ウインドウを残したままシャットダウンさせると、ウインドウの跡形を残したまま30秒くらい固まる、という状態になってしまったです。Xorg -configureを実行して/etc/X11/xorg.confを作成したり、/var/logの下にあるログや~/.xsession-errorsを確認したですが、今もまだ全然解決できてないです。
とにかくもう、まず無線接続の問題を解決! ということで、8月に入って(^^; とりあえずDebianを使うのを諦めることにして、カーネル3.2のCrunchBang Linux(Statler 20120207 64-bit Stable+Backports)に変更したです。ちなみに、DebianをインストールしていたSDHCカードにCrunchBangをインストールしたですが、比較的サクサク動いた(ブート直後だけ少しひっかかる感じがする)ので、Debianが遅くなったのはSDHCカードのせいではないような気がしてるです。


OpenboxをアンインストールしてXfce4をインストール、日本語化したCrunchBang(壁紙も変更)。EC19C-N52Cの無線LANコントローラは、Broadcom BCM43225。firmware-brcm80211のインストールは必要だったが、他にBroadcom用のパッケージはインストールせずに、Netwoork Managerで無線接続はサクッと成功。しかし、12chの無線APには繋がらず、離れた5chの無線APに繋がる。

うーむ。なぜ12chの無線APに繋がらないのか、ヒントが欲しくてネットで検索、コレとかコレとかコレとかを見て、
 2.4GHz帯の12ch以上は使えない状態がデフォルトだったりする
 モジュールcfg80211のオプションに、適切なRegulatory domainを指定すれば、12ch以降を有効にすることができる
 Regulatory domainは、日本の場合はフツーJPだが、Broadcomの無線LANコントローラの場合(?)はX2にすると良い
ということみたい、と解釈したです。
そういや、/var/log/kern.logに
cfg80211: Calling CRDA for country: US
とか出てたな.... では、ということで、sudoでrootになって、

echo 'options cfg80211 ieee80211_regdom=JP' > /etc/modprobe.d/cfg80211.conf

を実行することで、cfg80211にRegulatory domainとしてJPを渡すように設定して再起動、ログインして無線接続。


繋がらん。Regulatory domainをJPからX2に変えて再起動しても、12chの無線APに繋がらん。





うー。試しに、

aptitude -y install linux-headers-3.2.0-0.bpo.3-all-amd64
aptitude -y install broadcom-sta-common broadcom-sta-source
cd /usr/src
bzcat broadcom-sta.tar.bz2 | tar xvf -
cd module/broadcom-sta/amd64
make

とやってみたですが、カーネル3.2のCrunchBangではエラーが出てmakeできなかったです。


ダメっすか....






 

ヤレヤレ... キーワードを変えてさらにネットで検索した結果、コレを見つけたです。書き換えるのは1行だけの割には面倒なのですが、やってみることにしたです。
次のような手順でコマンドを叩いてやったですが、ちゃんと理解した上でやっているわけではないので、おかしな部分や無駄な部分があるかもです。まずは、パッチを適用せずに、単にコンパイルとインストールをやってみたです。

aptitude -y install linux-source-3.2 iw
cd /usr/src
bzcat linux-source-3.2.tar.bz2 | tar xvf -
cd linux-source-3.2
/lib/module下のディレクトリ名に合わせて、Makefileの先頭を変更。今回は、
----
VERSION = 3
PATCHLEVEL = 2
SUBLEVEL = 23
EXTRAVERSION =
----

----
VERSION = 3
PATCHLEVEL = 2
SUBLEVEL = 0
EXTRAVERSION = -0.bpo.3-amd64
----
に変更。これをやっておかないと、/lib/module/3.2.23ディレクトリ下にモジュールがインストールされてしまい、modprobeで組み込んでくれない。
make distclean
make oldconfig
cp /usr/src/linux-headers-3.2.0-0.bpo.3-amd64/Module.symvers .
make prepare
make modules_prepare
make M=drivers/net/wireless/brcm80211/brcmsmac/ clean
make M=drivers/net/wireless/brcm80211/brcmsmac/ modules
make M=drivers/net/wireless/brcm80211/brcmsmac/ modules_install
modprobe -rfv brcmsmac
depmod -av
modprobe -v   brcmsmac
update-initramfs -u

新しいbrcmsmac.koは、/lib/module/3.2.0-0.bpo.3-amd64/extraディレクトリ下に作成されたです。


パッチを適用していないので、インストール前のbrcmsmac.koと基本的に変わらないはずなので、Regulatory domainを指定してもしなくても、やっぱり12chの無線APには繋がらない。

一旦接続を切って、iw reg set JP とコマンドを実行して再度接続しても、12chの無線APには繋がらない。





では、パッチを適用(と言っても1行だけなのでソースを手修正)するです。

cd drivers/net/wireless/brcm80211/brcmsmac/
channel.cを修正。今回は449行目の
LOCALE_RESTRICTED_SET_2G_SHORT,

LOCALE_RESTRICTED_NONE,
に変更。
cd /usr/src/linux-source-3.2
brcmsmacのmakeをやり直してインストール


おぉっ。Regulatory domainを指定してもしなくても、12chの無線APに繋がった。





んー。接続できたのは良いけど、なんだか力技っぽい気がするです....