struct bmc_device {
struct platform_device pdev;
struct ipmi_device_id id;
+ struct list_head intfs;
unsigned char guid[16];
int guid_set;
char name[16];
struct bmc_device *bmc;
bool bmc_registered;
+ struct list_head bmc_link;
char *my_dev_name;
/*
intf->my_dev_name = NULL;
mutex_lock(&ipmidriver_mutex);
+ list_del(&intf->bmc_link);
+ intf->bmc = NULL;
kref_put(&bmc->usecount, cleanup_bmc_device);
mutex_unlock(&ipmidriver_mutex);
intf->bmc_registered = false;
*/
if (old_bmc) {
kfree(bmc);
+ mutex_lock(&ipmidriver_mutex);
intf->bmc = old_bmc;
+ list_add_tail(&intf->bmc_link, &bmc->intfs);
+ mutex_unlock(&ipmidriver_mutex);
bmc = old_bmc;
printk(KERN_INFO
kref_init(&bmc->usecount);
rv = platform_device_register(&bmc->pdev);
+ list_add_tail(&intf->bmc_link, &bmc->intfs);
mutex_unlock(&ipmidriver_mutex);
if (rv) {
printk(KERN_ERR
out_put_bmc:
mutex_lock(&ipmidriver_mutex);
+ list_del(&intf->bmc_link);
intf->bmc = NULL;
kref_put(&bmc->usecount, cleanup_bmc_device);
mutex_unlock(&ipmidriver_mutex);
out_list_del:
mutex_lock(&ipmidriver_mutex);
+ list_del(&intf->bmc_link);
intf->bmc = NULL;
mutex_unlock(&ipmidriver_mutex);
put_device(&bmc->pdev.dev);
kfree(intf);
return -ENOMEM;
}
+ INIT_LIST_HEAD(&intf->bmc->intfs);
intf->intf_num = -1; /* Mark it invalid for now. */
kref_init(&intf->refcount);
intf->bmc->id = *device_id;