Dear Cheng,
Thank you for your patch.
Am 21.08.24 um 06:16 schrieb Cheng Jiang:
Is there any comment for the changes? Thanks!
On 7/26/2024 5:58 PM, Cheng Jiang wrote:
For the WCN6750/WCN6855/WCN7850, the vendor command for a baudrate
change is not sent as synchronous HCI command, controller sends the
corresponding vendor event with the new baudrate. It needs to be
dropped, otherwise it may be misinterpreted as response to a later
command.
Is that documented in some datasheet?
How can this behavior be tested, and your change be verified? How did
you test it?
Signed-off-by: Cheng Jiang <quic_chejiang@xxxxxxxxxxx>
---
drivers/bluetooth/hci_qca.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index ca6466676902..f497d601e035 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -1206,7 +1206,15 @@ static int qca_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
* vendor command).
*/
- if (hdr->evt == HCI_EV_VENDOR)
+ /* For the WCN6750/WCN6855/WCN7850, like the WCN3990, the
Does “like the” mean “and” in this situation? WCN3990 is not mentioned
in the commit message.
+ * vendor command for a baudrate change command isn't sent as
+ * synchronous HCI command, the controller sends the corresponding
+ * command complete event with the new baudrate. The event is
+ * received and properly decoded after changing the baudrate of
+ * the host port. It needs to be dropped.
+ */
+
It’d remove the blank line.
+ if (hdr->evt == HCI_EV_VENDOR || hdr->evt == HCI_EV_CMD_COMPLETE)
complete(&qca->drop_ev_comp);
Excuse my ignorance. Is `HCI_EV_CMD_COMPLETE` only sent in case of a
baudrate change?
kfree_skb(skb);
@@ -1497,6 +1505,9 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
switch (soc_type) {
case QCA_WCN3990:
+ case QCA_WCN6750:
+ case QCA_WCN6855:
+ case QCA_WCN7850:
So setting the speed wasn’t working before?
reinit_completion(&qca->drop_ev_comp);
set_bit(QCA_DROP_VENDOR_EVENT, &qca->flags);
break;
@@ -1531,6 +1542,9 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
switch (soc_type) {
case QCA_WCN3990:
+ case QCA_WCN6750:
+ case QCA_WCN6855:
+ case QCA_WCN7850:
/* Wait for the controller to send the vendor event
* for the baudrate change command.
*/
Kind regards,
Paul