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
parent
511d57dc71
commit
a9137c3dfa
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue