diff options
author | Jiri Pirko | 2016-03-10 23:10:21 +0100 |
---|---|---|
committer | David S. Miller | 2016-03-14 03:30:01 +0100 |
commit | 233fa44bd67ae0c6cbc01f96ab87d66a6c57812e (patch) | |
tree | c83aafab20c9f2954c1625f750d68319d4c1b77c /drivers/net/ethernet/mellanox/mlxsw/pci.c | |
parent | sctp: allow sctp_transmit_packet and others to use gfp (diff) | |
download | kernel-qcow2-linux-233fa44bd67ae0c6cbc01f96ab87d66a6c57812e.tar.gz kernel-qcow2-linux-233fa44bd67ae0c6cbc01f96ab87d66a6c57812e.tar.xz kernel-qcow2-linux-233fa44bd67ae0c6cbc01f96ab87d66a6c57812e.zip |
mlxsw: pci: Implement reset done check
Firmware now tells us that the reset is done by passing a magic value
via register. Use it to shorten the wait in case this is supported.
With old firmware, we still wait until the timeout is reached.
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlxsw/pci.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/pci.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/pci.c b/drivers/net/ethernet/mellanox/mlxsw/pci.c index 7992c553c1f5..7f4173c8eda3 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/pci.c +++ b/drivers/net/ethernet/mellanox/mlxsw/pci.c @@ -1681,11 +1681,18 @@ static const struct mlxsw_bus mlxsw_pci_bus = { static int mlxsw_pci_sw_reset(struct mlxsw_pci *mlxsw_pci) { + unsigned long end; + mlxsw_pci_write32(mlxsw_pci, SW_RESET, MLXSW_PCI_SW_RESET_RST_BIT); - /* Current firware does not let us know when the reset is done. - * So we just wait here for constant time and hope for the best. - */ - msleep(MLXSW_PCI_SW_RESET_TIMEOUT_MSECS); + wmb(); /* reset needs to be written before we read control register */ + end = jiffies + msecs_to_jiffies(MLXSW_PCI_SW_RESET_TIMEOUT_MSECS); + do { + u32 val = mlxsw_pci_read32(mlxsw_pci, FW_READY); + + if ((val & MLXSW_PCI_FW_READY_MASK) == MLXSW_PCI_FW_READY_MAGIC) + break; + cond_resched(); + } while (time_before(jiffies, end)); return 0; } |