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

Alistair Popple alistair at popple.id.au
Thu Oct 29 12:21:45 AEDT 2015


On Thu, 29 Oct 2015 11:24:08 Cyril Bur wrote:
> Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> ---
>  hw/bt.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/hw/bt.c b/hw/bt.c
> index a4da87e..1185412 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
>  
> @@ -136,6 +139,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);
> @@ -206,9 +216,19 @@ 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_assert_h_busy();
>  	bt_outb(BT_CTRL_B2H_ATN | BT_CTRL_CLR_RD_PTR, BT_CTRL);
> +	bt_clear_fifo();

I might be better to clear the write pointer as well in case BT_FIFO_LEN 
doesn't wrap the pointers properly, although we should test that.

>  	bt_set_h_busy(false);
>  }
>  
> 



More information about the Skiboot mailing list