[Skiboot] [PATCH V2 4/5] hw/bt: Clear the fifo when an unknown response is received

Cyril Bur cyril.bur at au1.ibm.com
Thu Nov 12 17:22:58 AEDT 2015


Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
---
 hw/bt.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/hw/bt.c b/hw/bt.c
index 215a05b..6d46367 100644
--- a/hw/bt.c
+++ b/hw/bt.c
@@ -39,6 +39,9 @@
 #define   BT_INTMASK_B2H_IRQ		0x02
 #define   BT_INTMASK_BMC_HWRST		0x80
 
+/* Maximum size of the HW FIFO */
+#define BT_FIFO_LEN 64
+
 /* Default poll interval before interrupts are working */
 #define BT_DEFAULT_POLL_MS	200
 
@@ -140,6 +143,13 @@ static inline void bt_set_h_busy(bool value)
 		bt_outb(BT_CTRL_H_BUSY, BT_CTRL);
 }
 
+static inline void bt_assert_h_busy(void)
+{
+	uint8_t rval;
+	rval = bt_inb(BT_CTRL);
+	assert(rval & BT_CTRL_H_BUSY);
+}
+
 static inline bool bt_idle(void)
 {
 	uint8_t bt_ctrl = bt_inb(BT_CTRL);
@@ -211,9 +221,21 @@ static void bt_send_msg(struct bt_msg *bt_msg)
 	return;
 }
 
+static void bt_clear_fifo(void)
+{
+	int i;
+
+	for (i = 0; i < BT_FIFO_LEN; i++)
+		bt_outb(0xff, BT_HOST2BMC);
+}
+
 static void bt_flush_msg(void)
 {
-	bt_outb(BT_CTRL_B2H_ATN | BT_CTRL_CLR_RD_PTR, BT_CTRL);
+	bt_assert_h_busy();
+	bt_outb(BT_CTRL_B2H_ATN | BT_CTRL_CLR_RD_PTR | BT_CTRL_CLR_WR_PTR, BT_CTRL);
+	bt_clear_fifo();
+	/* Can't hurt to clear the write pointer again, just to be sure */
+	bt_outb(BT_CTRL_CLR_WR_PTR, BT_CTRL);
 	bt_set_h_busy(false);
 }
 
-- 
2.6.2



More information about the Skiboot mailing list