Skip to contentSkip to conversation

Add sysfs support for the IPMI device interface

PATCH In review Corey Minyard 4 participants 6 messages May 19, 2005 – May 22, 2005 IPMI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add sysfs support for the IPMI device interface

Linus,

Could you please add this patch to the main tree? I can't send it to Andrew because he has a rework of this in his tree that has not made it into yours yet, and I'd like to have this in before 2.6.12 is released.

-Corey

Add support for sysfs to the IPMI device interface.

drivers/char/ipmi/ipmi_devintf.c +0 -0
Index: linux-2.6.11-mm1/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_simple *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_simple_device_add(ipmi_class, dev, NULL, name);
}

static void ipmi_smi_gone(int if_num)
{

+    class_simple_device_remove(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_simple_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_simple_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_simple_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_simple_destroy(ipmi_class);
    ipmi_smi_watcher_unregister(&smi_watcher);
    devfs_remove(DEVICE_NAME);
    unregister_chrdev(ipmi_major, DEVICE_NAME);
#1 lore raw
Quoted 10 lines · Corey Minyard

Linus,

Could you please add this patch to the main tree? I can't send it to Andrew because he has a rework of this in his tree that has not made it into yours yet, and I'd like to have this in before 2.6.12 is released.

-Corey

Add support for sysfs to the IPMI device interface.

Your patch has had it's tabs eaten and can't be applied :(

thanks,

greg k-h

#2 lore raw
In reply to Corey Minyard

Hello!

On Thu, May 19, 2005 at 06:26:04PM -0500, Corey Minyard wrote:
...

Quoted 1 line

Add support for sysfs to the IPMI device interface.

...

Quoted 1 line

...

Quoted 1 line

Index: linux-2.6.11-mm1/drivers/char/ipmi/ipmi_devintf.c

...

Quoted 3 lines

static void ipmi_new_smi(int if_num)
{
+ char name[10];

...

Review

Quoted 6 lines

devfs_mk_cdev(MKDEV(ipmi_major, if_num),
S_IFCHR | S_IRUSR | S_IWUSR,
"ipmidev/%d", if_num);

(quoted diff) +3 -0
+
+    snprintf(name, sizeof(name), "ipmi%d", if_num);
+    class_simple_device_add(ipmi_class, dev, NULL, name);

What happend to Dimitry Torokovs comment in
http://marc.theaimsgroup.com/?l=linux-kernel&m=111232712029756&w=2
and your reply in
http://marc.theaimsgroup.com/?l=linux-kernel&m=111232954415119&w=2
According to linux/device.h:250, class_simple_device_add() has a printf() like argument, so you don't need to snprintf() the name on your own.

Add support for sysfs to the IPMI device interface.

drivers/char/ipmi/ipmi_devintf.c +18 -2
Index: 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,21 @@
 		 " 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)
 {
-	devfs_mk_cdev(MKDEV(ipmi_major, if_num),
-		      S_IFCHR | S_IRUSR | S_IWUSR,
+	dev_t dev = MKDEV(ipmi_major, if_num);
+
+	devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
 		      "ipmidev/%d", if_num);
+
+	class_simple_device_add(ipmi_class, dev, NULL, "ipmi%d", if_num);
 }
 
 static void ipmi_smi_gone(int if_num)
 {
+	class_simple_device_remove(ipmi_class, MKDEV(ipmi_major, if_num));
 	devfs_remove("ipmidev/%d", if_num);
 }
 
@@ -548,8 +555,15 @@
 	printk(KERN_INFO "ipmi device interface version "
 	       IPMI_DEVINTF_VERSION "\n");
 
+	ipmi_class = class_simple_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_simple_destroy(ipmi_class);
 		printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
 		return rv;
 	}
@@ -563,6 +577,7 @@
 	rv = ipmi_smi_watcher_register(&smi_watcher);
 	if (rv) {
 		unregister_chrdev(ipmi_major, DEVICE_NAME);
+		class_simple_destroy(ipmi_class);
 		printk(KERN_WARNING "ipmi: can't register smi watcher\n");
 		return rv;
 	}
@@ -573,6 +588,7 @@
 
 static __exit void cleanup_ipmi(void)
 {
+	class_simple_destroy(ipmi_class);
 	ipmi_smi_watcher_unregister(&smi_watcher);
 	devfs_remove(DEVICE_NAME);
 	unregister_chrdev(ipmi_major, DEVICE_NAME);

BYtE
Philipp

Signature · 3 lines
  / /  (_)__  __ ____  __ Philipp Hahn
 / /__/ / _ \/ // /\ \/ /
/____/_/_//_/\_,_/ /_/\_\ [email protected]
#3 lore raw
Quoted 11 lines · Philipp Matthias Hahn

What happend to Dimitry Torokovs comment in
http://marc.theaimsgroup.com/?l=linux-kernel&m=111232712029756&w=2
and your reply in
http://marc.theaimsgroup.com/?l=linux-kernel&m=111232954415119&w=2
According to linux/device.h:250, class_simple_device_add() has a printf() like argument, so you don't need to snprintf() the name on your own.

Thank you. My stupid mailer ate the tabs, and you fixed that, too. This looks good to go in.

-Corey

Quoted 78 lines

Add support for sysfs to the IPMI device interface.

Index: linux-2.6.12-rc1/drivers/char/ipmi/ipmi_devintf.c
===================================================================

drivers/char/ipmi/ipmi_devintf.c +18 -2
@@ -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,21 @@
 		 " 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)
 {
-	devfs_mk_cdev(MKDEV(ipmi_major, if_num),
-		      S_IFCHR | S_IRUSR | S_IWUSR,
+	dev_t dev = MKDEV(ipmi_major, if_num);
+
+	devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
 		      "ipmidev/%d", if_num);
+
+	class_simple_device_add(ipmi_class, dev, NULL, "ipmi%d", if_num);
 }
 
 static void ipmi_smi_gone(int if_num)
 {
+	class_simple_device_remove(ipmi_class, MKDEV(ipmi_major, if_num));
 	devfs_remove("ipmidev/%d", if_num);
 }
 
@@ -548,8 +555,15 @@
 	printk(KERN_INFO "ipmi device interface version "
 	       IPMI_DEVINTF_VERSION "\n");
 
+	ipmi_class = class_simple_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_simple_destroy(ipmi_class);
 		printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
 		return rv;
 	}
@@ -563,6 +577,7 @@
 	rv = ipmi_smi_watcher_register(&smi_watcher);
 	if (rv) {
 		unregister_chrdev(ipmi_major, DEVICE_NAME);
+		class_simple_destroy(ipmi_class);
 		printk(KERN_WARNING "ipmi: can't register smi watcher\n");
 		return rv;
 	}
@@ -573,6 +588,7 @@
 
 static __exit void cleanup_ipmi(void)
 {
+	class_simple_destroy(ipmi_class);
 	ipmi_smi_watcher_unregister(&smi_watcher);
 	devfs_remove(DEVICE_NAME);
 	unregister_chrdev(ipmi_major, DEVICE_NAME);

BYtE
Philipp

#4 lore raw

I get the following compile problem with this change in linus' git repo....

CC [M] drivers/char/ipmi/ipmi_devintf.o
drivers/char/ipmi/ipmi_devintf.c: In function 'ipmi_new_smi':
drivers/char/ipmi/ipmi_devintf.c:532: warning: passing argument 1 of 'class_simple_device_add' from incompatible pointer type drivers/char/ipmi/ipmi_devintf.c: In function 'ipmi_smi_gone':
drivers/char/ipmi/ipmi_devintf.c:537: warning: passing argument 1 of 'class_simple_device_remove' makes integer from pointer without a cast drivers/char/ipmi/ipmi_devintf.c:537: error: too many arguments to function 'class_simple_device_remove' drivers/char/ipmi/ipmi_devintf.c: In function 'init_ipmi_devintf':
drivers/char/ipmi/ipmi_devintf.c:558: warning: assignment from incompatible pointer type drivers/char/ipmi/ipmi_devintf.c:566: warning: passing argument 1 of 'class_simple_destroy' from incompatible pointer type drivers/char/ipmi/ipmi_devintf.c:580: warning: passing argument 1 of 'class_simple_destroy' from incompatible pointer type drivers/char/ipmi/ipmi_devintf.c: In function 'cleanup_ipmi':
drivers/char/ipmi/ipmi_devintf.c:591: warning: passing argument 1 of 'class_simple_destroy' from incompatible pointer type make[3]: *** [drivers/char/ipmi/ipmi_devintf.o] Error 1 make[2]: *** [drivers/char/ipmi] Error 2
make[1]: *** [drivers/char] Error 2
make: *** [drivers] Error 2

Following patch makes it compile...

signed-off AsterixTheGaul <[email protected]>

Compile fix ipmi_devintf.c for problem introduced by the commit change 37e0915b701281182cea9fc90e894d10addf134a

---
commit 1f974bf04b1f2a01e189e01970cb744343ad1bb7
tree c7b157f4d23340a6d773b8d1385c0efb21d4b650
parent b5c44c2147a447f77e07fecdb087ae288e1f4e40
author AsterixTheGaul <[email protected]> Sat, 21 May 2005 20:16:39 +0530committer AsterixTheGaul <[email protected]> Sat, 21 May 2005 20:16:39 +0530

 char/ipmi/ipmi_devintf.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

Index: drivers/char/ipmi/ipmi_devintf.c
===================================================================
--- ec1d95eb1e03e320fc5eb5cfb40379f2f4a7267d/drivers/char/ipmi/ipmi_devintf.c
(mode:100644)
+++ c7b157f4d23340a6d773b8d1385c0efb21d4b650/drivers/char/ipmi/ipmi_devintf.c
(mode:100644)
@@ -520,7 +520,7 @@
" interface. Other values will set the major device number" " to that value.");

-static struct class *ipmi_class;
+static struct class_simple *ipmi_class;

Quoted 103 lines · Corey Minyard
Quoted 11 lines · Philipp Matthias Hahn

What happend to Dimitry Torokovs comment in
http://marc.theaimsgroup.com/?l=linux-kernel&m=111232712029756&w=2
and your reply in
http://marc.theaimsgroup.com/?l=linux-kernel&m=111232954415119&w=2
According to linux/device.h:250, class_simple_device_add() has a printf() like argument, so you don't need to snprintf() the name on your own.

Thank you. My stupid mailer ate the tabs, and you fixed that, too. This looks good to go in.

-Corey

Quoted 74 lines

Add support for sysfs to the IPMI device interface.

Index: linux-2.6.12-rc1/drivers/char/ipmi/ipmi_devintf.c
===================================================================

drivers/char/ipmi/ipmi_devintf.c +18 -2
@@ -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,21 @@
               " 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)
 {
-      devfs_mk_cdev(MKDEV(ipmi_major, if_num),
-                    S_IFCHR | S_IRUSR | S_IWUSR,
+      dev_t dev = MKDEV(ipmi_major, if_num);
+
+      devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
                    "ipmidev/%d", if_num);
+
+      class_simple_device_add(ipmi_class, dev, NULL, "ipmi%d", if_num);
 }
 
 static void ipmi_smi_gone(int if_num)
 {
+      class_simple_device_remove(ipmi_class, MKDEV(ipmi_major, if_num));
      devfs_remove("ipmidev/%d", if_num);
 }
 
@@ -548,8 +555,15 @@
      printk(KERN_INFO "ipmi device interface version "
             IPMI_DEVINTF_VERSION "\n");
 
+      ipmi_class = class_simple_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_simple_destroy(ipmi_class);
              printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
              return rv;
      }
@@ -563,6 +577,7 @@
      rv = ipmi_smi_watcher_register(&smi_watcher);
      if (rv) {
              unregister_chrdev(ipmi_major, DEVICE_NAME);
+              class_simple_destroy(ipmi_class);
              printk(KERN_WARNING "ipmi: can't register smi watcher\n");
              return rv;
      }
@@ -573,6 +588,7 @@
 
 static __exit void cleanup_ipmi(void)
 {
+      class_simple_destroy(ipmi_class);
      ipmi_smi_watcher_unregister(&smi_watcher);
      devfs_remove(DEVICE_NAME);
      unregister_chrdev(ipmi_major, DEVICE_NAME);
Quoted 4 lines

BYtE
Philipp

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#5 lore raw

Sorry dint copy the full mkpatch output. Here is the full output....

Signed-off by AsterixTheGaul <[email protected]>

Compile fix ipmi_devintf.c for problem introduced by the commit change 37e0915b701281182cea9fc90e894d10addf134a

---
commit 1f974bf04b1f2a01e189e01970cb744343ad1bb7
tree c7b157f4d23340a6d773b8d1385c0efb21d4b650
parent b5c44c2147a447f77e07fecdb087ae288e1f4e40
author AsterixTheGaul <[email protected]> Sat, 21 May 2005 20:16:39 +0530 committer AsterixTheGaul <[email protected]> Sat, 21 May 2005 20:16:39 +0530

 char/ipmi/ipmi_devintf.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

Index: drivers/char/ipmi/ipmi_devintf.c
===================================================================
--- ec1d95eb1e03e320fc5eb5cfb40379f2f4a7267d/drivers/char/ipmi/ipmi_devintf.c
(mode:100644)
+++ c7b157f4d23340a6d773b8d1385c0efb21d4b650/drivers/char/ipmi/ipmi_devintf.c
(mode:100644)
@@ -520,7 +520,7 @@
" interface. Other values will set the major device number" " to that value.");

-static struct class *ipmi_class;
+static struct class_simple *ipmi_class;

static void ipmi_new_smi(int if_num)
{
@@ -534,7 +534,7 @@

static void ipmi_smi_gone(int if_num)
{
- class_simple_device_remove(ipmi_class, MKDEV(ipmi_major, if_num));

+       class_simple_device_remove(MKDEV(ipmi_major, if_num));
        devfs_remove("ipmidev/%d", if_num);

}