]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipmi: Fix __scan_channels() failing to rescan channels
authorJinhui Guo <guojinhui.liam@bytedance.com>
Tue, 30 Sep 2025 07:42:38 +0000 (15:42 +0800)
committerCorey Minyard <corey@minyard.net>
Tue, 14 Oct 2025 20:52:58 +0000 (15:52 -0500)
channel_handler() sets intf->channels_ready to true but never
clears it, so __scan_channels() skips any rescan. When the BMC
firmware changes a rescan is required. Allow it by clearing
the flag before starting a new scan.

Signed-off-by: Jinhui Guo <guojinhui.liam@bytedance.com>
Message-ID: <20250930074239.2353-3-guojinhui.liam@bytedance.com>
Signed-off-by: Corey Minyard <corey@minyard.net>
drivers/char/ipmi/ipmi_msghandler.c

index d3f84deee4513d9bcf7c3cd84391cea361253c3c..0a886399f9dafb2b09134aa553cb96b896f34513 100644 (file)
@@ -599,7 +599,8 @@ static void __ipmi_bmc_unregister(struct ipmi_smi *intf);
 static int __ipmi_bmc_register(struct ipmi_smi *intf,
                               struct ipmi_device_id *id,
                               bool guid_set, guid_t *guid, int intf_num);
-static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id);
+static int __scan_channels(struct ipmi_smi *intf,
+                               struct ipmi_device_id *id, bool rescan);
 
 static void free_ipmi_user(struct kref *ref)
 {
@@ -2668,7 +2669,7 @@ retry_bmc_lock:
                if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num))
                        need_waiter(intf); /* Retry later on an error. */
                else
-                       __scan_channels(intf, &id);
+                       __scan_channels(intf, &id, false);
 
 
                if (!intf_set) {
@@ -2688,7 +2689,7 @@ retry_bmc_lock:
                goto out_noprocessing;
        } else if (memcmp(&bmc->fetch_id, &bmc->id, sizeof(bmc->id)))
                /* Version info changes, scan the channels again. */
-               __scan_channels(intf, &bmc->fetch_id);
+               __scan_channels(intf, &bmc->fetch_id, true);
 
        bmc->dyn_id_expiry = jiffies + IPMI_DYN_DEV_ID_EXPIRY;
 
@@ -3438,10 +3439,17 @@ channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
 /*
  * Must be holding intf->bmc_reg_mutex to call this.
  */
-static int __scan_channels(struct ipmi_smi *intf, struct ipmi_device_id *id)
+static int __scan_channels(struct ipmi_smi *intf,
+                               struct ipmi_device_id *id,
+                               bool rescan)
 {
        int rv;
 
+       if (rescan) {
+               /* Clear channels_ready to force channels rescan. */
+               intf->channels_ready = false;
+       }
+
        if (ipmi_version_major(id) > 1
                        || (ipmi_version_major(id) == 1
                            && ipmi_version_minor(id) >= 5)) {
@@ -3656,7 +3664,7 @@ int ipmi_add_smi(struct module         *owner,
        }
 
        mutex_lock(&intf->bmc_reg_mutex);
-       rv = __scan_channels(intf, &id);
+       rv = __scan_channels(intf, &id, false);
        mutex_unlock(&intf->bmc_reg_mutex);
        if (rv)
                goto out_err_bmc_reg;