ath10kのQCA9377はBD-SABRE-LITEの標準カーネル3.14でサポートされてない?

【関連記事】
【組込ボードで無線LAN】②(無線LANカードN-6300を組込ボードに接続するには?)
【組込ボードで無線LAN】⑧(iwのビルド:後編-1)【組込ボードで無線LAN】⑰(QCA9377-5を挿してみた)
  • まず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
/*
 * Copyright (c) 2005-2011 Atheros Communications Inc.
 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _HW_H_
#define _HW_H_

#include "targaddrs.h"

/* QCA988X 1.0 definitions (unsupported) */
#define QCA988X_HW_1_0_CHIP_ID_REV  0x0

/* QCA988X 2.0 definitions */
#define QCA988X_HW_2_0_VERSION      0x4100016c
#define QCA988X_HW_2_0_CHIP_ID_REV  0x2
#define QCA988X_HW_2_0_FW_DIR       "ath10k/QCA988X/hw2.0"
#define QCA988X_HW_2_0_FW_FILE      "firmware.bin"
#define QCA988X_HW_2_0_OTP_FILE     "otp.bin"
#define QCA988X_HW_2_0_BOARD_DATA_FILE  "board.bin"
#define QCA988X_HW_2_0_PATCH_LOAD_ADDR  0x1234

#define ATH10K_FW_API2_FILE     "firmware-2.bin"

/* includes also the null byte */
#define ATH10K_FIRMWARE_MAGIC               "QCA-ATH10K"

(以下略)
次にpci.cを見てみる。デバイスIDは見つかったがやはりQCA988xの1種のみ。
$ vi pci.c
/*
 * Copyright (c) 2005-2011 Atheros Communications Inc.
 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <linux/pci.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/bitops.h>

#include "core.h"
#include "debug.h"

#include "targaddrs.h"
#include "bmi.h"

#include "hif.h"
#include "htc.h"

#include "ce.h"
#include "pci.h"

enum ath10k_pci_irq_mode {
    ATH10K_PCI_IRQ_AUTO = 0,
    ATH10K_PCI_IRQ_LEGACY = 1,
    ATH10K_PCI_IRQ_MSI = 2,
};

static unsigned int ath10k_target_ps;
static unsigned int ath10k_pci_irq_mode = ATH10K_PCI_IRQ_AUTO;

module_param(ath10k_target_ps, uint, 0644);
MODULE_PARM_DESC(ath10k_target_ps, "Enable ath10k Target (SoC) PS option");

module_param_named(irq_mode, ath10k_pci_irq_mode, uint, 0644);
MODULE_PARM_DESC(irq_mode, "0: auto, 1: legacy, 2: msi (default: 0)");

#define QCA988X_2_0_DEVICE_ID   (0x003c)

static DEFINE_PCI_DEVICE_TABLE(ath10k_pci_id_table) = {
    { PCI_VDEVICE(ATHEROS, QCA988X_2_0_DEVICE_ID) }, /* PCI-E QCA988X V2 */
    {0}
};
(以下略)
うーむ...。とりあえずLinuxの最新ソースコードを見てみるか。Bootlin Linux Sourceを開いてみた。カーネル5.3.6のツリーが見れる。
1

1
pci.cを開いてみた。QCA9377が居た。しかしデバイスIDはここで定義されてない。
// SPDX-License-Identifier: ISC
/*
 * Copyright (c) 2005-2011 Atheros Communications Inc.
 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
 */

#include <linux/pci.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/bitops.h>

#include "core.h"
#include "debug.h"
#include "coredump.h"

#include "targaddrs.h"
#include "bmi.h"

#include "hif.h"
#include "htc.h"

#include "ce.h"
#include "pci.h"

enum ath10k_pci_reset_mode {
    ATH10K_PCI_RESET_AUTO = 0,
    ATH10K_PCI_RESET_WARM_ONLY = 1,
};

static unsigned int ath10k_pci_irq_mode = ATH10K_PCI_IRQ_AUTO;
static unsigned int ath10k_pci_reset_mode = ATH10K_PCI_RESET_AUTO;

module_param_named(irq_mode, ath10k_pci_irq_mode, uint, 0644);
MODULE_PARM_DESC(irq_mode, "0: auto, 1: legacy, 2: msi (default: 0)");

module_param_named(reset_mode, ath10k_pci_reset_mode, uint, 0644);
MODULE_PARM_DESC(reset_mode, "0: auto, 1: warm only (default: 0)");

/* how long wait to wait for target to initialise, in ms */
#define ATH10K_PCI_TARGET_WAIT 3000
#define ATH10K_PCI_NUM_WARM_RESET_ATTEMPTS 3

/* Maximum number of bytes that can be handled atomically by
 * diag read and write.
 */
#define ATH10K_DIAG_TRANSFER_LIMIT    0x5000

#define QCA99X0_PCIE_BAR0_START_REG    0x81030
#define QCA99X0_CPU_MEM_ADDR_REG       0x4d00c
#define QCA99X0_CPU_MEM_DATA_REG       0x4d010

static const struct pci_device_id ath10k_pci_id_table[] = {
    /* PCI-E QCA988X V2 (Ubiquiti branded) */
    { PCI_VDEVICE(UBIQUITI, QCA988X_2_0_DEVICE_ID_UBNT) },

    { PCI_VDEVICE(ATHEROS, QCA988X_2_0_DEVICE_ID) }, /* PCI-E QCA988X V2 */
    { PCI_VDEVICE(ATHEROS, QCA6164_2_1_DEVICE_ID) }, /* PCI-E QCA6164 V2.1 */
    { PCI_VDEVICE(ATHEROS, QCA6174_2_1_DEVICE_ID) }, /* PCI-E QCA6174 V2.1 */
    { PCI_VDEVICE(ATHEROS, QCA99X0_2_0_DEVICE_ID) }, /* PCI-E QCA99X0 V2 */
    { PCI_VDEVICE(ATHEROS, QCA9888_2_0_DEVICE_ID) }, /* PCI-E QCA9888 V2 */
    { PCI_VDEVICE(ATHEROS, QCA9984_1_0_DEVICE_ID) }, /* PCI-E QCA9984 V1 */
    { PCI_VDEVICE(ATHEROS, QCA9377_1_0_DEVICE_ID) }, /* PCI-E QCA9377 V1 */
    { PCI_VDEVICE(ATHEROS, QCA9887_1_0_DEVICE_ID) }, /* PCI-E QCA9887 */
    {0}
};
pci.cからQCA9377_1_0_DEVICE_IDを掘ってみた。

まずQCA9377_1_0_DEVICE_IDをクリック。
1

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

2
QCA9377_1_0_DEVICE_ID0x0042。ん...。なんか見たことあるIDだな。

3


思い出した。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ドライバを見つければいいのかな。次回やってみよう。

続く
IMG_0847



スポンサードリンク