Message ID | 20201014054746.2507-1-amitesh.chandra@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] Bluetooth: hci_bcm: Add compatible string for BCM4389 | expand |
Hi Amitesh, > Broadcom VSC uart_clock_setting is deprecated in > newer controllers. Ignore error if the controller > returns invalid or bad request error code. > > Signed-off-by: Amitesh Chandra <amitesh.chandra@broadcom.com> > Signed-off-by: Manoj Babulal <manoj.babulal@broadcom.com> > --- > drivers/bluetooth/hci_bcm.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c > index 680478f..d316788 100644 > --- a/drivers/bluetooth/hci_bcm.c > +++ b/drivers/bluetooth/hci_bcm.c > @@ -158,15 +158,18 @@ static int bcm_set_baudrate(struct hci_uart *hu, unsigned int speed) > skb = __hci_cmd_sync(hdev, 0xfc45, 1, &clock, HCI_INIT_TIMEOUT); > if (IS_ERR(skb)) { > int err = PTR_ERR(skb); > - bt_dev_err(hdev, "BCM: failed to write clock (%d)", > - err); > - return err; > + /* Ignore err if command is deprecated in controller */ > + if (err != -EBADRQC) { > + bt_dev_err(hdev, "BCM: failed to write " > + "clock (%d)", err); > + return err; > + } > + } else { > + kfree_skb(skb); > } > - > - kfree_skb(skb); > } So I really disliked try-and-error of HCI commands. Can we know up-front somehow if the controller supports a command or not. It is a total waste of time to send a command that might fail. So we better know this before sending it. Regards Marcel
diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c index 680478f..d316788 100644 --- a/drivers/bluetooth/hci_bcm.c +++ b/drivers/bluetooth/hci_bcm.c @@ -158,15 +158,18 @@ static int bcm_set_baudrate(struct hci_uart *hu, unsigned int speed) skb = __hci_cmd_sync(hdev, 0xfc45, 1, &clock, HCI_INIT_TIMEOUT); if (IS_ERR(skb)) { int err = PTR_ERR(skb); - bt_dev_err(hdev, "BCM: failed to write clock (%d)", - err); - return err; + /* Ignore err if command is deprecated in controller */ + if (err != -EBADRQC) { + bt_dev_err(hdev, "BCM: failed to write " + "clock (%d)", err); + return err; + } + } else { + kfree_skb(skb); } - - kfree_skb(skb); } - bt_dev_dbg(hdev, "Set Controller UART speed to %d bit/s", speed); + bt_dev_info(hdev, "Set Controller UART speed to %d bit/s", speed); param.zero = cpu_to_le16(0); param.baud_rate = cpu_to_le32(speed);