mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-01 16:27:08 +08:00
185 lines
5.9 KiB
Diff
185 lines
5.9 KiB
Diff
From 8d06b8023ace027dc31a9cb3c85c3c8fe83289c5 Mon Sep 17 00:00:00 2001
|
|
From: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
|
|
Date: Fri, 1 Apr 2022 14:53:08 +0300
|
|
Subject: [PATCH] ath11k: Choose MSI config based on HW revision
|
|
|
|
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 | 31 +++---------
|
|
drivers/net/wireless/ath/ath11k/pci.h | 1 +
|
|
drivers/net/wireless/ath/ath11k/pcic.c | 70 ++++++++++++++++++++++++++
|
|
drivers/net/wireless/ath/ath11k/pcic.h | 1 +
|
|
4 files changed, 78 insertions(+), 25 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/pci.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/pci.c
|
|
@@ -43,28 +43,6 @@ static const struct ath11k_bus_params at
|
|
.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_d
|
|
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);
|
|
--- a/drivers/net/wireless/ath/ath11k/pci.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/pci.h
|
|
@@ -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 {
|
|
--- a/drivers/net/wireless/ath/ath11k/pcic.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/pcic.c
|
|
@@ -63,6 +63,76 @@ static const char *irq_name[ATH11K_IRQ_N
|
|
"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))
|
|
--- a/drivers/net/wireless/ath/ath11k/pcic.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/pcic.h
|
|
@@ -50,4 +50,5 @@ int ath11k_get_user_msi_assignment(struc
|
|
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
|