Signed-off-by: Kamlakant Patel <kamlakant.pa...@cavium.com>
---
drivers/char/ipmi/ipmi_ssif.c | 102
+++++++++++++++++++++++-------------------
1 file changed, 55 insertions(+), 47 deletions(-)
diff --git a/drivers/char/ipmi/ipmi_ssif.c
b/drivers/char/ipmi/ipmi_ssif.c
index 16d7fb5..c71e707 100644
--- a/drivers/char/ipmi/ipmi_ssif.c
+++ b/drivers/char/ipmi/ipmi_ssif.c
@@ -192,6 +192,8 @@ struct ssif_addr_info {
};
struct ssif_info;
+static struct ssif_info *local_ssif_info;
+static int local_slave_addr;
typedef void (*ssif_i2c_done)(struct ssif_info *ssif_info, int
result,
unsigned char *data, unsigned int len);
@@ -1534,6 +1536,7 @@ static int ssif_probe(struct i2c_client
*client, const struct i2c_device_id *id)
}
slave_addr = find_slave_address(client, slave_addr);
+ local_slave_addr = slave_addr;
pr_info(PFX "Trying %s-specified SSIF interface at i2c
address 0x%x, adapter %s, slave address 0x%x\n",
ipmi_addr_src_to_str(ssif_info->addr_source),
@@ -1725,43 +1728,7 @@ static int ssif_probe(struct i2c_client
*client, const struct i2c_device_id *id)
}
}
- dev_set_drvdata(&ssif_info->client->dev, ssif_info);
- rv = device_add_group(&ssif_info->client->dev,
- &ipmi_ssif_dev_attr_group);
- if (rv) {
- dev_err(&ssif_info->client->dev,
- "Unable to add device attributes: error %d\n",
- rv);
- goto out;
- }
-
- rv = ipmi_register_smi(&ssif_info->handlers,
- ssif_info,
- &ssif_info->client->dev,
- slave_addr);
- if (rv) {
- pr_err(PFX "Unable to register device: error %d\n", rv);
- goto out_remove_attr;
- }
-
-#ifdef CONFIG_IPMI_PROC_INTERFACE
- rv = ipmi_smi_add_proc_entry(ssif_info->intf, "type",
- &smi_type_proc_ops,
- ssif_info);
- if (rv) {
- pr_err(PFX "Unable to create proc entry: %d\n", rv);
- goto out_err_unreg;
- }
-
- rv = ipmi_smi_add_proc_entry(ssif_info->intf, "ssif_stats",
- &smi_stats_proc_ops,
- ssif_info);
- if (rv) {
- pr_err(PFX "Unable to create proc entry: %d\n", rv);
- goto out_err_unreg;
- }
-#endif
-
+ local_ssif_info = ssif_info;
out:
if (rv) {
/*
@@ -1778,16 +1745,6 @@ static int ssif_probe(struct i2c_client
*client, const struct i2c_device_id *id)
}
kfree(resp);
return rv;
-
-#ifdef CONFIG_IPMI_PROC_INTERFACE
-out_err_unreg:
- ipmi_unregister_smi(ssif_info->intf);
-#endif
-
-out_remove_attr:
- device_remove_group(&ssif_info->client->dev,
&ipmi_ssif_dev_attr_group);
- dev_set_drvdata(&ssif_info->client->dev, NULL);
- goto out;
}
static int ssif_adapter_handler(struct device *adev, void *opaque)
@@ -2127,7 +2084,58 @@ static int init_ipmi_ssif(void)
if (!rv)
initialized = true;
+ if (local_ssif_info == NULL)
+ goto out;
+
+ dev_set_drvdata(&local_ssif_info->client->dev, local_ssif_info);
+ rv = device_add_group(&local_ssif_info->client->dev,
+ &ipmi_ssif_dev_attr_group);
+ if (rv) {
+ dev_err(&local_ssif_info->client->dev,
+ "Unable to add device attributes: error %d\n",
+ rv);
+ goto out;
+ }
+
+ rv = ipmi_register_smi(&local_ssif_info->handlers,
+ local_ssif_info,
+ &local_ssif_info->client->dev,
+ local_slave_addr);
+ if (rv) {
+ pr_err(PFX "Unable to register device: error %d\n", rv);
+ goto out_remove_attr;
+ }
+
+#ifdef CONFIG_IPMI_PROC_INTERFACE
+ rv = ipmi_smi_add_proc_entry(local_ssif_info->intf, "type",
+ &smi_type_proc_ops,
+ local_ssif_info);
+ if (rv) {
+ pr_err(PFX "Unable to create proc entry: %d\n", rv);
+ goto out_err_unreg;
+ }
+
+ rv = ipmi_smi_add_proc_entry(local_ssif_info->intf, "ssif_stats",
+ &smi_stats_proc_ops,
+ local_ssif_info);
+ if (rv) {
+ pr_err(PFX "Unable to create proc entry: %d\n", rv);
+ goto out_err_unreg;
+ }
+#endif
+ out:
return rv;
+
+#ifdef CONFIG_IPMI_PROC_INTERFACE
+ out_err_unreg:
+ ipmi_unregister_smi(local_ssif_info->intf);
+#endif
+
+ out_remove_attr:
+ device_remove_group(&local_ssif_info->client->dev,
+ &ipmi_ssif_dev_attr_group);
+ dev_set_drvdata(&local_ssif_info->client->dev, NULL);
+ goto out;
}
module_init(init_ipmi_ssif);