テクニカルプア

備忘録と若干の補足

Elecom WDC-433SU2Mで802.11acな通信を実現したかった

2015-03-08 追記

体裁がグチャグチャになってたのに気がついたので直した。内容は変わってない)

2014-06-11 追記

進展があった

 今まで使っていたwifiルータ(プラネックスMZK-W04N)が長いこと不調で、とうとう我慢の限界に達したので、wifiルータを新調することにした。そういうわけで802.11acに対応しているバッファローWHR-1166DHPを購入し、acが使えるならと併せてエレコムWDC-433SU2MBKを買うことにした。
 さて、WDC-433SU2MBKだが、こういうものの常として、何も考えずに挿しても認識することはない。適当に型番で検索するとElecom WDC-433SU2M - WikiDeviというのが出てきて、使えるドライバも掲載されていた。GNU/Linux用ドライバが入手出来るのなら動かせるだろうということで、やってみることにした。
 で、結果だが、動作しなかった。
 詳しく言うと、ドライバをインストールすればWDC-433SU2MBKを認識はする。netctlなりwicdなりのネットワーク管理ツールを使えば802.11acでつながりもする。しかし、いい感じに通信をしようとすると、カーネルパニックを起こしてシステムがまるごと死ぬ。原因として思い当たる節は多々あるが、そのへんは後述する。

環境

$ uname -r
3.14.4-2-ck
$ gcc --version
gcc (GCC) 4.9.0 20140521 (prerelease)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

(2014-06-22 追記:ドライバのコンパイルにはカーネルのヘッダファイルが必要。linux-headersとかそういうのをインストールしないとコンパイル時に怒られる)

作業

 ほぼPLANEX GW-450D KATANAをLinux(CentOS6.5)で動かす | hosiiのメモ帳に沿っている。

ドライバのソースコード入手

 http://www.mediatek.com/en/downloads/mt7610u-usb/からダウンロードする。氏名とメールアドレスを入力し、CAPTCHAを通れば入手できる。GPLv2で頒布されている。

パッチ当て

 以下のパッチをあてる。

planex_gw450_katana_linux_3_13_driver.patch · GitHub

 最後のパッチはGW-450D KATANAのドライバ用みたいになっているが、これはGW-450D KATANAもWDC-433SU2Mも同じMediaTek製のMT7610Uというチップを使用しており、このためドライバも同一のものになるためである。

コンパイル

 パッチを当てたらmakeする。makeが終わると、ドライバのソースがあるディレクトリのうち、os/linux/内にmt7650u_sta.koというカーネルモジュールができている。これを使う。

インストールとか

 mt7650u_sta.koをカーネルモジュールが格納されているディレクトリへ配置して、設定ファイルを適切な位置へ置く。以下ではカレントディレクトリをドライバのソースがあるディレクトリとする。

# cp os/linux/mt7650u_sta.ko  /lib/modules/`uname -r`/kernel/drivers/net/wireless/
# mkdir -p /etc/Wireless/RT2870STA
# cp RT2870STA.dat  /etc/Wireless/RT2870STA/

 次にWDC-433SU2Mをra0として扱えるように、modprobeの設定ファイルを書く。内容は以下の通り。

$ cat /etc/modprobe.d/99-local.conf
alias ra0 mt7650u_sta

 最後に、カーネルモジュールをカーネルに読み込んで、ドライバとして使えるようにする。

# depmod -a
# modprobe mt7650u_sta

 こうすれば、ifconfigなりiwconfigなり、あるいはip aとかでra0を確認できる。

結果

 以上でWDC-433SU2Mをシステムへ認識させることはできる。しかし動かそうとすると、これはまた別の問題になる。前述のとおり、いい感じに通信させようとするとカーネルパニックを起こして死ぬのだ。いい感じに通信をすると死ぬというのは、pingを飛ばす程度なら死なないのにレポジトリを更新させようとしたり、ブラウザを立ち上げてインターネットしようとすると死ぬ、という意味でつかっている*1
 で、思い当たる節というのは、config.mkへのパッチでコンパイルオプションとして-Wno-date-timeをつけるようにしていることだ。こいつは

@item -Wdate-time
@opindex Wdate-time
@opindex Wno-date-time
Warn when macros @code{__TIME__}, @code{__DATE__} or @code{__TIMESTAMP__}
are encountered as they might prevent bit-wise-identical reproducable
compilations.

Tobias Burnus - [Patch: libcpp, c-family, Fortran] Re: Warning about __DATE__ and __TIMEより引用、各行先頭'+'を除去)
だそうで、こいつを付けないと

  CC [M]  /dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../sta/sta_cfg.o
/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../sta/sta_cfg.c: In function ‘RTMPIoctlShow’:
/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../sta/sta_cfg.c:5401:85: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
             snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
                                                                                     ^
/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../sta/sta_cfg.c:5401:95: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
             snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
                                                                                               ^
cc1: some warnings being treated as errors
scripts/Makefile.build:308: recipe for target '/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../sta/sta_cfg.o' failed
make[2]: *** [/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../sta/sta_cfg.o] Error 1
Makefile:1278: recipe for target '_module_/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux' failed
make[1]: *** [_module_/dev/shm/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux] Error 2
make[1]: Leaving directory '/usr/lib/modules/3.14.4-2-ck/build'
Makefile:393: recipe for target 'LINUX' failed
make: *** [LINUX] Error 2

とかいってコンパイルに失敗するのが、こいつをつけると抑制できる。しかし、無事コンパイルが通ってもカーネルパニックでシステムをブチ殺してしまうのなら、このオプションなしでコンパイルが通るようにしたほうがよさそうだ。しかし、上の中で表示されているエラーで検索してみても、AUR (en) - broadcom-wlなどのように、-Wno-date-timeでお茶を濁している感じで、どうにもならない。
 802.11acの恩恵を受けたかった。WDC-433SU2MBKを使わず802.11nで過ごすぶんには何も問題はないので、こちらもそれでお茶を濁すことにしようと思う。

*1:詳しく調べていないので確証は無いけれど、たぶんICMPは大丈夫でTCPとかUDPだと死ぬんだと思われる。その他のプロトコルについては不明。