Re: [PATCH 1/3] Bluetooth: hci_qca: Only remove TX clock vote after TX is completed

From: bgodavar
Date: Sat Jun 06 2020 - 08:53:21 EST


Hi Matthias,

On 2020-06-06 00:16, Matthias Kaehlcke wrote:
qca_suspend() removes the vote for the UART TX clock after
writing an IBS sleep request to the serial buffer. This is
not a good idea since there is no guarantee that the request
has been sent at this point. Instead remove the vote after
successfully entering IBS sleep. This also fixes the issue
of the vote being removed in case of an aborted suspend due
to a failure of entering IBS sleep.

Fixes: 41d5b25fed0a0 ("Bluetooth: hci_qca: add PM support")
Signed-off-by: Matthias Kaehlcke <mka@xxxxxxxxxxxx>
---

drivers/bluetooth/hci_qca.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index ece9f91cc3deb..b1d82d32892e9 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -2083,8 +2083,6 @@ static int __maybe_unused qca_suspend(struct device *dev)

qca->tx_ibs_state = HCI_IBS_TX_ASLEEP;
qca->ibs_sent_slps++;
-
- qca_wq_serial_tx_clock_vote_off(&qca->ws_tx_vote_off);
break;

case HCI_IBS_TX_ASLEEP:
@@ -2112,8 +2110,10 @@ static int __maybe_unused qca_suspend(struct device *dev)
qca->rx_ibs_state == HCI_IBS_RX_ASLEEP,
msecs_to_jiffies(IBS_BTSOC_TX_IDLE_TIMEOUT_MS));

- if (ret > 0)
+ if (ret > 0) {
+ qca_wq_serial_tx_clock_vote_off(&qca->ws_tx_vote_off);
[Bala]: qca_wq_serial_tx_clock_vote_off votes for Tx clock off, when both Tx clock and Rx clock voted to off.
then only actual call to clock off is called.
https://elixir.bootlin.com/linux/latest/source/drivers/bluetooth/hci_qca.c#L312
I would recommend to vote Tx clock off after sending SLEEP BYTE from HOST TO BT SOC.

return 0;
+ }

if (ret == 0)
ret = -ETIMEDOUT;