diff options
author | Alistair Popple <alistair@popple.id.au> | 2015-05-05 15:01:30 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2015-07-16 14:12:50 +1000 |
commit | f5a7c43a163f5484d2bd2b8b74814abc23f1e92d (patch) | |
tree | 2f668abb031702cefc7a692aa571c11dadc44626 | |
parent | 451530398b744ebe0401abecfc0315b4b8ce99c2 (diff) | |
download | skiboot-f5a7c43a163f5484d2bd2b8b74814abc23f1e92d.zip skiboot-f5a7c43a163f5484d2bd2b8b74814abc23f1e92d.tar.gz skiboot-f5a7c43a163f5484d2bd2b8b74814abc23f1e92d.tar.bz2 |
bt: Remove B_BUSY stateskiboot-5.0.5
The bt layer used to cache the value of B_BUSY in the state machine,
assuming that once B_BUSY was cleared by the BMC that it would never
be set by the BMC again unless a message was sent to the bt interface.
This was mostly true for the AMI firmware except when the BMC reboots
which causes B_BUSY to be set. There may also be additional
circumstances which set B_BUSY. Therefore the bt layer must check
B_BUSY is clear before sending a message making the B_BUSY state
superfluous.
Signed-off-by: Alistair Popple <alistair@popple.id.au>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r-- | hw/bt.c | 24 |
1 files changed, 6 insertions, 18 deletions
@@ -78,7 +78,6 @@ enum bt_states { BT_STATE_IDLE = 0, BT_STATE_RESP_WAIT, - BT_STATE_B_BUSY, }; struct bt_msg { @@ -149,7 +148,7 @@ static void bt_init_interface(void) /* Take care of a stable H_BUSY if any */ bt_set_h_busy(false); - bt_set_state(BT_STATE_B_BUSY); + bt_set_state(BT_STATE_IDLE); } static void bt_reset_interface(void) @@ -172,13 +171,6 @@ static void bt_send_msg(void) ipmi_msg = &bt_msg->ipmi_msg; - if (!bt_idle()) { - BT_ERR(bt_msg, "Interface in unexpected state, attempting reset\n"); - bt_reset_interface(); - unlock(&bt.lock); - return; - } - /* Send the message */ bt_outb(BT_CTRL_CLR_WR_PTR, BT_CTRL); @@ -254,7 +246,7 @@ static void bt_get_resp(void) /* A response to a message we no longer care about. */ prlog(PR_INFO, "BT: Nobody cared about a response to an BT/IPMI message\n"); bt_flush_msg(); - bt_set_state(BT_STATE_B_BUSY); + bt_set_state(BT_STATE_IDLE); return; } @@ -277,7 +269,7 @@ static void bt_get_resp(void) ipmi_msg->data[i] = bt_inb(BT_HOST2BMC); bt_set_h_busy(false); - bt_set_state(BT_STATE_B_BUSY); + bt_set_state(BT_STATE_IDLE); list_del(&bt_msg->link); bt.queue_len--; @@ -351,8 +343,8 @@ static void print_debug_queue_info(void) {} static void bt_send_and_unlock(void) { - if (lpc_ok() && - bt.state == BT_STATE_IDLE && !list_empty(&bt.msgq)) + if (lpc_ok() && bt_idle() && !list_empty(&bt.msgq) + && bt.state == BT_STATE_IDLE) bt_send_msg(); unlock(&bt.lock); @@ -380,10 +372,6 @@ static void bt_poll(struct timer *t __unused, void *data __unused) (bt_ctrl & BT_CTRL_B2H_ATN)) bt_get_resp(); - /* We need to wait for B_BUSY to clear */ - if (bt.state == BT_STATE_B_BUSY && bt_idle()) - bt_set_state(BT_STATE_IDLE); - /* Check for sms_atn */ if (bt_inb(BT_CTRL) & BT_CTRL_SMS_ATN) { bt_outb(BT_CTRL_SMS_ATN, BT_CTRL); @@ -541,7 +529,7 @@ void bt_init(void) * The iBT interface comes up in the busy state until the daemon has * initialised it. */ - bt_set_state(BT_STATE_B_BUSY); + bt_set_state(BT_STATE_IDLE); list_head_init(&bt.msgq); bt.queue_len = 0; |