Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ddc7fe1 authored by Alexander Duyck's avatar Alexander Duyck Committed by Jeff Kirsher
Browse files

ixgbevf: Return error on failure to enable VLAN



With recent kernel changes we can now return errors on a failure to setup a
VLAN filter.  This patch takes advantage of that opportunity so that we can
return either an EIO error in the case of a mailbox failure, or an EACCESS
error in the case of being denied access to the VLAN filter table by the
PF.

Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Tested-by: default avatarRobert Garrett <robertx.e.garrett@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 5c60f81a
Loading
Loading
Loading
Loading
+16 −5
Original line number Original line Diff line number Diff line
@@ -1126,36 +1126,47 @@ static int ixgbevf_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{
{
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_hw *hw = &adapter->hw;
	struct ixgbe_hw *hw = &adapter->hw;
	int err;

	if (!hw->mac.ops.set_vfta)
		return -EOPNOTSUPP;


	spin_lock(&adapter->mbx_lock);
	spin_lock(&adapter->mbx_lock);


	/* add VID to filter table */
	/* add VID to filter table */
	if (hw->mac.ops.set_vfta)
	err = hw->mac.ops.set_vfta(hw, vid, 0, true);
		hw->mac.ops.set_vfta(hw, vid, 0, true);


	spin_unlock(&adapter->mbx_lock);
	spin_unlock(&adapter->mbx_lock);


	/* translate error return types so error makes sense */
	if (err == IXGBE_ERR_MBX)
		return -EIO;

	if (err == IXGBE_ERR_INVALID_ARGUMENT)
		return -EACCES;

	set_bit(vid, adapter->active_vlans);
	set_bit(vid, adapter->active_vlans);


	return 0;
	return err;
}
}


static int ixgbevf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
static int ixgbevf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{
{
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_hw *hw = &adapter->hw;
	struct ixgbe_hw *hw = &adapter->hw;
	int err = -EOPNOTSUPP;


	spin_lock(&adapter->mbx_lock);
	spin_lock(&adapter->mbx_lock);


	/* remove VID from filter table */
	/* remove VID from filter table */
	if (hw->mac.ops.set_vfta)
	if (hw->mac.ops.set_vfta)
		hw->mac.ops.set_vfta(hw, vid, 0, false);
		err = hw->mac.ops.set_vfta(hw, vid, 0, false);


	spin_unlock(&adapter->mbx_lock);
	spin_unlock(&adapter->mbx_lock);


	clear_bit(vid, adapter->active_vlans);
	clear_bit(vid, adapter->active_vlans);


	return 0;
	return err;
}
}


static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)
static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)
+18 −2
Original line number Original line Diff line number Diff line
@@ -349,16 +349,32 @@ static s32 ixgbevf_update_mc_addr_list_vf(struct ixgbe_hw *hw,
static s32 ixgbevf_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
static s32 ixgbevf_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
			       bool vlan_on)
			       bool vlan_on)
{
{
	struct ixgbe_mbx_info *mbx = &hw->mbx;
	u32 msgbuf[2];
	u32 msgbuf[2];
	s32 err;


	msgbuf[0] = IXGBE_VF_SET_VLAN;
	msgbuf[0] = IXGBE_VF_SET_VLAN;
	msgbuf[1] = vlan;
	msgbuf[1] = vlan;
	/* Setting the 8 bit field MSG INFO to TRUE indicates "add" */
	/* Setting the 8 bit field MSG INFO to TRUE indicates "add" */
	msgbuf[0] |= vlan_on << IXGBE_VT_MSGINFO_SHIFT;
	msgbuf[0] |= vlan_on << IXGBE_VT_MSGINFO_SHIFT;


	ixgbevf_write_msg_read_ack(hw, msgbuf, 2);
	err = mbx->ops.write_posted(hw, msgbuf, 2);
	if (err)
		goto mbx_err;


	return 0;
	err = mbx->ops.read_posted(hw, msgbuf, 2);
	if (err)
		goto mbx_err;

	/* remove extra bits from the message */
	msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
	msgbuf[0] &= ~(0xFF << IXGBE_VT_MSGINFO_SHIFT);

	if (msgbuf[0] != (IXGBE_VF_SET_VLAN | IXGBE_VT_MSGTYPE_ACK))
		err = IXGBE_ERR_INVALID_ARGUMENT;

mbx_err:
	return err;
}
}


/**
/**