ドライバ未登録機器を 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'"