aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/pensando/ionic
diff options
context:
space:
mode:
authorShannon Nelson <snelson@pensando.io>2022-02-17 14:02:49 -0800
committerJakub Kicinski <kuba@kernel.org>2022-02-18 20:37:14 -0800
commit12b1b997c0e5604f1a5c081f51ff67f4c814b7dd (patch)
treeff0b8779d5ae8af03e191d167a24aa121c5f90f7 /drivers/net/ethernet/pensando/ionic
parentnet: avoid quadratic behavior in netdev_wait_allrefs_any() (diff)
downloadlinux-dev-12b1b997c0e5604f1a5c081f51ff67f4c814b7dd.tar.xz
linux-dev-12b1b997c0e5604f1a5c081f51ff67f4c814b7dd.zip
ionic: catch transition back to RUNNING with fw_generation 0
In some graceful updates that get initially triggered by the RESET event, especially with older firmware, the fw_generation bits don't change but the fw_status is seen to go to 0 then back to 1. However, the driver didn't perform the restart, remained waiting for fw_generation to change, and got left in limbo. This is because the clearing of idev->fw_status_ready to 0 didn't happen correctly as it was buried in the transition trigger: since the transition down was triggered not here but in the RESET event handler, the clear to 0 didn't happen, so the transition back to 1 wasn't detected. Fix this particular case by bringing the setting of idev->fw_status_ready back out to where it was before. Fixes: 398d1e37f960 ("ionic: add FW_STOPPING state") Signed-off-by: Shannon Nelson <snelson@pensando.io> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/pensando/ionic')
-rw-r--r--drivers/net/ethernet/pensando/ionic/ionic_dev.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_dev.c b/drivers/net/ethernet/pensando/ionic/ionic_dev.c
index 52a1b5cfd8e7..faeedc8db6f4 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_dev.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_dev.c
@@ -206,6 +206,8 @@ do_check_time:
if (fw_status_ready != idev->fw_status_ready) {
bool trigger = false;
+ idev->fw_status_ready = fw_status_ready;
+
if (!fw_status_ready && lif &&
!test_bit(IONIC_LIF_F_FW_RESET, lif->state) &&
!test_and_set_bit(IONIC_LIF_F_FW_STOPPING, lif->state)) {
@@ -222,8 +224,6 @@ do_check_time:
if (trigger) {
struct ionic_deferred_work *work;
- idev->fw_status_ready = fw_status_ready;
-
work = kzalloc(sizeof(*work), GFP_ATOMIC);
if (work) {
work->type = IONIC_DW_TYPE_LIF_RESET;