wifi: ath11k: move pci.ops registration ahead
authorBaochen Qiang <quic_bqiang@quicinc.com>
Tue, 9 Jan 2024 02:13:35 +0000 (10:13 +0800)
committerKalle Valo <quic_kvalo@quicinc.com>
Thu, 15 Feb 2024 11:23:50 +0000 (13:23 +0200)
In ath11k_pci_probe() there is a switch statement that, based
upon the PCI device ID, assigns pci_ops. After the switch,
ath11k_pcic_register_pci_ops() is called to register the pci_ops.

Unfortunately, this registration is too late if any of the cases
in the switch need to perform operations that require the pci_ops
to already be registered. In particular, an upcoming patch for
QCA2066 needs to call ath11k_pcic_read32().

To address this issue, call ath11k_pcic_register_pci_ops() from
each case instead of doing so after the switch. That way the ops
will be registered if any subsequent operations within the case
processing require the ops to be present.

Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3

Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240109021336.4143-2-quic_bqiang@quicinc.com
drivers/net/wireless/ath/ath11k/pci.c

index d667d5e06a66bc73f6da015e42b022e4a5230d28..022d695be00f1daeb207c2bead872b9d2aae16bd 100644 (file)
@@ -742,7 +742,6 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
        struct ath11k_base *ab;
        struct ath11k_pci *ab_pci;
        u32 soc_hw_version_major, soc_hw_version_minor, addr;
-       const struct ath11k_pci_ops *pci_ops;
        int ret;
 
        ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI);
@@ -788,6 +787,12 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
 
        switch (pci_dev->device) {
        case QCA6390_DEVICE_ID:
+               ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qca6390);
+               if (ret) {
+                       ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
+                       goto err_pci_free_region;
+               }
+
                ath11k_pci_read_hw_version(ab, &soc_hw_version_major,
                                           &soc_hw_version_minor);
                switch (soc_hw_version_major) {
@@ -801,13 +806,21 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
                        goto err_pci_free_region;
                }
 
-               pci_ops = &ath11k_pci_ops_qca6390;
                break;
        case QCN9074_DEVICE_ID:
-               pci_ops = &ath11k_pci_ops_qcn9074;
+               ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qcn9074);
+               if (ret) {
+                       ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
+                       goto err_pci_free_region;
+               }
                ab->hw_rev = ATH11K_HW_QCN9074_HW10;
                break;
        case WCN6855_DEVICE_ID:
+               ret = ath11k_pcic_register_pci_ops(ab, &ath11k_pci_ops_qca6390);
+               if (ret) {
+                       ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
+                       goto err_pci_free_region;
+               }
                ab->id.bdf_search = ATH11K_BDF_SEARCH_BUS_AND_BOARD;
                ath11k_pci_read_hw_version(ab, &soc_hw_version_major,
                                           &soc_hw_version_minor);
@@ -834,7 +847,6 @@ unsupported_wcn6855_soc:
                        goto err_pci_free_region;
                }
 
-               pci_ops = &ath11k_pci_ops_qca6390;
                break;
        default:
                dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n",
@@ -843,12 +855,6 @@ unsupported_wcn6855_soc:
                goto err_pci_free_region;
        }
 
-       ret = ath11k_pcic_register_pci_ops(ab, pci_ops);
-       if (ret) {
-               ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
-               goto err_pci_free_region;
-       }
-
        ret = ath11k_pcic_init_msi_config(ab);
        if (ret) {
                ath11k_err(ab, "failed to init msi config: %d\n", ret);