}
        }
 
-       if (dev->stop && !dev->wd_pending) {
-               dev->wd_stopped = true;
+       if (dev->wd_state == MEI_WD_STOPPING) {
+               dev->wd_state = MEI_WD_IDLE;
                wake_up_interruptible(&dev->wait_stop_wd);
-               return 0;
        }
 
        if (dev->extra_write_index) {
 
                        dev->wd_pending = false;
 
-                       if (dev->wd_timeout)
+                       if (dev->wd_state == MEI_WD_RUNNING)
                                *slots -= mei_data2slots(MEI_WD_START_MSG_SIZE);
                        else
                                *slots -= mei_data2slots(MEI_WD_STOP_MSG_SIZE);
                }
        }
-       if (dev->stop)
-               return -ENODEV;
 
        /* complete control write list CB */
        dev_dbg(&dev->pdev->dev, "complete control write list cb.\n");
 
 
        mutex_lock(&dev->device_lock);
 
-       mei_wd_stop(dev, false);
+       cancel_delayed_work(&dev->timer_work);
+
+       mei_wd_stop(dev);
 
        mei_device = NULL;
 
        if (!dev)
                return -ENODEV;
        mutex_lock(&dev->device_lock);
+
+       cancel_delayed_work(&dev->timer_work);
+
        /* Stop watchdog if exists */
-       err = mei_wd_stop(dev, true);
+       err = mei_wd_stop(dev);
        /* Set new mei state */
        if (dev->dev_state == MEI_DEV_ENABLED ||
            dev->dev_state == MEI_DEV_RECOVERING_FROM_RESET) {
 
 #define MEI_WD_MIN_TIMEOUT       120  /* seconds */
 #define MEI_WD_MAX_TIMEOUT     65535  /* seconds */
 
+#define MEI_WD_STOP_TIMEOUT      10 /* msecs */
+
 #define MEI_WD_STATE_INDEPENDENCE_MSG_SENT       (1 << 0)
 
 #define MEI_RD_MSG_BUF_SIZE           (128 * sizeof(u32))
        MEI_READ_COMPLETE
 };
 
+enum mei_wd_states {
+       MEI_WD_IDLE,
+       MEI_WD_RUNNING,
+       MEI_WD_STOPPING,
+};
+
 /* MEI CB */
 enum mei_cb_major_types {
        MEI_READ = 0,
        enum mei_dev_state dev_state;
        enum mei_init_clients_states init_clients_state;
        u16 init_clients_timer;
-       bool stop;
        bool need_reset;
 
        u32 extra_write_index;
        bool mei_host_buffer_is_empty;
 
        struct mei_cl wd_cl;
+       enum mei_wd_states wd_state;
        bool wd_interface_reg;
        bool wd_pending;
-       bool wd_stopped;
-       bool wd_bypass; /* if false, don't refresh watchdog ME client */
-       u16 wd_timeout; /* seconds ((wd_data[1] << 8) + wd_data[0]) */
+       u16 wd_timeout;
        unsigned char wd_data[MEI_WD_START_MSG_SIZE];
 
 
 
        /* look for WD client and connect to it */
        dev->wd_cl.state = MEI_FILE_DISCONNECTED;
        dev->wd_timeout = MEI_WD_DEFAULT_TIMEOUT;
+       dev->wd_state = MEI_WD_IDLE;
 
        /* find ME WD client */
        mei_me_cl_update_filext(dev, &dev->wd_cl,
  *     -EIO when message send fails
  *     -EINVAL when invalid message is to be sent
  */
-int mei_wd_stop(struct mei_device *dev, bool preserve)
+int mei_wd_stop(struct mei_device *dev)
 {
        int ret;
-       u16 wd_timeout = dev->wd_timeout;
 
-       cancel_delayed_work(&dev->timer_work);
-       if (dev->wd_cl.state != MEI_FILE_CONNECTED || !dev->wd_timeout)
+       if (dev->wd_cl.state != MEI_FILE_CONNECTED ||
+           dev->wd_state != MEI_WD_RUNNING)
                return 0;
 
-       dev->wd_timeout = 0;
        memcpy(dev->wd_data, mei_stop_wd_params, MEI_WD_STOP_MSG_SIZE);
-       dev->stop = true;
+
+       dev->wd_state = MEI_WD_STOPPING;
 
        ret = mei_flow_ctrl_creds(dev, &dev->wd_cl);
        if (ret < 0)
        } else {
                dev->wd_pending = true;
        }
-       dev->wd_stopped = false;
+
        mutex_unlock(&dev->device_lock);
 
        ret = wait_event_interruptible_timeout(dev->wait_stop_wd,
-                                       dev->wd_stopped, 10 * HZ);
+                                       dev->wd_state == MEI_WD_IDLE,
+                                       msecs_to_jiffies(MEI_WD_STOP_TIMEOUT));
        mutex_lock(&dev->device_lock);
-       if (dev->wd_stopped) {
+       if (dev->wd_state == MEI_WD_IDLE) {
                dev_dbg(&dev->pdev->dev, "wd: stop completed ret=%d.\n", ret);
                ret = 0;
        } else {
                        "wd: stop failed to complete ret=%d.\n", ret);
        }
 
-       if (preserve)
-               dev->wd_timeout = wd_timeout;
-
 out:
        return ret;
 }
                return -ENODEV;
 
        mutex_lock(&dev->device_lock);
-       mei_wd_stop(dev, false);
+       mei_wd_stop(dev);
        mutex_unlock(&dev->device_lock);
 
        return 0;
                goto end;
        }
 
+       dev->wd_state = MEI_WD_RUNNING;
+
        /* Check if we can send the ping to HW*/
        if (dev->mei_host_buffer_is_empty &&
                mei_flow_ctrl_creds(dev, &dev->wd_cl) > 0) {