From: Slawomir Mrozowicz <slawomirx.mrozow...@intel.com>

commit 16cf93f50f659c7eb0b3d0a6649a695023107515 from
git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy

Add possibility to disable link state if it is administratively
disabled in PF.

It is part of the general functionality that allows the PF driver
to control the state of the virtual link VF devices.

Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozow...@intel.com>
Tested-by: Konrad Jankowski <konrad0.jankow...@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.ngu...@intel.com>

CVE-2021-33061
(backported from commit 443ebdd68b443ea0798c883e8aabf10d75268e92)
[cengizcan: IXGBE_VT_MSGTYPE_{NACK|ACK} were renamed in v5.17 with
commit 0edbecd57057 and the patch depends on new names. Add aliases
into `mbx.h` to fix compilation and preserve maintainability.]
Signed-off-by: Cengiz Can <cengiz....@canonical.com>
Acked-by: Stefan Bader <stefan.ba...@canonical.com>
Acked-by: Tim Gardner <tim.gard...@canonical.com>
Signed-off-by: Stefan Bader <stefan.ba...@canonical.com>
Signed-off-by: Paul Gortmaker <paul.gortma...@windriver.com>
---
 drivers/net/ethernet/intel/ixgbevf/ixgbevf.h  |  2 +
 .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 11 ++++-
 drivers/net/ethernet/intel/ixgbevf/mbx.h      | 12 ++++++
 drivers/net/ethernet/intel/ixgbevf/vf.c       | 42 +++++++++++++++++++
 drivers/net/ethernet/intel/ixgbevf/vf.h       |  1 +
 5 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h 
b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
index a0e325774819..89bfe4eb92f8 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
@@ -387,6 +387,8 @@ struct ixgbevf_adapter {
        u32 *rss_key;
        u8 rss_indir_tbl[IXGBEVF_X550_VFRETA_SIZE];
        u32 flags;
+       bool link_state;
+
 #define IXGBEVF_FLAGS_LEGACY_RX                BIT(1)
 
 #ifdef CONFIG_XFRM
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c 
b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 7ef2e1241a76..c2e96e570f3b 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -2291,7 +2291,9 @@ static void ixgbevf_negotiate_api(struct ixgbevf_adapter 
*adapter)
 static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
+       struct pci_dev *pdev = adapter->pdev;
        struct ixgbe_hw *hw = &adapter->hw;
+       bool state;
 
        ixgbevf_configure_msix(adapter);
 
@@ -2304,6 +2306,11 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter 
*adapter)
 
        spin_unlock_bh(&adapter->mbx_lock);
 
+       state = adapter->link_state;
+       hw->mac.ops.get_link_state(hw, &adapter->link_state);
+       if (state && state != adapter->link_state)
+               dev_info(&pdev->dev, "VF is administratively disabled\n");
+
        smp_mb__before_atomic();
        clear_bit(__IXGBEVF_DOWN, &adapter->state);
        ixgbevf_napi_enable_all(adapter);
@@ -3073,6 +3080,8 @@ static int ixgbevf_sw_init(struct ixgbevf_adapter 
*adapter)
        adapter->tx_ring_count = IXGBEVF_DEFAULT_TXD;
        adapter->rx_ring_count = IXGBEVF_DEFAULT_RXD;
 
+       adapter->link_state = true;
+
        set_bit(__IXGBEVF_DOWN, &adapter->state);
        return 0;
 
@@ -3305,7 +3314,7 @@ static void ixgbevf_watchdog_subtask(struct 
ixgbevf_adapter *adapter)
 
        ixgbevf_watchdog_update_link(adapter);
 
-       if (adapter->link_up)
+       if (adapter->link_up && adapter->link_state)
                ixgbevf_watchdog_link_is_up(adapter);
        else
                ixgbevf_watchdog_link_is_down(adapter);
diff --git a/drivers/net/ethernet/intel/ixgbevf/mbx.h 
b/drivers/net/ethernet/intel/ixgbevf/mbx.h
index 853796c8ef0e..711dcebed3d0 100644
--- a/drivers/net/ethernet/intel/ixgbevf/mbx.h
+++ b/drivers/net/ethernet/intel/ixgbevf/mbx.h
@@ -51,6 +51,16 @@
 /* bits 23:16 are used for exra info for certain messages */
 #define IXGBE_VT_MSGINFO_MASK  (0xFF << IXGBE_VT_MSGINFO_SHIFT)
 
