[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