@ -43,6 +43,7 @@
# include <linux/semaphore.h>
# include <rdma/ib_smi.h>
# include <linux/delay.h>
# include <linux/etherdevice.h>
# include <asm/io.h>
@ -2955,7 +2956,7 @@ static bool mlx4_valid_vf_state_change(struct mlx4_dev *dev, int port,
return false ;
}
int mlx4_set_vf_mac ( struct mlx4_dev * dev , int port , int vf , u64 mac )
int mlx4_set_vf_mac ( struct mlx4_dev * dev , int port , int vf , u8 * mac )
{
struct mlx4_priv * priv = mlx4_priv ( dev ) ;
struct mlx4_vport_state * s_info ;
@ -2964,13 +2965,22 @@ int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac)
if ( ! mlx4_is_master ( dev ) )
return - EPROTONOSUPPORT ;
if ( is_multicast_ether_addr ( mac ) )
return - EINVAL ;
slave = mlx4_get_slave_indx ( dev , vf ) ;
if ( slave < 0 )
return - EINVAL ;
port = mlx4_slaves_closest_port ( dev , slave , port ) ;
s_info = & priv - > mfunc . master . vf_admin [ slave ] . vport [ port ] ;
s_info - > mac = mac ;
if ( s_info - > spoofchk & & is_zero_ether_addr ( mac ) ) {
mlx4_info ( dev , " MAC invalidation is not allowed when spoofchk is on \n " ) ;
return - EPERM ;
}
s_info - > mac = mlx4_mac_to_u64 ( mac ) ;
mlx4_info ( dev , " default mac on vf %d port %d to %llX will take effect only after vf restart \n " ,
vf , port , s_info - > mac ) ;
return 0 ;
@ -3143,6 +3153,7 @@ int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting)
struct mlx4_priv * priv = mlx4_priv ( dev ) ;
struct mlx4_vport_state * s_info ;
int slave ;
u8 mac [ ETH_ALEN ] ;
if ( ( ! mlx4_is_master ( dev ) ) | |
! ( dev - > caps . flags2 & MLX4_DEV_CAP_FLAG2_FSM ) )
@ -3154,6 +3165,13 @@ int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting)
port = mlx4_slaves_closest_port ( dev , slave , port ) ;
s_info = & priv - > mfunc . master . vf_admin [ slave ] . vport [ port ] ;
mlx4_u64_to_mac ( mac , s_info - > mac ) ;
if ( setting & & ! is_valid_ether_addr ( mac ) ) {
mlx4_info ( dev , " Illegal MAC with spoofchk \n " ) ;
return - EPERM ;
}
s_info - > spoofchk = setting ;
return 0 ;