+/* IXGBE_VT_MSGTYPE_NACK and IXGBE_VT_MSGTYPE_ACK were renamed to
+ * IXGBE_VT_MSGTYPE_FAILURE and IXGBE_VT_MSGTYPE_SUCCESS respectively
+ * with commit 0edbecd57057 upstream.
+ *
+ * One of the backported fixes use them with their new names. These
+ * aliases enable them to work with both older and newer names.
+ */
+#define IXGBE_VT_MSGTYPE_SUCCESS IXGBE_VT_MSGTYPE_ACK
+#define IXGBE_VT_MSGTYPE_FAILURE IXGBE_VT_MSGTYPE_NACK
+
 /* definitions to support mailbox API version negotiation */
 
 /* each element denotes a version of the API; existing numbers may not
@@ -97,6 +107,8 @@ enum ixgbe_pfvf_api_rev {
 #define IXGBE_VF_IPSEC_ADD     0x0d
 #define IXGBE_VF_IPSEC_DEL     0x0e
 
+#define IXGBE_VF_GET_LINK_STATE 0x10 /* get vf link state */
+
 /* length of permanent address message returned from PF */
 #define IXGBE_VF_PERMADDR_MSG_LEN      4
 /* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c 
b/drivers/net/ethernet/intel/ixgbevf/vf.c
index 5fc347abab3c..dbec5120d7a7 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -579,6 +579,46 @@ static s32 ixgbevf_hv_update_xcast_mode(struct ixgbe_hw 
*hw, int xcast_mode)
        return -EOPNOTSUPP;
 }
 
+/**
+ * ixgbevf_get_link_state_vf - Get VF link state from PF
+ * @hw: pointer to the HW structure
+ * @link_state: link state storage
+ *
+ * Returns state of the operation error or success.
+ */
+static s32 ixgbevf_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state)
+{
+       u32 msgbuf[2];
+       s32 ret_val;
+       s32 err;
+
+       msgbuf[0] = IXGBE_VF_GET_LINK_STATE;
+       msgbuf[1] = 0x0;
+
+       err = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
+
+       if (err || (msgbuf[0] & IXGBE_VT_MSGTYPE_FAILURE)) {
+               ret_val = IXGBE_ERR_MBX;
+       } else {
+               ret_val = 0;
+               *link_state = msgbuf[1];
+       }
+
+       return ret_val;
+}
+
+/**
+ * ixgbevf_hv_get_link_state_vf - * Hyper-V variant - just a stub.
+ * @hw: unused
+ * @link_state: unused
+ *
+ * Hyper-V variant; there is no mailbox communication.
+ */
+static s32 ixgbevf_hv_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state)
+{
+       return -EOPNOTSUPP;
+}
+
 /**
  *  ixgbevf_set_vfta_vf - Set/Unset VLAN filter table address
  *  @hw: pointer to the HW structure
@@ -958,6 +998,7 @@ static const struct ixgbe_mac_operations ixgbevf_mac_ops = {
        .set_rar                = ixgbevf_set_rar_vf,
        .update_mc_addr_list    = ixgbevf_update_mc_addr_list_vf,
        .update_xcast_mode      = ixgbevf_update_xcast_mode,
+       .get_link_state         = ixgbevf_get_link_state_vf,
        .set_uc_addr            = ixgbevf_set_uc_addr_vf,
        .set_vfta               = ixgbevf_set_vfta_vf,
        .set_rlpml              = ixgbevf_set_rlpml_vf,
@@ -975,6 +1016,7 @@ static const struct ixgbe_mac_operations 
ixgbevf_hv_mac_ops = {
        .set_rar                = ixgbevf_hv_set_rar_vf,
        .update_mc_addr_list    = ixgbevf_hv_update_mc_addr_list_vf,
        .update_xcast_mode      = ixgbevf_hv_update_xcast_mode,
+       .get_link_state         = ixgbevf_hv_get_link_state_vf,
        .set_uc_addr            = ixgbevf_hv_set_uc_addr_vf,
        .set_vfta               = ixgbevf_hv_set_vfta_vf,
        .set_rlpml              = ixgbevf_hv_set_rlpml_vf,
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h 
b/drivers/net/ethernet/intel/ixgbevf/vf.h
index 1d8209df4162..addeece133e7 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.h
@@ -39,6 +39,7 @@ struct ixgbe_mac_operations {
        s32 (*init_rx_addrs)(struct ixgbe_hw *);
        s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
        s32 (*update_xcast_mode)(struct ixgbe_hw *, int);
+       s32 (*get_link_state)(struct ixgbe_hw *hw, bool *link_state);
        s32 (*enable_mc)(struct ixgbe_hw *);
        s32 (*disable_mc)(struct ixgbe_hw *);
        s32 (*clear_vfta)(struct ixgbe_hw *);
-- 
2.33.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#11877): 
https://lists.yoctoproject.org/g/linux-yocto/message/11877
Mute This Topic: https://lists.yoctoproject.org/mt/94964663/21656
Group Owner: linux-yocto+ow...@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to