提交 0f2357db 编写于 作者: J Jason Yan 提交者: Xie XiuQi

ipmi: fix BT reset for a while when cmd timeout

euler inclusion
category: bugfix
bugzilla: 7565
CVE: NA

----------------------

[Changelog]: fix ipmi bt infinite loop when insmod with BMC broken
[Author]:zhengshaoyu
Signed-off-by: NJason Yan <yanaijie@huawei.com>
[yan: cherry-picked from kernel-3.4]
Signed-off-by: NJason Yan <yanaijie@huawei.com>
Reviewed-by: Nzhengbin <zhengbin13@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 fb7488bb
...@@ -86,6 +86,7 @@ struct si_sm_data { ...@@ -86,6 +86,7 @@ struct si_sm_data {
enum bt_states complete; /* to divert the state machine */ enum bt_states complete; /* to divert the state machine */
long BT_CAP_req2rsp; long BT_CAP_req2rsp;
int BT_CAP_retries; /* Recommended retries */ int BT_CAP_retries; /* Recommended retries */
int init;
}; };
#define BT_CLR_WR_PTR 0x01 /* See IPMI 1.5 table 11.6.4 */ #define BT_CLR_WR_PTR 0x01 /* See IPMI 1.5 table 11.6.4 */
...@@ -414,8 +415,8 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt, ...@@ -414,8 +415,8 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt,
if (!bt->nonzero_status) if (!bt->nonzero_status)
printk(KERN_ERR "IPMI BT: stuck, try power cycle\n"); printk(KERN_ERR "IPMI BT: stuck, try power cycle\n");
/* this is most likely during insmod */ /* only during insmod */
else if (bt->seq <= (unsigned char)(bt->BT_CAP_retries & 0xFF)) { else if (!bt->init) {
printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n"); printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n");
bt->state = BT_STATE_RESET1; bt->state = BT_STATE_RESET1;
return SI_SM_CALL_WITHOUT_DELAY; return SI_SM_CALL_WITHOUT_DELAY;
...@@ -560,6 +561,10 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time) ...@@ -560,6 +561,10 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
BT_STATE_CHANGE(BT_STATE_READ_WAIT, BT_STATE_CHANGE(BT_STATE_READ_WAIT,
SI_SM_CALL_WITHOUT_DELAY); SI_SM_CALL_WITHOUT_DELAY);
bt->state = bt->complete; bt->state = bt->complete;
if (!bt->init && bt->seq)
bt->init = 1;
return bt->state == BT_STATE_IDLE ? /* where to next? */ return bt->state == BT_STATE_IDLE ? /* where to next? */
SI_SM_TRANSACTION_COMPLETE : /* normal */ SI_SM_TRANSACTION_COMPLETE : /* normal */
SI_SM_CALL_WITHOUT_DELAY; /* Startup magic */ SI_SM_CALL_WITHOUT_DELAY; /* Startup magic */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册