1
0
Fork 0

ipmi: Add a reference from BMC devices to their interfaces

In an upcoming change, we'll want to grab a reference to the ipmi_smi_t
from a struct bmc_device. This change adds a pointer to allow this.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>

Reworked to support multiple interfaces on a BMC.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
hifive-unleashed-5.1
Jeremy Kerr 2017-08-25 15:47:22 +08:00 committed by Corey Minyard
parent 511d57dc71
commit a9137c3dfa
1 changed files with 11 additions and 0 deletions

View File

@ -265,6 +265,7 @@ struct ipmi_proc_entry {
struct bmc_device { struct bmc_device {
struct platform_device pdev; struct platform_device pdev;
struct ipmi_device_id id; struct ipmi_device_id id;
struct list_head intfs;
unsigned char guid[16]; unsigned char guid[16];
int guid_set; int guid_set;
char name[16]; char name[16];
@ -404,6 +405,7 @@ struct ipmi_smi {
struct bmc_device *bmc; struct bmc_device *bmc;
bool bmc_registered; bool bmc_registered;
struct list_head bmc_link;
char *my_dev_name; char *my_dev_name;
/* /*
@ -2616,6 +2618,8 @@ static void ipmi_bmc_unregister(ipmi_smi_t intf)
intf->my_dev_name = NULL; intf->my_dev_name = NULL;
mutex_lock(&ipmidriver_mutex); mutex_lock(&ipmidriver_mutex);
list_del(&intf->bmc_link);
intf->bmc = NULL;
kref_put(&bmc->usecount, cleanup_bmc_device); kref_put(&bmc->usecount, cleanup_bmc_device);
mutex_unlock(&ipmidriver_mutex); mutex_unlock(&ipmidriver_mutex);
intf->bmc_registered = false; intf->bmc_registered = false;
@ -2646,7 +2650,10 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
*/ */
if (old_bmc) { if (old_bmc) {
kfree(bmc); kfree(bmc);
mutex_lock(&ipmidriver_mutex);
intf->bmc = old_bmc; intf->bmc = old_bmc;
list_add_tail(&intf->bmc_link, &bmc->intfs);
mutex_unlock(&ipmidriver_mutex);
bmc = old_bmc; bmc = old_bmc;
printk(KERN_INFO printk(KERN_INFO
@ -2697,6 +2704,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
kref_init(&bmc->usecount); kref_init(&bmc->usecount);
rv = platform_device_register(&bmc->pdev); rv = platform_device_register(&bmc->pdev);
list_add_tail(&intf->bmc_link, &bmc->intfs);
mutex_unlock(&ipmidriver_mutex); mutex_unlock(&ipmidriver_mutex);
if (rv) { if (rv) {
printk(KERN_ERR printk(KERN_ERR
@ -2761,6 +2769,7 @@ out_unlink1:
out_put_bmc: out_put_bmc:
mutex_lock(&ipmidriver_mutex); mutex_lock(&ipmidriver_mutex);
list_del(&intf->bmc_link);
intf->bmc = NULL; intf->bmc = NULL;
kref_put(&bmc->usecount, cleanup_bmc_device); kref_put(&bmc->usecount, cleanup_bmc_device);
mutex_unlock(&ipmidriver_mutex); mutex_unlock(&ipmidriver_mutex);
@ -2768,6 +2777,7 @@ out_put_bmc:
out_list_del: out_list_del:
mutex_lock(&ipmidriver_mutex); mutex_lock(&ipmidriver_mutex);
list_del(&intf->bmc_link);
intf->bmc = NULL; intf->bmc = NULL;
mutex_unlock(&ipmidriver_mutex); mutex_unlock(&ipmidriver_mutex);
put_device(&bmc->pdev.dev); put_device(&bmc->pdev.dev);
@ -2990,6 +3000,7 @@ int ipmi_register_smi(const struct ipmi_smi_handlers *handlers,
kfree(intf); kfree(intf);
return -ENOMEM; return -ENOMEM;
} }
INIT_LIST_HEAD(&intf->bmc->intfs);
intf->intf_num = -1; /* Mark it invalid for now. */ intf->intf_num = -1; /* Mark it invalid for now. */
kref_init(&intf->refcount); kref_init(&intf->refcount);
intf->bmc->id = *device_id; intf->bmc->id = *device_id;