[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <6b18e30fb1b747d674a75cb265b5821b@codeaurora.org>
Date: Mon, 28 Jan 2019 19:15:48 +0530
From: Balakrishna Godavarthi <bgodavar@...eaurora.org>
To: Matthias Kaehlcke <mka@...omium.org>
Cc: marcel@...tmann.org, johan.hedberg@...il.com, johan@...nel.org,
linux-kernel@...r.kernel.org, linux-bluetooth@...r.kernel.org,
hemantg@...eaurora.org, linux-arm-msm@...r.kernel.org
Subject: Re: [PATCH v9 2/3] Bluetooth: hci_qca: Deassert RTS while baudrate
change command
Hi Matthias,
On 2019-01-25 05:42, Matthias Kaehlcke wrote:
> Hi Balakrishna,
>
> On Thu, Jan 24, 2019 at 05:38:07PM +0530, Balakrishna Godavarthi wrote:
>> This patch will help to stop frame reassembly errors while changing
>> the baudrate. This is because host send a change baudrate request
>> command to the chip with 115200 bps, Whereas chip will change their
>> UART clocks to the enable for new baudrate and sends the response
>> for the change request command with newer baudrate, On host side
>> we are still operating in 115200 bps which results of reading garbage
>> data. Here we are pulling RTS line, so that chip we will wait to send
>> data
>> to host until host change its baudrate.
>>
>> Signed-off-by: Balakrishna Godavarthi <bgodavar@...eaurora.org>
>> Tested-by: Matthias Kaehlcke <mka@...omium.org>
>> Reviewed-by: Matthias Kaehlcke <mka@...omium.org>
>> ---
>> Changes in v9:
>> * disabled flow control while setting the baudrate of HOST and chip.
>> ---
>> drivers/bluetooth/hci_qca.c | 24 +++++++++++++-----------
>> 1 file changed, 13 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
>> index c08f4d105e73..6b5bcd44e24c 100644
>> --- a/drivers/bluetooth/hci_qca.c
>> +++ b/drivers/bluetooth/hci_qca.c
>> @@ -964,7 +964,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)
>> @@ -978,13 +977,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;
>> @@ -1000,9 +992,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;
>> }
>>
>> @@ -1089,6 +1078,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) {
>> @@ -1100,6 +1090,15 @@ static int qca_set_speed(struct hci_uart *hu,
>> enum qca_speed_type speed_type)
>> if (!speed)
>> return 0;
>>
>> + /* Deassert RTS while changing the baudrate of chip and host.
>> + * This will prevent chip from transmitting its response with
>> + * the new baudrate while the host port is still operating at
>> + * the old speed.
>> + */
>
> It is not necessarily evident which action deasserts RTS, I suggest to
> rephrase it to something like:
>
> "Disable flow control for wcn3990 to deassert RTS while ... "
>
[Bala]: will update.
>> + qcadev = serdev_device_get_drvdata(hu->serdev);
>> + if (qcadev->btsoc_type == QCA_WCN3990)
>> + hci_uart_set_flow_control(hu, true);
>> +
>> 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);
>
> flow control should be re-enabled in the error path.
>
> Cheers
>
> Matthias
[Bala; will update.
--
Regards
Balakrishna.
Powered by blists - more mailing lists