diff options
| -rw-r--r-- | drivers/char/ipmi/ipmi_msghandler.c | 11 |
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 { | |||
| 265 | struct bmc_device { | 265 | struct 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 | ||
| 2762 | out_put_bmc: | 2770 | out_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 | ||
| 2769 | out_list_del: | 2778 | out_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; |
