@ -788,31 +788,37 @@ err_exit:
return err ;
}
static int hw_atl_b0_hw_interrupt_moderation_set ( struct aq_hw_s * self ,
bool itr_enabled )
static int hw_atl_b0_hw_interrupt_moderation_set ( struct aq_hw_s * self )
{
unsigned int i = 0U ;
u32 itr_tx = 2U ;
u32 itr_rx = 2U ;
if ( itr_enabled & & self - > aq_nic_cfg - > itr ) {
switch ( self - > aq_nic_cfg - > itr ) {
case AQ_CFG_INTERRUPT_MODERATION_ON :
case AQ_CFG_INTERRUPT_MODERATION_AUTO :
tdm_tx_desc_wr_wb_irq_en_set ( self , 0U ) ;
tdm_tdm_intr_moder_en_set ( self , 1U ) ;
rdm_rx_desc_wr_wb_irq_en_set ( self , 0U ) ;
rdm_rdm_intr_moder_en_set ( self , 1U ) ;
PHAL_ATLANTIC_B0 - > itr_tx = 2U ;
PHAL_ATLANTIC_B0 - > itr_rx = 2U ;
if ( self - > aq_nic_cfg - > itr = = AQ_CFG_INTERRUPT_MODERATION_ON ) {
/* HW timers are in 2us units */
int tx_max_timer = self - > aq_nic_cfg - > tx_itr / 2 ;
int tx_min_timer = tx_max_timer / 2 ;
if ( self - > aq_nic_cfg - > itr ! = 0xFFFFU ) {
unsigned int max_timer = self - > aq_nic_cfg - > itr / 2U ;
unsigned int min_timer = self - > aq_nic_cfg - > itr / 32U ;
int rx_max_timer = self - > aq_nic_cfg - > rx_itr / 2 ;
int rx_min_timer = rx_max_timer / 2 ;
max_timer = min ( 0x1FFU , max_timer ) ;
min_timer = min ( 0xFFU , min_timer ) ;
tx_max_timer = min ( HW_ATL_INTR_MODER_MAX , tx_max_timer ) ;
tx_min_timer = min ( HW_ATL_INTR_MODER_MIN , tx_min_timer ) ;
rx_max_timer = min ( HW_ATL_INTR_MODER_MAX , rx_max_timer ) ;
rx_min_timer = min ( HW_ATL_INTR_MODER_MIN , rx_min_timer ) ;
PHAL_ATLANTIC_B0 - > itr_tx | = min_timer < < 0x8U ;
PHAL_ATLANTIC_B0 - > itr_tx | = max_timer < < 0x10U ;
PHAL_ATLANTIC_B0 - > itr_rx | = min_timer < < 0x8U ;
PHAL_ATLANTIC_B0 - > itr_rx | = max_timer < < 0x10U ;
itr_tx | = tx_ min_timer < < 0x8U ;
itr_tx | = tx_ max_timer < < 0x10U ;
itr_rx | = rx_ min_timer < < 0x8U ;
itr_rx | = rx_ max_timer < < 0x10U ;
} else {
static unsigned int hw_atl_b0_timers_table_tx_ [ ] [ 2 ] = {
{ 0xffU , 0xffU } , /* 10Gbit */
@ -836,34 +842,36 @@ static int hw_atl_b0_hw_interrupt_moderation_set(struct aq_hw_s *self,
hw_atl_utils_mbps_2_speed_index (
self - > aq_link_status . mbps ) ;
PHAL_ATLANTIC_B0 - > itr_tx | =
hw_atl_b0_timers_table_tx_ [ speed_index ]
[ 0 ] < < 0x8U ; /* set min timer value */
PHAL_ATLANTIC_B0 - > itr_tx | =
hw_atl_b0_timers_table_tx_ [ speed_index ]
[ 1 ] < < 0x10U ; /* set max timer value */
PHAL_ATLANTIC_B0 - > itr_rx | =
hw_atl_b0_timers_table_rx_ [ speed_index ]
[ 0 ] < < 0x8U ; /* set min timer value */
PHAL_ATLANTIC_B0 - > itr_rx | =
hw_atl_b0_timers_table_rx_ [ speed_index ]
[ 1 ] < < 0x10U ; /* set max timer value */
/* Update user visible ITR settings */
self - > aq_nic_cfg - > tx_itr = hw_atl_b0_timers_table_tx_
[ speed_index ] [ 1 ] * 2 ;
self - > aq_nic_cfg - > rx_itr = hw_atl_b0_timers_table_rx_
[ speed_index ] [ 1 ] * 2 ;
itr_tx | = hw_atl_b0_timers_table_tx_
[ speed_index ] [ 0 ] < < 0x8U ;
itr_tx | = hw_atl_b0_timers_table_tx_
[ speed_index ] [ 1 ] < < 0x10U ;
itr_rx | = hw_atl_b0_timers_table_rx_
[ speed_index ] [ 0 ] < < 0x8U ;
itr_rx | = hw_atl_b0_timers_table_rx_
[ speed_index ] [ 1 ] < < 0x10U ;
}
} else {
break ;
case AQ_CFG_INTERRUPT_MODERATION_OFF :
tdm_tx_desc_wr_wb_irq_en_set ( self , 1U ) ;
tdm_tdm_intr_moder_en_set ( self , 0U ) ;
rdm_rx_desc_wr_wb_irq_en_set ( self , 1U ) ;
rdm_rdm_intr_moder_en_set ( self , 0U ) ;
PHAL_ATLANTIC_B0 - > itr_tx = 0U ;
PHAL_ATLANTIC_B0 - > itr_rx = 0U ;
itr_tx = 0U ;
itr_rx = 0U ;
break ;
}
for ( i = HW_ATL_B0_RINGS_MAX ; i - - ; ) {
reg_tx_intr_moder_ctrl_set ( self ,
PHAL_ATLANTIC_B0 - > itr_tx , i ) ;
reg_rx_intr_moder_ctrl_set ( self ,
PHAL_ATLANTIC_B0 - > itr_rx , i ) ;
reg_tx_intr_moder_ctrl_set ( self , itr_tx , i ) ;
reg_rx_intr_moder_ctrl_set ( self , itr_rx , i ) ;
}
return aq_hw_err_from_flags ( self ) ;