staging: mei: adding watchdog ping
authorOren Weil <oren.jer.weil@intel.com>
Wed, 7 Sep 2011 06:03:11 +0000 (09:03 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 9 Sep 2011 20:28:20 +0000 (13:28 -0700)
adding watchdog ping to send ping/heartbeat to the the AMT watchdog client.
in addition removing the heartbeat sending from the driver timers function.

Signed-off-by: Oren Weil <oren.jer.weil@intel.com>
Acked-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/mei/interrupt.c
drivers/staging/mei/wd.c

index 958a7e2958b6958895639945bf3ca3c46d7cf3b0..62b8001ba1d703e53188be53728c5421ade6aec3 100644 (file)
@@ -1430,33 +1430,6 @@ void mei_wd_timer(struct work_struct *work)
                }
        }
 
-       if (dev->wd_cl.state != MEI_FILE_CONNECTED)
-               goto out;
-
-       /* Watchdog */
-       if (dev->wd_due_counter && !dev->wd_bypass) {
-               if (--dev->wd_due_counter == 0) {
-                       if (dev->mei_host_buffer_is_empty &&
-                           mei_flow_ctrl_creds(dev, &dev->wd_cl) > 0) {
-                               dev->mei_host_buffer_is_empty = false;
-                               dev_dbg(&dev->pdev->dev, "send watchdog.\n");
-
-                               if (mei_wd_send(dev))
-                                       dev_dbg(&dev->pdev->dev, "wd send failed.\n");
-                               else
-                                       if (mei_flow_ctrl_reduce(dev, &dev->wd_cl))
-                                               goto out;
-
-                               if (dev->wd_timeout)
-                                       dev->wd_due_counter = 2;
-                               else
-                                       dev->wd_due_counter = 0;
-
-                       } else
-                               dev->wd_pending = true;
-
-               }
-       }
        if (dev->iamthif_stall_timer) {
                if (--dev->iamthif_stall_timer == 0) {
                        dev_dbg(&dev->pdev->dev, "reseting because of hang to amthi.\n");
index fb2bd3d43346c1f0b61dfd4bf10a3d1735f3884a..9338394b236956bbfe6e2e9c613dfa5e4d5db660 100644 (file)
@@ -254,6 +254,58 @@ static int mei_wd_ops_stop(struct watchdog_device *wd_dev)
        return 0;
 }
 
+/*
+ * mei_wd_ops_ping - wd ping command from the watchdog core.
+ *
+ * @wd_dev - watchdog device struct
+ *
+ * returns 0 if success, negative errno code for failure
+ */
+static int mei_wd_ops_ping(struct watchdog_device *wd_dev)
+{
+       int ret = 0;
+       struct mei_device *dev;
+       dev = pci_get_drvdata(mei_device);
+
+       if (!dev)
+               return -ENODEV;
+
+       mutex_lock(&dev->device_lock);
+
+       if (dev->wd_cl.state != MEI_FILE_CONNECTED) {
+               dev_dbg(&dev->pdev->dev, "wd is not connected.\n");
+               ret = -ENODEV;
+               goto end;
+       }
+
+       /* 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) {
+
+               dev->mei_host_buffer_is_empty = false;
+               dev_dbg(&dev->pdev->dev, "sending watchdog ping\n");
+
+               if (mei_wd_send(dev)) {
+                       dev_dbg(&dev->pdev->dev, "wd send failed.\n");
+                       ret = -EIO;
+                       goto end;
+               }
+
+               if (mei_flow_ctrl_reduce(dev, &dev->wd_cl)) {
+                       dev_dbg(&dev->pdev->dev, "mei_flow_ctrl_reduce() failed.\n");
+                       ret = -EIO;
+                       goto end;
+               }
+
+       } else {
+               dev->wd_pending = true;
+       }
+
+end:
+       mutex_unlock(&dev->device_lock);
+       return ret;
+}
+
 /*
  * Watchdog Device structs
  */
@@ -261,9 +313,11 @@ const struct watchdog_ops wd_ops = {
                .owner = THIS_MODULE,
                .start = mei_wd_ops_start,
                .stop = mei_wd_ops_stop,
+               .ping = mei_wd_ops_ping,
 };
 const struct watchdog_info wd_info = {
                .identity = INTEL_AMT_WATCHDOG_ID,
+               .options = WDIOF_KEEPALIVEPING,
 };
 
 struct watchdog_device amt_wd_dev = {