On Fri, Dec 28, 2018 at 05:18:18PM +0530, Balakrishna Godavarthi wrote: > During hci down we observed IBS sleep commands are queued in the Tx > buffer and hci_uart_write_work is sending data to the chip which is > not required as the chip is powered off. This patch will disable IBS > and flush the Tx buffer before we turn off the chip. > > Signed-off-by: Balakrishna Godavarthi <bgodavar@xxxxxxxxxxxxxx> > --- > drivers/bluetooth/hci_qca.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c > index b79ef901ab8b..9d5e41f159c7 100644 > --- a/drivers/bluetooth/hci_qca.c > +++ b/drivers/bluetooth/hci_qca.c > @@ -1274,6 +1274,14 @@ static const struct qca_vreg_data qca_soc_data = { > > static void qca_power_shutdown(struct hci_uart *hu) > { > + struct qca_data *qca = hu->priv; > + > + /* From this point we go into power off state. But serial port is > + * still open, stop queueing the IBS data and flush all the buffered > + * data in skb's. > + */ > + clear_bit(STATE_IN_BAND_SLEEP_ENABLED, &qca->flags); With that you ensure that no IBS wakeup command is sent for the power pulse, however there could still be a wakeup work in the workqueue (added before clearing the above bit). If you want to make sure no IBS wakeup command is pending I think you need to add: if (work_pending(&qca->ws_awake_device)) cancel_work_sync(&qca->ws_awake_device); it's not exactly the case you intend to address with this patch, but a related (probably less frequent) scenario.