|
@@ -155,9 +155,11 @@ int mei_wd_send(struct mei_device *dev)
|
|
|
* @dev: the device structure
|
|
* @dev: the device structure
|
|
|
* @preserve: indicate if to keep the timeout value
|
|
* @preserve: indicate if to keep the timeout value
|
|
|
*
|
|
*
|
|
|
- * returns 0 if success,
|
|
|
|
|
- * -EIO when message send fails
|
|
|
|
|
|
|
+ * returns 0 if success
|
|
|
|
|
+ * on error:
|
|
|
|
|
+ * -EIO when message send fails
|
|
|
* -EINVAL when invalid message is to be sent
|
|
* -EINVAL when invalid message is to be sent
|
|
|
|
|
+ * -ETIME on message timeout
|
|
|
*/
|
|
*/
|
|
|
int mei_wd_stop(struct mei_device *dev)
|
|
int mei_wd_stop(struct mei_device *dev)
|
|
|
{
|
|
{
|
|
@@ -173,12 +175,12 @@ int mei_wd_stop(struct mei_device *dev)
|
|
|
|
|
|
|
|
ret = mei_cl_flow_ctrl_creds(&dev->wd_cl);
|
|
ret = mei_cl_flow_ctrl_creds(&dev->wd_cl);
|
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
|
- goto out;
|
|
|
|
|
|
|
+ goto err;
|
|
|
|
|
|
|
|
if (ret && mei_hbuf_acquire(dev)) {
|
|
if (ret && mei_hbuf_acquire(dev)) {
|
|
|
ret = mei_wd_send(dev);
|
|
ret = mei_wd_send(dev);
|
|
|
if (ret)
|
|
if (ret)
|
|
|
- goto out;
|
|
|
|
|
|
|
+ goto err;
|
|
|
dev->wd_pending = false;
|
|
dev->wd_pending = false;
|
|
|
} else {
|
|
} else {
|
|
|
dev->wd_pending = true;
|
|
dev->wd_pending = true;
|
|
@@ -186,21 +188,21 @@ int mei_wd_stop(struct mei_device *dev)
|
|
|
|
|
|
|
|
mutex_unlock(&dev->device_lock);
|
|
mutex_unlock(&dev->device_lock);
|
|
|
|
|
|
|
|
- ret = wait_event_interruptible_timeout(dev->wait_stop_wd,
|
|
|
|
|
- dev->wd_state == MEI_WD_IDLE,
|
|
|
|
|
- msecs_to_jiffies(MEI_WD_STOP_TIMEOUT));
|
|
|
|
|
|
|
+ ret = wait_event_timeout(dev->wait_stop_wd,
|
|
|
|
|
+ dev->wd_state == MEI_WD_IDLE,
|
|
|
|
|
+ msecs_to_jiffies(MEI_WD_STOP_TIMEOUT));
|
|
|
mutex_lock(&dev->device_lock);
|
|
mutex_lock(&dev->device_lock);
|
|
|
- if (dev->wd_state == MEI_WD_IDLE) {
|
|
|
|
|
- dev_dbg(&dev->pdev->dev, "wd: stop completed ret=%d.\n", ret);
|
|
|
|
|
- ret = 0;
|
|
|
|
|
- } else {
|
|
|
|
|
- if (!ret)
|
|
|
|
|
- ret = -ETIME;
|
|
|
|
|
|
|
+ if (dev->wd_state != MEI_WD_IDLE) {
|
|
|
|
|
+ /* timeout */
|
|
|
|
|
+ ret = -ETIME;
|
|
|
dev_warn(&dev->pdev->dev,
|
|
dev_warn(&dev->pdev->dev,
|
|
|
"wd: stop failed to complete ret=%d.\n", ret);
|
|
"wd: stop failed to complete ret=%d.\n", ret);
|
|
|
|
|
+ goto err;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-out:
|
|
|
|
|
|
|
+ dev_dbg(&dev->pdev->dev, "wd: stop completed after %u msec\n",
|
|
|
|
|
+ MEI_WD_STOP_TIMEOUT - jiffies_to_msecs(ret));
|
|
|
|
|
+ return 0;
|
|
|
|
|
+err:
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
|
|
|
|