aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/ipmi/ipmi_msghandler.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
index 89b72425f9ce..8814f4bed862 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -265,6 +265,7 @@ struct ipmi_proc_entry {
265struct bmc_device { 265struct bmc_device {
266 struct platform_device pdev; 266 struct platform_device pdev;
267 struct ipmi_device_id id; 267 struct ipmi_device_id id;
268 struct list_head intfs;
268 unsigned char guid[16]; 269 unsigned char guid[16];
269 int guid_set; 270 int guid_set;
270 char name[16]; 271 char name[16];
@@ -404,6 +405,7 @@ struct ipmi_smi {
404 405
405 struct bmc_device *bmc; 406 struct bmc_device *bmc;
406 bool bmc_registered; 407 bool bmc_registered;
408 struct list_head bmc_link;
407 char *my_dev_name; 409 char *my_dev_name;
408 410
409 /* 411 /*
@@ -2616,6 +2618,8 @@ static void ipmi_bmc_unregister(ipmi_smi_t intf)
2616 intf->my_dev_name = NULL; 2618 intf->my_dev_name = NULL;
2617 2619
2618 mutex_lock(&ipmidriver_mutex); 2620 mutex_lock(&ipmidriver_mutex);
2621 list_del(&intf->bmc_link);
2622 intf->bmc = NULL;
2619 kref_put(&bmc->usecount, cleanup_bmc_device); 2623 kref_put(&bmc->usecount, cleanup_bmc_device);
2620 mutex_unlock(&ipmidriver_mutex); 2624 mutex_unlock(&ipmidriver_mutex);
2621 intf->bmc_registered = false; 2625 intf->bmc_registered = false;
@@ -2646,7 +2650,10 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
2646 */ 2650 */
2647 if (old_bmc) { 2651 if (old_bmc) {
2648 kfree(bmc); 2652 kfree(bmc);
2653 mutex_lock(&ipmidriver_mutex);
2649 intf->bmc = old_bmc; 2654 intf->bmc = old_bmc;
2655 list_add_tail(&intf->bmc_link, &bmc->intfs);
2656 mutex_unlock(&ipmidriver_mutex);
2650 bmc = old_bmc; 2657 bmc = old_bmc;
2651 2658
2652 printk(KERN_INFO 2659 printk(KERN_INFO
@@ -2697,6 +2704,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
2697 kref_init(&bmc->usecount); 2704 kref_init(&bmc->usecount);
2698 2705
2699 rv = platform_device_register(&bmc->pdev); 2706 rv = platform_device_register(&bmc->pdev);
2707 list_add_tail(&intf->bmc_link, &bmc->intfs);
2700 mutex_unlock(&ipmidriver_mutex); 2708 mutex_unlock(&ipmidriver_mutex);
2701 if (rv) { 2709 if (rv) {
2702 printk(KERN_ERR 2710 printk(KERN_ERR
@@ -2761,6 +2769,7 @@ out_unlink1:
2761 2769
2762out_put_bmc: 2770out_put_bmc:
2763 mutex_lock(&ipmidriver_mutex); 2771 mutex_lock(&ipmidriver_mutex);
2772 list_del(&intf->bmc_link);
2764 intf->bmc = NULL; 2773 intf->bmc = NULL;
2765 kref_put(&bmc->usecount, cleanup_bmc_device); 2774 kref_put(&bmc->usecount, cleanup_bmc_device);
2766 mutex_unlock(&ipmidriver_mutex); 2775 mutex_unlock(&ipmidriver_mutex);
@@ -2768,6 +2777,7 @@ out_put_bmc:
2768 2777
2769out_list_del: 2778out_list_del:
2770 mutex_lock(&ipmidriver_mutex); 2779 mutex_lock(&ipmidriver_mutex);
2780 list_del(&intf->bmc_link);
2771 intf->bmc = NULL; 2781 intf->bmc = NULL;
2772 mutex_unlock(&ipmidriver_mutex); 2782 mutex_unlock(&ipmidriver_mutex);
2773 put_device(&bmc->pdev.dev); 2783 put_device(&bmc->pdev.dev);
@@ -2990,6 +3000,7 @@ int ipmi_register_smi(const struct ipmi_smi_handlers *handlers,
2990 kfree(intf); 3000 kfree(intf);
2991 return -ENOMEM; 3001 return -ENOMEM;
2992 } 3002 }
3003 INIT_LIST_HEAD(&intf->bmc->intfs);
2993 intf->intf_num = -1; /* Mark it invalid for now. */ 3004 intf->intf_num = -1; /* Mark it invalid for now. */
2994 kref_init(&intf->refcount); 3005 kref_init(&intf->refcount);
2995 intf->bmc->id = *device_id; 3006 intf->bmc->id = *device_id;