From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthias Kaehlcke Subject: Re: [PATCH v7 3/4] Bluetooth: hci_qca: Disable IBS state machine and flush Tx buffer Date: Fri, 28 Dec 2018 12:25:20 -0800 Message-ID: <20181228202520.GO261387@google.com> References: <20181228114819.17479-1-bgodavar@codeaurora.org> <20181228114819.17479-4-bgodavar@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Return-path: Content-Disposition: inline In-Reply-To: <20181228114819.17479-4-bgodavar@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org To: Balakrishna Godavarthi Cc: marcel@holtmann.org, johan.hedberg@gmail.com, linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, hemantg@codeaurora.org, linux-arm-msm@vger.kernel.org List-Id: linux-arm-msm@vger.kernel.org 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 > --- > 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.