@@ -356,16 +356,30 @@ static void ath12k_pci_free_irq(struct ath12k_base *ab)
356
356
357
357
static void ath12k_pci_ce_irq_enable (struct ath12k_base * ab , u16 ce_id )
358
358
{
359
+ struct ath12k_pci * ab_pci = ath12k_pci_priv (ab );
359
360
u32 irq_idx ;
360
361
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
+
361
368
irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_id ;
362
369
enable_irq (ab -> irq_num [irq_idx ]);
363
370
}
364
371
365
372
static void ath12k_pci_ce_irq_disable (struct ath12k_base * ab , u16 ce_id )
366
373
{
374
+ struct ath12k_pci * ab_pci = ath12k_pci_priv (ab );
367
375
u32 irq_idx ;
368
376
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
+
369
383
irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_id ;
370
384
disable_irq_nosync (ab -> irq_num [irq_idx ]);
371
385
}
@@ -425,8 +439,15 @@ static irqreturn_t ath12k_pci_ce_interrupt_handler(int irq, void *arg)
425
439
426
440
static void ath12k_pci_ext_grp_disable (struct ath12k_ext_irq_grp * irq_grp )
427
441
{
442
+ struct ath12k_pci * ab_pci = ath12k_pci_priv (irq_grp -> ab );
428
443
int i ;
429
444
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
+
430
451
for (i = 0 ; i < irq_grp -> num_irq ; i ++ )
431
452
disable_irq_nosync (irq_grp -> ab -> irq_num [irq_grp -> irqs [i ]]);
432
453
}
@@ -449,8 +470,15 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
449
470
450
471
static void ath12k_pci_ext_grp_enable (struct ath12k_ext_irq_grp * irq_grp )
451
472
{
473
+ struct ath12k_pci * ab_pci = ath12k_pci_priv (irq_grp -> ab );
452
474
int i ;
453
475
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
+
454
482
for (i = 0 ; i < irq_grp -> num_irq ; i ++ )
455
483
enable_irq (irq_grp -> ab -> irq_num [irq_grp -> irqs [i ]]);
456
484
}
@@ -511,6 +539,7 @@ static irqreturn_t ath12k_pci_ext_interrupt_handler(int irq, void *arg)
511
539
512
540
static int ath12k_pci_ext_irq_config (struct ath12k_base * ab )
513
541
{
542
+ struct ath12k_pci * ab_pci = ath12k_pci_priv (ab );
514
543
int i , j , ret , num_vectors = 0 ;
515
544
u32 user_base_data = 0 , base_vector = 0 ;
516
545
@@ -556,23 +585,23 @@ static int ath12k_pci_ext_irq_config(struct ath12k_base *ab)
556
585
557
586
irq_set_status_flags (irq , IRQ_DISABLE_UNLAZY );
558
587
ret = request_irq (irq , ath12k_pci_ext_interrupt_handler ,
559
- IRQF_SHARED ,
588
+ ab_pci -> irq_flags ,
560
589
"DP_EXT_IRQ" , irq_grp );
561
590
if (ret ) {
562
591
ath12k_err (ab , "failed request irq %d: %d\n" ,
563
592
vector , ret );
564
593
return ret ;
565
594
}
566
-
567
- disable_irq_nosync (ab -> irq_num [irq_idx ]);
568
595
}
596
+ ath12k_pci_ext_grp_disable (irq_grp );
569
597
}
570
598
571
599
return 0 ;
572
600
}
573
601
574
602
static int ath12k_pci_config_irq (struct ath12k_base * ab )
575
603
{
604
+ struct ath12k_pci * ab_pci = ath12k_pci_priv (ab );
576
605
struct ath12k_ce_pipe * ce_pipe ;
577
606
u32 msi_data_start ;
578
607
u32 msi_data_count , msi_data_idx ;
@@ -601,7 +630,7 @@ static int ath12k_pci_config_irq(struct ath12k_base *ab)
601
630
tasklet_setup (& ce_pipe -> intr_tq , ath12k_pci_ce_tasklet );
602
631
603
632
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 ],
605
634
ce_pipe );
606
635
if (ret ) {
607
636
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)
692
721
return - EINVAL ;
693
722
else
694
723
return num_vectors ;
724
+ } else {
725
+ set_bit (ATH12K_PCI_FLAG_MULTI_MSI_VECTORS , & ab_pci -> flags );
726
+ ab_pci -> irq_flags = IRQF_SHARED ;
695
727
}
696
728
697
729
ath12k_pci_msi_disable (ab_pci );
@@ -924,11 +956,11 @@ int ath12k_pci_get_user_msi_assignment(struct ath12k_base *ab, char *user_name,
924
956
for (idx = 0 ; idx < msi_config -> total_users ; idx ++ ) {
925
957
if (strcmp (user_name , msi_config -> users [idx ].name ) == 0 ) {
926
958
* 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 ;
930
961
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" ,
932
964
user_name , * num_vectors , * user_base_data ,
933
965
* base_vector );
934
966
0 commit comments