Skip to content

Commit

Permalink
ipmi: Prefer ACPI system interfaces over SMBIOS ones
Browse files Browse the repository at this point in the history
commit 7e030d6 upstream.

The recent changes to add SMBIOS (DMI) IPMI interfaces as platform
devices caused DMI to be selected before ACPI, causing ACPI type
of operations to not work.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Corey Minyard authored and Greg Kroah-Hartman committed Nov 24, 2017
1 parent 71d3850 commit 8d8564f
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions drivers/char/ipmi/ipmi_si_intf.c
Original file line number Diff line number Diff line change
Expand Up @@ -3424,7 +3424,7 @@ static inline void wait_for_timer_and_thread(struct smi_info *smi_info)
del_timer_sync(&smi_info->si_timer);
}

static int is_new_interface(struct smi_info *info)
static struct smi_info *find_dup_si(struct smi_info *info)
{
struct smi_info *e;

Expand All @@ -3439,24 +3439,36 @@ static int is_new_interface(struct smi_info *info)
*/
if (info->slave_addr && !e->slave_addr)
e->slave_addr = info->slave_addr;
return 0;
return e;
}
}

return 1;
return NULL;
}

static int add_smi(struct smi_info *new_smi)
{
int rv = 0;
struct smi_info *dup;

mutex_lock(&smi_infos_lock);
if (!is_new_interface(new_smi)) {
pr_info(PFX "%s-specified %s state machine: duplicate\n",
ipmi_addr_src_to_str(new_smi->addr_source),
si_to_str[new_smi->si_type]);
rv = -EBUSY;
goto out_err;
dup = find_dup_si(new_smi);
if (dup) {
if (new_smi->addr_source == SI_ACPI &&
dup->addr_source == SI_SMBIOS) {
/* We prefer ACPI over SMBIOS. */
dev_info(dup->dev,
"Removing SMBIOS-specified %s state machine in favor of ACPI\n",
si_to_str[new_smi->si_type]);
cleanup_one_si(dup);
} else {
dev_info(new_smi->dev,
"%s-specified %s state machine: duplicate\n",
ipmi_addr_src_to_str(new_smi->addr_source),
si_to_str[new_smi->si_type]);
rv = -EBUSY;
goto out_err;
}
}

pr_info(PFX "Adding %s-specified %s state machine\n",
Expand Down Expand Up @@ -3865,7 +3877,8 @@ static void cleanup_one_si(struct smi_info *to_clean)
poll(to_clean);
schedule_timeout_uninterruptible(1);
}
disable_si_irq(to_clean, false);
if (to_clean->handlers)
disable_si_irq(to_clean, false);
while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) {
poll(to_clean);
schedule_timeout_uninterruptible(1);
Expand Down

0 comments on commit 8d8564f

Please sign in to comment.