Message ID | 20181227073136.8431-4-bgodavar@codeaurora.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | Andy Gross |
Headers | show |
Series | Bug fixes for Qualcomm BT chip wcn3990 | expand |
On Thu, Dec 27, 2018 at 01:01:33PM +0530, Balakrishna Godavarthi wrote: > During initalization of wcn3990, we observed UART is reading some > stray bytes on the Rx line. This is logging Frame reassembly errors > on the serial console. This could be because of tristate of Tx line > of wcn3990 during boot up. My testing suggests that this change is not needed if the Rx line of the SoC/AP is configured with a pull-up. We'd probably all prefer not to have this change if there's a neater way to address the garbage data. Could you test with adding the pull-up and dropping this patch on your side? Thanks Matthias
Hi Matthias, On 2018-12-28 01:55, Matthias Kaehlcke wrote: > On Thu, Dec 27, 2018 at 01:01:33PM +0530, Balakrishna Godavarthi wrote: >> During initalization of wcn3990, we observed UART is reading some >> stray bytes on the Rx line. This is logging Frame reassembly errors >> on the serial console. This could be because of tristate of Tx line >> of wcn3990 during boot up. > > My testing suggests that this change is not needed if the Rx line of > the SoC/AP is configured with a pull-up. We'd probably all prefer not > to have this change if there's a neater way to address the garbage > data. Could you test with adding the pull-up and dropping this patch > on your side? > > Thanks > > Matthias Thanks a lot it worked to me. will drop this patch.
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index 63436023632d..0751b2359f6f 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -56,6 +56,7 @@ /* Controller states */ #define STATE_IN_BAND_SLEEP_ENABLED 1 +#define STATE_DISCARD_RX 2 #define IBS_WAKE_RETRANS_TIMEOUT_MS 100 #define IBS_TX_IDLE_TIMEOUT_MS 2000 @@ -511,6 +512,7 @@ static int qca_open(struct hci_uart *hu) } else { hu->init_speed = qcadev->init_speed; hu->oper_speed = qcadev->oper_speed; + set_bit(STATE_DISCARD_RX, &qca->flags); ret = qca_power_setup(hu, true); if (ret) { destroy_workqueue(qca->workqueue); @@ -903,6 +905,13 @@ static int qca_recv(struct hci_uart *hu, const void *data, int count) if (!test_bit(HCI_UART_REGISTERED, &hu->flags)) return -EUNATCH; + /* We discard Rx data received while device is in booting + * stage, This is because of BT chip Tx line is in tristate. + * Due to this we read some garbage data on UART Rx. + */ + if (test_bit(STATE_DISCARD_RX, &qca->flags)) + return 0; + qca->rx_skb = h4_recv_buf(hu->hdev, qca->rx_skb, data, count, qca_recv_pkts, ARRAY_SIZE(qca_recv_pkts)); if (IS_ERR(qca->rx_skb)) { @@ -1195,6 +1204,7 @@ static int qca_setup(struct hci_uart *hu) if (ret) return ret; + clear_bit(STATE_DISCARD_RX, &qca->flags); ret = qca_read_soc_version(hdev, &soc_ver); if (ret) return ret; @@ -1271,6 +1281,12 @@ 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, discard all the garbage data received on the Rx line. + */ + set_bit(STATE_DISCARD_RX, &qca->flags); host_set_baudrate(hu, 2400); qca_send_power_pulse(hu, QCA_WCN3990_POWEROFF_PULSE); qca_power_setup(hu, false);