grafi.jp

追記:カーネルのバージョンは3.18.0で試しました。 3.18系では動作するものの3.19.1ではコンパイルが通らないようです。コメント欄参照。 id:nosada さん、ありがとうございます。

バイト先のオフィスがフロアのEthernetケーブルをなくしてWi-Fiメインにすることになったので、Wi-Fiでそこそこ高速に安定した通信を行う必要があり試した結果です。Macbook ProにGentoo Linuxを入れて使っているのですが、これまでは基本的に有線LANで運用していました。Macbook内臓のBroadcomのWi-Fiチップのドライバが、プロプライエタリなものは不安定でオープンソースのものは遅かったので。

さて、WDC-433SU2Mが使っているチップはRalinkという会社のもので、この会社は今はMediaTekという会社に買収されています。MediaTekはLinux向けのドライバのソースを公開しているので、そのドライバを適当にデバイスIDなど書き換えた上で使えばよさそうです。既に、 Elecom WDC-433SU2Mで802.11acな通信を実現したかった - テクニカルプア および Elecom WDC-433SU2Mで802.11acな通信を実現したのかわからないけどとりあえず動いた - テクニカルプア に手順などが記載されています。

ただし、そこで二つ問題があります。

上でリンクした記事においても、この問題でハマっていました。

64bit対応に関しては、幸いにも 有志によって64bit対応されたドライバ がGitリポジトリとして公開されているので、そちらを用いました。自分が用いたコミットはbe2e5d4です。

また、ソースコードを見たところ実際には802.11acに対応しているようで、ソースコードから推測した以下の設定を行いました。

具体的には、64bit対応されたドライバに対して以下のパッチを当てました。

diff --git a/Makefile b/Makefile
index 25d87aa..f1e8fa5 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,7 @@ endif
 # rt8592(for rt85592), mt7650e, mt7630e, mt7610e, mt7650u, mt7630u, mt7610u

 ifeq ($(CHIPSET),)
-CHIPSET = mt7610u
+CHIPSET = mt7650u mt7630u mt7610u
 endif

 MODULE = $(word 1, $(CHIPSET))
@@ -196,9 +196,10 @@ endif

 ifeq ($(PLATFORM),PC)
 # Linux 2.6
-LINUX_SRC = /lib/modules/$(shell uname -r)/build
+#LINUX_SRC = /lib/modules/$(shell uname -r)/build
 # Linux 2.4 Change to your local setting
 #LINUX_SRC = /usr/src/linux-2.4
+LINUX_SRC = /usr/src/linux-$(shell uname -r)
 LINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/
 CROSS_COMPILE =
 endif
diff --git a/common/rtusb_dev_id.c b/common/rtusb_dev_id.c
index 061362a..fb7bf4d 100644
--- a/common/rtusb_dev_id.c
+++ b/common/rtusb_dev_id.c
@@ -38,6 +38,7 @@ USB_DEVICE_ID rtusb_dev_id[] = {
 #ifdef MT76x0
        {USB_DEVICE(0x148F,0x7610)}, /* MT7610U */
        {USB_DEVICE(0x13B1,0x003E)}, /* MT7610U */
+       {USB_DEVICE(0x7392,0xb711)}, /* WDC-433SU2M */
        {USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7630, 0xff, 0x2, 0xff)}, /* MT7630U */
        {USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7650, 0xff, 0x2, 0xff)}, /* MT7650U */
 #endif
diff --git a/conf/RT2870STA.dat b/conf/RT2870STA.dat
index 0240bd5..172df59 100644
--- a/conf/RT2870STA.dat
+++ b/conf/RT2870STA.dat
@@ -1,12 +1,12 @@
 #The word of "Default" must not be removed
 Default
-CountryRegion=5
-CountryRegionABand=7
-CountryCode=
+CountryRegion=1
+CountryRegionABand=1
+CountryCode=JP
 ChannelGeography=1
-SSID=11n-AP
+SSID=
 NetworkType=Infra
-WirelessMode=8
+WirelessMode=14
 EfuseBufferMode=0
 Channel=0
 BeaconPeriod=100

802.11acに対応するための設定は、RT2870STA.datでのWirelessMode=14の部分です。同ファイルにおけるCountry周りの設定は日本で使うことが許されている周波数帯を指定するものです。MakefileにおけるLINUX_SRCの設定はGentoo Linux依存のものなので、環境によっては必要ありません。

この上で、makeしてmake installすれば上手く動作しました。スピードテストの結果802.11acで動作しているであろうことが確認できました。また、しばらく使った感じだと、どうも三日に一回くらい落ちてしまう(抜いて挿し直させば復活する)のですが、それ以外は安定して動いているようです。