sysfs for IPMI, for new mm kernels

From: Corey Minyard
Date: Thu Mar 31 2005 - 22:05:39 EST


Andrew,

There are some major changes in the current mm kernels to the class interface that require changes to the IPMI driver. Thus the previously posted sysfs changes for IPMI are now incorrect. Here's a new one.

-Corey Add support for sysfs to the IPMI device interface.

Signed-off-by: Corey Minyard <minyard@xxxxxxx>

Index: linux-2.6.12-rc1/drivers/char/ipmi/ipmi_devintf.c
===================================================================
--- linux-2.6.12-rc1.orig/drivers/char/ipmi/ipmi_devintf.c
+++ linux-2.6.12-rc1/drivers/char/ipmi/ipmi_devintf.c
@@ -44,6 +44,7 @@
#include <linux/ipmi.h>
#include <asm/semaphore.h>
#include <linux/init.h>
+#include <linux/device.h>

#define IPMI_DEVINTF_VERSION "v33"

@@ -519,15 +520,24 @@
" interface. Other values will set the major device number"
" to that value.");

+static struct class *ipmi_class;
+
static void ipmi_new_smi(int if_num)
{
+ char name[10];
+ dev_t dev = MKDEV(ipmi_major, if_num);
+
devfs_mk_cdev(MKDEV(ipmi_major, if_num),
S_IFCHR | S_IRUSR | S_IWUSR,
"ipmidev/%d", if_num);
+
+ snprintf(name, sizeof(name), "ipmi%d", if_num);
+ class_device_create(ipmi_class, dev, NULL, name);
}

static void ipmi_smi_gone(int if_num)
{
+ class_device_destroy(ipmi_class, MKDEV(ipmi_major, if_num));
devfs_remove("ipmidev/%d", if_num);
}

@@ -548,8 +558,15 @@
printk(KERN_INFO "ipmi device interface version "
IPMI_DEVINTF_VERSION "\n");

+ ipmi_class = class_create(THIS_MODULE, "ipmi");
+ if (IS_ERR(ipmi_class)) {
+ printk(KERN_ERR "ipmi: can't register device class\n");
+ return PTR_ERR(ipmi_class);
+ }
+
rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops);
if (rv < 0) {
+ class_destroy(ipmi_class);
printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
return rv;
}
@@ -563,6 +580,7 @@
rv = ipmi_smi_watcher_register(&smi_watcher);
if (rv) {
unregister_chrdev(ipmi_major, DEVICE_NAME);
+ class_destroy(ipmi_class);
printk(KERN_WARNING "ipmi: can't register smi watcher\n");
return rv;
}
@@ -573,6 +591,7 @@

static __exit void cleanup_ipmi(void)
{
+ class_destroy(ipmi_class);
ipmi_smi_watcher_unregister(&smi_watcher);
devfs_remove(DEVICE_NAME);
unregister_chrdev(ipmi_major, DEVICE_NAME);