• Ido Schimmel's avatar
    mlxsw: pci: Add support for new reset flow · f257c73e
    Ido Schimmel authored
    The driver resets the device during probe and during a devlink reload.
    The current reset method reloads the current firmware version or a
    pending one, if one was previously flashed using devlink. However, the
    current reset method does not result in a PCI hot reset, preventing the
    PCI firmware from being upgraded, unless the system is rebooted.
    
    To solve this problem, a new reset command (6) was implemented in the
    firmware. Unlike the current command (1), after issuing the new command
    the device will not start the reset immediately, but only after a PCI
    hot reset.
    
    Implement the new reset method by first verifying that it is supported
    by the current firmware version by querying the Management Capabilities
    Mask (MCAM) register. If supported, issue the new reset command (6) via
    MRSR register followed by a PCI reset by calling
    __pci_reset_function_locked().
    
    Once the PCI firmware is operational, go back to the regular reset flow
    and wait for the entire device to become ready. That is, repeatedly read
    the "system_status" register from the BAR until a value of "FW_READY"
    (0x5E) appears.
    
    Tested:
    
     # for i in $(seq 1 10); do devlink dev reload pci/0000:01:00.0; done
    Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Reviewed-by: default avatarPetr Machata <petrm@nvidia.com>
    Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
    Reviewed-by: default avatarSimon Horman <horms@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f257c73e
reg.h 377 KB