1
0

ipmi: Fix __scan_channels() failing to rescan channels

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>
This commit is contained in:
Jinhui Guo
2025-09-30 15:42:38 +08:00
committed by Corey Minyard
parent 936750fdba
commit 6bd30d8fc5

View File

@@ -599,7 +599,8 @@ static void __ipmi_bmc_unregister(struct ipmi_smi *intf);
static int __ipmi_bmc_register(struct ipmi_smi *intf, static int __ipmi_bmc_register(struct ipmi_smi *intf,
struct ipmi_device_id *id, struct ipmi_device_id *id,
bool guid_set, guid_t *guid, int intf_num); 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) 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)) if (__ipmi_bmc_register(intf, &id, guid_set, &guid, intf_num))
need_waiter(intf); /* Retry later on an error. */ need_waiter(intf); /* Retry later on an error. */
else else
__scan_channels(intf, &id); __scan_channels(intf, &id, false);
if (!intf_set) { if (!intf_set) {
@@ -2688,7 +2689,7 @@ retry_bmc_lock:
goto out_noprocessing; goto out_noprocessing;
} else if (memcmp(&bmc->fetch_id, &bmc->id, sizeof(bmc->id))) } else if (memcmp(&bmc->fetch_id, &bmc->id, sizeof(bmc->id)))
/* Version info changes, scan the channels again. */ /* 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; 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. * 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; int rv;
if (rescan) {
/* Clear channels_ready to force channels rescan. */
intf->channels_ready = false;
}
if (ipmi_version_major(id) > 1 if (ipmi_version_major(id) > 1
|| (ipmi_version_major(id) == 1 || (ipmi_version_major(id) == 1
&& ipmi_version_minor(id) >= 5)) { && ipmi_version_minor(id) >= 5)) {
@@ -3656,7 +3664,7 @@ int ipmi_add_smi(struct module *owner,
} }
mutex_lock(&intf->bmc_reg_mutex); mutex_lock(&intf->bmc_reg_mutex);
rv = __scan_channels(intf, &id); rv = __scan_channels(intf, &id, false);
mutex_unlock(&intf->bmc_reg_mutex); mutex_unlock(&intf->bmc_reg_mutex);
if (rv) if (rv)
goto out_err_bmc_reg; goto out_err_bmc_reg;