Commit 12b1b997 authored by Shannon Nelson's avatar Shannon Nelson Committed by Jakub Kicinski

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: 398d1e37 ("ionic: add FW_STOPPING state")
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 86213f80
...@@ -206,6 +206,8 @@ int ionic_heartbeat_check(struct ionic *ionic) ...@@ -206,6 +206,8 @@ int ionic_heartbeat_check(struct ionic *ionic)
if (fw_status_ready != idev->fw_status_ready) { if (fw_status_ready != idev->fw_status_ready) {
bool trigger = false; bool trigger = false;
idev->fw_status_ready = fw_status_ready;
if (!fw_status_ready && lif && if (!fw_status_ready && lif &&
!test_bit(IONIC_LIF_F_FW_RESET, lif->state) && !test_bit(IONIC_LIF_F_FW_RESET, lif->state) &&
!test_and_set_bit(IONIC_LIF_F_FW_STOPPING, lif->state)) { !test_and_set_bit(IONIC_LIF_F_FW_STOPPING, lif->state)) {
...@@ -222,8 +224,6 @@ int ionic_heartbeat_check(struct ionic *ionic) ...@@ -222,8 +224,6 @@ int ionic_heartbeat_check(struct ionic *ionic)
if (trigger) { if (trigger) {
struct ionic_deferred_work *work; struct ionic_deferred_work *work;
idev->fw_status_ready = fw_status_ready;
work = kzalloc(sizeof(*work), GFP_ATOMIC); work = kzalloc(sizeof(*work), GFP_ATOMIC);
if (work) { if (work) {
work->type = IONIC_DW_TYPE_LIF_RESET; work->type = IONIC_DW_TYPE_LIF_RESET;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment