Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipmi: kcs_bmc: Enable IBF on open

This way devices don't get delivered IRQs when no-one is interested.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Message-Id: <20210608104757.582199-11-andrew@aj.id.au>
Signed-off-by: Corey Minyard <cminyard@mvista.com>

authored by

Andrew Jeffery and committed by
Corey Minyard
fb6379f5 28651e6c

+12 -19
+10 -15
drivers/char/ipmi/kcs_bmc.c
··· 55 55 irqreturn_t kcs_bmc_handle_event(struct kcs_bmc_device *kcs_bmc) 56 56 { 57 57 struct kcs_bmc_client *client; 58 - irqreturn_t rc; 58 + irqreturn_t rc = IRQ_NONE; 59 59 60 60 spin_lock(&kcs_bmc->lock); 61 61 client = kcs_bmc->client; 62 - if (client) { 62 + if (client) 63 63 rc = client->ops->event(client); 64 - } else { 65 - u8 status; 66 - 67 - status = kcs_bmc_read_status(kcs_bmc); 68 - if (status & KCS_BMC_STR_IBF) { 69 - /* Ack the event by reading the data */ 70 - kcs_bmc_read_data(kcs_bmc); 71 - rc = IRQ_HANDLED; 72 - } else { 73 - rc = IRQ_NONE; 74 - } 75 - } 76 64 spin_unlock(&kcs_bmc->lock); 77 65 78 66 return rc; ··· 75 87 if (kcs_bmc->client) { 76 88 rc = -EBUSY; 77 89 } else { 90 + u8 mask = KCS_BMC_EVENT_TYPE_IBF; 91 + 78 92 kcs_bmc->client = client; 93 + kcs_bmc_update_event_mask(kcs_bmc, mask, mask); 79 94 rc = 0; 80 95 } 81 96 spin_unlock_irq(&kcs_bmc->lock); ··· 90 99 void kcs_bmc_disable_device(struct kcs_bmc_device *kcs_bmc, struct kcs_bmc_client *client) 91 100 { 92 101 spin_lock_irq(&kcs_bmc->lock); 93 - if (client == kcs_bmc->client) 102 + if (client == kcs_bmc->client) { 103 + u8 mask = KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE; 104 + 105 + kcs_bmc_update_event_mask(kcs_bmc, mask, 0); 94 106 kcs_bmc->client = NULL; 107 + } 95 108 spin_unlock_irq(&kcs_bmc->lock); 96 109 } 97 110 EXPORT_SYMBOL(kcs_bmc_disable_device);
+1 -2
drivers/char/ipmi/kcs_bmc_aspeed.c
··· 416 416 417 417 platform_set_drvdata(pdev, priv); 418 418 419 - aspeed_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE), 420 - KCS_BMC_EVENT_TYPE_IBF); 419 + aspeed_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE), 0); 421 420 aspeed_kcs_enable_channel(kcs_bmc, true); 422 421 423 422 rc = kcs_bmc_add_device(&priv->kcs_bmc);
+1 -2
drivers/char/ipmi/kcs_bmc_npcm7xx.c
··· 202 202 if (rc) 203 203 return rc; 204 204 205 - npcm7xx_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE), 206 - KCS_BMC_EVENT_TYPE_IBF); 205 + npcm7xx_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE), 0); 207 206 npcm7xx_kcs_enable_channel(kcs_bmc, true); 208 207 209 208 rc = kcs_bmc_add_device(kcs_bmc);