@@ -1148,7 +1148,7 @@ mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc)
1148
1148
/* TMs are on msix_index == 0 */
1149
1149
if (reply_q -> msix_index == 0 )
1150
1150
continue ;
1151
- synchronize_irq (reply_q -> vector );
1151
+ synchronize_irq (pci_irq_vector ( ioc -> pdev , reply_q -> msix_index ) );
1152
1152
}
1153
1153
}
1154
1154
@@ -1837,11 +1837,8 @@ _base_free_irq(struct MPT3SAS_ADAPTER *ioc)
1837
1837
1838
1838
list_for_each_entry_safe (reply_q , next , & ioc -> reply_queue_list , list ) {
1839
1839
list_del (& reply_q -> list );
1840
- if (smp_affinity_enable ) {
1841
- irq_set_affinity_hint (reply_q -> vector , NULL );
1842
- free_cpumask_var (reply_q -> affinity_hint );
1843
- }
1844
- free_irq (reply_q -> vector , reply_q );
1840
+ free_irq (pci_irq_vector (ioc -> pdev , reply_q -> msix_index ),
1841
+ reply_q );
1845
1842
kfree (reply_q );
1846
1843
}
1847
1844
}
@@ -1850,13 +1847,13 @@ _base_free_irq(struct MPT3SAS_ADAPTER *ioc)
1850
1847
* _base_request_irq - request irq
1851
1848
* @ioc: per adapter object
1852
1849
* @index: msix index into vector table
1853
- * @vector: irq vector
1854
1850
*
1855
1851
* Inserting respective reply_queue into the list.
1856
1852
*/
1857
1853
static int
1858
- _base_request_irq (struct MPT3SAS_ADAPTER * ioc , u8 index , u32 vector )
1854
+ _base_request_irq (struct MPT3SAS_ADAPTER * ioc , u8 index )
1859
1855
{
1856
+ struct pci_dev * pdev = ioc -> pdev ;
1860
1857
struct adapter_reply_queue * reply_q ;
1861
1858
int r ;
1862
1859
@@ -1868,14 +1865,6 @@ _base_request_irq(struct MPT3SAS_ADAPTER *ioc, u8 index, u32 vector)
1868
1865
}
1869
1866
reply_q -> ioc = ioc ;
1870
1867
reply_q -> msix_index = index ;
1871
- reply_q -> vector = vector ;
1872
-
1873
- if (smp_affinity_enable ) {
1874
- if (!zalloc_cpumask_var (& reply_q -> affinity_hint , GFP_KERNEL )) {
1875
- kfree (reply_q );
1876
- return - ENOMEM ;
1877
- }
1878
- }
1879
1868
1880
1869
atomic_set (& reply_q -> busy , 0 );
1881
1870
if (ioc -> msix_enable )
@@ -1884,12 +1873,11 @@ _base_request_irq(struct MPT3SAS_ADAPTER *ioc, u8 index, u32 vector)
1884
1873
else
1885
1874
snprintf (reply_q -> name , MPT_NAME_LENGTH , "%s%d" ,
1886
1875
ioc -> driver_name , ioc -> id );
1887
- r = request_irq (vector , _base_interrupt , IRQF_SHARED , reply_q -> name ,
1888
- reply_q );
1876
+ r = request_irq (pci_irq_vector ( pdev , index ), _base_interrupt ,
1877
+ IRQF_SHARED , reply_q -> name , reply_q );
1889
1878
if (r ) {
1890
1879
pr_err (MPT3SAS_FMT "unable to allocate interrupt %d!\n" ,
1891
- reply_q -> name , vector );
1892
- free_cpumask_var (reply_q -> affinity_hint );
1880
+ reply_q -> name , pci_irq_vector (pdev , index ));
1893
1881
kfree (reply_q );
1894
1882
return - EBUSY ;
1895
1883
}
@@ -1925,6 +1913,21 @@ _base_assign_reply_queues(struct MPT3SAS_ADAPTER *ioc)
1925
1913
if (!nr_msix )
1926
1914
return ;
1927
1915
1916
+ if (smp_affinity_enable ) {
1917
+ list_for_each_entry (reply_q , & ioc -> reply_queue_list , list ) {
1918
+ const cpumask_t * mask = pci_irq_get_affinity (ioc -> pdev ,
1919
+ reply_q -> msix_index );
1920
+ if (!mask ) {
1921
+ pr_warn (MPT3SAS_FMT "no affinity for msi %x\n" ,
1922
+ ioc -> name , reply_q -> msix_index );
1923
+ continue ;
1924
+ }
1925
+
1926
+ for_each_cpu (cpu , mask )
1927
+ ioc -> cpu_msix_table [cpu ] = reply_q -> msix_index ;
1928
+ }
1929
+ return ;
1930
+ }
1928
1931
cpu = cpumask_first (cpu_online_mask );
1929
1932
1930
1933
list_for_each_entry (reply_q , & ioc -> reply_queue_list , list ) {
@@ -1938,18 +1941,9 @@ _base_assign_reply_queues(struct MPT3SAS_ADAPTER *ioc)
1938
1941
group ++ ;
1939
1942
1940
1943
for (i = 0 ; i < group ; i ++ ) {
1941
- ioc -> cpu_msix_table [cpu ] = index ;
1942
- if (smp_affinity_enable )
1943
- cpumask_or (reply_q -> affinity_hint ,
1944
- reply_q -> affinity_hint , get_cpu_mask (cpu ));
1944
+ ioc -> cpu_msix_table [cpu ] = reply_q -> msix_index ;
1945
1945
cpu = cpumask_next (cpu , cpu_online_mask );
1946
1946
}
1947
- if (smp_affinity_enable )
1948
- if (irq_set_affinity_hint (reply_q -> vector ,
1949
- reply_q -> affinity_hint ))
1950
- dinitprintk (ioc , pr_info (MPT3SAS_FMT
1951
- "Err setting affinity hint to irq vector %d\n" ,
1952
- ioc -> name , reply_q -> vector ));
1953
1947
index ++ ;
1954
1948
}
1955
1949
}
@@ -1976,10 +1970,10 @@ _base_disable_msix(struct MPT3SAS_ADAPTER *ioc)
1976
1970
static int
1977
1971
_base_enable_msix (struct MPT3SAS_ADAPTER * ioc )
1978
1972
{
1979
- struct msix_entry * entries , * a ;
1980
1973
int r ;
1981
1974
int i , local_max_msix_vectors ;
1982
1975
u8 try_msix = 0 ;
1976
+ unsigned int irq_flags = PCI_IRQ_MSIX ;
1983
1977
1984
1978
if (msix_disable == -1 || msix_disable == 0 )
1985
1979
try_msix = 1 ;
@@ -1991,7 +1985,7 @@ _base_enable_msix(struct MPT3SAS_ADAPTER *ioc)
1991
1985
goto try_ioapic ;
1992
1986
1993
1987
ioc -> reply_queue_count = min_t (int , ioc -> cpu_count ,
1994
- ioc -> msix_vector_count );
1988
+ ioc -> msix_vector_count );
1995
1989
1996
1990
printk (MPT3SAS_FMT "MSI-X vectors supported: %d, no of cores"
1997
1991
": %d, max_msix_vectors: %d\n" , ioc -> name , ioc -> msix_vector_count ,
@@ -2002,56 +1996,51 @@ _base_enable_msix(struct MPT3SAS_ADAPTER *ioc)
2002
1996
else
2003
1997
local_max_msix_vectors = max_msix_vectors ;
2004
1998
2005
- if (local_max_msix_vectors > 0 ) {
1999
+ if (local_max_msix_vectors > 0 )
2006
2000
ioc -> reply_queue_count = min_t (int , local_max_msix_vectors ,
2007
2001
ioc -> reply_queue_count );
2008
- ioc -> msix_vector_count = ioc -> reply_queue_count ;
2009
- } else if (local_max_msix_vectors == 0 )
2002
+ else if (local_max_msix_vectors == 0 )
2010
2003
goto try_ioapic ;
2011
2004
2012
2005
if (ioc -> msix_vector_count < ioc -> cpu_count )
2013
2006
smp_affinity_enable = 0 ;
2014
2007
2015
- entries = kcalloc (ioc -> reply_queue_count , sizeof (struct msix_entry ),
2016
- GFP_KERNEL );
2017
- if (!entries ) {
2018
- dfailprintk (ioc , pr_info (MPT3SAS_FMT
2019
- "kcalloc failed @ at %s:%d/%s() !!!\n" ,
2020
- ioc -> name , __FILE__ , __LINE__ , __func__ ));
2021
- goto try_ioapic ;
2022
- }
2008
+ if (smp_affinity_enable )
2009
+ irq_flags |= PCI_IRQ_AFFINITY ;
2023
2010
2024
- for (i = 0 , a = entries ; i < ioc -> reply_queue_count ; i ++ , a ++ )
2025
- a -> entry = i ;
2026
-
2027
- r = pci_enable_msix_exact (ioc -> pdev , entries , ioc -> reply_queue_count );
2028
- if (r ) {
2011
+ r = pci_alloc_irq_vectors (ioc -> pdev , 1 , ioc -> reply_queue_count ,
2012
+ irq_flags );
2013
+ if (r < 0 ) {
2029
2014
dfailprintk (ioc , pr_info (MPT3SAS_FMT
2030
- "pci_enable_msix_exact failed (r=%d) !!!\n" ,
2015
+ "pci_alloc_irq_vectors failed (r=%d) !!!\n" ,
2031
2016
ioc -> name , r ));
2032
- kfree (entries );
2033
2017
goto try_ioapic ;
2034
2018
}
2035
2019
2036
2020
ioc -> msix_enable = 1 ;
2037
- for (i = 0 , a = entries ; i < ioc -> reply_queue_count ; i ++ , a ++ ) {
2038
- r = _base_request_irq (ioc , i , a -> vector );
2021
+ ioc -> reply_queue_count = r ;
2022
+ for (i = 0 ; i < ioc -> reply_queue_count ; i ++ ) {
2023
+ r = _base_request_irq (ioc , i );
2039
2024
if (r ) {
2040
2025
_base_free_irq (ioc );
2041
2026
_base_disable_msix (ioc );
2042
- kfree (entries );
2043
2027
goto try_ioapic ;
2044
2028
}
2045
2029
}
2046
2030
2047
- kfree (entries );
2048
2031
return 0 ;
2049
2032
2050
2033
/* failback to io_apic interrupt routing */
2051
2034
try_ioapic :
2052
2035
2053
2036
ioc -> reply_queue_count = 1 ;
2054
- r = _base_request_irq (ioc , 0 , ioc -> pdev -> irq );
2037
+ r = pci_alloc_irq_vectors (ioc -> pdev , 1 , 1 , PCI_IRQ_LEGACY );
2038
+ if (r < 0 ) {
2039
+ dfailprintk (ioc , pr_info (MPT3SAS_FMT
2040
+ "pci_alloc_irq_vector(legacy) failed (r=%d) !!!\n" ,
2041
+ ioc -> name , r ));
2042
+ } else
2043
+ r = _base_request_irq (ioc , 0 );
2055
2044
2056
2045
return r ;
2057
2046
}
@@ -2222,7 +2211,8 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc)
2222
2211
list_for_each_entry (reply_q , & ioc -> reply_queue_list , list )
2223
2212
pr_info (MPT3SAS_FMT "%s: IRQ %d\n" ,
2224
2213
reply_q -> name , ((ioc -> msix_enable ) ? "PCI-MSI-X enabled" :
2225
- "IO-APIC enabled" ), reply_q -> vector );
2214
+ "IO-APIC enabled" ),
2215
+ pci_irq_vector (ioc -> pdev , reply_q -> msix_index ));
2226
2216
2227
2217
pr_info (MPT3SAS_FMT "iomem(0x%016llx), mapped(0x%p), size(%d)\n" ,
2228
2218
ioc -> name , (unsigned long long )chip_phys , ioc -> chip , memap_sz );
@@ -5357,7 +5347,8 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
5357
5347
sizeof (resource_size_t * ), GFP_KERNEL );
5358
5348
if (!ioc -> reply_post_host_index ) {
5359
5349
dfailprintk (ioc , pr_info (MPT3SAS_FMT "allocation "
5360
- "for cpu_msix_table failed!!!\n" , ioc -> name ));
5350
+ "for reply_post_host_index failed!!!\n" ,
5351
+ ioc -> name ));
5361
5352
r = - ENOMEM ;
5362
5353
goto out_free_resources ;
5363
5354
}
0 commit comments