linux/drivers/char/ipmi
Xianting Tian f8910ffa81 ipmi:msghandler: retry to get device id on an error
We fail to get the BMCS's device id with low probability when loading
the ipmi driver and it causes BMC device registration failed. When this
issue occurs we got below kernel prints:

  [Wed Sep  9 19:52:03 2020] ipmi_si IPI0001:00: IPMI message handler:
     device id demangle failed: -22
  [Wed Sep  9 19:52:03 2020] IPMI BT: using default values
  [Wed Sep  9 19:52:03 2020] IPMI BT: req2rsp=5 secs retries=2
  [Wed Sep  9 19:52:03 2020] ipmi_si IPI0001:00: Unable to get the
     device id: -5
  [Wed Sep  9 19:52:04 2020] ipmi_si IPI0001:00: Unable to register
     device: error -5

When this issue happens, we want to manually unload the driver and try to
load it again, but it can't be unloaded by 'rmmod' as it is already 'in
use'.

We add a print in handle_one_recv_msg(), when this issue happens,
the msg we received is "Recv: 1c 01 d5", which means the data_len is 1,
data[0] is 0xd5 (completion code), which means "bmc cannot execute
command.  Command, or request parameter(s), not supported in present
state".  Debug code:
	static int handle_one_recv_msg(struct ipmi_smi *intf,
                               struct ipmi_smi_msg *msg) {
        	printk("Recv: %*ph\n", msg->rsp_size, msg->rsp);
		... ...
	}
Then in ipmi_demangle_device_id(), it returned '-EINVAL' as 'data_len < 7'
and 'data[0] != 0'.

We created this patch to retry the get device id when this error
happens.  We reproduced this issue again and the retry succeed on the
first retry, we finally got the correct msg and then all is ok:
Recv: 1c 01 00 01 81 05 84 02 af db 07 00 01 00 b9 00 10 00

So use a retry machanism in this patch to give bmc more opportunity to
correctly response kernel when we received specific completion codes.

Signed-off-by: Xianting Tian <tian.xianting@h3c.com>
Message-Id: <20200915071817.4484-1-tian.xianting@h3c.com>
[Cleaned up the verbage a bit in the header and prints.]
Signed-off-by: Corey Minyard <cminyard@mvista.com>
2020-09-15 09:57:45 -05:00
..
bt-bmc.c ipmi:bt-bmc: Fix error handling and status check 2020-05-18 06:32:02 -05:00
ipmb_dev_int.c drivers: ipmi: fix off-by-one bounds check that leads to a out-of-bounds write 2020-01-20 11:01:00 -06:00
ipmi_bt_sm.c ipmi:sm: Print current state when the state is invalid 2020-09-15 09:46:20 -05:00
ipmi_devintf.c ipmi: Remove file from ipmi_file_private 2019-04-17 13:14:25 -05:00
ipmi_dmi.c ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_dmi.h ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_kcs_sm.c ipmi:sm: Print current state when the state is invalid 2020-09-15 09:46:20 -05:00
ipmi_msghandler.c ipmi:msghandler: retry to get device id on an error 2020-09-15 09:57:45 -05:00
ipmi_plat_data.c ipmi: Add the i2c-addr property for SSIF interfaces 2019-04-24 09:02:53 -05:00
ipmi_plat_data.h ipmi: Add the i2c-addr property for SSIF interfaces 2019-04-24 09:02:53 -05:00
ipmi_powernv.c ipmi:powernv: Convert ipmi_smi_t to struct ipmi_smi 2018-09-18 16:15:33 -05:00
ipmi_poweroff.c ipmi: Use more common logging styles 2018-09-18 16:15:33 -05:00
ipmi_si_hardcode.c ipmi: Add the i2c-addr property for SSIF interfaces 2019-04-24 09:02:53 -05:00
ipmi_si_hotmod.c docs: fix references for ipmi.rst file 2020-05-15 11:55:21 -06:00
ipmi_si_intf.c docs: fix references for ipmi.rst file 2020-05-15 11:55:21 -06:00
ipmi_si_mem_io.c ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_si_parisc.c ipmi_si: Rename addr_type to addr_space to match what it does 2019-02-22 07:12:41 -06:00
ipmi_si_pci.c ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_si_platform.c ipmi_si: Load acpi_ipmi when ACPI IPMI interface added 2020-05-18 06:32:02 -05:00
ipmi_si_port_io.c ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_si_sm.h ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_si.h ipmi_si: Rework some include files 2019-08-02 07:25:03 -05:00
ipmi_smic_sm.c ipmi:sm: Print current state when the state is invalid 2020-09-15 09:46:20 -05:00
ipmi_ssif.c ipmi: ssif: Remove finished TODO comment about SMBus alert 2020-06-24 06:41:42 -05:00
ipmi_watchdog.c ipmi/watchdog: add missing newlines when printing parameters by sysfs 2020-07-21 06:29:15 -05:00
Kconfig docs: fix references for ipmi.rst file 2020-05-15 11:55:21 -06:00
kcs_bmc_aspeed.c ipmi: kcs: Fix aspeed_kcs_probe_of_v1() 2020-04-07 08:35:40 -05:00
kcs_bmc_npcm7xx.c
kcs_bmc.c ipmi: kcs_bmc: handle devm_kasprintf() failure case 2019-02-09 19:48:42 -06:00
kcs_bmc.h
Makefile Add support for IPMB driver 2019-06-10 14:47:10 -05:00