ドライバ未登録機器を new_id によって認識させる方法

AR5523 チップを使用してはいるが、 Linux カーネルの ar5523 ドライバにその ID が登録されていないから、 そのままでは認識されない USB ドングルがあって、 認識させるために ar5523.c のソースコードに加筆する方法は既述

既述のパッチの主たる目的は 11A モードを使うという点にあって、 単に 11G/B モードをつかうならば、新しい機器の USB ID を加筆するだけでよいのだが、 そんならわざわざカーネルに手を加えなくとも済むと思われるかもしれない。 というのは、 Kernel.org の Adding new device IDs to zd1211rw という文書において /sys/bus/usb/drivers/*/new_id に書き込むことによって、ドライバ未登録の機器を認識させる方法が書かれているからである。

結論を先にいえば、 ファームウェアを読み込むと idProduct が変化する仕様の ar5523 ドライバではこの方法が利用できないのだが、 Adding new device IDs to zd1211rw に書かれている情報は、現時点の 3.14 乃至 3.17 カーネルにおいて一般的に誤りであると思われるので、以下にその方法についてメモしておく。

例として、カーネルの zd1211rw ドライバのソースコードに手を加えずに、 BUFFALO WLI-UC-AG を認識させる方法について述べる。 この USB ドングルの Vendor:Product ID は 0411:00f3 である。 この機器は zd1211rw ドライバが扱う機器のうちの ZD1211B というチップタイプのもので、 zd_usb.c の中に列挙されている機器のうち、たとえば、 0411:00da という ID を持つ機器と同じタイプのものである。

これだけの情報が得られれば、zd1211rw ドライバがロードされた状態において、コマンドラインから

echo "0411 00f3 0 0411 00da" > /sys/bus/usb/drivers/zd1211rw/new_id  

としておけば、 WLI-UC-AG が認識される。 new_id に書き込む5個のパラメータの意味は、 Documentation/ABI/testing/sysfs-bus-usb に書かれているが、 上記の例では「0411:00f3 の ID を持つ機器があれば、 0411:00da の ID を持つ機器と同じものとして認識せよ」 ということを命令しているのである。

ただし ZD1211B タイプの機器として認識されたこの USB ドングルをつかうには、 このタイプのための zd1211/zd1211b* の一群のファームウェアがインストールされている必要がある。

以上の説明に対して、 2014年12月現在の Adding new device IDs to zd1211rw は、 7個のパラメータを書き込むと書いているが、 これは /sys/bus/pci/drivers/*/new_id に書き込むときの文法と混同しているのであろう。 同じ new_id という名前でも、 PCI 機器の場合には Documentation/ABI/testing/sysfs-bus-pci に書いてあるような7個のパラメータで新しい機器を登録するのだから、 別の話なのであった。

それで、 BUFFALO WLI-UC-AG を Linux のマシンに挿入したときに自動的にドライバが読み込まれて機器が認識されるようにする udev の rule を書けば次のとおり:

ACTION=="add",SUBSYSTEM=="usb",\
  ATTR{idVendor}=="0411",ATTR{idProduct}=="00f3",\
  RUN+="/sbin/modprobe zd1211rw"
ACTION=="add",SUBSYSTEM=="drivers",ENV{DEVPATH}=="/bus/usb/drivers/zd1211rw",\
  RUN+="/bin/sh -c 'echo 0411 00f3 0 0411 00da > /sys/bus/usb/drivers/zd1211rw/new_id'"
古い Atheros を使う