From 6cd7af367eeba793ff94259674d80797298879da Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Wed, 26 May 2010 14:43:49 -0700 Subject: [PATCH] --- yaml --- r: 198794 b: refs/heads/master c: 06ee459402434aabed0c6d03c4cc10bfe4a3a65b h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/char/ipmi/ipmi_si_intf.c | 28 +++++++++++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index cd8c50f4f4b8..cf8ef949eb05 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3326f4f2276791561af1fd5f2020be0186459813 +refs/heads/master: 06ee459402434aabed0c6d03c4cc10bfe4a3a65b diff --git a/trunk/drivers/char/ipmi/ipmi_si_intf.c b/trunk/drivers/char/ipmi/ipmi_si_intf.c index 46bf2a97d6cb..6503d995b727 100644 --- a/trunk/drivers/char/ipmi/ipmi_si_intf.c +++ b/trunk/drivers/char/ipmi/ipmi_si_intf.c @@ -3278,6 +3278,7 @@ static __devinit int init_ipmi_si(void) char *str; int rv; struct smi_info *e; + enum ipmi_addr_src type = SI_INVALID; if (initialized) return 0; @@ -3344,30 +3345,43 @@ static __devinit int init_ipmi_si(void) of_register_platform_driver(&ipmi_of_platform_driver); #endif - /* Try to register something with interrupts first */ + /* We prefer devices with interrupts, but in the case of a machine + with multiple BMCs we assume that there will be several instances + of a given type so if we succeed in registering a type then also + try to register everything else of the same type */ mutex_lock(&smi_infos_lock); list_for_each_entry(e, &smi_infos, link) { - if (e->irq) { + /* Try to register a device if it has an IRQ and we either + haven't successfully registered a device yet or this + device has the same type as one we successfully registered */ + if (e->irq && (!type || e->addr_source == type)) { if (!try_smi_init(e)) { - mutex_unlock(&smi_infos_lock); - return 0; + type = e->addr_source; } } } + /* type will only have been set if we successfully registered an si */ + if (type) { + mutex_unlock(&smi_infos_lock); + return 0; + } + /* Fall back to the preferred device */ list_for_each_entry(e, &smi_infos, link) { - if (!e->irq) { + if (!e->irq && (!type || e->addr_source == type)) { if (!try_smi_init(e)) { - mutex_unlock(&smi_infos_lock); - return 0; + type = e->addr_source; } } } mutex_unlock(&smi_infos_lock); + if (type) + return 0; + if (si_trydefaults) { mutex_lock(&smi_infos_lock); if (list_empty(&smi_infos)) {