]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: libwx: fix device bus LAN ID
authorJiawen Wu <jiawenwu@trustnetic.com>
Tue, 4 Nov 2025 06:23:21 +0000 (14:23 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 6 Nov 2025 01:52:13 +0000 (17:52 -0800)
The device bus LAN ID was obtained from PCI_FUNC(), but when a PF
port is passthrough to a virtual machine, the function number may not
match the actual port index on the device. This could cause the driver
to perform operations such as LAN reset on the wrong port.

Fix this by reading the LAN ID from port status register.

Fixes: a34b3e6ed8fb ("net: txgbe: Store PCI info")
Cc: stable@vger.kernel.org
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/B60A670C1F52CB8E+20251104062321.40059-1-jiawenwu@trustnetic.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/wangxun/libwx/wx_hw.c
drivers/net/ethernet/wangxun/libwx/wx_type.h

index 1e2713f0c9212f9f9f17cd3de6ee86181ffea3d6..b37d6cfbfbe94318003455d3502a2a196655c941 100644 (file)
@@ -2427,7 +2427,8 @@ int wx_sw_init(struct wx *wx)
        wx->oem_svid = pdev->subsystem_vendor;
        wx->oem_ssid = pdev->subsystem_device;
        wx->bus.device = PCI_SLOT(pdev->devfn);
-       wx->bus.func = PCI_FUNC(pdev->devfn);
+       wx->bus.func = FIELD_GET(WX_CFG_PORT_ST_LANID,
+                                rd32(wx, WX_CFG_PORT_ST));
 
        if (wx->oem_svid == PCI_VENDOR_ID_WANGXUN ||
            pdev->is_virtfn) {
index d89b9b8a0a2ce06a6762d6c597ba3808fe29b43a..2f8319e031820c6dd40de5d96156dc46acd20f16 100644 (file)
@@ -97,6 +97,8 @@
 #define WX_CFG_PORT_CTL_DRV_LOAD     BIT(3)
 #define WX_CFG_PORT_CTL_QINQ         BIT(2)
 #define WX_CFG_PORT_CTL_D_VLAN       BIT(0) /* double vlan*/
+#define WX_CFG_PORT_ST               0x14404
+#define WX_CFG_PORT_ST_LANID         GENMASK(9, 8)
 #define WX_CFG_TAG_TPID(_i)          (0x14430 + ((_i) * 4))
 #define WX_CFG_PORT_CTL_NUM_VT_MASK  GENMASK(13, 12) /* number of TVs */
 
@@ -557,8 +559,6 @@ enum WX_MSCA_CMD_value {
 #define TXD_USE_COUNT(S)     DIV_ROUND_UP((S), WX_MAX_DATA_PER_TXD)
 #define DESC_NEEDED          (MAX_SKB_FRAGS + 4)
 
-#define WX_CFG_PORT_ST               0x14404
-
 /******************* Receive Descriptor bit definitions **********************/
 #define WX_RXD_STAT_DD               BIT(0) /* Done */
 #define WX_RXD_STAT_EOP              BIT(1) /* End of Packet */