On 8/6/26 12:46, Tomasz Lichwala wrote:
When an E610 VF is running under Hyper-V, the VFLINKS register does not
carry valid link speed. The existing code reads speed from VFLINKS, which
does not reflect the actual negotiated speed. This results in ethtool
reporting a stale or incorrect link speed.

The Hyper-V synthetic NIC exposes the actual link status through
emulated PCI config space at offset 0x209 in VFLINKS register format.
Read and decode link status from there when checking link on E610 VFs.

Fixes: 4c44b450c69b ("ixgbevf: Add support for Intel(R) E610 device")
Reviewed-by: Marcin Szycik <[email protected]>
Signed-off-by: Tomasz Lichwala <[email protected]>
---

next time please provide changelog section here

  drivers/net/ethernet/intel/ixgbevf/vf.c | 77 +++++++++++++++++++++----
  1 file changed, 65 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c 
b/drivers/net/ethernet/intel/ixgbevf/vf.c
index f6df86d124b9..8ad06e28b5de 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -1,14 +1,17 @@
  // SPDX-License-Identifier: GPL-2.0
  /* Copyright(c) 1999 - 2024 Intel Corporation. */
+#include <linux/unaligned.h>
+
  #include "vf.h"
  #include "ixgbevf.h"

[..]

+static s32 ixgbevf_hv_read_links_e610(struct ixgbe_hw *hw, u32 *links_reg)
+{
+       struct ixgbevf_adapter *adapter = hw->back;
+       u8 data[IXGBE_HV_LINK_STATUS_SIZE];

following Paul's suggestion, you could add:
        if (IS_ENABLED(CONFIG_PCI_MMCONFIG)) {
dev_err_once(&adapter->pdev->dev, "cannot read link status, PCI_MMCONFIG is required for Hyper-V\n");
                return -EOPNOTSUPP;
        }

and this will give user more information

IS_ENABLED() is really nice macro :)

+
+       for (int i = 0; i < IXGBE_HV_LINK_STATUS_SIZE; i++) {
+               int ret = pci_read_config_byte(adapter->pdev,
+                                              IXGBE_HV_LINK_STATUS_OFFSET + i,
+                                              &data[i]);
+               if (ret)
+                       return pcibios_err_to_errno(ret);
+       }
+
+       *links_reg = get_unaligned_le32(data);
+       return 0;
+}
+

Reply via email to