This patch will pull the RTS line high instead of turning off the
flow control, while changing baudrate of host and chip.

Signed-off-by: Balakrishna Godavarthi <bgoda...@codeaurora.org>
---
 drivers/bluetooth/hci_qca.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index 051f081d1835..8301663f0004 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -963,7 +963,6 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t 
baudrate)
        struct hci_uart *hu = hci_get_drvdata(hdev);
        struct qca_data *qca = hu->priv;
        struct sk_buff *skb;
-       struct qca_serdev *qcadev;
        u8 cmd[] = { 0x01, 0x48, 0xFC, 0x01, 0x00 };
 
        if (baudrate > QCA_BAUDRATE_3200000)
@@ -977,13 +976,6 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t 
baudrate)
                return -ENOMEM;
        }
 
-       /* Disabling hardware flow control is mandatory while
-        * sending change baudrate request to wcn3990 SoC.
-        */
-       qcadev = serdev_device_get_drvdata(hu->serdev);
-       if (qcadev->btsoc_type == QCA_WCN3990)
-               hci_uart_set_flow_control(hu, true);
-
        /* Assign commands to change baudrate and packet type. */
        skb_put_data(skb, cmd, sizeof(cmd));
        hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
@@ -999,9 +991,6 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t 
baudrate)
        schedule_timeout(msecs_to_jiffies(BAUDRATE_SETTLE_TIMEOUT_MS));
        set_current_state(TASK_RUNNING);
 
-       if (qcadev->btsoc_type == QCA_WCN3990)
-               hci_uart_set_flow_control(hu, false);
-
        return 0;
 }
 
@@ -1086,6 +1075,7 @@ static int qca_check_speeds(struct hci_uart *hu)
 static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
 {
        unsigned int speed, qca_baudrate;
+       struct qca_serdev *qcadev;
        int ret;
 
        if (speed_type == QCA_INIT_SPEED) {
@@ -1097,6 +1087,14 @@ static int qca_set_speed(struct hci_uart *hu, enum 
qca_speed_type speed_type)
                if (!speed)
                        return 0;
 
+               /* Pulling RTS line to high is mandatory while sending change
+                * baudrate request to SoC and also while setting the host
+                * baudrate.
+                */
+               qcadev = serdev_device_get_drvdata(hu->serdev);
+               if (qcadev->btsoc_type == QCA_WCN3990)
+                       serdev_device_set_rts(hu->serdev, false);
+
                qca_baudrate = qca_get_baudrate_value(speed);
                bt_dev_dbg(hu->hdev, "Set UART speed to %d", speed);
                ret = qca_set_baudrate(hu->hdev, qca_baudrate);
@@ -1104,6 +1102,9 @@ static int qca_set_speed(struct hci_uart *hu, enum 
qca_speed_type speed_type)
                        return ret;
 
                host_set_baudrate(hu, speed);
+
+               if (qcadev->btsoc_type == QCA_WCN3990)
+                       serdev_device_set_rts(hu->serdev, true);
        }
 
        return 0;
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

Reply via email to