qtnfmac_pcie: check for correct CHIP ID at pcie probe
authorIgor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Mon, 24 Sep 2018 22:15:14 +0000 (15:15 -0700)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 1 Oct 2018 15:40:34 +0000 (18:40 +0300)
Make sure that wifi device is of supported variant by checking it's CHIP ID
before completing a probe sequence.

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c
drivers/net/wireless/quantenna/qtnfmac/qtn_hw_ids.h

index 6d72a9d..5aca12a 100644 (file)
@@ -1090,6 +1090,26 @@ static void qtnf_pearl_reclaim_tasklet_fn(unsigned long data)
        qtnf_en_txdone_irq(ps);
 }
 
+static int qtnf_pearl_check_chip_id(struct qtnf_pcie_pearl_state *ps)
+{
+       unsigned int chipid;
+
+       chipid = qtnf_chip_id_get(ps->base.sysctl_bar);
+
+       switch (chipid) {
+       case QTN_CHIP_ID_PEARL:
+       case QTN_CHIP_ID_PEARL_B:
+       case QTN_CHIP_ID_PEARL_C:
+               pr_info("chip ID is 0x%x\n", chipid);
+               break;
+       default:
+               pr_err("incorrect chip ID 0x%x\n", chipid);
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
 static int qtnf_pcie_pearl_probe(struct pci_dev *pdev,
                                 const struct pci_device_id *id)
 {
@@ -1130,6 +1150,10 @@ static int qtnf_pcie_pearl_probe(struct pci_dev *pdev,
        qtnf_pcie_init_shm_ipc(&ps->base, &ps->bda->bda_shm_reg1,
                               &ps->bda->bda_shm_reg2, &ipc_int);
 
+       ret = qtnf_pearl_check_chip_id(ps);
+       if (ret)
+               goto error;
+
        ret = qtnf_pcie_pearl_init_xfer(ps);
        if (ret) {
                pr_err("PCIE xfer init failed\n");
index c4ad40d..1fe798a 100644 (file)
 
 #define        PCIE_DEVICE_ID_QTN_PEARL        (0x0008)
 
+#define QTN_REG_SYS_CTRL_CSR           0x14
+#define QTN_CHIP_ID_MASK               0xF0
+#define QTN_CHIP_ID_TOPAZ              0x40
+#define QTN_CHIP_ID_PEARL              0x50
+#define QTN_CHIP_ID_PEARL_B            0x60
+#define QTN_CHIP_ID_PEARL_C            0x70
+
 /* FW names */
 
 #define QTN_PCI_PEARL_FW_NAME          "qtn/fmac_qsr10g.img"
 
+static inline unsigned int qtnf_chip_id_get(const void __iomem *regs_base)
+{
+       u32 board_rev = readl(regs_base + QTN_REG_SYS_CTRL_CSR);
+
+       return board_rev & QTN_CHIP_ID_MASK;
+}
+
 #endif /* _QTN_HW_IDS_H_ */