Add support for the QCA9379 chipset. Analogous to the vendor qcacld driver
this change treats the QCA9379 family the same as the QCA9377 family.

The card generally works and connects to a variety of networks (open,
WPA2-PSK, WPA3 Personal) but currently does not roam cleanly and will
reauthenticate, causing intermittent loss of connectivity.

This change was tested on a device that uses a LITE-ON WCBN3510A card.

Tested-on: QCA9379 hw1.0 SDIO WLAN.NPL.1.6-00163-QCANPLSWPZ-1

Signed-off-by: Felix Kaechele <fe...@kaechele.ca>
---
 drivers/net/wireless/ath/ath10k/core.c      | 35 +++++++++++++++++++++
 drivers/net/wireless/ath/ath10k/hw.h        | 11 +++++++
 drivers/net/wireless/ath/ath10k/pci.c       |  2 ++
 drivers/net/wireless/ath/ath10k/sdio.c      |  5 ++-
 drivers/net/wireless/ath/ath10k/targaddrs.h |  3 ++
 include/linux/mmc/sdio_ids.h                |  1 +
 6 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c 
b/drivers/net/wireless/ath/ath10k/core.c
index 9ce6f49ab261..6daf26d06885 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -661,6 +661,40 @@ static const struct ath10k_hw_params 
ath10k_hw_params_list[] = {
                .delay_unmap_buffer = false,
                .mcast_frame_registration = false,
        },
