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:
committed by
Corey Minyard
parent
936750fdba
commit
6bd30d8fc5
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user