|
@@ -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;
|