Commit a04ea57a authored by Jiawen Wu's avatar Jiawen Wu Committed by Jakub Kicinski
Browse files

net: libwx: fix device bus LAN ID



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: a34b3e6e ("net: txgbe: Store PCI info")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/B60A670C1F52CB8E+20251104062321.40059-1-jiawenwu@trustnetic.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b1d91548
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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) {
+2 −2
Original line number Diff line number Diff line
@@ -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 */