Patch "mlxsw: pci: Fix driver initialization with Spectrum-4" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mlxsw: pci: Fix driver initialization with Spectrum-4

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mlxsw-pci-fix-driver-initialization-with-spectrum-4.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit abb6aab810e5484cfcaca9ae6b792591c2fbed56
Author: Ido Schimmel <idosch@xxxxxxxxxx>
Date:   Fri Jun 21 09:19:13 2024 +0200

    mlxsw: pci: Fix driver initialization with Spectrum-4
    
    [ Upstream commit 0602697d6f4d72b0bc5edbc76afabf6aaa029a69 ]
    
    Cited commit added support for a new reset flow ("all reset") which is
    deeper than the existing reset flow ("software reset") and allows the
    device's PCI firmware to be upgraded.
    
    In the new flow the driver first tells the firmware that "all reset" is
    required by issuing a new reset command (i.e., MRSR.command=6) and then
    triggers the reset by having the PCI core issue a secondary bus reset
    (SBR).
    
    However, due to a race condition in the device's firmware the device is
    not always able to recover from this reset, resulting in initialization
    failures [1].
    
    New firmware versions include a fix for the bug and advertise it using a
    new capability bit in the Management Capabilities Mask (MCAM) register.
    
    Avoid initialization failures by reading the new capability bit and
    triggering the new reset flow only if the bit is set. If the bit is not
    set, trigger a normal PCI hot reset by skipping the call to the
    Management Reset and Shutdown Register (MRSR).
    
    Normal PCI hot reset is weaker than "all reset", but it results in a
    fully operational driver and allows users to flash a new firmware, if
    they want to.
    
    [1]
    mlxsw_spectrum4 0000:01:00.0: not ready 1023ms after bus reset; waiting
    mlxsw_spectrum4 0000:01:00.0: not ready 2047ms after bus reset; waiting
    mlxsw_spectrum4 0000:01:00.0: not ready 4095ms after bus reset; waiting
    mlxsw_spectrum4 0000:01:00.0: not ready 8191ms after bus reset; waiting
    mlxsw_spectrum4 0000:01:00.0: not ready 16383ms after bus reset; waiting
    mlxsw_spectrum4 0000:01:00.0: not ready 32767ms after bus reset; waiting
    mlxsw_spectrum4 0000:01:00.0: not ready 65535ms after bus reset; giving up
    mlxsw_spectrum4 0000:01:00.0: PCI function reset failed with -25
    mlxsw_spectrum4 0000:01:00.0: cannot register bus device
    mlxsw_spectrum4: probe of 0000:01:00.0 failed with error -25
    
    Fixes: f257c73e5356 ("mlxsw: pci: Add support for new reset flow")
    Reported-by: Maksym Yaremchuk <maksymy@xxxxxxxxxx>
    Signed-off-by: Ido Schimmel <idosch@xxxxxxxxxx>
    Tested-by: Maksym Yaremchuk <maksymy@xxxxxxxxxx>
    Reviewed-by: Simon Horman <horms@xxxxxxxxxx>
    Signed-off-by: Petr Machata <petrm@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/mellanox/mlxsw/pci.c b/drivers/net/ethernet/mellanox/mlxsw/pci.c
index f42a1b1c93687..653a47dd43862 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/pci.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/pci.c
@@ -1490,18 +1490,25 @@ static int mlxsw_pci_sys_ready_wait(struct mlxsw_pci *mlxsw_pci,
 	return -EBUSY;
 }
 
-static int mlxsw_pci_reset_at_pci_disable(struct mlxsw_pci *mlxsw_pci)
+static int mlxsw_pci_reset_at_pci_disable(struct mlxsw_pci *mlxsw_pci,
+					  bool pci_reset_sbr_supported)
 {
 	struct pci_dev *pdev = mlxsw_pci->pdev;
 	char mrsr_pl[MLXSW_REG_MRSR_LEN];
 	int err;
 
+	if (!pci_reset_sbr_supported) {
+		pci_dbg(pdev, "Performing PCI hot reset instead of \"all reset\"\n");
+		goto sbr;
+	}
+
 	mlxsw_reg_mrsr_pack(mrsr_pl,
 			    MLXSW_REG_MRSR_COMMAND_RESET_AT_PCI_DISABLE);
 	err = mlxsw_reg_write(mlxsw_pci->core, MLXSW_REG(mrsr), mrsr_pl);
 	if (err)
 		return err;
 
+sbr:
 	device_lock_assert(&pdev->dev);
 
 	pci_cfg_access_lock(pdev);
@@ -1529,6 +1536,7 @@ static int
 mlxsw_pci_reset(struct mlxsw_pci *mlxsw_pci, const struct pci_device_id *id)
 {
 	struct pci_dev *pdev = mlxsw_pci->pdev;
+	bool pci_reset_sbr_supported = false;
 	char mcam_pl[MLXSW_REG_MCAM_LEN];
 	bool pci_reset_supported = false;
 	u32 sys_status;
@@ -1548,13 +1556,17 @@ mlxsw_pci_reset(struct mlxsw_pci *mlxsw_pci, const struct pci_device_id *id)
 	mlxsw_reg_mcam_pack(mcam_pl,
 			    MLXSW_REG_MCAM_FEATURE_GROUP_ENHANCED_FEATURES);
 	err = mlxsw_reg_query(mlxsw_pci->core, MLXSW_REG(mcam), mcam_pl);
-	if (!err)
+	if (!err) {
 		mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_PCI_RESET,
 				      &pci_reset_supported);
+		mlxsw_reg_mcam_unpack(mcam_pl, MLXSW_REG_MCAM_PCI_RESET_SBR,
+				      &pci_reset_sbr_supported);
+	}
 
 	if (pci_reset_supported) {
 		pci_dbg(pdev, "Starting PCI reset flow\n");
-		err = mlxsw_pci_reset_at_pci_disable(mlxsw_pci);
+		err = mlxsw_pci_reset_at_pci_disable(mlxsw_pci,
+						     pci_reset_sbr_supported);
 	} else {
 		pci_dbg(pdev, "Starting software reset flow\n");
 		err = mlxsw_pci_reset_sw(mlxsw_pci);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h
index 8892654c685f3..010eecab5147a 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/reg.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h
@@ -10668,6 +10668,8 @@ enum mlxsw_reg_mcam_mng_feature_cap_mask_bits {
 	MLXSW_REG_MCAM_MCIA_128B = 34,
 	/* If set, MRSR.command=6 is supported. */
 	MLXSW_REG_MCAM_PCI_RESET = 48,
+	/* If set, MRSR.command=6 is supported with Secondary Bus Reset. */
+	MLXSW_REG_MCAM_PCI_RESET_SBR = 67,
 };
 
 #define MLXSW_REG_BYTES_PER_DWORD 0x4




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux