OSDN Git Service

ath11k: Choose MSI config based on HW revision
authorManikanta Pubbisetty <quic_mpubbise@quicinc.com>
Fri, 1 Apr 2022 11:53:08 +0000 (14:53 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Tue, 5 Apr 2022 08:05:48 +0000 (11:05 +0300)
Instead of selecting MSI config based on magic numbers, make
the assignment based on HW revision. The logic is similar to
the selection of HW params. This improves readability of the
code and also simplifies new additions.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00192-QCAHKSWPL_SILICONZ-1

Signed-off-by: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20220328055714.6449-4-quic_mpubbise@quicinc.com
drivers/net/wireless/ath/ath11k/pci.c
drivers/net/wireless/ath/ath11k/pci.h
drivers/net/wireless/ath/ath11k/pcic.c
drivers/net/wireless/ath/ath11k/pcic.h

index bffbcac..ab6572b 100644 (file)
@@ -43,28 +43,6 @@ static const struct ath11k_bus_params ath11k_pci_bus_params = {
        .fixed_mem_region = false,
 };
 
-static const struct ath11k_msi_config ath11k_msi_config[] = {
-       {
-               .total_vectors = 32,
-               .total_users = 4,
-               .users = (struct ath11k_msi_user[]) {
-                       { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
-                       { .name = "CE", .num_vectors = 10, .base_vector = 3 },
-                       { .name = "WAKE", .num_vectors = 1, .base_vector = 13 },
-                       { .name = "DP", .num_vectors = 18, .base_vector = 14 },
-               },
-       },
-       {
-               .total_vectors = 16,
-               .total_users = 3,
-               .users = (struct ath11k_msi_user[]) {
-                       { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
-                       { .name = "CE", .num_vectors = 5, .base_vector = 3 },
-                       { .name = "DP", .num_vectors = 8, .base_vector = 8 },
-               },
-       },
-};
-
 static const struct ath11k_msi_config msi_config_one_msi = {
        .total_vectors = 1,
        .total_users = 4,
@@ -667,10 +645,8 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
                        ret = -EOPNOTSUPP;
                        goto err_pci_free_region;
                }
-               ab_pci->msi_config = &ath11k_msi_config[0];
                break;
        case QCN9074_DEVICE_ID:
-               ab_pci->msi_config = &ath11k_msi_config[1];
                ab->bus_params.static_window_map = true;
                ab->hw_rev = ATH11K_HW_QCN9074_HW10;
                break;
@@ -700,7 +676,6 @@ unsupported_wcn6855_soc:
                        ret = -EOPNOTSUPP;
                        goto err_pci_free_region;
                }
-               ab_pci->msi_config = &ath11k_msi_config[0];
                break;
        default:
                dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n",
@@ -709,6 +684,12 @@ unsupported_wcn6855_soc:
                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);
+               goto err_pci_free_region;
+       }
+
        ret = ath11k_pci_alloc_msi(ab_pci);
        if (ret) {
                ath11k_err(ab, "failed to enable msi: %d\n", ret);
index 038e415..7e225de 100644 (file)
@@ -63,6 +63,7 @@ struct ath11k_msi_config {
        int total_vectors;
        int total_users;
        struct ath11k_msi_user *users;
+       u16 hw_rev;
 };
 
 enum ath11k_pci_flags {
index 391c308..eab1534 100644 (file)
@@ -63,6 +63,76 @@ static const char *irq_name[ATH11K_IRQ_NUM_MAX] = {
        "tcl2host-status-ring",
 };
 
+static const struct ath11k_msi_config ath11k_msi_config[] = {
+       {
+               .total_vectors = 32,
+               .total_users = 4,
+               .users = (struct ath11k_msi_user[]) {
+                       { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
+                       { .name = "CE", .num_vectors = 10, .base_vector = 3 },
+                       { .name = "WAKE", .num_vectors = 1, .base_vector = 13 },
+                       { .name = "DP", .num_vectors = 18, .base_vector = 14 },
+               },
+               .hw_rev = ATH11K_HW_QCA6390_HW20,
+       },
+       {
+               .total_vectors = 16,
+               .total_users = 3,
+               .users = (struct ath11k_msi_user[]) {
+                       { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
+                       { .name = "CE", .num_vectors = 5, .base_vector = 3 },
+                       { .name = "DP", .num_vectors = 8, .base_vector = 8 },
+               },
+               .hw_rev = ATH11K_HW_QCN9074_HW10,
+       },
+       {
+               .total_vectors = 32,
+               .total_users = 4,
+               .users = (struct ath11k_msi_user[]) {
+                       { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
+                       { .name = "CE", .num_vectors = 10, .base_vector = 3 },
+                       { .name = "WAKE", .num_vectors = 1, .base_vector = 13 },
+                       { .name = "DP", .num_vectors = 18, .base_vector = 14 },
+               },
+               .hw_rev = ATH11K_HW_WCN6855_HW20,
+       },
+       {
+               .total_vectors = 32,
+               .total_users = 4,
+               .users = (struct ath11k_msi_user[]) {
+                       { .name = "MHI", .num_vectors = 3, .base_vector = 0 },
+                       { .name = "CE", .num_vectors = 10, .base_vector = 3 },
+                       { .name = "WAKE", .num_vectors = 1, .base_vector = 13 },
+                       { .name = "DP", .num_vectors = 18, .base_vector = 14 },
+               },
+               .hw_rev = ATH11K_HW_WCN6855_HW21,
+       },
+};
+
+int ath11k_pcic_init_msi_config(struct ath11k_base *ab)
+{
+       struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
+       const struct ath11k_msi_config *msi_config;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ath11k_msi_config); i++) {
+               msi_config = &ath11k_msi_config[i];
+
+               if (msi_config->hw_rev == ab->hw_rev)
+                       break;
+       }
+
+       if (i == ARRAY_SIZE(ath11k_msi_config)) {
+               ath11k_err(ab, "failed to fetch msi config, unsupported hw version: 0x%x\n",
+                          ab->hw_rev);
+               return -EINVAL;
+       }
+
+       ab_pci->msi_config = msi_config;
+       return 0;
+}
+EXPORT_SYMBOL(ath11k_pcic_init_msi_config);
+
 void ath11k_pcic_aspm_restore(struct ath11k_pci *ab_pci)
 {
        if (test_and_clear_bit(ATH11K_PCI_ASPM_RESTORE, &ab_pci->flags))
index 6780f7e..d5fe315 100644 (file)
@@ -50,4 +50,5 @@ int ath11k_get_user_msi_assignment(struct ath11k_base *ab, char *user_name,
 void ath11k_pcic_aspm_restore(struct ath11k_pci *ab_pci);
 int ath11k_pcic_set_irq_affinity_hint(struct ath11k_pci *ab_pci,
                                      const struct cpumask *m);
+int ath11k_pcic_init_msi_config(struct ath11k_base *ab);
 #endif