net/ncsi: Fix stale link state of inactive channels on failover
[cascardo/linux.git] / net / ncsi / ncsi-manage.c
index 655d0d6..4789f86 100644 (file)
@@ -550,11 +550,37 @@ static void ncsi_suspend_channel(struct ncsi_dev_priv *ndp)
                else
                        nca.bytes[0] = 1;
 
-               nd->state = ncsi_dev_state_suspend_dcnt;
+               /* To retrieve the last link states of channels in current
+                * package when current active channel needs fail over to
+                * another one. It means we will possibly select another
+                * channel as next active one. The link states of channels
+                * are most important factor of the selection. So we need
+                * accurate link states. Unfortunately, the link states on
+                * inactive channels can't be updated with LSC AEN in time.
+                */
+               if (ndp->flags & NCSI_DEV_RESHUFFLE)
+                       nd->state = ncsi_dev_state_suspend_gls;
+               else
+                       nd->state = ncsi_dev_state_suspend_dcnt;
                ret = ncsi_xmit_cmd(&nca);
                if (ret)
                        goto error;
 
+               break;
+       case ncsi_dev_state_suspend_gls:
+               ndp->pending_req_num = np->channel_num;
+
+               nca.type = NCSI_PKT_CMD_GLS;
+               nca.package = np->id;
+
+               nd->state = ncsi_dev_state_suspend_dcnt;
+               NCSI_FOR_EACH_CHANNEL(np, nc) {
+                       nca.channel = nc->id;
+                       ret = ncsi_xmit_cmd(&nca);
+                       if (ret)
+                               goto error;
+               }
+
                break;
        case ncsi_dev_state_suspend_dcnt:
                ndp->pending_req_num = 1;