@ -3831,6 +3831,8 @@ static void i40e_reset_interrupt_capability(struct i40e_pf *pf)
pci_disable_msix ( pf - > pdev ) ;
kfree ( pf - > msix_entries ) ;
pf - > msix_entries = NULL ;
kfree ( pf - > irq_pile ) ;
pf - > irq_pile = NULL ;
} else if ( pf - > flags & I40E_FLAG_MSI_ENABLED ) {
pci_disable_msi ( pf - > pdev ) ;
}
@ -6933,15 +6935,14 @@ static int i40e_reserve_msix_vectors(struct i40e_pf *pf, int vectors)
*
* Work with the OS to set up the MSIX vectors needed .
*
* Returns 0 on success , negative on failure
* Returns the number of vectors reserved or negative on failure
* */
static int i40e_init_msix ( struct i40e_pf * pf )
{
i40e_status err = 0 ;
struct i40e_hw * hw = & pf - > hw ;
int other_vecs = 0 ;
int v_budget , i ;
int vec ;
int v_actual ;
if ( ! ( pf - > flags & I40E_FLAG_MSIX_ENABLED ) )
return - ENODEV ;
@ -6990,9 +6991,9 @@ static int i40e_init_msix(struct i40e_pf *pf)
for ( i = 0 ; i < v_budget ; i + + )
pf - > msix_entries [ i ] . entry = i ;
vec = i40e_reserve_msix_vectors ( pf , v_budget ) ;
v_actual = i40e_reserve_msix_vectors ( pf , v_budget ) ;
if ( vec ! = v_budget ) {
if ( v_actual ! = v_budget ) {
/* If we have limited resources, we will start with no vectors
* for the special features and then allocate vectors to some
* of these features based on the policy and at the end disable
@ -7005,22 +7006,24 @@ static int i40e_init_msix(struct i40e_pf *pf)
pf - > num_vmdq_msix = 0 ;
}
if ( vec < I40E_MIN_MSIX ) {
if ( v_actual < I40E_MIN_MSIX ) {
pf - > flags & = ~ I40E_FLAG_MSIX_ENABLED ;
kfree ( pf - > msix_entries ) ;
pf - > msix_entries = NULL ;
return - ENODEV ;
} else if ( vec = = I40E_MIN_MSIX ) {
} else if ( v_actual = = I40E_MIN_MSIX ) {
/* Adjust for minimal MSIX use */
pf - > num_vmdq_vsis = 0 ;
pf - > num_vmdq_qps = 0 ;
pf - > num_lan_qps = 1 ;
pf - > num_lan_msix = 1 ;
} else if ( vec ! = v_budget ) {
} else if ( v_actual ! = v_budget ) {
int vec ;
/* reserve the misc vector */
vec - - ;
vec = v_actual - 1 ;
/* Scale vector usage down */
pf - > num_vmdq_msix = 1 ; /* force VMDqs to only one vector */
@ -7070,7 +7073,7 @@ static int i40e_init_msix(struct i40e_pf *pf)
pf - > flags & = ~ I40E_FLAG_FCOE_ENABLED ;
}
# endif
return err ;
return v_actual ;
}
/**
@ -7147,11 +7150,12 @@ err_out:
* */
static void i40e_init_interrupt_scheme ( struct i40e_pf * pf )
{
int err = 0 ;
int vectors = 0 ;
ssize_t size ;
if ( pf - > flags & I40E_FLAG_MSIX_ENABLED ) {
err = i40e_init_msix ( pf ) ;
if ( err ) {
vectors = i40e_init_msix ( pf ) ;
if ( vectors < 0 ) {
pf - > flags & = ~ ( I40E_FLAG_MSIX_ENABLED |
# ifdef I40E_FCOE
I40E_FLAG_FCOE_ENABLED |
@ -7171,18 +7175,26 @@ static void i40e_init_interrupt_scheme(struct i40e_pf *pf)
if ( ! ( pf - > flags & I40E_FLAG_MSIX_ENABLED ) & &
( pf - > flags & I40E_FLAG_MSI_ENABLED ) ) {
dev_info ( & pf - > pdev - > dev , " MSI-X not available, trying MSI \n " ) ;
err = pci_enable_msi ( pf - > pdev ) ;
if ( err ) {
dev_info ( & pf - > pdev - > dev , " MSI init failed - %d \n " , err ) ;
vectors = pci_enable_msi ( pf - > pdev ) ;
if ( vectors < 0 ) {
dev_info ( & pf - > pdev - > dev , " MSI init failed - %d \n " ,
vectors ) ;
pf - > flags & = ~ I40E_FLAG_MSI_ENABLED ;
}
vectors = 1 ; /* one MSI or Legacy vector */
}
if ( ! ( pf - > flags & ( I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED ) ) )
dev_info ( & pf - > pdev - > dev , " MSI-X and MSI not available, falling back to Legacy IRQ \n " ) ;
/* set up vector assignment tracking */
size = sizeof ( struct i40e_lump_tracking ) + ( sizeof ( u16 ) * vectors ) ;
pf - > irq_pile = kzalloc ( size , GFP_KERNEL ) ;
pf - > irq_pile - > num_entries = vectors ;
pf - > irq_pile - > search_hint = 0 ;
/* track first vector for misc interrupts */
err = i40e_get_lump ( pf , pf - > irq_pile , 1 , I40E_PILE_VALID_BIT - 1 ) ;
( void ) i40e_get_lump ( pf , pf - > irq_pile , 1 , I40E_PILE_VALID_BIT - 1 ) ;
}
/**
@ -7560,18 +7572,6 @@ static int i40e_sw_init(struct i40e_pf *pf)
pf - > qp_pile - > num_entries = pf - > hw . func_caps . num_tx_qp ;
pf - > qp_pile - > search_hint = 0 ;
/* set up vector assignment tracking */
size = sizeof ( struct i40e_lump_tracking )
+ ( sizeof ( u16 ) * pf - > hw . func_caps . num_msix_vectors ) ;
pf - > irq_pile = kzalloc ( size , GFP_KERNEL ) ;
if ( ! pf - > irq_pile ) {
kfree ( pf - > qp_pile ) ;
err = - ENOMEM ;
goto sw_init_done ;
}
pf - > irq_pile - > num_entries = pf - > hw . func_caps . num_msix_vectors ;
pf - > irq_pile - > search_hint = 0 ;
pf - > tx_timeout_recovery_level = 1 ;
mutex_init ( & pf - > switch_mutex ) ;
@ -9840,7 +9840,6 @@ err_configure_lan_hmc:
( void ) i40e_shutdown_lan_hmc ( hw ) ;
err_init_lan_hmc :
kfree ( pf - > qp_pile ) ;
kfree ( pf - > irq_pile ) ;
err_sw_init :
err_adminq_setup :
( void ) i40e_shutdown_adminq ( hw ) ;
@ -9940,7 +9939,6 @@ static void i40e_remove(struct pci_dev *pdev)
}
kfree ( pf - > qp_pile ) ;
kfree ( pf - > irq_pile ) ;
kfree ( pf - > vsi ) ;
iounmap ( pf - > hw . hw_addr ) ;