|
@@ -540,42 +540,60 @@ static void ncsi_suspend_channel(struct ncsi_dev_priv *ndp)
|
|
|
nd->state = ncsi_dev_state_suspend_select;
|
|
|
/* Fall through */
|
|
|
case ncsi_dev_state_suspend_select:
|
|
|
+ ndp->pending_req_num = 1;
|
|
|
+
|
|
|
+ nca.type = NCSI_PKT_CMD_SP;
|
|
|
+ nca.package = np->id;
|
|
|
+ nca.channel = NCSI_RESERVED_CHANNEL;
|
|
|
+ if (ndp->flags & NCSI_DEV_HWA)
|
|
|
+ nca.bytes[0] = 0;
|
|
|
+ else
|
|
|
+ nca.bytes[0] = 1;
|
|
|
+
|
|
|
+ nd->state = ncsi_dev_state_suspend_dcnt;
|
|
|
+ ret = ncsi_xmit_cmd(&nca);
|
|
|
+ if (ret)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ break;
|
|
|
case ncsi_dev_state_suspend_dcnt:
|
|
|
+ ndp->pending_req_num = 1;
|
|
|
+
|
|
|
+ nca.type = NCSI_PKT_CMD_DCNT;
|
|
|
+ nca.package = np->id;
|
|
|
+ nca.channel = nc->id;
|
|
|
+
|
|
|
+ nd->state = ncsi_dev_state_suspend_dc;
|
|
|
+ ret = ncsi_xmit_cmd(&nca);
|
|
|
+ if (ret)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ break;
|
|
|
case ncsi_dev_state_suspend_dc:
|
|
|
+ ndp->pending_req_num = 1;
|
|
|
+
|
|
|
+ nca.type = NCSI_PKT_CMD_DC;
|
|
|
+ nca.package = np->id;
|
|
|
+ nca.channel = nc->id;
|
|
|
+ nca.bytes[0] = 1;
|
|
|
+
|
|
|
+ nd->state = ncsi_dev_state_suspend_deselect;
|
|
|
+ ret = ncsi_xmit_cmd(&nca);
|
|
|
+ if (ret)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ break;
|
|
|
case ncsi_dev_state_suspend_deselect:
|
|
|
ndp->pending_req_num = 1;
|
|
|
|
|
|
- np = ndp->active_package;
|
|
|
- nc = ndp->active_channel;
|
|
|
+ nca.type = NCSI_PKT_CMD_DP;
|
|
|
nca.package = np->id;
|
|
|
- if (nd->state == ncsi_dev_state_suspend_select) {
|
|
|
- nca.type = NCSI_PKT_CMD_SP;
|
|
|
- nca.channel = NCSI_RESERVED_CHANNEL;
|
|
|
- if (ndp->flags & NCSI_DEV_HWA)
|
|
|
- nca.bytes[0] = 0;
|
|
|
- else
|
|
|
- nca.bytes[0] = 1;
|
|
|
- nd->state = ncsi_dev_state_suspend_dcnt;
|
|
|
- } else if (nd->state == ncsi_dev_state_suspend_dcnt) {
|
|
|
- nca.type = NCSI_PKT_CMD_DCNT;
|
|
|
- nca.channel = nc->id;
|
|
|
- nd->state = ncsi_dev_state_suspend_dc;
|
|
|
- } else if (nd->state == ncsi_dev_state_suspend_dc) {
|
|
|
- nca.type = NCSI_PKT_CMD_DC;
|
|
|
- nca.channel = nc->id;
|
|
|
- nca.bytes[0] = 1;
|
|
|
- nd->state = ncsi_dev_state_suspend_deselect;
|
|
|
- } else if (nd->state == ncsi_dev_state_suspend_deselect) {
|
|
|
- nca.type = NCSI_PKT_CMD_DP;
|
|
|
- nca.channel = NCSI_RESERVED_CHANNEL;
|
|
|
- nd->state = ncsi_dev_state_suspend_done;
|
|
|
- }
|
|
|
+ nca.channel = NCSI_RESERVED_CHANNEL;
|
|
|
|
|
|
+ nd->state = ncsi_dev_state_suspend_done;
|
|
|
ret = ncsi_xmit_cmd(&nca);
|
|
|
- if (ret) {
|
|
|
- nd->state = ncsi_dev_state_functional;
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (ret)
|
|
|
+ goto error;
|
|
|
|
|
|
break;
|
|
|
case ncsi_dev_state_suspend_done:
|
|
@@ -589,6 +607,10 @@ static void ncsi_suspend_channel(struct ncsi_dev_priv *ndp)
|
|
|
netdev_warn(nd->dev, "Wrong NCSI state 0x%x in suspend\n",
|
|
|
nd->state);
|
|
|
}
|
|
|
+
|
|
|
+ return;
|
|
|
+error:
|
|
|
+ nd->state = ncsi_dev_state_functional;
|
|
|
}
|
|
|
|
|
|
static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
|