@ -1020,10 +1020,97 @@ static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
return 0 ;
}
# define QLC_83XX_ENCAP_TYPE_VXLAN BIT_1
# define QLC_83XX_MATCH_ENCAP_ID BIT_2
# define QLC_83XX_SET_VXLAN_UDP_DPORT BIT_3
# define QLC_83XX_VXLAN_UDP_DPORT(PORT) ((PORT & 0xffff) << 16)
# define QLCNIC_ENABLE_INGRESS_ENCAP_PARSING 1
# define QLCNIC_DISABLE_INGRESS_ENCAP_PARSING 0
static int qlcnic_set_vxlan_port ( struct qlcnic_adapter * adapter )
{
u16 port = adapter - > ahw - > vxlan_port ;
struct qlcnic_cmd_args cmd ;
int ret = 0 ;
memset ( & cmd , 0 , sizeof ( cmd ) ) ;
ret = qlcnic_alloc_mbx_args ( & cmd , adapter ,
QLCNIC_CMD_INIT_NIC_FUNC ) ;
if ( ret )
return ret ;
cmd . req . arg [ 1 ] = QLC_83XX_MULTI_TENANCY_INFO ;
cmd . req . arg [ 2 ] = QLC_83XX_ENCAP_TYPE_VXLAN |
QLC_83XX_SET_VXLAN_UDP_DPORT |
QLC_83XX_VXLAN_UDP_DPORT ( port ) ;
ret = qlcnic_issue_cmd ( adapter , & cmd ) ;
if ( ret )
netdev_err ( adapter - > netdev ,
" Failed to set VXLAN port %d in adapter \n " ,
port ) ;
qlcnic_free_mbx_args ( & cmd ) ;
return ret ;
}
static int qlcnic_set_vxlan_parsing ( struct qlcnic_adapter * adapter ,
bool state )
{
u16 vxlan_port = adapter - > ahw - > vxlan_port ;
struct qlcnic_cmd_args cmd ;
int ret = 0 ;
memset ( & cmd , 0 , sizeof ( cmd ) ) ;
ret = qlcnic_alloc_mbx_args ( & cmd , adapter ,
QLCNIC_CMD_SET_INGRESS_ENCAP ) ;
if ( ret )
return ret ;
cmd . req . arg [ 1 ] = state ? QLCNIC_ENABLE_INGRESS_ENCAP_PARSING :
QLCNIC_DISABLE_INGRESS_ENCAP_PARSING ;
ret = qlcnic_issue_cmd ( adapter , & cmd ) ;
if ( ret )
netdev_err ( adapter - > netdev ,
" Failed to %s VXLAN parsing for port %d \n " ,
state ? " enable " : " disable " , vxlan_port ) ;
else
netdev_info ( adapter - > netdev ,
" %s VXLAN parsing for port %d \n " ,
state ? " Enabled " : " Disabled " , vxlan_port ) ;
qlcnic_free_mbx_args ( & cmd ) ;
return ret ;
}
static void qlcnic_83xx_periodic_tasks ( struct qlcnic_adapter * adapter )
{
struct qlcnic_hardware_context * ahw = adapter - > ahw ;
if ( adapter - > fhash . fnum )
qlcnic_prune_lb_filters ( adapter ) ;
if ( adapter - > flags & QLCNIC_ADD_VXLAN_PORT ) {
if ( qlcnic_set_vxlan_port ( adapter ) )
return ;
if ( qlcnic_set_vxlan_parsing ( adapter , true ) )
return ;
adapter - > flags & = ~ QLCNIC_ADD_VXLAN_PORT ;
} else if ( adapter - > flags & QLCNIC_DEL_VXLAN_PORT ) {
if ( qlcnic_set_vxlan_parsing ( adapter , false ) )
return ;
ahw - > vxlan_port = 0 ;
adapter - > flags & = ~ QLCNIC_DEL_VXLAN_PORT ;
}
}
/**