summaryrefslogtreecommitdiff
path: root/drivers/char/ipmi/ipmi_ssif.c
diff options
context:
space:
mode:
authorCorey Minyard <cminyard@mvista.com>2018-10-23 11:29:02 -0500
committerCorey Minyard <cminyard@mvista.com>2019-02-09 19:48:42 -0600
commitc65ea996595005be470fbfa16711deba414fd33b (patch)
tree55b50d2d008afe4411e7085bf48f1f7e9e032f11 /drivers/char/ipmi/ipmi_ssif.c
parenta1466ec5b671651b848df17fc9233ecbb7d35f9f (diff)
downloadlwn-c65ea996595005be470fbfa16711deba414fd33b.tar.gz
lwn-c65ea996595005be470fbfa16711deba414fd33b.zip
ipmi: Fix how the lower layers are told to watch for messages
The IPMI driver has a mechanism to tell the lower layers it needs to watch for messages, commands, and watchdogs (so it doesn't needlessly poll). However, it needed some extensions, it needed a way to tell what is being waited for so it could set the timeout appropriately. The update to the lower layer was also being done once a second at best because it was done in the main timeout handler. However, if a command is sent and a response message is coming back, it needed to be started immediately. So modify the code to update immediately if it needs to be enabled. Disable is still lazy. Signed-off-by: Corey Minyard <cminyard@mvista.com> Tested-by: Kamlakant Patel <kamlakant.patel@cavium.com>
Diffstat (limited to 'drivers/char/ipmi/ipmi_ssif.c')
-rw-r--r--drivers/char/ipmi/ipmi_ssif.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c
index 1aacc1144d2a..a1219af32105 100644
--- a/drivers/char/ipmi/ipmi_ssif.c
+++ b/drivers/char/ipmi/ipmi_ssif.c
@@ -93,8 +93,8 @@
/*
* Timeout for the watch, only used for get flag timer.
*/
-#define SSIF_WATCH_TIMEOUT_MSEC 100
-#define SSIF_WATCH_TIMEOUT_JIFFIES msecs_to_jiffies(SSIF_WATCH_TIMEOUT_MSEC)
+#define SSIF_WATCH_MSG_TIMEOUT msecs_to_jiffies(10)
+#define SSIF_WATCH_WATCHDOG_TIMEOUT msecs_to_jiffies(250)
enum ssif_intf_state {
SSIF_NORMAL,
@@ -276,7 +276,7 @@ struct ssif_info {
struct timer_list retry_timer;
int retries_left;
- bool need_watch; /* Need to look for flags? */
+ long watch_timeout; /* Timeout for flags check, 0 if off. */
struct timer_list watch_timer; /* Flag fetch timer. */
/* Info from SSIF cmd */
@@ -578,9 +578,9 @@ static void watch_timeout(struct timer_list *t)
return;
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
- if (ssif_info->need_watch) {
+ if (ssif_info->watch_timeout) {
mod_timer(&ssif_info->watch_timer,
- jiffies + SSIF_WATCH_TIMEOUT_JIFFIES);
+ jiffies + ssif_info->watch_timeout);
if (SSIF_IDLE(ssif_info)) {
start_flag_fetch(ssif_info, flags); /* Releases lock */
return;
@@ -1121,17 +1121,23 @@ static void request_events(void *send_info)
* Upper layer is changing the flag saying whether we need to request
* flags periodically or not.
*/
-static void ssif_set_need_watch(void *send_info, bool enable)
+static void ssif_set_need_watch(void *send_info, unsigned int watch_mask)
{
struct ssif_info *ssif_info = (struct ssif_info *) send_info;
unsigned long oflags, *flags;
+ long timeout = 0;
+
+ if (watch_mask & IPMI_WATCH_MASK_CHECK_MESSAGES)
+ timeout = SSIF_WATCH_MSG_TIMEOUT;
+ else if (watch_mask & ~IPMI_WATCH_MASK_INTERNAL)
+ timeout = SSIF_WATCH_WATCHDOG_TIMEOUT;
flags = ipmi_ssif_lock_cond(ssif_info, &oflags);
- if (enable != ssif_info->need_watch) {
- ssif_info->need_watch = enable;
- if (ssif_info->need_watch)
+ if (timeout != ssif_info->watch_timeout) {
+ ssif_info->watch_timeout = timeout;
+ if (ssif_info->watch_timeout)
mod_timer(&ssif_info->watch_timer,
- jiffies + SSIF_WATCH_TIMEOUT_JIFFIES);
+ jiffies + ssif_info->watch_timeout);
}
ipmi_ssif_unlock_cond(ssif_info, flags);
}