+       {
+               .id = QCA9379_HW_1_0_DEV_VERSION,
+               .dev_id = QCA9379_1_0_DEVICE_ID,
+               .bus = ATH10K_BUS_SDIO,
+               .name = "qca9379 hw1.0 sdio",
+               .patch_load_addr = QCA9379_HW_1_0_PATCH_LOAD_ADDR,
+               .uart_pin = 19,
+               .otp_exe_param = 0,
+               .channel_counters_freq_hz = 88000,
+               .max_probe_resp_desc_thres = 0,
+               .cal_data_len = 8124,
+               .fw = {
+                       .dir = QCA9379_HW_1_0_FW_DIR,
+                       .board = QCA9379_HW_1_0_BOARD_DATA_FILE,
+                       .board_size = QCA9379_BOARD_DATA_SZ,
+                       .board_ext_size = QCA9379_BOARD_EXT_DATA_SZ,
+               },
+               .rx_desc_ops = &qca988x_rx_desc_ops,
+               .hw_ops = &qca6174_ops,
+               .hw_clk = qca6174_clk,
+               .target_cpu_freq = 176000000,
+               .decap_align_bytes = 4,
+               .n_cipher_suites = 8,
+               .num_peers = TARGET_HL_TLV_NUM_PEERS,
+               .ast_skid_limit = 0x10,
+               .num_wds_entries = 0x20,
+               .uart_pin_workaround = true,
+               .credit_size_workaround = true,
+               .dynamic_sar_support = false,
+               .hw_restart_disconnect = false,
+               .use_fw_tx_credits = true,
+               .delay_unmap_buffer = false,
+               .mcast_frame_registration = false,
+       },
        {
                .id = QCA4019_HW_1_0_DEV_VERSION,
                .dev_id = 0,
@@ -3585,6 +3619,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, 
struct device *dev,
                break;
        case ATH10K_HW_QCA6174:
        case ATH10K_HW_QCA9377:
+       case ATH10K_HW_QCA9379:
                ar->regs = &qca6174_regs;
                ar->hw_ce_regs = &qcax_ce_regs;
                ar->hw_values = &qca6174_values;
diff --git a/drivers/net/wireless/ath/ath10k/hw.h 
b/drivers/net/wireless/ath/ath10k/hw.h
index 93c073091996..8f52695b46db 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -30,6 +30,7 @@ enum ath10k_bus {
 #define QCA9888_2_0_DEVICE_ID  (0x0056)
 #define QCA9984_1_0_DEVICE_ID  (0x0046)
 #define QCA9377_1_0_DEVICE_ID   (0x0042)
+#define QCA9379_1_0_DEVICE_ID   (0x0042)
 #define QCA9887_1_0_DEVICE_ID   (0x0050)
 
 /* QCA988X 1.0 definitions (unsupported) */
@@ -61,6 +62,9 @@ enum ath10k_bus {
 #define QCA9377_HW_1_0_DEV_VERSION     0x05020000
 #define QCA9377_HW_1_1_DEV_VERSION     0x05020001
 
+/* QCA9379 target BMI version signatures */
+#define QCA9379_HW_1_0_DEV_VERSION     0x05040000
+
 enum qca6174_pci_rev {
        QCA6174_PCI_REV_1_1 = 0x11,
        QCA6174_PCI_REV_1_3 = 0x13,
@@ -124,6 +128,11 @@ enum qca9377_chip_id_rev {
 #define QCA9377_HW_1_0_BOARD_DATA_FILE "board.bin"
 #define QCA9377_HW_1_0_PATCH_LOAD_ADDR 0x1234
 
+/* QCA9379 1.0 definitions */
+#define QCA9379_HW_1_0_FW_DIR          ATH10K_FW_DIR "/QCA9379/hw1.0"
+#define QCA9379_HW_1_0_BOARD_DATA_FILE "board.bin"
+#define QCA9379_HW_1_0_PATCH_LOAD_ADDR 0x1234
+
 /* QCA4019 1.0 definitions */
 #define QCA4019_HW_1_0_DEV_VERSION     0x01000000
 #define QCA4019_HW_1_0_FW_DIR          ATH10K_FW_DIR "/QCA4019/hw1.0"
@@ -238,6 +247,7 @@ enum ath10k_hw_rev {
        ATH10K_HW_QCA9888,
        ATH10K_HW_QCA9984,
        ATH10K_HW_QCA9377,
+       ATH10K_HW_QCA9379,
        ATH10K_HW_QCA4019,
        ATH10K_HW_QCA9887,
        ATH10K_HW_WCN3990,
@@ -409,6 +419,7 @@ int ath10k_hw_diag_fast_download(struct ath10k *ar,
 #define QCA_REV_9888(ar) ((ar)->hw_rev == ATH10K_HW_QCA9888)
 #define QCA_REV_9984(ar) ((ar)->hw_rev == ATH10K_HW_QCA9984)
 #define QCA_REV_9377(ar) ((ar)->hw_rev == ATH10K_HW_QCA9377)
+#define QCA_REV_9379(ar) ((ar)->hw_rev == ATH10K_HW_QCA9379)
 #define QCA_REV_40XX(ar) ((ar)->hw_rev == ATH10K_HW_QCA4019)
 #define QCA_REV_WCN3990(ar) ((ar)->hw_rev == ATH10K_HW_WCN3990)
 
diff --git a/drivers/net/wireless/ath/ath10k/pci.c 
b/drivers/net/wireless/ath/ath10k/pci.c
index 5c34b156b4ff..903224fdac15 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -1899,6 +1899,7 @@ void ath10k_pci_irq_msi_fw_mask(struct ath10k *ar)
                 *  to mask irq/MSI.
                 */
                break;
+       case ATH10K_HW_QCA9379:
        case ATH10K_HW_WCN3990:
                break;
        }
@@ -1927,6 +1928,7 @@ static void ath10k_pci_irq_msi_fw_unmask(struct ath10k 
*ar)
                 *  to unmask irq/MSI.
                 */
                break;
+       case ATH10K_HW_QCA9379:
        case ATH10K_HW_WCN3990:
                break;
        }
diff --git a/drivers/net/wireless/ath/ath10k/sdio.c 
b/drivers/net/wireless/ath/ath10k/sdio.c
index 0ab5433f6cf6..a1e8f9783b5d 100644
--- a/drivers/net/wireless/ath/ath10k/sdio.c
+++ b/drivers/net/wireless/ath/ath10k/sdio.c
@@ -1105,6 +1105,7 @@ static void ath10k_sdio_set_mbox_info(struct ath10k *ar)
                                ATH10K_HIF_MBOX0_EXT_WIDTH_ROME_2_0;
                break;
        case (SDIO_DEVICE_ID_ATHEROS_QCA9377 & 0x0F00):
+       case (SDIO_DEVICE_ID_ATHEROS_QCA9379 & 0x0F00):
                mbox_info->ext_info[0].htc_ext_sz =
                        ATH10K_HIF_MBOX0_EXT_WIDTH_ROME_2_0;
                break;
@@ -2597,7 +2598,8 @@ static int ath10k_sdio_probe(struct sdio_func *func,
 
        dev_id_base = (id->device & 0x0F00);
        if (dev_id_base != (SDIO_DEVICE_ID_ATHEROS_AR6005 & 0x0F00) &&
-           dev_id_base != (SDIO_DEVICE_ID_ATHEROS_QCA9377 & 0x0F00)) {
+           dev_id_base != (SDIO_DEVICE_ID_ATHEROS_QCA9377 & 0x0F00) &&
+           dev_id_base != (SDIO_DEVICE_ID_ATHEROS_QCA9379 & 0x0F00)) {
                ret = -ENODEV;
                ath10k_err(ar, "unsupported device id %u (0x%x)\n",
                           dev_id_base, id->device);
@@ -2656,6 +2658,7 @@ static void ath10k_sdio_remove(struct sdio_func *func)
 static const struct sdio_device_id ath10k_sdio_devices[] = {
        {SDIO_DEVICE(SDIO_VENDOR_ID_ATHEROS, SDIO_DEVICE_ID_ATHEROS_AR6005)},
        {SDIO_DEVICE(SDIO_VENDOR_ID_ATHEROS, SDIO_DEVICE_ID_ATHEROS_QCA9377)},
+       {SDIO_DEVICE(SDIO_VENDOR_ID_ATHEROS, SDIO_DEVICE_ID_ATHEROS_QCA9379)},
        {},
 };
 
diff --git a/drivers/net/wireless/ath/ath10k/targaddrs.h 
b/drivers/net/wireless/ath/ath10k/targaddrs.h
index ec556bb88d65..71782b153e75 100644
--- a/drivers/net/wireless/ath/ath10k/targaddrs.h
+++ b/drivers/net/wireless/ath/ath10k/targaddrs.h
@@ -481,6 +481,9 @@ struct host_interest {
 #define QCA9377_BOARD_DATA_SZ     QCA6174_BOARD_DATA_SZ
 #define QCA9377_BOARD_EXT_DATA_SZ 0
 
+#define QCA9379_BOARD_DATA_SZ     QCA6174_BOARD_DATA_SZ
+#define QCA9379_BOARD_EXT_DATA_SZ 0
+
 #define QCA99X0_BOARD_DATA_SZ    12288
 #define QCA99X0_BOARD_EXT_DATA_SZ 0
 
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
index 7fada7a714fe..181a284862d0 100644
--- a/include/linux/mmc/sdio_ids.h
+++ b/include/linux/mmc/sdio_ids.h
@@ -52,6 +52,7 @@
 #define SDIO_DEVICE_ID_ATHEROS_AR6004_19       0x0419
 #define SDIO_DEVICE_ID_ATHEROS_AR6005          0x050A
 #define SDIO_DEVICE_ID_ATHEROS_QCA9377         0x0701
+#define SDIO_DEVICE_ID_ATHEROS_QCA9379         0x0801
 
 #define SDIO_VENDOR_ID_BROADCOM                        0x02d0
 #define SDIO_DEVICE_ID_BROADCOM_NINTENDO_WII   0x044b
-- 
2.44.0


Reply via email to