ネットワーク

【無線LAN】組み込みボードで無線LANを動かしてみた(QCA9377失敗編)③カーネル3.14(Yocto)のath10kコードを見てみる

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア

【無線LAN】組み込みボードで無線LANを動かしてみた(Intel N6300編)を実験したところ、Intel N6300はAPモードになれないことが判明。

そこでクアルコムアセロス社のQCA9377というAPモード対応デバイスを挿してみることにした。

先に結果を書きますが、いろいろやった結果、手詰まりになりました(QCA9377の認識に失敗します。STAすら動いてません)。

最後にも書きましたが、どこかで仕切り直したいです。そのときに今回の失敗事例が役にたつと思うので、記録しておきました。

中途半端で申し訳ありません。

こんな悩みを解決します。

今回やることは1つ。

  1. カーネル3.14(Yocto)のath10kコードを見てみる

バージョン情報

Linux Kernel 3.14

カーネル3.14(Yocto)のath10kコードを見てみる

fidoのカーネルコードはここにありました。

$ cd ~/fido/core-image-sato/tmp/work/nitrogen6x-poky-linux-gnueabi/linux-boundary/3.14.28-r0/build/source
$ ls
COPYING Kconfig REPORTING-BUGS drivers init mm security usr
CREDITS MAINTAINERS arch firmware ipc net sound virt
Documentation Makefile block fs kernel samples tools
Kbuild README crypto include lib scripts ubuntunize

ath10kはここです。デバイスを特定するにはハードウェアから取得したデバイスIDを照合しないと不可能。というわけでまずhw.hを見てみます。

$ cd ~/fido/core-image-sato/tmp/work/nitrogen6x-poky-linux-gnueabi/linux-boundary/3.14.28-r0/build/source/drivers/net/wireless/ath/ath10k
$ ls
Kconfig bmi.h core.c debug.h htc.h htt_rx.c mac.c pci.h trace.c txrx.h
Makefile ce.c core.h hif.h htt.c htt_tx.c mac.h rx_desc.h trace.h wmi.c
bmi.c ce.h debug.c htc.c htt.h hw.h pci.c targaddrs.h txrx.c wmi.h

hw.hにデバイスIDを識別する値はありません。しかもQCA988xしか書かれてません。今回のデバイスはQCA9377なのです。

$ vi hw.h

次にpci.cを見てみます。デバイスIDは見つかりましたがやはりQCA988xの1種のみです。

$ vi pci.c

うーむ…。とりあえずLinuxの最新ソースコードを見てみますか。Bootlin Linux Sourceを開き、カーネル5.3.6のツリーを確認。

カーネル5.3.6のath10を開く。

pci.cを開いてみました。QCA9377が居ました。しかしデバイスIDはここで定義されてません。

pci.cからQCA9377_1_0_DEVICE_IDを掘ってみました。

まずQCA9377_1_0_DEVICE_IDをクリック。

hw.hで定義されてるみたいなのでhw.hをクリック。

QCA9377_1_0_DEVICE_IDは0x0042。ん…。なんか見たことあるID。

思い出しました。BD-SABRE-LITEでlspci -kしたときにデバイスID 0042が出てきてました。やはり想像通りカーネル3.14のath10ドライバはQCA9377が認識できない様子です(定義されてないため)。

# lspci -k
00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01)
Kernel driver in use: pcieport
01:00.0 Network controller: Qualcomm Atheros Device 0042 (rev 31)
Subsystem: AzureWave Device 2a51

状況を整理する

①カーネル5.6にはQCA9377のDEVICE_ID定義があるが、カーネル3.14にはQCA9377のDEVICE_ID定義がないため、デバイスをPCIeに挿しても認識できない。

②BD-SABRE-LITEがサポートするカーネルVerは3.14なのでQCA9377のDEVICE_ID定義を移植したいが、カーネル3.14と5.6はギャップが大きいため、単純な移植では済まなそう。

③新しいカーネルからサポートされた機能を古いカーネルに移植するbackportsというものがあるのを思い出した。

まとめ

QCA9377のデバイスIDが定義されたカーネルのath10コードを、カーネル3.14にbackportしたath10kドライバを見つければいいんですかね。

 

ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。