4  * Linux device interface for the IPMI message handler.
 
   6  * Author: MontaVista Software, Inc.
 
   7  *         Corey Minyard <minyard@mvista.com>
 
  10  * Copyright 2002 MontaVista Software Inc.
 
  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.
 
  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.
 
  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.
 
  34 #include <linux/config.h>
 
  35 #include <linux/module.h>
 
  36 #include <linux/moduleparam.h>
 
  37 #include <linux/errno.h>
 
  38 #include <asm/system.h>
 
  39 #include <linux/sched.h>
 
  40 #include <linux/poll.h>
 
  41 #include <linux/spinlock.h>
 
  42 #include <linux/slab.h>
 
  43 #include <linux/devfs_fs_kernel.h>
 
  44 #include <linux/ipmi.h>
 
  45 #include <linux/mutex.h>
 
  46 #include <linux/init.h>
 
  47 #include <linux/device.h>
 
  48 #include <linux/compat.h>
 
  50 struct ipmi_file_private
 
  53         spinlock_t           recv_msg_lock;
 
  54         struct list_head     recv_msgs;
 
  56         struct fasync_struct *fasync_queue;
 
  57         wait_queue_head_t    wait;
 
  58         struct mutex         recv_mutex;
 
  60         unsigned int         default_retry_time_ms;
 
  63 static void file_receive_handler(struct ipmi_recv_msg *msg,
 
  66         struct ipmi_file_private *priv = handler_data;
 
  70         spin_lock_irqsave(&(priv->recv_msg_lock), flags);
 
  72         was_empty = list_empty(&(priv->recv_msgs));
 
  73         list_add_tail(&(msg->link), &(priv->recv_msgs));
 
  76                 wake_up_interruptible(&priv->wait);
 
  77                 kill_fasync(&priv->fasync_queue, SIGIO, POLL_IN);
 
  80         spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
  83 static unsigned int ipmi_poll(struct file *file, poll_table *wait)
 
  85         struct ipmi_file_private *priv = file->private_data;
 
  86         unsigned int             mask = 0;
 
  89         poll_wait(file, &priv->wait, wait);
 
  91         spin_lock_irqsave(&priv->recv_msg_lock, flags);
 
  93         if (!list_empty(&(priv->recv_msgs)))
 
  94                 mask |= (POLLIN | POLLRDNORM);
 
  96         spin_unlock_irqrestore(&priv->recv_msg_lock, flags);
 
 101 static int ipmi_fasync(int fd, struct file *file, int on)
 
 103         struct ipmi_file_private *priv = file->private_data;
 
 106         result = fasync_helper(fd, file, on, &priv->fasync_queue);
 
 111 static struct ipmi_user_hndl ipmi_hndlrs =
 
 113         .ipmi_recv_hndl = file_receive_handler,
 
 116 static int ipmi_open(struct inode *inode, struct file *file)
 
 118         int                      if_num = iminor(inode);
 
 120         struct ipmi_file_private *priv;
 
 123         priv = kmalloc(sizeof(*priv), GFP_KERNEL);
 
 129         rv = ipmi_create_user(if_num,
 
 138         file->private_data = priv;
 
 140         spin_lock_init(&(priv->recv_msg_lock));
 
 141         INIT_LIST_HEAD(&(priv->recv_msgs));
 
 142         init_waitqueue_head(&priv->wait);
 
 143         priv->fasync_queue = NULL;
 
 144         mutex_init(&priv->recv_mutex);
 
 146         /* Use the low-level defaults. */
 
 147         priv->default_retries = -1;
 
 148         priv->default_retry_time_ms = 0;
 
 153 static int ipmi_release(struct inode *inode, struct file *file)
 
 155         struct ipmi_file_private *priv = file->private_data;
 
 158         rv = ipmi_destroy_user(priv->user);
 
 162         ipmi_fasync (-1, file, 0);
 
 164         /* FIXME - free the messages in the list. */
 
 170 static int handle_send_req(ipmi_user_t     user,
 
 171                            struct ipmi_req *req,
 
 173                            unsigned int    retry_time_ms)
 
 176         struct ipmi_addr addr;
 
 177         struct kernel_ipmi_msg msg;
 
 179         if (req->addr_len > sizeof(struct ipmi_addr))
 
 182         if (copy_from_user(&addr, req->addr, req->addr_len))
 
 185         msg.netfn = req->msg.netfn;
 
 186         msg.cmd = req->msg.cmd;
 
 187         msg.data_len = req->msg.data_len;
 
 188         msg.data = kmalloc(IPMI_MAX_MSG_LENGTH, GFP_KERNEL);
 
 192         /* From here out we cannot return, we must jump to "out" for
 
 193            error exits to free msgdata. */
 
 195         rv = ipmi_validate_addr(&addr, req->addr_len);
 
 199         if (req->msg.data != NULL) {
 
 200                 if (req->msg.data_len > IPMI_MAX_MSG_LENGTH) {
 
 205                 if (copy_from_user(msg.data,
 
 216         rv = ipmi_request_settime(user,
 
 229 static int ipmi_ioctl(struct inode  *inode,
 
 235         struct ipmi_file_private *priv = file->private_data;
 
 236         void __user *arg = (void __user *)data;
 
 240         case IPMICTL_SEND_COMMAND:
 
 244                 if (copy_from_user(&req, arg, sizeof(req))) {
 
 249                 rv = handle_send_req(priv->user,
 
 251                                      priv->default_retries,
 
 252                                      priv->default_retry_time_ms);
 
 256         case IPMICTL_SEND_COMMAND_SETTIME:
 
 258                 struct ipmi_req_settime req;
 
 260                 if (copy_from_user(&req, arg, sizeof(req))) {
 
 265                 rv = handle_send_req(priv->user,
 
 272         case IPMICTL_RECEIVE_MSG:
 
 273         case IPMICTL_RECEIVE_MSG_TRUNC:
 
 275                 struct ipmi_recv      rsp;
 
 277                 struct list_head *entry;
 
 278                 struct ipmi_recv_msg  *msg;
 
 283                 if (copy_from_user(&rsp, arg, sizeof(rsp))) {
 
 288                 /* We claim a mutex because we don't want two
 
 289                    users getting something from the queue at a time.
 
 290                    Since we have to release the spinlock before we can
 
 291                    copy the data to the user, it's possible another
 
 292                    user will grab something from the queue, too.  Then
 
 293                    the messages might get out of order if something
 
 294                    fails and the message gets put back onto the
 
 295                    queue.  This mutex prevents that problem. */
 
 296                 mutex_lock(&priv->recv_mutex);
 
 298                 /* Grab the message off the list. */
 
 299                 spin_lock_irqsave(&(priv->recv_msg_lock), flags);
 
 300                 if (list_empty(&(priv->recv_msgs))) {
 
 301                         spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
 305                 entry = priv->recv_msgs.next;
 
 306                 msg = list_entry(entry, struct ipmi_recv_msg, link);
 
 308                 spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
 310                 addr_len = ipmi_addr_length(msg->addr.addr_type);
 
 311                 if (rsp.addr_len < addr_len)
 
 314                         goto recv_putback_on_err;
 
 317                 if (copy_to_user(rsp.addr, &(msg->addr), addr_len)) {
 
 319                         goto recv_putback_on_err;
 
 321                 rsp.addr_len = addr_len;
 
 323                 rsp.recv_type = msg->recv_type;
 
 324                 rsp.msgid = msg->msgid;
 
 325                 rsp.msg.netfn = msg->msg.netfn;
 
 326                 rsp.msg.cmd = msg->msg.cmd;
 
 328                 if (msg->msg.data_len > 0) {
 
 329                         if (rsp.msg.data_len < msg->msg.data_len) {
 
 331                                 if (cmd == IPMICTL_RECEIVE_MSG_TRUNC) {
 
 332                                         msg->msg.data_len = rsp.msg.data_len;
 
 334                                         goto recv_putback_on_err;
 
 338                         if (copy_to_user(rsp.msg.data,
 
 343                                 goto recv_putback_on_err;
 
 345                         rsp.msg.data_len = msg->msg.data_len;
 
 347                         rsp.msg.data_len = 0;
 
 350                 if (copy_to_user(arg, &rsp, sizeof(rsp))) {
 
 352                         goto recv_putback_on_err;
 
 355                 mutex_unlock(&priv->recv_mutex);
 
 356                 ipmi_free_recv_msg(msg);
 
 360                 /* If we got an error, put the message back onto
 
 361                    the head of the queue. */
 
 362                 spin_lock_irqsave(&(priv->recv_msg_lock), flags);
 
 363                 list_add(entry, &(priv->recv_msgs));
 
 364                 spin_unlock_irqrestore(&(priv->recv_msg_lock), flags);
 
 365                 mutex_unlock(&priv->recv_mutex);
 
 369                 mutex_unlock(&priv->recv_mutex);
 
 373         case IPMICTL_REGISTER_FOR_CMD:
 
 375                 struct ipmi_cmdspec val;
 
 377                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 382                 rv = ipmi_register_for_cmd(priv->user, val.netfn, val.cmd);
 
 386         case IPMICTL_UNREGISTER_FOR_CMD:
 
 388                 struct ipmi_cmdspec   val;
 
 390                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 395                 rv = ipmi_unregister_for_cmd(priv->user, val.netfn, val.cmd);
 
 399         case IPMICTL_SET_GETS_EVENTS_CMD:
 
 403                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 408                 rv = ipmi_set_gets_events(priv->user, val);
 
 412         /* The next four are legacy, not per-channel. */
 
 413         case IPMICTL_SET_MY_ADDRESS_CMD:
 
 417                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 422                 rv = ipmi_set_my_address(priv->user, 0, val);
 
 426         case IPMICTL_GET_MY_ADDRESS_CMD:
 
 431                 rv = ipmi_get_my_address(priv->user, 0, &rval);
 
 437                 if (copy_to_user(arg, &val, sizeof(val))) {
 
 444         case IPMICTL_SET_MY_LUN_CMD:
 
 448                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 453                 rv = ipmi_set_my_LUN(priv->user, 0, val);
 
 457         case IPMICTL_GET_MY_LUN_CMD:
 
 462                 rv = ipmi_get_my_LUN(priv->user, 0, &rval);
 
 468                 if (copy_to_user(arg, &val, sizeof(val))) {
 
 475         case IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD:
 
 477                 struct ipmi_channel_lun_address_set val;
 
 479                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 484                 return ipmi_set_my_address(priv->user, val.channel, val.value);
 
 488         case IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD:
 
 490                 struct ipmi_channel_lun_address_set val;
 
 492                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 497                 rv = ipmi_get_my_address(priv->user, val.channel, &val.value);
 
 501                 if (copy_to_user(arg, &val, sizeof(val))) {
 
 508         case IPMICTL_SET_MY_CHANNEL_LUN_CMD:
 
 510                 struct ipmi_channel_lun_address_set val;
 
 512                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 517                 rv = ipmi_set_my_LUN(priv->user, val.channel, val.value);
 
 521         case IPMICTL_GET_MY_CHANNEL_LUN_CMD:
 
 523                 struct ipmi_channel_lun_address_set val;
 
 525                 if (copy_from_user(&val, arg, sizeof(val))) {
 
 530                 rv = ipmi_get_my_LUN(priv->user, val.channel, &val.value);
 
 534                 if (copy_to_user(arg, &val, sizeof(val))) {
 
 541         case IPMICTL_SET_TIMING_PARMS_CMD:
 
 543                 struct ipmi_timing_parms parms;
 
 545                 if (copy_from_user(&parms, arg, sizeof(parms))) {
 
 550                 priv->default_retries = parms.retries;
 
 551                 priv->default_retry_time_ms = parms.retry_time_ms;
 
 556         case IPMICTL_GET_TIMING_PARMS_CMD:
 
 558                 struct ipmi_timing_parms parms;
 
 560                 parms.retries = priv->default_retries;
 
 561                 parms.retry_time_ms = priv->default_retry_time_ms;
 
 563                 if (copy_to_user(arg, &parms, sizeof(parms))) {
 
 579  * The following code contains code for supporting 32-bit compatible
 
 580  * ioctls on 64-bit kernels.  This allows running 32-bit apps on the
 
 583 #define COMPAT_IPMICTL_SEND_COMMAND     \
 
 584         _IOR(IPMI_IOC_MAGIC, 13, struct compat_ipmi_req)
 
 585 #define COMPAT_IPMICTL_SEND_COMMAND_SETTIME     \
 
 586         _IOR(IPMI_IOC_MAGIC, 21, struct compat_ipmi_req_settime)
 
 587 #define COMPAT_IPMICTL_RECEIVE_MSG      \
 
 588         _IOWR(IPMI_IOC_MAGIC, 12, struct compat_ipmi_recv)
 
 589 #define COMPAT_IPMICTL_RECEIVE_MSG_TRUNC        \
 
 590         _IOWR(IPMI_IOC_MAGIC, 11, struct compat_ipmi_recv)
 
 592 struct compat_ipmi_msg {
 
 599 struct compat_ipmi_req {
 
 601         compat_uint_t           addr_len;
 
 603         struct compat_ipmi_msg  msg;
 
 606 struct compat_ipmi_recv {
 
 607         compat_int_t            recv_type;
 
 609         compat_uint_t           addr_len;
 
 611         struct compat_ipmi_msg  msg;
 
 614 struct compat_ipmi_req_settime {
 
 615         struct compat_ipmi_req  req;
 
 616         compat_int_t            retries;
 
 617         compat_uint_t           retry_time_ms;
 
 621  * Define some helper functions for copying IPMI data
 
 623 static long get_compat_ipmi_msg(struct ipmi_msg *p64,
 
 624                                 struct compat_ipmi_msg __user *p32)
 
 628         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 629                         __get_user(p64->netfn, &p32->netfn) ||
 
 630                         __get_user(p64->cmd, &p32->cmd) ||
 
 631                         __get_user(p64->data_len, &p32->data_len) ||
 
 632                         __get_user(tmp, &p32->data))
 
 634         p64->data = compat_ptr(tmp);
 
 638 static long put_compat_ipmi_msg(struct ipmi_msg *p64,
 
 639                                 struct compat_ipmi_msg __user *p32)
 
 641         if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) ||
 
 642                         __put_user(p64->netfn, &p32->netfn) ||
 
 643                         __put_user(p64->cmd, &p32->cmd) ||
 
 644                         __put_user(p64->data_len, &p32->data_len))
 
 649 static long get_compat_ipmi_req(struct ipmi_req *p64,
 
 650                                 struct compat_ipmi_req __user *p32)
 
 655         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 656                         __get_user(tmp, &p32->addr) ||
 
 657                         __get_user(p64->addr_len, &p32->addr_len) ||
 
 658                         __get_user(p64->msgid, &p32->msgid) ||
 
 659                         get_compat_ipmi_msg(&p64->msg, &p32->msg))
 
 661         p64->addr = compat_ptr(tmp);
 
 665 static long get_compat_ipmi_req_settime(struct ipmi_req_settime *p64,
 
 666                 struct compat_ipmi_req_settime __user *p32)
 
 668         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 669                         get_compat_ipmi_req(&p64->req, &p32->req) ||
 
 670                         __get_user(p64->retries, &p32->retries) ||
 
 671                         __get_user(p64->retry_time_ms, &p32->retry_time_ms))
 
 676 static long get_compat_ipmi_recv(struct ipmi_recv *p64,
 
 677                                  struct compat_ipmi_recv __user *p32)
 
 681         if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) ||
 
 682                         __get_user(p64->recv_type, &p32->recv_type) ||
 
 683                         __get_user(tmp, &p32->addr) ||
 
 684                         __get_user(p64->addr_len, &p32->addr_len) ||
 
 685                         __get_user(p64->msgid, &p32->msgid) ||
 
 686                         get_compat_ipmi_msg(&p64->msg, &p32->msg))
 
 688         p64->addr = compat_ptr(tmp);
 
 692 static long put_compat_ipmi_recv(struct ipmi_recv *p64,
 
 693                                  struct compat_ipmi_recv __user *p32)
 
 695         if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) ||
 
 696                         __put_user(p64->recv_type, &p32->recv_type) ||
 
 697                         __put_user(p64->addr_len, &p32->addr_len) ||
 
 698                         __put_user(p64->msgid, &p32->msgid) ||
 
 699                         put_compat_ipmi_msg(&p64->msg, &p32->msg))
 
 705  * Handle compatibility ioctls
 
 707 static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd,
 
 711         struct ipmi_file_private *priv = filep->private_data;
 
 714         case COMPAT_IPMICTL_SEND_COMMAND:
 
 718                 if (get_compat_ipmi_req(&rp, compat_ptr(arg)))
 
 721                 return handle_send_req(priv->user, &rp,
 
 722                                 priv->default_retries,
 
 723                                 priv->default_retry_time_ms);
 
 725         case COMPAT_IPMICTL_SEND_COMMAND_SETTIME:
 
 727                 struct ipmi_req_settime sp;
 
 729                 if (get_compat_ipmi_req_settime(&sp, compat_ptr(arg)))
 
 732                 return handle_send_req(priv->user, &sp.req,
 
 733                                 sp.retries, sp.retry_time_ms);
 
 735         case COMPAT_IPMICTL_RECEIVE_MSG:
 
 736         case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC:
 
 738                 struct ipmi_recv   __user *precv64;
 
 739                 struct ipmi_recv   recv64;
 
 741                 if (get_compat_ipmi_recv(&recv64, compat_ptr(arg)))
 
 744                 precv64 = compat_alloc_user_space(sizeof(recv64));
 
 745                 if (copy_to_user(precv64, &recv64, sizeof(recv64)))
 
 748                 rc = ipmi_ioctl(filep->f_dentry->d_inode, filep,
 
 749                                 ((cmd == COMPAT_IPMICTL_RECEIVE_MSG)
 
 750                                  ? IPMICTL_RECEIVE_MSG
 
 751                                  : IPMICTL_RECEIVE_MSG_TRUNC),
 
 752                                 (unsigned long) precv64);
 
 756                 if (copy_from_user(&recv64, precv64, sizeof(recv64)))
 
 759                 if (put_compat_ipmi_recv(&recv64, compat_ptr(arg)))
 
 765                 return ipmi_ioctl(filep->f_dentry->d_inode, filep, cmd, arg);
 
 770 static struct file_operations ipmi_fops = {
 
 771         .owner          = THIS_MODULE,
 
 774         .compat_ioctl   = compat_ipmi_ioctl,
 
 777         .release        = ipmi_release,
 
 778         .fasync         = ipmi_fasync,
 
 782 #define DEVICE_NAME     "ipmidev"
 
 784 static int ipmi_major = 0;
 
 785 module_param(ipmi_major, int, 0);
 
 786 MODULE_PARM_DESC(ipmi_major, "Sets the major number of the IPMI device.  By"
 
 787                  " default, or if you set it to zero, it will choose the next"
 
 788                  " available device.  Setting it to -1 will disable the"
 
 789                  " interface.  Other values will set the major device number"
 
 792 /* Keep track of the devices that are registered. */
 
 793 struct ipmi_reg_list {
 
 795         struct list_head link;
 
 797 static LIST_HEAD(reg_list);
 
 798 static DEFINE_MUTEX(reg_list_mutex);
 
 800 static struct class *ipmi_class;
 
 802 static void ipmi_new_smi(int if_num, struct device *device)
 
 804         dev_t dev = MKDEV(ipmi_major, if_num);
 
 805         struct ipmi_reg_list *entry;
 
 807         devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
 
 808                       "ipmidev/%d", if_num);
 
 810         entry = kmalloc(sizeof(*entry), GFP_KERNEL);
 
 812                 printk(KERN_ERR "ipmi_devintf: Unable to create the"
 
 813                        " ipmi class device link\n");
 
 818         mutex_lock(®_list_mutex);
 
 819         class_device_create(ipmi_class, NULL, dev, device, "ipmi%d", if_num);
 
 820         list_add(&entry->link, ®_list);
 
 821         mutex_unlock(®_list_mutex);
 
 824 static void ipmi_smi_gone(int if_num)
 
 826         dev_t dev = MKDEV(ipmi_major, if_num);
 
 827         struct ipmi_reg_list *entry;
 
 829         mutex_lock(®_list_mutex);
 
 830         list_for_each_entry(entry, ®_list, link) {
 
 831                 if (entry->dev == dev) {
 
 832                         list_del(&entry->link);
 
 837         class_device_destroy(ipmi_class, dev);
 
 838         mutex_unlock(®_list_mutex);
 
 839         devfs_remove("ipmidev/%d", if_num);
 
 842 static struct ipmi_smi_watcher smi_watcher =
 
 844         .owner    = THIS_MODULE,
 
 845         .new_smi  = ipmi_new_smi,
 
 846         .smi_gone = ipmi_smi_gone,
 
 849 static __init int init_ipmi_devintf(void)
 
 856         printk(KERN_INFO "ipmi device interface\n");
 
 858         ipmi_class = class_create(THIS_MODULE, "ipmi");
 
 859         if (IS_ERR(ipmi_class)) {
 
 860                 printk(KERN_ERR "ipmi: can't register device class\n");
 
 861                 return PTR_ERR(ipmi_class);
 
 864         rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops);
 
 866                 class_destroy(ipmi_class);
 
 867                 printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
 
 871         if (ipmi_major == 0) {
 
 875         devfs_mk_dir(DEVICE_NAME);
 
 877         rv = ipmi_smi_watcher_register(&smi_watcher);
 
 879                 unregister_chrdev(ipmi_major, DEVICE_NAME);
 
 880                 class_destroy(ipmi_class);
 
 881                 printk(KERN_WARNING "ipmi: can't register smi watcher\n");
 
 887 module_init(init_ipmi_devintf);
 
 889 static __exit void cleanup_ipmi(void)
 
 891         struct ipmi_reg_list *entry, *entry2;
 
 892         mutex_lock(®_list_mutex);
 
 893         list_for_each_entry_safe(entry, entry2, ®_list, link) {
 
 894                 list_del(&entry->link);
 
 895                 class_device_destroy(ipmi_class, entry->dev);
 
 898         mutex_unlock(®_list_mutex);
 
 899         class_destroy(ipmi_class);
 
 900         ipmi_smi_watcher_unregister(&smi_watcher);
 
 901         devfs_remove(DEVICE_NAME);
 
 902         unregister_chrdev(ipmi_major, DEVICE_NAME);
 
 904 module_exit(cleanup_ipmi);
 
 906 MODULE_LICENSE("GPL");
 
 907 MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
 
 908 MODULE_DESCRIPTION("Linux device interface for the IPMI message handler.");