@@ -891,14 +891,14 @@ static int hclge_query_pf_resource(struct hclge_dev *hdev)
891
891
hdev -> pkt_buf_size = __le16_to_cpu (req -> buf_size ) << HCLGE_BUF_UNIT_S ;
892
892
893
893
if (hnae3_dev_roce_supported (hdev )) {
894
- hdev -> num_roce_msix =
894
+ hdev -> num_roce_msi =
895
895
hnae_get_field (__le16_to_cpu (req -> pf_intr_vector_number ),
896
896
HCLGE_PF_VEC_NUM_M , HCLGE_PF_VEC_NUM_S );
897
897
898
898
/* PF should have NIC vectors and Roce vectors,
899
899
* NIC vectors are queued before Roce vectors.
900
900
*/
901
- hdev -> num_msi = hdev -> num_roce_msix + HCLGE_ROCE_VECTOR_OFFSET ;
901
+ hdev -> num_msi = hdev -> num_roce_msi + HCLGE_ROCE_VECTOR_OFFSET ;
902
902
} else {
903
903
hdev -> num_msi =
904
904
hnae_get_field (__le16_to_cpu (req -> pf_intr_vector_number ),
@@ -1950,7 +1950,7 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
1950
1950
struct hnae3_handle * roce = & vport -> roce ;
1951
1951
struct hnae3_handle * nic = & vport -> nic ;
1952
1952
1953
- roce -> rinfo .num_vectors = vport -> back -> num_roce_msix ;
1953
+ roce -> rinfo .num_vectors = vport -> back -> num_roce_msi ;
1954
1954
1955
1955
if (vport -> back -> num_msi_left < vport -> roce .rinfo .num_vectors ||
1956
1956
vport -> back -> num_msi_left == 0 )
@@ -1968,67 +1968,47 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
1968
1968
return 0 ;
1969
1969
}
1970
1970
1971
- static int hclge_init_msix (struct hclge_dev * hdev )
1971
+ static int hclge_init_msi (struct hclge_dev * hdev )
1972
1972
{
1973
1973
struct pci_dev * pdev = hdev -> pdev ;
1974
- int ret , i ;
1975
-
1976
- hdev -> msix_entries = devm_kcalloc (& pdev -> dev , hdev -> num_msi ,
1977
- sizeof (struct msix_entry ),
1978
- GFP_KERNEL );
1979
- if (!hdev -> msix_entries )
1980
- return - ENOMEM ;
1981
-
1982
- hdev -> vector_status = devm_kcalloc (& pdev -> dev , hdev -> num_msi ,
1983
- sizeof (u16 ), GFP_KERNEL );
1984
- if (!hdev -> vector_status )
1985
- return - ENOMEM ;
1974
+ int vectors ;
1975
+ int i ;
1986
1976
1987
- for (i = 0 ; i < hdev -> num_msi ; i ++ ) {
1988
- hdev -> msix_entries [i ].entry = i ;
1989
- hdev -> vector_status [i ] = HCLGE_INVALID_VPORT ;
1977
+ vectors = pci_alloc_irq_vectors (pdev , 1 , hdev -> num_msi ,
1978
+ PCI_IRQ_MSI | PCI_IRQ_MSIX );
1979
+ if (vectors < 0 ) {
1980
+ dev_err (& pdev -> dev ,
1981
+ "failed(%d) to allocate MSI/MSI-X vectors\n" ,
1982
+ vectors );
1983
+ return vectors ;
1990
1984
}
1985
+ if (vectors < hdev -> num_msi )
1986
+ dev_warn (& hdev -> pdev -> dev ,
1987
+ "requested %d MSI/MSI-X, but allocated %d MSI/MSI-X\n" ,
1988
+ hdev -> num_msi , vectors );
1991
1989
1992
- hdev -> num_msi_left = hdev -> num_msi ;
1993
- hdev -> base_msi_vector = hdev -> pdev -> irq ;
1990
+ hdev -> num_msi = vectors ;
1991
+ hdev -> num_msi_left = vectors ;
1992
+ hdev -> base_msi_vector = pdev -> irq ;
1994
1993
hdev -> roce_base_vector = hdev -> base_msi_vector +
1995
1994
HCLGE_ROCE_VECTOR_OFFSET ;
1996
1995
1997
- ret = pci_enable_msix_range (hdev -> pdev , hdev -> msix_entries ,
1998
- hdev -> num_msi , hdev -> num_msi );
1999
- if (ret < 0 ) {
2000
- dev_info (& hdev -> pdev -> dev ,
2001
- "MSI-X vector alloc failed: %d\n" , ret );
2002
- return ret ;
2003
- }
2004
-
2005
- return 0 ;
2006
- }
2007
-
2008
- static int hclge_init_msi (struct hclge_dev * hdev )
2009
- {
2010
- struct pci_dev * pdev = hdev -> pdev ;
2011
- int vectors ;
2012
- int i ;
2013
-
2014
1996
hdev -> vector_status = devm_kcalloc (& pdev -> dev , hdev -> num_msi ,
2015
1997
sizeof (u16 ), GFP_KERNEL );
2016
- if (!hdev -> vector_status )
1998
+ if (!hdev -> vector_status ) {
1999
+ pci_free_irq_vectors (pdev );
2017
2000
return - ENOMEM ;
2001
+ }
2018
2002
2019
2003
for (i = 0 ; i < hdev -> num_msi ; i ++ )
2020
2004
hdev -> vector_status [i ] = HCLGE_INVALID_VPORT ;
2021
2005
2022
- vectors = pci_alloc_irq_vectors (pdev , 1 , hdev -> num_msi , PCI_IRQ_MSI );
2023
- if (vectors < 0 ) {
2024
- dev_err (& pdev -> dev , "MSI vectors enable failed %d\n" , vectors );
2025
- return - EINVAL ;
2006
+ hdev -> vector_irq = devm_kcalloc (& pdev -> dev , hdev -> num_msi ,
2007
+ sizeof (int ), GFP_KERNEL );
2008
+ if (!hdev -> vector_irq ) {
2009
+ pci_free_irq_vectors (pdev );
2010
+ return - ENOMEM ;
2026
2011
}
2027
- hdev -> num_msi = vectors ;
2028
- hdev -> num_msi_left = vectors ;
2029
- hdev -> base_msi_vector = pdev -> irq ;
2030
- hdev -> roce_base_vector = hdev -> base_msi_vector +
2031
- HCLGE_ROCE_VECTOR_OFFSET ;
2032
2012
2033
2013
return 0 ;
2034
2014
}
@@ -2704,6 +2684,7 @@ static int hclge_get_vector(struct hnae3_handle *handle, u16 vector_num,
2704
2684
vport -> vport_id *
2705
2685
HCLGE_VECTOR_VF_OFFSET ;
2706
2686
hdev -> vector_status [i ] = vport -> vport_id ;
2687
+ hdev -> vector_irq [i ] = vector -> vector ;
2707
2688
2708
2689
vector ++ ;
2709
2690
alloc ++ ;
@@ -2722,15 +2703,10 @@ static int hclge_get_vector_index(struct hclge_dev *hdev, int vector)
2722
2703
{
2723
2704
int i ;
2724
2705
2725
- for (i = 0 ; i < hdev -> num_msi ; i ++ ) {
2726
- if (hdev -> msix_entries ) {
2727
- if (vector == hdev -> msix_entries [i ].vector )
2728
- return i ;
2729
- } else {
2730
- if (vector == (hdev -> base_msi_vector + i ))
2731
- return i ;
2732
- }
2733
- }
2706
+ for (i = 0 ; i < hdev -> num_msi ; i ++ )
2707
+ if (vector == hdev -> vector_irq [i ])
2708
+ return i ;
2709
+
2734
2710
return - EINVAL ;
2735
2711
}
2736
2712
@@ -4664,14 +4640,7 @@ static void hclge_pci_uninit(struct hclge_dev *hdev)
4664
4640
{
4665
4641
struct pci_dev * pdev = hdev -> pdev ;
4666
4642
4667
- if (hdev -> flag & HCLGE_FLAG_USE_MSIX ) {
4668
- pci_disable_msix (pdev );
4669
- devm_kfree (& pdev -> dev , hdev -> msix_entries );
4670
- hdev -> msix_entries = NULL ;
4671
- } else {
4672
- pci_disable_msi (pdev );
4673
- }
4674
-
4643
+ pci_free_irq_vectors (pdev );
4675
4644
pci_clear_master (pdev );
4676
4645
pci_release_mem_regions (pdev );
4677
4646
pci_disable_device (pdev );
@@ -4689,7 +4658,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4689
4658
goto err_hclge_dev ;
4690
4659
}
4691
4660
4692
- hdev -> flag |= HCLGE_FLAG_USE_MSIX ;
4693
4661
hdev -> pdev = pdev ;
4694
4662
hdev -> ae_dev = ae_dev ;
4695
4663
hdev -> reset_type = HNAE3_NONE_RESET ;
@@ -4726,12 +4694,9 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4726
4694
return ret ;
4727
4695
}
4728
4696
4729
- if (hdev -> flag & HCLGE_FLAG_USE_MSIX )
4730
- ret = hclge_init_msix (hdev );
4731
- else
4732
- ret = hclge_init_msi (hdev );
4697
+ ret = hclge_init_msi (hdev );
4733
4698
if (ret ) {
4734
- dev_err (& pdev -> dev , "Init msix/msi error, ret = %d.\n" , ret );
4699
+ dev_err (& pdev -> dev , "Init MSI/MSI-X error, ret = %d.\n" , ret );
4735
4700
return ret ;
4736
4701
}
4737
4702
0 commit comments