All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xie XiuQi <xiexiuqi@huawei.com>
To: Corey Minyard <minyard@acm.org>
Cc: <openipmi-developer@lists.sourceforge.net>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Hushiyuan <hushiyuan@huawei.com>
Subject: [PATCH] ipmi: fix BT reset for a while when cmd timeout
Date: Tue, 11 Feb 2014 18:26:12 +0800	[thread overview]
Message-ID: <52F9FAC4.4040105@huawei.com> (raw)

I fould a problem: when a cmd timeout and just
in that time bt->seq < 2, system will alway keep
retrying and we can't send any cmd to bmc.

the error message is like this:
[  530.908621] IPMI BT: timeout in RD_WAIT [ ] 1 retries left
[  582.661329] IPMI BT: timeout in RD_WAIT [ ]
[  582.661334] failed 2 retries, sending error response
[  582.661337] IPMI: BT reset (takes 5 secs)
[  693.335307] IPMI BT: timeout in RD_WAIT [ ]
[  693.335312] failed 2 retries, sending error response
[  693.335315] IPMI: BT reset (takes 5 secs)
[  804.825161] IPMI BT: timeout in RD_WAIT [ ]
[  804.825166] failed 2 retries, sending error response
[  804.825169] IPMI: BT reset (takes 5 secs)
...

When BT reset, a cmd "warm reset" will be sent to bmc, but this cmd
is Optional in spec(refer to ipmi-interface-spec-v2). Some machines
don't support this cmd.

So, bt->init is introduced. Only during insmod, we do BT reset when
response timeout to avoid system crash.

Reported-by: Hu Shiyuan <hushiyuan@huawei.com>
Signed-off-by: Xie XiuQi <xiexiuqi@huawei.com>
Cc: stable@vger.kernel.org	# 3.4+
---
 drivers/char/ipmi/ipmi_bt_sm.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c
index a22a7a5..b4a7b2a 100644
--- a/drivers/char/ipmi/ipmi_bt_sm.c
+++ b/drivers/char/ipmi/ipmi_bt_sm.c
@@ -107,6 +107,7 @@ struct si_sm_data {
 	int		BT_CAP_outreqs;
 	long		BT_CAP_req2rsp;
 	int		BT_CAP_retries;	/* Recommended retries */
+	int		init;
 };

 #define BT_CLR_WR_PTR	0x01	/* See IPMI 1.5 table 11.6.4 */
@@ -438,8 +439,8 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt,
 	if (!bt->nonzero_status)
 		printk(KERN_ERR "IPMI BT: stuck, try power cycle\n");

-	/* this is most likely during insmod */
-	else if (bt->seq <= (unsigned char)(bt->BT_CAP_retries & 0xFF)) {
+	/* only during insmod */
+	else if (!bt->init) {
 		printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n");
 		bt->state = BT_STATE_RESET1;
 		return SI_SM_CALL_WITHOUT_DELAY;
@@ -589,6 +590,10 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
 			BT_STATE_CHANGE(BT_STATE_READ_WAIT,
 					SI_SM_CALL_WITHOUT_DELAY);
 		bt->state = bt->complete;
+
+		if (!bt->init && bt->seq)
+			bt->init = 1;
+
 		return bt->state == BT_STATE_IDLE ?	/* where to next? */
 			SI_SM_TRANSACTION_COMPLETE :	/* normal */
 			SI_SM_CALL_WITHOUT_DELAY;	/* Startup magic */
-- 
1.8.2.2



             reply	other threads:[~2014-02-11 10:30 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-11 10:26 Xie XiuQi [this message]
2014-02-16  4:44 ` [Openipmi-developer] [PATCH] ipmi: fix BT reset for a while when cmd timeout Corey Minyard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52F9FAC4.4040105@huawei.com \
    --to=xiexiuqi@huawei.com \
    --cc=hushiyuan@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=minyard@acm.org \
    --cc=openipmi-developer@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.