Bluetooth: hci_bcm: Use operation speed of 4Mbps only for ACPI devices
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 16 Aug 2017 07:53:30 +0000 (09:53 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Wed, 16 Aug 2017 14:51:27 +0000 (17:51 +0300)
Not all Broadcom controller support the 4Mbps operational speed on UART
devices. This is because the UART clock setting changes might not be
supported.

  < HCI Command: Broadcom Write UART Clock Setting (0x3f|0x0045) plen 1
         01                                               .
  > HCI Event: Command Complete (0x0e) plen 4
       Broadcom Write UART Clock Setting (0x3f|0x0045) ncmd 1
         Status: Unknown HCI Command (0x01)

To support any operational speed higher than 3Mbps, support for this
command is required. With that respect it is better to not enforce any
operational speed by default. Only when its support is known, then allow
for higher operational speed.

This patch assigns the 4Mbps opertional speed only for devices
discovered through ACPI and leave all others at the default 115200.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
drivers/bluetooth/hci_bcm.c

index 6b42372c53efb52ca5a8cf37f4e8c5363145b332..1eb286ade48aa043aa35a496a903a8c74b99d4fe 100644 (file)
@@ -59,6 +59,7 @@ struct bcm_device {
        bool                    clk_enabled;
 
        u32                     init_speed;
+       u32                     oper_speed;
        int                     irq;
        u8                      irq_polarity;
 
@@ -303,6 +304,7 @@ static int bcm_open(struct hci_uart *hu)
                if (hu->tty->dev->parent == dev->pdev->dev.parent) {
                        bcm->dev = dev;
                        hu->init_speed = dev->init_speed;
+                       hu->oper_speed = dev->oper_speed;
 #ifdef CONFIG_PM
                        dev->hu = hu;
 #endif
@@ -699,8 +701,10 @@ static int bcm_resource(struct acpi_resource *ares, void *data)
 
        case ACPI_RESOURCE_TYPE_SERIAL_BUS:
                sb = &ares->data.uart_serial_bus;
-               if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_UART)
+               if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_UART) {
                        dev->init_speed = sb->default_baud_rate;
+                       dev->oper_speed = 4000000;
+               }
                break;
 
        default:
@@ -853,7 +857,6 @@ static const struct hci_uart_proto bcm_proto = {
        .name           = "Broadcom",
        .manufacturer   = 15,
        .init_speed     = 115200,
-       .oper_speed     = 4000000,
        .open           = bcm_open,
        .close          = bcm_close,
        .flush          = bcm_flush,