mirror of https://gitee.com/openkylin/linux.git
mlxsw: core: Reset firmware after flash during driver initialization
After flashing new firmware during the driver initialization flow (reload or not), the driver should do a firmware reset when it gets -EAGAIN in order to load the new one. Signed-off-by: Shalom Toledo <shalomt@mellanox.com> Reviewed-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
846e980a87
commit
03bffcad49
|
@ -965,10 +965,11 @@ static const struct devlink_ops mlxsw_devlink_ops = {
|
|||
.sb_occ_tc_port_bind_get = mlxsw_devlink_sb_occ_tc_port_bind_get,
|
||||
};
|
||||
|
||||
int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
||||
const struct mlxsw_bus *mlxsw_bus,
|
||||
void *bus_priv, bool reload,
|
||||
struct devlink *devlink)
|
||||
static int
|
||||
__mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
||||
const struct mlxsw_bus *mlxsw_bus,
|
||||
void *bus_priv, bool reload,
|
||||
struct devlink *devlink)
|
||||
{
|
||||
const char *device_kind = mlxsw_bus_info->device_kind;
|
||||
struct mlxsw_core *mlxsw_core;
|
||||
|
@ -1076,6 +1077,29 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
|||
err_devlink_alloc:
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
||||
const struct mlxsw_bus *mlxsw_bus,
|
||||
void *bus_priv, bool reload,
|
||||
struct devlink *devlink)
|
||||
{
|
||||
bool called_again = false;
|
||||
int err;
|
||||
|
||||
again:
|
||||
err = __mlxsw_core_bus_device_register(mlxsw_bus_info, mlxsw_bus,
|
||||
bus_priv, reload, devlink);
|
||||
/* -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;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(mlxsw_core_bus_device_register);
|
||||
|
||||
void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
|
||||
|
|
|
@ -1720,7 +1720,6 @@ 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);
|
||||
|
@ -1777,18 +1776,10 @@ 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);
|
||||
/* -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) {
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "cannot register bus device\n");
|
||||
goto err_bus_device_register;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue