mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	mlxsw: spectrum: Reset FW after flash
Recent FW fixes a bug and allows to load newly flashed FW image after reset. So make sure the reset happens after flash. Indicate the need down to PCI layer by -EAGAIN. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									a716d55e4d
								
							
						
					
					
						commit
						c86d62cc41
					
				| @ -362,6 +362,7 @@ struct mlxsw_fw_rev { | ||||
| 	u16 major; | ||||
| 	u16 minor; | ||||
| 	u16 subminor; | ||||
| 	u16 can_reset_minor; | ||||
| }; | ||||
| 
 | ||||
| struct mlxsw_bus_info { | ||||
|  | ||||
| @ -1750,6 +1750,7 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||||
| { | ||||
| 	const char *driver_name = pdev->driver->name; | ||||
| 	struct mlxsw_pci *mlxsw_pci; | ||||
| 	bool called_again = false; | ||||
| 	int err; | ||||
| 
 | ||||
| 	mlxsw_pci = kzalloc(sizeof(*mlxsw_pci), GFP_KERNEL); | ||||
| @ -1806,10 +1807,18 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||||
| 	mlxsw_pci->bus_info.dev = &pdev->dev; | ||||
| 	mlxsw_pci->id = id; | ||||
| 
 | ||||
| again: | ||||
| 	err = mlxsw_core_bus_device_register(&mlxsw_pci->bus_info, | ||||
| 					     &mlxsw_pci_bus, mlxsw_pci, false, | ||||
| 					     NULL); | ||||
| 	if (err) { | ||||
| 	/* -EAGAIN is returned in case the FW was updated. FW needs
 | ||||
| 	 * a reset, so lets try to call mlxsw_core_bus_device_register() | ||||
| 	 * again. | ||||
| 	 */ | ||||
| 	if (err == -EAGAIN && !called_again) { | ||||
| 		called_again = true; | ||||
| 		goto again; | ||||
| 	} else if (err) { | ||||
| 		dev_err(&pdev->dev, "cannot register bus device\n"); | ||||
| 		goto err_bus_device_register; | ||||
| 	} | ||||
|  | ||||
| @ -79,11 +79,13 @@ | ||||
| #define MLXSW_SP1_FWREV_MAJOR 13 | ||||
| #define MLXSW_SP1_FWREV_MINOR 1702 | ||||
| #define MLXSW_SP1_FWREV_SUBMINOR 6 | ||||
| #define MLXSW_SP1_FWREV_CAN_RESET_MINOR 1702 | ||||
| 
 | ||||
| static const struct mlxsw_fw_rev mlxsw_sp1_fw_rev = { | ||||
| 	.major = MLXSW_SP1_FWREV_MAJOR, | ||||
| 	.minor = MLXSW_SP1_FWREV_MINOR, | ||||
| 	.subminor = MLXSW_SP1_FWREV_SUBMINOR, | ||||
| 	.can_reset_minor = MLXSW_SP1_FWREV_CAN_RESET_MINOR, | ||||
| }; | ||||
| 
 | ||||
| #define MLXSW_SP1_FW_FILENAME \ | ||||
| @ -380,7 +382,16 @@ static int mlxsw_sp_fw_rev_validate(struct mlxsw_sp *mlxsw_sp) | ||||
| 
 | ||||
| 	err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware); | ||||
| 	release_firmware(firmware); | ||||
| 	return err; | ||||
| 	if (err) | ||||
| 		dev_err(mlxsw_sp->bus_info->dev, "Could not upgrade firmware\n"); | ||||
| 
 | ||||
| 	/* On FW flash success, tell the caller FW reset is needed
 | ||||
| 	 * if current FW supports it. | ||||
| 	 */ | ||||
| 	if (rev->minor >= req_rev->can_reset_minor) | ||||
| 		return err ? err : -EAGAIN; | ||||
| 	else | ||||
| 		return 0; | ||||
| } | ||||
| 
 | ||||
| int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp, | ||||
| @ -3734,10 +3745,8 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core, | ||||
| 	mlxsw_sp->bus_info = mlxsw_bus_info; | ||||
| 
 | ||||
| 	err = mlxsw_sp_fw_rev_validate(mlxsw_sp); | ||||
| 	if (err) { | ||||
| 		dev_err(mlxsw_sp->bus_info->dev, "Could not upgrade firmware\n"); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 	} | ||||
| 
 | ||||
| 	err = mlxsw_sp_base_mac_get(mlxsw_sp); | ||||
| 	if (err) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jiri Pirko
						Jiri Pirko