Skip to content

Commit

Permalink
Move platform device creation earlier in the initialization
Browse files Browse the repository at this point in the history
Some logs are printed out early using smi->dev, but on a platform device
that is not created until later.  So move the creation of that device
structure earlier in the sequence so it can be used for printing.

Signed-off-by: Corey Minyard <[email protected]>
Tested-by: Corentin Labbe <[email protected]>
  • Loading branch information
cminyard committed Nov 25, 2016
1 parent c11daf6 commit 1abf71e
Showing 1 changed file with 31 additions and 15 deletions.
46 changes: 31 additions & 15 deletions drivers/char/ipmi/ipmi_si_intf.c
Original file line number Diff line number Diff line change
Expand Up @@ -3502,6 +3502,7 @@ static int try_smi_init(struct smi_info *new_smi)
{
int rv = 0;
int i;
char *init_name = NULL;

printk(KERN_INFO PFX "Trying %s-specified %s state"
" machine at %s address 0x%lx, slave address 0x%x,"
Expand Down Expand Up @@ -3531,6 +3532,26 @@ static int try_smi_init(struct smi_info *new_smi)
goto out_err;
}

/* Do this early so it's available for logs. */
if (!new_smi->dev) {
init_name = kasprintf(GFP_KERNEL, "ipmi_si.%d", 0);

/*
* If we don't already have a device from something
* else (like PCI), then register a new one.
*/
new_smi->pdev = platform_device_alloc("ipmi_si",
new_smi->intf_num);
if (!new_smi->pdev) {
pr_err(PFX "Unable to allocate platform device\n");
goto out_err;
}
new_smi->dev = &new_smi->pdev->dev;
new_smi->dev->driver = &ipmi_driver.driver;
/* Nulled by device_add() */
new_smi->dev->init_name = init_name;
}

/* Allocate the state machine's data and initialize it. */
new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL);
if (!new_smi->si_sm) {
Expand Down Expand Up @@ -3604,21 +3625,7 @@ static int try_smi_init(struct smi_info *new_smi)
atomic_set(&new_smi->req_events, 1);
}

if (!new_smi->dev) {
/*
* If we don't already have a device from something
* else (like PCI), then register a new one.
*/
new_smi->pdev = platform_device_alloc("ipmi_si",
new_smi->intf_num);
if (!new_smi->pdev) {
printk(KERN_ERR PFX
"Unable to allocate platform device\n");
goto out_err;
}
new_smi->dev = &new_smi->pdev->dev;
new_smi->dev->driver = &ipmi_driver.driver;

if (new_smi->pdev) {
rv = platform_device_add(new_smi->pdev);
if (rv) {
printk(KERN_ERR PFX
Expand Down Expand Up @@ -3668,6 +3675,9 @@ static int try_smi_init(struct smi_info *new_smi)
dev_info(new_smi->dev, "IPMI %s interface initialized\n",
si_to_str[new_smi->si_type]);

WARN_ON(new_smi->dev->init_name != NULL);
kfree(init_name);

return 0;

out_err_stop_timer:
Expand Down Expand Up @@ -3712,8 +3722,14 @@ static int try_smi_init(struct smi_info *new_smi)
if (new_smi->dev_registered) {
platform_device_unregister(new_smi->pdev);
new_smi->dev_registered = false;
new_smi->pdev = NULL;
} else if (new_smi->pdev) {
platform_device_put(new_smi->pdev);
new_smi->pdev = NULL;
}

kfree(init_name);

return rv;
}

Expand Down

0 comments on commit 1abf71e

Please sign in to comment.