mirror of https://gitee.com/openkylin/linux.git
staging: mei: adding set_timeout watchdog function
add the ability to let the watchdog core set the AMT watchdog timeout value. the default value will be only set in the start 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>
This commit is contained in:
parent
8c4a59a789
commit
55d3385672
|
@ -51,7 +51,7 @@ int mei_flow_ctrl_creds(struct mei_device *dev, struct mei_cl *cl);
|
||||||
int mei_wd_send(struct mei_device *dev);
|
int mei_wd_send(struct mei_device *dev);
|
||||||
int mei_wd_stop(struct mei_device *dev, bool preserve);
|
int mei_wd_stop(struct mei_device *dev, bool preserve);
|
||||||
bool mei_wd_host_init(struct mei_device *dev);
|
bool mei_wd_host_init(struct mei_device *dev);
|
||||||
void mei_wd_start_setup(struct mei_device *dev);
|
void mei_wd_set_start_timeout(struct mei_device *dev, u16 timeout);
|
||||||
|
|
||||||
int mei_flow_ctrl_reduce(struct mei_device *dev, struct mei_cl *cl);
|
int mei_flow_ctrl_reduce(struct mei_device *dev, struct mei_cl *cl);
|
||||||
|
|
||||||
|
|
|
@ -1153,7 +1153,6 @@ static int mei_pci_resume(struct device *device)
|
||||||
|
|
||||||
/* Start watchdog if stopped in suspend */
|
/* Start watchdog if stopped in suspend */
|
||||||
if (dev->wd_timeout) {
|
if (dev->wd_timeout) {
|
||||||
mei_wd_start_setup(dev);
|
|
||||||
dev->wd_due_counter = 1;
|
dev->wd_due_counter = 1;
|
||||||
schedule_delayed_work(&dev->wd_work, HZ);
|
schedule_delayed_work(&dev->wd_work, HZ);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,12 +51,12 @@ const uuid_le mei_wd_guid = UUID_LE(0x05B79A6F, 0x4628, 0x4D7F, 0x89,
|
||||||
0x32, 0xAB);
|
0x32, 0xAB);
|
||||||
|
|
||||||
|
|
||||||
void mei_wd_start_setup(struct mei_device *dev)
|
void mei_wd_set_start_timeout(struct mei_device *dev, u16 timeout)
|
||||||
{
|
{
|
||||||
dev_dbg(&dev->pdev->dev, "dev->wd_timeout=%d.\n", dev->wd_timeout);
|
dev_dbg(&dev->pdev->dev, "timeout=%d.\n", timeout);
|
||||||
memcpy(dev->wd_data, mei_start_wd_params, MEI_WD_PARAMS_SIZE);
|
memcpy(dev->wd_data, mei_start_wd_params, MEI_WD_PARAMS_SIZE);
|
||||||
memcpy(dev->wd_data + MEI_WD_PARAMS_SIZE,
|
memcpy(dev->wd_data + MEI_WD_PARAMS_SIZE,
|
||||||
&dev->wd_timeout, sizeof(u16));
|
&timeout, sizeof(u16));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,7 +75,6 @@ bool mei_wd_host_init(struct mei_device *dev)
|
||||||
dev->wd_timeout = watchdog_timeout;
|
dev->wd_timeout = watchdog_timeout;
|
||||||
|
|
||||||
if (dev->wd_timeout > 0) {
|
if (dev->wd_timeout > 0) {
|
||||||
mei_wd_start_setup(dev);
|
|
||||||
/* find ME WD client */
|
/* find ME WD client */
|
||||||
mei_find_me_client_update_filext(dev, &dev->wd_cl,
|
mei_find_me_client_update_filext(dev, &dev->wd_cl,
|
||||||
&mei_wd_guid, MEI_WD_HOST_CLIENT_ID);
|
&mei_wd_guid, MEI_WD_HOST_CLIENT_ID);
|
||||||
|
@ -224,7 +223,7 @@ static int mei_wd_ops_start(struct watchdog_device *wd_dev)
|
||||||
goto end_unlock;
|
goto end_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
mei_wd_start_setup(dev);
|
mei_wd_set_start_timeout(dev, dev->wd_timeout);
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
end_unlock:
|
end_unlock:
|
||||||
|
@ -306,6 +305,36 @@ static int mei_wd_ops_ping(struct watchdog_device *wd_dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mei_wd_ops_set_timeout - wd set timeout command from the watchdog core.
|
||||||
|
*
|
||||||
|
* @wd_dev - watchdog device struct
|
||||||
|
* @timeout - timeout value to set
|
||||||
|
*
|
||||||
|
* returns 0 if success, negative errno code for failure
|
||||||
|
*/
|
||||||
|
static int mei_wd_ops_set_timeout(struct watchdog_device *wd_dev, unsigned int timeout)
|
||||||
|
{
|
||||||
|
struct mei_device *dev;
|
||||||
|
dev = pci_get_drvdata(mei_device);
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* Check Timeout value */
|
||||||
|
if (timeout < AMT_WD_MIN_TIMEOUT || timeout > AMT_WD_MAX_TIMEOUT)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&dev->device_lock);
|
||||||
|
|
||||||
|
dev->wd_timeout = timeout;
|
||||||
|
mei_wd_set_start_timeout(dev, dev->wd_timeout);
|
||||||
|
|
||||||
|
mutex_unlock(&dev->device_lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Watchdog Device structs
|
* Watchdog Device structs
|
||||||
*/
|
*/
|
||||||
|
@ -314,6 +343,7 @@ const struct watchdog_ops wd_ops = {
|
||||||
.start = mei_wd_ops_start,
|
.start = mei_wd_ops_start,
|
||||||
.stop = mei_wd_ops_stop,
|
.stop = mei_wd_ops_stop,
|
||||||
.ping = mei_wd_ops_ping,
|
.ping = mei_wd_ops_ping,
|
||||||
|
.set_timeout = mei_wd_ops_set_timeout,
|
||||||
};
|
};
|
||||||
const struct watchdog_info wd_info = {
|
const struct watchdog_info wd_info = {
|
||||||
.identity = INTEL_AMT_WATCHDOG_ID,
|
.identity = INTEL_AMT_WATCHDOG_ID,
|
||||||
|
|
Loading…
Reference in New Issue