diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 88a58cb0856..2d971d18696 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -544,13 +544,18 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)  	retval = ixgbe_read_mbx(hw, msgbuf, mbx_size, vf); -	if (retval) +	if (retval) {  		pr_err("Error receiving message from VF\n"); +		return retval; +	}  	/* this is a message we already processed, do nothing */  	if (msgbuf[0] & (IXGBE_VT_MSGTYPE_ACK | IXGBE_VT_MSGTYPE_NACK))  		return retval; +	/* flush the ack before we write any messages back */ +	IXGBE_WRITE_FLUSH(hw); +  	/*  	 * until the vf completes a virtual function reset it should not be  	 * allowed to start any configuration. @@ -637,6 +642,12 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)  	case IXGBE_VF_SET_MACVLAN:  		index = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >>  			IXGBE_VT_MSGINFO_SHIFT; +		if (adapter->vfinfo[vf].pf_set_mac && index > 0) { +			e_warn(drv, "VF %d requested MACVLAN filter but is " +				    "administratively denied\n", vf); +			retval = -1; +			break; +		}  		/*  		 * If the VF is allowed to set MAC filters then turn off  		 * anti-spoofing to avoid false positives.  An index  |