#define IPMI_IPMB_NUM_SEQ      64
 struct ipmi_smi {
+       struct module *owner;
+
        /* What interface number are we? */
        int intf_num;
 
        if (rv)
                goto out_kfree;
 
+       if (!try_module_get(intf->owner)) {
+               rv = -ENODEV;
+               goto out_kfree;
+       }
+
        /* Note that each existing user holds a refcount to the interface. */
        kref_get(&intf->refcount);
 
        }
 
        kref_put(&intf->refcount, intf_free);
+       module_put(intf->owner);
 }
 
 int ipmi_destroy_user(struct ipmi_user *user)
  * been recently fetched, this will just use the cached data.  Otherwise
  * it will run a new fetch.
  *
- * Except for the first time this is called (in ipmi_register_smi()),
+ * Except for the first time this is called (in ipmi_add_smi()),
  * this will always return good data;
  */
 static int __bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc,
        kref_put(&intf->refcount, intf_free);
 }
 
-int ipmi_register_smi(const struct ipmi_smi_handlers *handlers,
-                     void                     *send_info,
-                     struct device            *si_dev,
-                     unsigned char            slave_addr)
+int ipmi_add_smi(struct module         *owner,
+                const struct ipmi_smi_handlers *handlers,
+                void                  *send_info,
+                struct device         *si_dev,
+                unsigned char         slave_addr)
 {
        int              i, j;
        int              rv;
                return rv;
        }
 
-
+       intf->owner = owner;
        intf->bmc = &intf->tmp_bmc;
        INIT_LIST_HEAD(&intf->bmc->intfs);
        mutex_init(&intf->bmc->dyn_mutex);
 
        return rv;
 }
-EXPORT_SYMBOL(ipmi_register_smi);
+EXPORT_SYMBOL(ipmi_add_smi);
 
 static void deliver_smi_err_response(struct ipmi_smi *intf,
                                     struct ipmi_smi_msg *msg,
 
  * is called, and the lower layer must get the interface from that
  * call.
  */
-int ipmi_register_smi(const struct ipmi_smi_handlers *handlers,
-                     void                     *send_info,
-                     struct device            *dev,
-                     unsigned char            slave_addr);
+int ipmi_add_smi(struct module            *owner,
+                const struct ipmi_smi_handlers *handlers,
+                void                     *send_info,
+                struct device            *dev,
+                unsigned char            slave_addr);
+
+#define ipmi_register_smi(handlers, send_info, dev, slave_addr) \
+       ipmi_add_smi(THIS_MODULE, handlers, send_info, dev, slave_addr)
 
 /*
  * Remove a low-level interface from the IPMI driver.  This will