Skip to content

Commit 6711b2a

Browse files
Kang Yangkvalo
authored andcommitted
wifi: ath12k: refactor multiple MSI vector implementation
This is to prepare for one MSI vector support. IRQ enable and disable of CE and DP are done only in case of multiple MSI vectors. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4 Signed-off-by: Kang Yang <[email protected]> Acked-by: Jeff Johnson <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 1f1f7d5 commit 6711b2a

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

drivers/net/wireless/ath/ath12k/pci.c

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -356,16 +356,30 @@ static void ath12k_pci_free_irq(struct ath12k_base *ab)
356356

357357
static void ath12k_pci_ce_irq_enable(struct ath12k_base *ab, u16 ce_id)
358358
{
359+
struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
359360
u32 irq_idx;
360361

362+
/* In case of one MSI vector, we handle irq enable/disable in a
363+
* uniform way since we only have one irq
364+
*/
365+
if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
366+
return;
367+
361368
irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_id;
362369
enable_irq(ab->irq_num[irq_idx]);
363370
}
364371

365372
static void ath12k_pci_ce_irq_disable(struct ath12k_base *ab, u16 ce_id)
366373
{
374+
struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
367375
u32 irq_idx;
368376

377+
/* In case of one MSI vector, we handle irq enable/disable in a
378+
* uniform way since we only have one irq
379+
*/
380+
if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
381+
return;
382+
369383
irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_id;
370384
disable_irq_nosync(ab->irq_num[irq_idx]);
371385
}
@@ -425,8 +439,15 @@ static irqreturn_t ath12k_pci_ce_interrupt_handler(int irq, void *arg)
425439

426440
static void ath12k_pci_ext_grp_disable(struct ath12k_ext_irq_grp *irq_grp)
427441
{
442+
struct ath12k_pci *ab_pci = ath12k_pci_priv(irq_grp->ab);
428443
int i;
429444

445+
/* In case of one MSI vector, we handle irq enable/disable
446+
* in a uniform way since we only have one irq
447+
*/
448+
if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
449+
return;
450+
430451
for (i = 0; i < irq_grp->num_irq; i++)
431452
disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
432453
}
@@ -449,8 +470,15 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
449470

450471
static void ath12k_pci_ext_grp_enable(struct ath12k_ext_irq_grp *irq_grp)
451472
{
473+
struct ath12k_pci *ab_pci = ath12k_pci_priv(irq_grp->ab);
452474
int i;
453475

476+
/* In case of one MSI vector, we handle irq enable/disable in a
477+
* uniform way since we only have one irq
478+
*/
479+
if (!test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
480+
return;
481+
454482
for (i = 0; i < irq_grp->num_irq; i++)
455483
enable_irq(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
456484
}
@@ -511,6 +539,7 @@ static irqreturn_t ath12k_pci_ext_interrupt_handler(int irq, void *arg)
511539

512540
static int ath12k_pci_ext_irq_config(struct ath12k_base *ab)
513541
{
542+
struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
514543
int i, j, ret, num_vectors = 0;
515544
u32 user_base_data = 0, base_vector = 0;
516545

@@ -556,23 +585,23 @@ static int ath12k_pci_ext_irq_config(struct ath12k_base *ab)
556585

557586
irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
558587
ret = request_irq(irq, ath12k_pci_ext_interrupt_handler,
559-
IRQF_SHARED,
588+
ab_pci->irq_flags,
560589
"DP_EXT_IRQ", irq_grp);
561590
if (ret) {
562591
ath12k_err(ab, "failed request irq %d: %d\n",
563592
vector, ret);
564593
return ret;
565594
}
566-
567-
disable_irq_nosync(ab->irq_num[irq_idx]);
568595
}
596+
ath12k_pci_ext_grp_disable(irq_grp);
569597
}
570598

571599
return 0;
572600
}
573601

574602
static int ath12k_pci_config_irq(struct ath12k_base *ab)
575603
{
604+
struct ath12k_pci *ab_pci = ath12k_pci_priv(ab);
576605
struct ath12k_ce_pipe *ce_pipe;
577606
u32 msi_data_start;
578607
u32 msi_data_count, msi_data_idx;
@@ -601,7 +630,7 @@ static int ath12k_pci_config_irq(struct ath12k_base *ab)
601630
tasklet_setup(&ce_pipe->intr_tq, ath12k_pci_ce_tasklet);
602631

603632
ret = request_irq(irq, ath12k_pci_ce_interrupt_handler,
604-
IRQF_SHARED, irq_name[irq_idx],
633+
ab_pci->irq_flags, irq_name[irq_idx],
605634
ce_pipe);
606635
if (ret) {
607636
ath12k_err(ab, "failed to request irq %d: %d\n",
@@ -692,6 +721,9 @@ static int ath12k_pci_msi_alloc(struct ath12k_pci *ab_pci)
692721
return -EINVAL;
693722
else
694723
return num_vectors;
724+
} else {
725+
set_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags);
726+
ab_pci->irq_flags = IRQF_SHARED;
695727
}
696728

697729
ath12k_pci_msi_disable(ab_pci);
@@ -924,11 +956,11 @@ int ath12k_pci_get_user_msi_assignment(struct ath12k_base *ab, char *user_name,
924956
for (idx = 0; idx < msi_config->total_users; idx++) {
925957
if (strcmp(user_name, msi_config->users[idx].name) == 0) {
926958
*num_vectors = msi_config->users[idx].num_vectors;
927-
*user_base_data = msi_config->users[idx].base_vector
928-
+ ab_pci->msi_ep_base_data;
929-
*base_vector = msi_config->users[idx].base_vector;
959+
*base_vector = msi_config->users[idx].base_vector;
960+
*user_base_data = *base_vector + ab_pci->msi_ep_base_data;
930961

931-
ath12k_dbg(ab, ATH12K_DBG_PCI, "Assign MSI to user: %s, num_vectors: %d, user_base_data: %u, base_vector: %u\n",
962+
ath12k_dbg(ab, ATH12K_DBG_PCI,
963+
"Assign MSI to user: %s, num_vectors: %d, user_base_data: %u, base_vector: %u\n",
932964
user_name, *num_vectors, *user_base_data,
933965
*base_vector);
934966

drivers/net/wireless/ath/ath12k/pci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ enum ath12k_pci_flags {
8484
ATH12K_PCI_FLAG_INIT_DONE,
8585
ATH12K_PCI_FLAG_IS_MSI_64,
8686
ATH12K_PCI_ASPM_RESTORE,
87+
ATH12K_PCI_FLAG_MULTI_MSI_VECTORS,
8788
};
8889

8990
struct ath12k_pci_ops {
@@ -108,6 +109,7 @@ struct ath12k_pci {
108109
/* enum ath12k_pci_flags */
109110
unsigned long flags;
110111
u16 link_ctl;
112+
unsigned long irq_flags;
111113
const struct ath12k_pci_ops *pci_ops;
112114
};
113115

0 commit comments

Comments
 (0)