2011年3月3日木曜日

NetBSD 5.1 で ath5k

仕事で必要にかられて、古〜い"IBM"のThinkpadにNetBSDを入れて、無線LAN端末にしようとしました。まず最初はThinkpad X32。Atherosのa/b/g mini-PCIカードが刺さってます。NetBSD5.1を入れてインターフェースをupすると、


ath0: ath_chan_set: unable to reset channel 7 (2442 MHz, flags 0x3e0 hal flags 0x140)


なんていうメッセージが出てスキャンが止まり、もちろんAPに繋がりません。無線LANのカードが壊れてるのかな?と思ってThinkpad X40にもインストールしてみましたが、やっぱり同じように7chにできないで止まってしまいます。ちなみにAtherosのmini-PCIが刺さったThinkpadじゃないマシンもあるのですが、こちらでは正常動作。うーん、謎だ。。。

で、調べてみるとこんな話が。

http://www.muranet.jp/~mura/blosxom.cgi/bsd/070505.html

どうやらa/b/gサポートでRegulatory Domainが日本になっていると起きる問題らしい。
無線LANって世界中で「ほぼ」同じ周波数が使われていますが、実は国によって微妙に使えるチャンネルが違ったりします。で、一般には無線LANカードのROMに国とか使えるチャンネルの情報が入っていて、ドライバがそれを読み取ってチャンネルを設定するようになっています。ここで、NetBSDの実装がちょっといい加減で、2.4GHz帯も5GHz帯も同じ配列で管理していて、そのインデックスにチャンネル番号を使っているとのこと。解決方法も書かれていました(http://www.muranet.jp/~mura/blosxom.cgi/bsd/070506.html)が、残念ながらこれは古いFreeBSDの話。
ということで、ドライバのコードを見ていくとやっぱり同じようにチャンネル番号をインデックスに使っています。で、問題の7chはb/gの2.4GHzで書き込んだ後に、日本の設定だと11jの4.9GHz帯(日本でだけ使える)が7chとして上書きされています。ちょっとややこしいのですが、チャンネルのデータを記録している構造体の周波数とフラグが矛盾を起こしてエラーとなっているようでした。
とりあえず、4.9GHz帯は使えなくてもいいので以下のようにかぶるところは上書きしないようにしました。


*** ath.c.org   Mon Feb 14 15:32:06 2011
--- ath.c       Wed Mar  2 21:50:57 2011
***************
*** 4921,4926 ****
--- 4921,4930 ----
                HAL_CHANNEL *c = &chans[i];
                u_int16_t flags;
  
+ #ifdef THINKPAD_11A
+               if ((c->channel > 4940) && (c->channel < 5240))
+                       continue;
+ #endif
                ix = ath_hal_mhz2ieee(ah, c->channel, c->channelFlags);
                if (ix > IEEE80211_CHAN_MAX) {
                        if_printf(ifp, "bad hal channel %d (%u/%x) ignored\n",

これで無事解決。

ちなみに別のマシンで大丈夫だったのは5GHz(11a)をもともとサポートしていなかったからのようです。Atherosの場合、この辺りの情報はHALに書かれていると思うので、HALをいじって11jの情報を消すとか、NetBSDのチャンネルの管理方法を変えるのが一番いいんでしょうけど、とりあえずこれでOKとしました(^^;

0 件のコメント:

コメントを投稿