linux/drivers/char/ipmi/ipmi_watchdog.c History
<<
>>
Prefs
   1/*
   2 * ipmi_watchdog.c
   3 *
   4 * A watchdog timer based upon the IPMI interface.
   5 *
   6 * Author: MontaVista Software, Inc.
   7 *         Corey Minyard <minyard@mvista.com>
   8 *         source@mvista.com
   9 *
  10 * Copyright 2002 MontaVista Software Inc.
  11 *
  12 *  This program is free software; you can redistribute it and/or modify it
  13 *  under the terms of the GNU General Public License as published by the
  14 *  Free Software Foundation; either version 2 of the License, or (at your
  15 *  option) any later version.
  16 *
  17 *
  18 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  19 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  20 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  21 *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  22 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  23 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  24 *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  25 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
  26 *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  27 *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28 *
  29 *  You should have received a copy of the GNU General Public License along
  30 *  with this program; if not, write to the Free Software Foundation, Inc.,
  31 *  675 Mass Ave, Cambridge, MA 02139, USA.
  32 */
  33
  34#include <linux/module.h>
  35#include <linux/moduleparam.h>
  36#include <linux/ipmi.h>
  37#include <linux/ipmi_smi.h>
  38#include <linux/smp_lock.h>
  39#include <linux/watchdog.h>
  40#include <linux/miscdevice.h>
  41#include <linux/init.h>
  42#include <linux/completion.h>
  43#include <linux/kdebug.h>
  44#include <linux/rwsem.h>
  45#include <linux/errno.h>
  46#include <asm/uaccess.h>
  47#include <linux/notifier.h>
  48#include <linux/nmi.h>
  49#include <linux/reboot.h>
  50#include <linux/wait.h>
  51#include <linux/poll.h>
  52#include <linux/string.h>
  53#include <linux/ctype.h>
  54#include <linux/delay.h>
  55#include <asm/atomic.h>
  56
  57#ifdef CONFIG_X86
  58/*
  59 * This is ugly, but I've determined that x86 is the only architecture
  60 * that can reasonably support the IPMI NMI watchdog timeout at this
  61 * time.  If another architecture adds this capability somehow, it
  62 * will have to be a somewhat different mechanism and I have no idea
  63 * how it will work.  So in the unlikely event that another
  64 * architecture supports this, we can figure out a good generic
  65 * mechanism for it at that time.
  66 */
  67#include <asm/kdebug.h>
  68#define HAVE_DIE_NMI
  69#endif
  70
  71#define PFX "IPMI Watchdog: "
  72
  73/*
  74 * The IPMI command/response information for the watchdog timer.
  75 */
  76
  77/* values for byte 1 of the set command, byte 2 of the get response. */
  78#define WDOG_DONT_LOG           (1 << 7)
  79#define WDOG_DONT_STOP_ON_SET   (1 << 6)
  80#define WDOG_SET_TIMER_USE(byte, use) \
  81        byte = ((byte) & 0xf8) | ((use) & 0x7)
  82#define WDOG_GET_TIMER_USE(byte) ((byte) & 0x7)
  83#define WDOG_TIMER_USE_BIOS_FRB2        1
  84#define WDOG_TIMER_USE_BIOS_POST        2
  85#define WDOG_TIMER_USE_OS_LOAD          3
  86#define WDOG_TIMER_USE_SMS_OS           4
  87#define WDOG_TIMER_USE_OEM              5
  88
  89/* values for byte 2 of the set command, byte 3 of the get response. */
  90#define WDOG_SET_PRETIMEOUT_ACT(byte, use) \
  91        byte = ((byte) & 0x8f) | (((use) & 0x7) << 4)
  92#define WDOG_GET_PRETIMEOUT_ACT(byte) (((byte) >> 4) & 0x7)
  93#define WDOG_PRETIMEOUT_NONE            0
  94#define WDOG_PRETIMEOUT_SMI             1
  95#define WDOG_PRETIMEOUT_NMI             2
  96#define WDOG_PRETIMEOUT_MSG_INT         3
  97
  98/* Operations that can be performed on a pretimout. */
  99#define WDOG_PREOP_NONE         0
 100#define WDOG_PREOP_PANIC        1
 101/* Cause data to be available to read.  Doesn't work in NMI mode. */
 102#define WDOG_PREOP_GIVE_DATA    2
 103
 104/* Actions to perform on a full timeout. */
 105#define WDOG_SET_TIMEOUT_ACT(byte, use) \
 106        byte = ((byte) & 0xf8) | ((use) & 0x7)
 107#define WDOG_GET_TIMEOUT_ACT(byte) ((byte) & 0x7)
 108#define WDOG_TIMEOUT_NONE               0
 109#define WDOG_TIMEOUT_RESET              1
 110#define WDOG_TIMEOUT_POWER_DOWN         2
 111#define WDOG_TIMEOUT_POWER_CYCLE        3
 112
 113/*
 114 * Byte 3 of the get command, byte 4 of the get response is the
 115 * pre-timeout in seconds.
 116 */
 117
 118/* Bits for setting byte 4 of the set command, byte 5 of the get response. */
 119#define WDOG_EXPIRE_CLEAR_BIOS_FRB2     (1 << 1)
 120#define WDOG_EXPIRE_CLEAR_BIOS_POST     (1 << 2)
 121#define WDOG_EXPIRE_CLEAR_OS_LOAD       (1 << 3)
 122#define WDOG_EXPIRE_CLEAR_SMS_OS        (1 << 4)
 123#define WDOG_EXPIRE_CLEAR_OEM           (1 << 5)
 124
 125/*
 126 * Setting/getting the watchdog timer value.  This is for bytes 5 and
 127 * 6 (the timeout time) of the set command, and bytes 6 and 7 (the
 128 * timeout time) and 8 and 9 (the current countdown value) of the
 129 * response.  The timeout value is given in seconds (in the command it
 130 * is 100ms intervals).
 131 */
 132#define WDOG_SET_TIMEOUT(byte1, byte2, val) \
 133        (byte1) = (((val) * 10) & 0xff), (byte2) = (((val) * 10) >> 8)
 134#define WDOG_GET_TIMEOUT(byte1, byte2) \
 135        (((byte1) | ((byte2) << 8)) / 10)
 136
 137#define IPMI_WDOG_RESET_TIMER           0x22
 138#define IPMI_WDOG_SET_TIMER             0x24
 139#define IPMI_WDOG_GET_TIMER             0x25
 140
 141/* These are here until the real ones get into the watchdog.h interface. */
 142#ifndef WDIOC_GETTIMEOUT
 143#define WDIOC_GETTIMEOUT        _IOW(WATCHDOG_IOCTL_BASE, 20, int)
 144#endif
 145#ifndef WDIOC_SET_PRETIMEOUT
 146#define WDIOC_SET_PRETIMEOUT     _IOW(WATCHDOG_IOCTL_BASE, 21, int)
 147#endif
 148#ifndef WDIOC_GET_PRETIMEOUT
 149#define WDIOC_GET_PRETIMEOUT     _IOW(WATCHDOG_IOCTL_BASE, 22, int)
 150#endif
 151
 152static int nowayout = WATCHDOG_NOWAYOUT;
 153
 154static ipmi_user_t watchdog_user;
 155static int watchdog_ifnum;
 156
 157/* Default the timeout to 10 seconds. */
 158static int timeout = 10;
 159
 160/* The pre-timeout is disabled by default. */
 161static int pretimeout;
 162
 163/* Default action is to reset the board on a timeout. */
 164static unsigned char action_val = WDOG_TIMEOUT_RESET;
 165
 166static char action[16] = "reset";
 167
 168static unsigned char preaction_val = WDOG_PRETIMEOUT_NONE;
 169
 170static char preaction[16] = "pre_none";
 171
 172static unsigned char preop_val = WDOG_PREOP_NONE;
 173
 174static char preop[16] = "preop_none";
 175static DEFINE_SPINLOCK(ipmi_read_lock);
 176static char data_to_read;
 177static DECLARE_WAIT_QUEUE_HEAD(read_q);
 178static struct fasync_struct *fasync_q;
 179static char pretimeout_since_last_heartbeat;
 180static char expect_close;
 181
 182static int ifnum_to_use = -1;
 183
 184/* Parameters to ipmi_set_timeout */
 185#define IPMI_SET_TIMEOUT_NO_HB                  0
 186#define IPMI_SET_TIMEOUT_HB_IF_NECESSARY        1
 187#define IPMI_SET_TIMEOUT_FORCE_HB               2
 188
 189static int ipmi_set_timeout(int do_heartbeat);
 190static void ipmi_register_watchdog(int ipmi_intf);
 191static void ipmi_unregister_watchdog(int ipmi_intf);
 192
 193/*
 194 * If true, the driver will start running as soon as it is configured
 195 * and ready.
 196 */
 197static int start_now;
 198
 199static int set_param_int(const char *val, struct kernel_param *kp)
 200{
 201        char *endp;
 202        int  l;
 203        int  rv = 0;
 204
 205        if (!val)
 206                return -EINVAL;
 207        l = simple_strtoul(val, &endp, 0);
 208        if (endp == val)
 209                return -EINVAL;
 210
 211        *((int *)kp->arg) = l;
 212        if (watchdog_user)
 213                rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
 214
 215        return rv;
 216}
 217
 218static int get_param_int(char *buffer, struct kernel_param *kp)
 219{
 220        return sprintf(buffer, "%i", *((int *)kp->arg));
 221}
 222
 223typedef int (*action_fn)(const char *intval, char *outval);
 224
 225static int action_op(const char *inval, char *outval);
 226static int preaction_op(const char *inval, char *outval);
 227static int preop_op(const char *inval, char *outval);
 228static void check_parms(void);
 229
 230static int set_param_str(const char *val, struct kernel_param *kp)
 231{
 232        action_fn  fn = (action_fn) kp->arg;
 233        int        rv = 0;
 234        char       valcp[16];
 235        char       *s;
 236
 237        strncpy(valcp, val, 16);
 238        valcp[15] = '\0';
 239
 240        s = strstrip(valcp);
 241
 242        rv = fn(s, NULL);
 243        if (rv)
 244                goto out;
 245
 246        check_parms();
 247        if (watchdog_user)
 248                rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
 249
 250 out:
 251        return rv;
 252}
 253
 254static int get_param_str(char *buffer, struct kernel_param *kp)
 255{
 256        action_fn fn = (action_fn) kp->arg;
 257        int       rv;
 258
 259        rv = fn(NULL, buffer);
 260        if (rv)
 261                return rv;
 262        return strlen(buffer);
 263}
 264
 265
 266static int set_param_wdog_ifnum(const char *val, struct kernel_param *kp)
 267{
 268        int rv = param_set_int(val, kp);
 269        if (rv)
 270                return rv;
 271        if ((ifnum_to_use < 0) || (ifnum_to_use == watchdog_ifnum))
 272                return 0;
 273
 274        ipmi_unregister_watchdog(watchdog_ifnum);
 275        ipmi_register_watchdog(ifnum_to_use);
 276        return 0;
 277}
 278
 279module_param_call(ifnum_to_use, set_param_wdog_ifnum, get_param_int,
 280                  &ifnum_to_use, 0644);
 281MODULE_PARM_DESC(ifnum_to_use, "The interface number to use for the watchdog "
 282                 "timer.  Setting to -1 defaults to the first registered "
 283                 "interface");
 284
 285module_param_call(timeout, set_param_int, get_param_int, &timeout, 0644);
 286MODULE_PARM_DESC(timeout, "Timeout value in seconds.");
 287
 288module_param_call(pretimeout, set_param_int, get_param_int, &pretimeout, 0644);
 289MODULE_PARM_DESC(pretimeout, "Pretimeout value in seconds.");
 290
 291module_param_call(action, set_param_str, get_param_str, action_op, 0644);
 292MODULE_PARM_DESC(action, "Timeout action. One of: "
 293                 "reset, none, power_cycle, power_off.");
 294
 295module_param_call(preaction, set_param_str, get_param_str, preaction_op, 0644);
 296MODULE_PARM_DESC(preaction, "Pretimeout action.  One of: "
 297                 "pre_none, pre_smi, pre_nmi, pre_int.");
 298
 299module_param_call(preop, set_param_str, get_param_str, preop_op, 0644);
 300MODULE_PARM_DESC(preop, "Pretimeout driver operation.  One of: "
 301                 "preop_none, preop_panic, preop_give_data.");
 302
 303module_param(start_now, int, 0444);
 304MODULE_PARM_DESC(start_now, "Set to 1 to start the watchdog as"
 305                 "soon as the driver is loaded.");
 306
 307module_param(nowayout, int, 0644);
 308MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started "
 309                 "(default=CONFIG_WATCHDOG_NOWAYOUT)");
 310
 311/* Default state of the timer. */
 312static unsigned char ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
 313
 314/* If shutting down via IPMI, we ignore the heartbeat. */
 315static int ipmi_ignore_heartbeat;
 316
 317/* Is someone using the watchdog?  Only one user is allowed. */
 318static unsigned long ipmi_wdog_open;
 319
 320/*
 321 * If set to 1, the heartbeat command will set the state to reset and
 322 * start the timer.  The timer doesn't normally run when the driver is
 323 * first opened until the heartbeat is set the first time, this
 324 * variable is used to accomplish this.
 325 */
 326static int ipmi_start_timer_on_heartbeat;
 327
 328/* IPMI version of the BMC. */
 329static unsigned char ipmi_version_major;
 330static unsigned char ipmi_version_minor;
 331
 332/* If a pretimeout occurs, this is used to allow only one panic to happen. */
 333static atomic_t preop_panic_excl = ATOMIC_INIT(-1);
 334
 335#ifdef HAVE_DIE_NMI
 336static int testing_nmi;
 337static int nmi_handler_registered;
 338#endif
 339
 340static int ipmi_heartbeat(void);
 341
 342/*
 343 * We use a mutex to make sure that only one thing can send a set
 344 * timeout at one time, because we only have one copy of the data.
 345 * The mutex is claimed when the set_timeout is sent and freed
 346 * when both messages are free.
 347 */
 348static atomic_t set_timeout_tofree = ATOMIC_INIT(0);
 349static DEFINE_MUTEX(set_timeout_lock);
 350static DECLARE_COMPLETION(set_timeout_wait);
 351static void set_timeout_free_smi(struct ipmi_smi_msg *msg)
 352{
 353    if (atomic_dec_and_test(&set_timeout_tofree))
 354            complete(&set_timeout_wait);
 355}
 356static void set_timeout_free_recv(struct ipmi_recv_msg *msg)
 357{
 358    if (atomic_dec_and_test(&set_timeout_tofree))
 359            complete(&set_timeout_wait);
 360}
 361static struct ipmi_smi_msg set_timeout_smi_msg = {
 362        .done = set_timeout_free_smi
 363};
 364static struct ipmi_recv_msg set_timeout_recv_msg = {
 365        .done = set_timeout_free_recv
 366};
 367
 368static int i_ipmi_set_timeout(struct ipmi_smi_msg  *smi_msg,
 369                              struct ipmi_recv_msg *recv_msg,
 370                              int                  *send_heartbeat_now)
 371{
 372        struct kernel_ipmi_msg            msg;
 373        unsigned char                     data[6];
 374        int                               rv;
 375        struct ipmi_system_interface_addr addr;
 376        int                               hbnow = 0;
 377
 378
 379        /* These can be cleared as we are setting the timeout. */
 380        pretimeout_since_last_heartbeat = 0;
 381
 382        data[0] = 0;
 383        WDOG_SET_TIMER_USE(data[0], WDOG_TIMER_USE_SMS_OS);
 384
 385        if ((ipmi_version_major > 1)
 386            || ((ipmi_version_major == 1) && (ipmi_version_minor >= 5))) {
 387                /* This is an IPMI 1.5-only feature. */
 388                data[0] |= WDOG_DONT_STOP_ON_SET;
 389        } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
 390                /*
 391                 * In ipmi 1.0, setting the timer stops the watchdog, we
 392                 * need to start it back up again.
 393                 */
 394                hbnow = 1;
 395        }
 396
 397        data[1] = 0;
 398        WDOG_SET_TIMEOUT_ACT(data[1], ipmi_watchdog_state);
 399        if ((pretimeout > 0) && (ipmi_watchdog_state != WDOG_TIMEOUT_NONE)) {
 400            WDOG_SET_PRETIMEOUT_ACT(data[1], preaction_val);
 401            data[2] = pretimeout;
 402        } else {
 403            WDOG_SET_PRETIMEOUT_ACT(data[1], WDOG_PRETIMEOUT_NONE);
 404            data[2] = 0; /* No pretimeout. */
 405        }
 406        data[3] = 0;
 407        WDOG_SET_TIMEOUT(data[4], data[5], timeout);
 408
 409        addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
 410        addr.channel = IPMI_BMC_CHANNEL;
 411        addr.lun = 0;
 412
 413        msg.netfn = 0x06;
 414        msg.cmd = IPMI_WDOG_SET_TIMER;
 415        msg.data = data;
 416        msg.data_len = sizeof(data);
 417        rv = ipmi_request_supply_msgs(watchdog_user,
 418                                      (struct ipmi_addr *) &addr,
 419                                      0,
 420                                      &msg,
 421                                      NULL,
 422                                      smi_msg,
 423                                      recv_msg,
 424                                      1);
 425        if (rv) {
 426                printk(KERN_WARNING PFX "set timeout error: %d\n",
 427                       rv);
 428        }
 429
 430        if (send_heartbeat_now)
 431            *send_heartbeat_now = hbnow;
 432
 433        return rv;
 434}
 435
 436static int ipmi_set_timeout(int do_heartbeat)
 437{
 438        int send_heartbeat_now;
 439        int rv;
 440
 441
 442        /* We can only send one of these at a time. */
 443        mutex_lock(&set_timeout_lock);
 444
 445        atomic_set(&set_timeout_tofree, 2);
 446
 447        rv = i_ipmi_set_timeout(&set_timeout_smi_msg,
 448                                &set_timeout_recv_msg,
 449                                &send_heartbeat_now);
 450        if (rv) {
 451                mutex_unlock(&set_timeout_lock);
 452                goto out;
 453        }
 454
 455        wait_for_completion(&set_timeout_wait);
 456
 457        mutex_unlock(&set_timeout_lock);
 458
 459        if ((do_heartbeat == IPMI_SET_TIMEOUT_FORCE_HB)
 460            || ((send_heartbeat_now)
 461                && (do_heartbeat == IPMI_SET_TIMEOUT_HB_IF_NECESSARY)))
 462                rv = ipmi_heartbeat();
 463
 464out:
 465        return rv;
 466}
 467
 468static atomic_t panic_done_count = ATOMIC_INIT(0);
 469
 470static void panic_smi_free(struct ipmi_smi_msg *msg)
 471{
 472        atomic_dec(&panic_done_count);
 473}
 474static void panic_recv_free(struct ipmi_recv_msg *msg)
 475{
 476        atomic_dec(&panic_done_count);
 477}
 478
 479static struct ipmi_smi_msg panic_halt_heartbeat_smi_msg = {
 480        .done = panic_smi_free
 481};
 482static struct ipmi_recv_msg panic_halt_heartbeat_recv_msg = {
 483        .done = panic_recv_free
 484};
 485
 486static void panic_halt_ipmi_heartbeat(void)
 487{
 488        struct kernel_ipmi_msg             msg;
 489        struct ipmi_system_interface_addr addr;
 490        int rv;
 491
 492        /*
 493         * Don't reset the timer if we have the timer turned off, that
 494         * re-enables the watchdog.
 495         */
 496        if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
 497                return;
 498
 499        addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
 500        addr.channel = IPMI_BMC_CHANNEL;
 501        addr.lun = 0;
 502
 503        msg.netfn = 0x06;
 504        msg.cmd = IPMI_WDOG_RESET_TIMER;
 505        msg.data = NULL;
 506        msg.data_len = 0;
 507        rv = ipmi_request_supply_msgs(watchdog_user,
 508                                      (struct ipmi_addr *) &addr,
 509                                      0,
 510                                      &msg,
 511                                      NULL,
 512                                      &panic_halt_heartbeat_smi_msg,
 513                                      &panic_halt_heartbeat_recv_msg,
 514                                      1);
 515        if (!rv)
 516                atomic_add(2, &panic_done_count);
 517}
 518
 519static struct ipmi_smi_msg panic_halt_smi_msg = {
 520        .done = panic_smi_free
 521};
 522static struct ipmi_recv_msg panic_halt_recv_msg = {
 523        .done = panic_recv_free
 524};
 525
 526/*
 527 * Special call, doesn't claim any locks.  This is only to be called
 528 * at panic or halt time, in run-to-completion mode, when the caller
 529 * is the only CPU and the only thing that will be going is these IPMI
 530 * calls.
 531 */
 532static void panic_halt_ipmi_set_timeout(void)
 533{
 534        int send_heartbeat_now;
 535        int rv;
 536
 537        /* Wait for the messages to be free. */
 538        while (atomic_read(&panic_done_count) != 0)
 539                ipmi_poll_interface(watchdog_user);
 540        rv = i_ipmi_set_timeout(&panic_halt_smi_msg,
 541                                &panic_halt_recv_msg,
 542                                &send_heartbeat_now);
 543        if (!rv) {
 544                atomic_add(2, &panic_done_count);
 545                if (send_heartbeat_now)
 546                        panic_halt_ipmi_heartbeat();
 547        } else
 548                printk(KERN_WARNING PFX
 549                       "Unable to extend the watchdog timeout.");
 550        while (atomic_read(&panic_done_count) != 0)
 551                ipmi_poll_interface(watchdog_user);
 552}
 553
 554/*
 555 * We use a mutex to make sure that only one thing can send a
 556 * heartbeat at one time, because we only have one copy of the data.
 557 * The semaphore is claimed when the set_timeout is sent and freed
 558 * when both messages are free.
 559 */
 560static atomic_t heartbeat_tofree = ATOMIC_INIT(0);
 561static DEFINE_MUTEX(heartbeat_lock);
 562static DECLARE_COMPLETION(heartbeat_wait);
 563static void heartbeat_free_smi(struct ipmi_smi_msg *msg)
 564{
 565    if (atomic_dec_and_test(&heartbeat_tofree))
 566            complete(&heartbeat_wait);
 567}
 568static void heartbeat_free_recv(struct ipmi_recv_msg *msg)
 569{
 570    if (atomic_dec_and_test(&heartbeat_tofree))
 571            complete(&heartbeat_wait);
 572}
 573static struct ipmi_smi_msg heartbeat_smi_msg = {
 574        .done = heartbeat_free_smi
 575};
 576static struct ipmi_recv_msg heartbeat_recv_msg = {
 577        .done = heartbeat_free_recv
 578};
 579
 580static int ipmi_heartbeat(void)
 581{
 582        struct kernel_ipmi_msg            msg;
 583        int                               rv;
 584        struct ipmi_system_interface_addr addr;
 585
 586        if (ipmi_ignore_heartbeat)
 587                return 0;
 588
 589        if (ipmi_start_timer_on_heartbeat) {
 590                ipmi_start_timer_on_heartbeat = 0;
 591                ipmi_watchdog_state = action_val;
 592                return ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
 593        } else if (pretimeout_since_last_heartbeat) {
 594                /*
 595                 * A pretimeout occurred, make sure we set the timeout.
 596                 * We don't want to set the action, though, we want to
 597                 * leave that alone (thus it can't be combined with the
 598                 * above operation.
 599                 */
 600                return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
 601        }
 602
 603        mutex_lock(&heartbeat_lock);
 604
 605        atomic_set(&heartbeat_tofree, 2);
 606
 607        /*
 608         * Don't reset the timer if we have the timer turned off, that
 609         * re-enables the watchdog.
 610         */
 611        if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE) {
 612                mutex_unlock(&heartbeat_lock);
 613                return 0;
 614        }
 615
 616        addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
 617        addr.channel = IPMI_BMC_CHANNEL;
 618        addr.lun = 0;
 619
 620        msg.netfn = 0x06;
 621        msg.cmd = IPMI_WDOG_RESET_TIMER;
 622        msg.data = NULL;
 623        msg.data_len = 0;
 624        rv = ipmi_request_supply_msgs(watchdog_user,
 625                                      (struct ipmi_addr *) &addr,
 626                                      0,
 627                                      &msg,
 628                                      NULL,
 629                                      &heartbeat_smi_msg,
 630                                      &heartbeat_recv_msg,
 631                                      1);
 632        if (rv) {
 633                mutex_unlock(&heartbeat_lock);
 634                printk(KERN_WARNING PFX "heartbeat failure: %d\n",
 635                       rv);
 636                return rv;
 637        }
 638
 639        /* Wait for the heartbeat to be sent. */
 640        wait_for_completion(&heartbeat_wait);
 641
 642        if (heartbeat_recv_msg.msg.data[0] != 0) {
 643                /*
 644                 * Got an error in the heartbeat response.  It was already
 645                 * reported in ipmi_wdog_msg_handler, but we should return
 646                 * an error here.
 647                 */
 648                rv = -EINVAL;
 649        }
 650
 651        mutex_unlock(&heartbeat_lock);
 652
 653        return rv;
 654}
 655
 656static struct watchdog_info ident = {
 657        .options        = 0,    /* WDIOF_SETTIMEOUT, */
 658        .firmware_version = 1,
 659        .identity       = "IPMI"
 660};
 661
 662static int ipmi_ioctl(struct inode *inode, struct file *file,
 663                      unsigned int cmd, unsigned long arg)
 664{
 665        void __user *argp = (void __user *)arg;
 666        int i;
 667        int val;
 668
 669        switch (cmd) {
 670        case WDIOC_GETSUPPORT:
 671                i = copy_to_user(argp, &ident, sizeof(ident));
 672                return i ? -EFAULT : 0;
 673
 674        case WDIOC_SETTIMEOUT:
 675                i = copy_from_user(&val, argp, sizeof(int));
 676                if (i)
 677                        return -EFAULT;
 678                timeout = val;
 679                return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
 680
 681        case WDIOC_GETTIMEOUT:
 682                i = copy_to_user(argp, &timeout, sizeof(timeout));
 683                if (i)
 684                        return -EFAULT;
 685                return 0;
 686
 687        case WDIOC_SET_PRETIMEOUT:
 688        case WDIOC_SETPRETIMEOUT:
 689                i = copy_from_user(&val, argp, sizeof(int));
 690                if (i)
 691                        return -EFAULT;
 692                pretimeout = val;
 693                return ipmi_set_timeout(IPMI_SET_TIMEOUT_HB_IF_NECESSARY);
 694
 695        case WDIOC_GET_PRETIMEOUT:
 696        case WDIOC_GETPRETIMEOUT:
 697                i = copy_to_user(argp, &pretimeout, sizeof(pretimeout));
 698                if (i)
 699                        return -EFAULT;
 700                return 0;
 701
 702        case WDIOC_KEEPALIVE:
 703                return ipmi_heartbeat();
 704
 705        case WDIOC_SETOPTIONS:
 706                i = copy_from_user(&val, argp, sizeof(int));
 707                if (i)
 708                        return -EFAULT;
 709                if (val & WDIOS_DISABLECARD) {
 710                        ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
 711                        ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
 712                        ipmi_start_timer_on_heartbeat = 0;
 713                }
 714
 715                if (val & WDIOS_ENABLECARD) {
 716                        ipmi_watchdog_state = action_val;
 717                        ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
 718                }
 719                return 0;
 720
 721        case WDIOC_GETSTATUS:
 722                val = 0;
 723                i = copy_to_user(argp, &val, sizeof(val));
 724                if (i)
 725                        return -EFAULT;
 726                return 0;
 727
 728        default:
 729                return -ENOIOCTLCMD;
 730        }
 731}
 732
 733static ssize_t ipmi_write(struct file *file,
 734                          const char  __user *buf,
 735                          size_t      len,
 736                          loff_t      *ppos)
 737{
 738        int rv;
 739
 740        if (len) {
 741                if (!nowayout) {
 742                        size_t i;
 743
 744                        /* In case it was set long ago */
 745                        expect_close = 0;
 746
 747                        for (i = 0; i != len; i++) {
 748                                char c;
 749
 750                                if (get_user(c, buf + i))
 751                                        return -EFAULT;
 752                                if (c == 'V')
 753                                        expect_close = 42;
 754                        }
 755                }
 756                rv = ipmi_heartbeat();
 757                if (rv)
 758                        return rv;
 759        }
 760        return len;
 761}
 762
 763static ssize_t ipmi_read(struct file *file,
 764                         char        __user *buf,
 765                         size_t      count,
 766                         loff_t      *ppos)
 767{
 768        int          rv = 0;
 769        wait_queue_t wait;
 770
 771        if (count <= 0)
 772                return 0;
 773
 774        /*
 775         * Reading returns if the pretimeout has gone off, and it only does
 776         * it once per pretimeout.
 777         */
 778        spin_lock(&ipmi_read_lock);
 779        if (!data_to_read) {
 780                if (file->f_flags & O_NONBLOCK) {
 781                        rv = -EAGAIN;
 782                        goto out;
 783                }
 784
 785                init_waitqueue_entry(&wait, current);
 786                add_wait_queue(&read_q, &wait);
 787                while (!data_to_read) {
 788                        set_current_state(TASK_INTERRUPTIBLE);
 789                        spin_unlock(&ipmi_read_lock);
 790                        schedule();
 791                        spin_lock(&ipmi_read_lock);
 792                }
 793                remove_wait_queue(&read_q, &wait);
 794
 795                if (signal_pending(current)) {
 796                        rv = -ERESTARTSYS;
 797                        goto out;
 798                }
 799        }
 800        data_to_read = 0;
 801
 802 out:
 803        spin_unlock(&ipmi_read_lock);
 804
 805        if (rv == 0) {
 806                if (copy_to_user(buf, &data_to_read, 1))
 807                        rv = -EFAULT;
 808                else
 809                        rv = 1;
 810        }
 811
 812        return rv;
 813}
 814
 815static int ipmi_open(struct inode *ino, struct file *filep)
 816{
 817        switch (iminor(ino)) {
 818        case WATCHDOG_MINOR:
 819                if (test_and_set_bit(0, &ipmi_wdog_open))
 820                        return -EBUSY;
 821
 822                cycle_kernel_lock();
 823
 824                /*
 825                 * Don't start the timer now, let it start on the
 826                 * first heartbeat.
 827                 */
 828                ipmi_start_timer_on_heartbeat = 1;
 829                return nonseekable_open(ino, filep);
 830
 831        default:
 832                return (-ENODEV);
 833        }
 834}
 835
 836static unsigned int ipmi_poll(struct file *file, poll_table *wait)
 837{
 838        unsigned int mask = 0;
 839
 840        poll_wait(file, &read_q, wait);
 841
 842        spin_lock(&ipmi_read_lock);
 843        if (data_to_read)
 844                mask |= (POLLIN | POLLRDNORM);
 845        spin_unlock(&ipmi_read_lock);
 846
 847        return mask;
 848}
 849
 850static int ipmi_fasync(int fd, struct file *file, int on)
 851{
 852        int result;
 853
 854        result = fasync_helper(fd, file, on, &fasync_q);
 855
 856        return (result);
 857}
 858
 859static int ipmi_close(struct inode *ino, struct file *filep)
 860{
 861        if (iminor(ino) == WATCHDOG_MINOR) {
 862                if (expect_close == 42) {
 863                        ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
 864                        ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
 865                } else {
 866                        printk(KERN_CRIT PFX
 867                               "Unexpected close, not stopping watchdog!\n");
 868                        ipmi_heartbeat();
 869                }
 870                clear_bit(0, &ipmi_wdog_open);
 871        }
 872
 873        expect_close = 0;
 874
 875        return 0;
 876}
 877
 878static const struct file_operations ipmi_wdog_fops = {
 879        .owner   = THIS_MODULE,
 880        .read    = ipmi_read,
 881        .poll    = ipmi_poll,
 882        .write   = ipmi_write,
 883        .ioctl   = ipmi_ioctl,
 884        .open    = ipmi_open,
 885        .release = ipmi_close,
 886        .fasync  = ipmi_fasync,
 887};
 888
 889static struct miscdevice ipmi_wdog_miscdev = {
 890        .minor          = WATCHDOG_MINOR,
 891        .name           = "watchdog",
 892        .fops           = &ipmi_wdog_fops
 893};
 894
 895static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
 896                                  void                 *handler_data)
 897{
 898        if (msg->msg.data[0] != 0) {
 899                printk(KERN_ERR PFX "response: Error %x on cmd %x\n",
 900                       msg->msg.data[0],
 901                       msg->msg.cmd);
 902        }
 903
 904        ipmi_free_recv_msg(msg);
 905}
 906
 907static void ipmi_wdog_pretimeout_handler(void *handler_data)
 908{
 909        if (preaction_val != WDOG_PRETIMEOUT_NONE) {
 910                if (preop_val == WDOG_PREOP_PANIC) {
 911                        if (atomic_inc_and_test(&preop_panic_excl))
 912                                panic("Watchdog pre-timeout");
 913                } else if (preop_val == WDOG_PREOP_GIVE_DATA) {
 914                        spin_lock(&ipmi_read_lock);
 915                        data_to_read = 1;
 916                        wake_up_interruptible(&read_q);
 917                        kill_fasync(&fasync_q, SIGIO, POLL_IN);
 918
 919                        spin_unlock(&ipmi_read_lock);
 920                }
 921        }
 922
 923        /*
 924         * On some machines, the heartbeat will give an error and not
 925         * work unless we re-enable the timer.  So do so.
 926         */
 927        pretimeout_since_last_heartbeat = 1;
 928}
 929
 930static struct ipmi_user_hndl ipmi_hndlrs = {
 931        .ipmi_recv_hndl           = ipmi_wdog_msg_handler,
 932        .ipmi_watchdog_pretimeout = ipmi_wdog_pretimeout_handler
 933};
 934
 935static void ipmi_register_watchdog(int ipmi_intf)
 936{
 937        int rv = -EBUSY;
 938
 939        if (watchdog_user)
 940                goto out;
 941
 942        if ((ifnum_to_use >= 0) && (ifnum_to_use != ipmi_intf))
 943                goto out;
 944
 945        watchdog_ifnum = ipmi_intf;
 946
 947        rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user);
 948        if (rv < 0) {
 949                printk(KERN_CRIT PFX "Unable to register with ipmi\n");
 950                goto out;
 951        }
 952
 953        ipmi_get_version(watchdog_user,
 954                         &ipmi_version_major,
 955                         &ipmi_version_minor);
 956
 957        rv = misc_register(&ipmi_wdog_miscdev);
 958        if (rv < 0) {
 959                ipmi_destroy_user(watchdog_user);
 960                watchdog_user = NULL;
 961                printk(KERN_CRIT PFX "Unable to register misc device\n");
 962        }
 963
 964#ifdef HAVE_DIE_NMI
 965        if (nmi_handler_registered) {
 966                int old_pretimeout = pretimeout;
 967                int old_timeout = timeout;
 968                int old_preop_val = preop_val;
 969
 970                /*
 971                 * Set the pretimeout to go off in a second and give
 972                 * ourselves plenty of time to stop the timer.
 973                 */
 974                ipmi_watchdog_state = WDOG_TIMEOUT_RESET;
 975                preop_val = WDOG_PREOP_NONE; /* Make sure nothing happens */
 976                pretimeout = 99;
 977                timeout = 100;
 978
 979                testing_nmi = 1;
 980
 981                rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
 982                if (rv) {
 983                        printk(KERN_WARNING PFX "Error starting timer to"
 984                               " test NMI: 0x%x.  The NMI pretimeout will"
 985                               " likely not work\n", rv);
 986                        rv = 0;
 987                        goto out_restore;
 988                }
 989
 990                msleep(1500);
 991
 992                if (testing_nmi != 2) {
 993                        printk(KERN_WARNING PFX "IPMI NMI didn't seem to"
 994                               " occur.  The NMI pretimeout will"
 995                               " likely not work\n");
 996                }
 997 out_restore:
 998                testing_nmi = 0;
 999                preop_val = old_preop_val;
1000                pretimeout = old_pretimeout;
1001                timeout = old_timeout;
1002        }
1003#endif
1004
1005 out:
1006        if ((start_now) && (rv == 0)) {
1007                /* Run from startup, so start the timer now. */
1008                start_now = 0; /* Disable this function after first startup. */
1009                ipmi_watchdog_state = action_val;
1010                ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
1011                printk(KERN_INFO PFX "Starting now!\n");
1012        } else {
1013                /* Stop the timer now. */
1014                ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
1015                ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
1016        }
1017}
1018
1019static void ipmi_unregister_watchdog(int ipmi_intf)
1020{
1021        int rv;
1022
1023        if (!watchdog_user)
1024                goto out;
1025
1026        if (watchdog_ifnum != ipmi_intf)
1027                goto out;
1028
1029        /* Make sure no one can call us any more. */
1030        misc_deregister(&ipmi_wdog_miscdev);
1031
1032        /*
1033         * Wait to make sure the message makes it out.  The lower layer has
1034         * pointers to our buffers, we want to make sure they are done before
1035         * we release our memory.
1036         */
1037        while (atomic_read(&set_timeout_tofree))
1038                schedule_timeout_uninterruptible(1);
1039
1040        /* Disconnect from IPMI. */
1041        rv = ipmi_destroy_user(watchdog_user);
1042        if (rv) {
1043                printk(KERN_WARNING PFX "error unlinking from IPMI: %d\n",
1044                       rv);
1045        }
1046        watchdog_user = NULL;
1047
1048 out:
1049        return;
1050}
1051
1052#ifdef HAVE_DIE_NMI
1053static int
1054ipmi_nmi(struct notifier_block *self, unsigned long val, void *data)
1055{
1056        struct die_args *args = data;
1057
1058        if (val != DIE_NMI)
1059                return NOTIFY_OK;
1060
1061        /* Hack, if it's a memory or I/O error, ignore it. */
1062        if (args->err & 0xc0)
1063                return NOTIFY_OK;
1064
1065        /*
1066         * If we get here, it's an NMI that's not a memory or I/O
1067         * error.  We can't truly tell if it's from IPMI or not
1068         * without sending a message, and sending a message is almost
1069         * impossible because of locking.
1070         */
1071
1072        if (testing_nmi) {
1073                testing_nmi = 2;
1074                return NOTIFY_STOP;
1075        }
1076
1077        /* If we are not expecting a timeout, ignore it. */
1078        if (ipmi_watchdog_state == WDOG_TIMEOUT_NONE)
1079                return NOTIFY_OK;
1080
1081        if (preaction_val != WDOG_PRETIMEOUT_NMI)
1082                return NOTIFY_OK;
1083
1084        /*
1085         * If no one else handled the NMI, we assume it was the IPMI
1086         * watchdog.
1087         */
1088        if (preop_val == WDOG_PREOP_PANIC) {
1089                /* On some machines, the heartbeat will give
1090                   an error and not work unless we re-enable
1091                   the timer.   So do so. */
1092                pretimeout_since_last_heartbeat = 1;
1093                if (atomic_inc_and_test(&preop_panic_excl))
1094                        panic(PFX "pre-timeout");
1095        }
1096
1097        return NOTIFY_STOP;
1098}
1099
1100static struct notifier_block ipmi_nmi_handler = {
1101        .notifier_call = ipmi_nmi
1102};
1103#endif
1104
1105static int wdog_reboot_handler(struct notifier_block *this,
1106                               unsigned long         code,
1107                               void                  *unused)
1108{
1109        static int reboot_event_handled;
1110
1111        if ((watchdog_user) && (!reboot_event_handled)) {
1112                /* Make sure we only do this once. */
1113                reboot_event_handled = 1;
1114
1115                if (code == SYS_POWER_OFF || code == SYS_HALT) {
1116                        /* Disable the WDT if we are shutting down. */
1117                        ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
1118                        panic_halt_ipmi_set_timeout();
1119                } else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
1120                        /* Set a long timer to let the reboot happens, but
1121                           reboot if it hangs, but only if the watchdog
1122                           timer was already running. */
1123                        timeout = 120;
1124                        pretimeout = 0;
1125                        ipmi_watchdog_state = WDOG_TIMEOUT_RESET;
1126                        panic_halt_ipmi_set_timeout();
1127                }
1128        }
1129        return NOTIFY_OK;
1130}
1131
1132static struct notifier_block wdog_reboot_notifier = {
1133        .notifier_call  = wdog_reboot_handler,
1134        .next           = NULL,
1135        .priority       = 0
1136};
1137
1138static int wdog_panic_handler(struct notifier_block *this,
1139                              unsigned long         event,
1140                              void                  *unused)
1141{
1142        static int panic_event_handled;
1143
1144        /* On a panic, if we have a panic timeout, make sure to extend
1145           the watchdog timer to a reasonable value to complete the
1146           panic, if the watchdog timer is running.  Plus the
1147           pretimeout is meaningless at panic time. */
1148        if (watchdog_user && !panic_event_handled &&
1149            ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
1150                /* Make sure we do this only once. */
1151                panic_event_handled = 1;
1152
1153                timeout = 255;
1154                pretimeout = 0;
1155                panic_halt_ipmi_set_timeout();
1156        }
1157
1158        return NOTIFY_OK;
1159}
1160
1161static struct notifier_block wdog_panic_notifier = {
1162        .notifier_call  = wdog_panic_handler,
1163        .next           = NULL,
1164        .priority       = 150   /* priority: INT_MAX >= x >= 0 */
1165};
1166
1167
1168static void ipmi_new_smi(int if_num, struct device *device)
1169{
1170        ipmi_register_watchdog(if_num);
1171}
1172
1173static void ipmi_smi_gone(int if_num)
1174{
1175        ipmi_unregister_watchdog(if_num);
1176}
1177
1178static struct ipmi_smi_watcher smi_watcher = {
1179        .owner    = THIS_MODULE,
1180        .new_smi  = ipmi_new_smi,
1181        .smi_gone = ipmi_smi_gone
1182};
1183
1184static int action_op(const char *inval, char *outval)
1185{
1186        if (outval)
1187                strcpy(outval, action);
1188
1189        if (!inval)
1190                return 0;
1191
1192        if (strcmp(inval, "reset") == 0)
1193                action_val = WDOG_TIMEOUT_RESET;
1194        else if (strcmp(inval, "none") == 0)
1195                action_val = WDOG_TIMEOUT_NONE;
1196        else if (strcmp(inval, "power_cycle") == 0)
1197                action_val = WDOG_TIMEOUT_POWER_CYCLE;
1198        else if (strcmp(inval, "power_off") == 0)
1199                action_val = WDOG_TIMEOUT_POWER_DOWN;
1200        else
1201                return -EINVAL;
1202        strcpy(action, inval);
1203        return 0;
1204}
1205
1206static int preaction_op(const char *inval, char *outval)
1207{
1208        if (outval)
1209                strcpy(outval, preaction);
1210
1211        if (!inval)
1212                return 0;
1213
1214        if (strcmp(inval, "pre_none") == 0)
1215                preaction_val = WDOG_PRETIMEOUT_NONE;
1216        else if (strcmp(inval, "pre_smi") == 0)
1217                preaction_val = WDOG_PRETIMEOUT_SMI;
1218#ifdef HAVE_DIE_NMI
1219        else if (strcmp(inval, "pre_nmi") == 0)
1220                preaction_val = WDOG_PRETIMEOUT_NMI;
1221#endif
1222        else if (strcmp(inval, "pre_int") == 0)
1223                preaction_val = WDOG_PRETIMEOUT_MSG_INT;
1224        else
1225                return -EINVAL;
1226        strcpy(preaction, inval);
1227        return 0;
1228}
1229
1230static int preop_op(const char *inval, char *outval)
1231{
1232        if (outval)
1233                strcpy(outval, preop);
1234
1235        if (!inval)
1236                return 0;
1237
1238        if (strcmp(inval, "preop_none") == 0)
1239                preop_val = WDOG_PREOP_NONE;
1240        else if (strcmp(inval, "preop_panic") == 0)
1241                preop_val = WDOG_PREOP_PANIC;
1242        else if (strcmp(inval, "preop_give_data") == 0)
1243                preop_val = WDOG_PREOP_GIVE_DATA;
1244        else
1245                return -EINVAL;
1246        strcpy(preop, inval);
1247        return 0;
1248}
1249
1250static void check_parms(void)
1251{
1252#ifdef HAVE_DIE_NMI
1253        int do_nmi = 0;
1254        int rv;
1255
1256        if (preaction_val == WDOG_PRETIMEOUT_NMI) {
1257                do_nmi = 1;
1258                if (preop_val == WDOG_PREOP_GIVE_DATA) {
1259                        printk(KERN_WARNING PFX "Pretimeout op is to give data"
1260                               " but NMI pretimeout is enabled, setting"
1261                               " pretimeout op to none\n");
1262                        preop_op("preop_none", NULL);
1263                        do_nmi = 0;
1264                }
1265        }
1266        if (do_nmi && !nmi_handler_registered) {
1267                rv = register_die_notifier(&ipmi_nmi_handler);
1268                if (rv) {
1269                        printk(KERN_WARNING PFX
1270                               "Can't register nmi handler\n");
1271                        return;
1272                } else
1273                        nmi_handler_registered = 1;
1274        } else if (!do_nmi && nmi_handler_registered) {
1275                unregister_die_notifier(&ipmi_nmi_handler);
1276                nmi_handler_registered = 0;
1277        }
1278#endif
1279}
1280
1281static int __init ipmi_wdog_init(void)
1282{
1283        int rv;
1284
1285        if (action_op(action, NULL)) {
1286                action_op("reset", NULL);
1287                printk(KERN_INFO PFX "Unknown action '%s', defaulting to"
1288                       " reset\n", action);
1289        }
1290
1291        if (preaction_op(preaction, NULL)) {
1292                preaction_op("pre_none", NULL);
1293                printk(KERN_INFO PFX "Unknown preaction '%s', defaulting to"
1294                       " none\n", preaction);
1295        }
1296
1297        if (preop_op(preop, NULL)) {
1298                preop_op("preop_none", NULL);
1299                printk(KERN_INFO PFX "Unknown preop '%s', defaulting to"
1300                       " none\n", preop);
1301        }
1302
1303        check_parms();
1304
1305        register_reboot_notifier(&wdog_reboot_notifier);
1306        atomic_notifier_chain_register(&panic_notifier_list,
1307                        &wdog_panic_notifier);
1308
1309        rv = ipmi_smi_watcher_register(&smi_watcher);
1310        if (rv) {
1311#ifdef HAVE_DIE_NMI
1312                if (nmi_handler_registered)
1313                        unregister_die_notifier(&ipmi_nmi_handler);
1314#endif
1315                atomic_notifier_chain_unregister(&panic_notifier_list,
1316                                                 &wdog_panic_notifier);
1317                unregister_reboot_notifier(&wdog_reboot_notifier);
1318                printk(KERN_WARNING PFX "can't register smi watcher\n");
1319                return rv;
1320        }
1321
1322        printk(KERN_INFO PFX "driver initialized\n");
1323
1324        return 0;
1325}
1326
1327static void __exit ipmi_wdog_exit(void)
1328{
1329        ipmi_smi_watcher_unregister(&smi_watcher);
1330        ipmi_unregister_watchdog(watchdog_ifnum);
1331
1332#ifdef HAVE_DIE_NMI
1333        if (nmi_handler_registered)
1334                unregister_die_notifier(&ipmi_nmi_handler);
1335#endif
1336
1337        atomic_notifier_chain_unregister(&panic_notifier_list,
1338                                         &wdog_panic_notifier);
1339        unregister_reboot_notifier(&wdog_reboot_notifier);
1340}
1341module_exit(ipmi_wdog_exit);
1342module_init(ipmi_wdog_init);
1343MODULE_LICENSE("GPL");
1344MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
1345MODULE_DESCRIPTION("watchdog timer based upon the IPMI interface.");
1346
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.