honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

PSCにUSB無線ドングルのドライバを入れようとしてハマった話

PSCに無線LANUSBを繋ぐ方法を標準化しようと思ってアレコレしている中で、
上手く行かない事象があったので記録しておきます。
多分ここに書いてあるようにすれば解決するし、PSC以外の似た環境でも発生しうることだと思います。

PSCのKernelはSONYからリリースされていて、configも整っているので、
make menuconfigからモジュールを設定してやれば自由にinsmod可能なモジュールを追加することができます。

f:id:honeylab:20190202205126p:plain

なので、適当に手持ちや安価に買える無線LANUSBドライバをコンパイルしてテストしていたのですが、せっかく使おうと思ったTP-LinkのTN-WN725を使うために

RTL8188EUの(stagingですが)ドライバをコンパイルし、insmodしたところカーネルがクラッシュしてしまいました。

[ 134.697838] <1>.(1)[1276:insmod]r8188eu: module is from the staging directory, the quality is unknown, you have been warned.
[ 134.703522] <1>.(1)[1276:insmod]Chip Version Info: CHIP_8188E_Normal_Chip_TSMC_D_CUT_1T1R_RomVer(0)
[ 134.729163] <2>.(2)[1276:insmod]Unable to handle kernel NULL pointer dereference at virtual address 00000004
[ 134.730441] <2>.(2)[1276:insmod]pgd = d96b8000
[ 134.731013] [00000004] *pgd=7f6db835
[ 134.731487] <2>-(2)[1276:insmod]Internal error: Oops: 817 [#1] PREEMPT SMP ARM
[ 134.732416] Modules linked in: r8188eu(C+) mac80211

 検索で引っかかるように↑に貼っておきます。

ぱっと見る感じ、NULLポインタアクセスっぽいのですが、
動作中に不安定なるとかならまだしも、stagingとはいえ、insmodした瞬間に落ちるようなバグが残っているとは思えません。
もしあったとしても、凡バグでちょっといじれば直せそうな気がしたので、
その近くにprintfを入れたり、insmodのパラメータでdebugを指定したりしてみました。

そうすると、どうやら usb_intf.c の

  memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);

 この行で落ちているようです。
メジャーなバグならもっと報告があるはず。ですが、数件レポートがあるだけで
解決したという報告もありません。


その周辺を見てみても、このアドレスを触っている文はありません。
で、pnetdevの型は…

struct net_device *pnetdev  

らしい。
もしかすると、特定のカーネルから急に構造が変わって対応していないのかもしれない、と思ってバージョン違いを見れそうなサイトを見てみました。

https://elixir.bootlin.com/linux/latest/source/include/linux/netdevice.h

 該当のメンバは

f:id:honeylab:20190202210500p:plain

1926行で宣言されていました。ズルズルっと上にたどってみていると

f:id:honeylab:20190202210622p:plain

ifdefの山…

そして偶然目に止まった

f:id:honeylab:20190202210735p:plain

この CONFIG_WIRESS_EXT

見覚えがある…

そう、昨日家に転がっていたGW-450D をコンパイルしようとして失敗し、検索して見つけた

メモがわりのブログ: Debian Sid + Linux 4.6-rc1でPlanex GW-450D KATANAを使う

を参考にしてこのフラグをセットしていたのだ。

どうやら、一部の無線LANのドライバで使用されるこのメンバを利用するモジュールconfigで選択した際に、このフラグがセットされるようだ。

 

PSCに内蔵されているカーネルではCONFIG_WIRESS_EXTがセットされていないため、構造体メンバの違うカーネルとドライバを組み合わせようとしてクラッシュするのは当然だ。

PSCには普通に考えたら無線LANドライバは入れないからな…
とはいえ、ソースツリーは、なんでそんな事になってるのよ…

今まで似たようなテストをしていてさらっと通っていたのは、多分カーネルも一緒にビルドして書き換えていたのできちんと組み合わせができていたからだと思う。
オリジナルのカーネルに戻していたので初めて気がついた。

というわけで、今後リリースされるカーネルではなにか適当な無線LANドライバをselectしておくことで、insmodできるドライバを増やせるように上記フラグをセットしておくといいんじゃないかな…