From 0a89a7134d62279e1292f7bc687346b0a4395e75 Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu Date: Tue, 26 Dec 2017 13:20:29 +0100 Subject: [PATCH] rocko migration: bluez: adapt recipe * 'experimental' has been renamed to 'testing' in Bluez 5.44 * Several patches (0004..0011) are now upstream and can be removed * QCA specific patches have been refreshed https://jira.digi.com/browse/DEL-5518 Signed-off-by: Jose Diaz de Grenu --- ...ver-update-example-to-master-version.patch | 124 - ...DR-over-LE-if-it-set-in-advertisemen.patch | 47 - ...Fix-not-connecting-services-properly.patch | 38 - ...device-Fix-marking-auto-connect-flag.patch | 29 - ...refer-bonded-bearers-when-connecting.patch | 30 - ...ccept-and-.disconnect-instead-of-att.patch | 137 - ...-bonding-while-failed-to-pair-device.patch | 99 - ...BR-EDR-pairing-for-dual-mode-devices.patch | 189 -- ...-not-show-unsupported-refresh-option.patch | 0 ...ase-the-shown-connection-limit-to-20.patch | 0 .../0003-port-test-discovery-to-python3.patch | 0 .../0004-QCA_bluetooth_chip_support.patch} | 2947 ++++------------- ...spect-the-user-indication-for-noflo.patch} | 11 +- ...f-the-user-supplies-a-bdaddr-use-it.patch} | 7 +- ...0007-hciattach-Add-verbosity-option.patch} | 7 +- .../ccimx6qpsbc/bluetooth-init | 0 .../ccimx6qpsbc/main.conf | 0 .../ccimx6sbc/bluetooth-init | 0 .../ccimx6sbc/main.conf | 0 .../ccimx6ul/bluetooth-init | 0 .../ccimx6ul/main.conf | 0 ...ez5_5.41.bbappend => bluez5_5.46.bbappend} | 22 +- 22 files changed, 703 insertions(+), 2984 deletions(-) delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0004-example-gatt-server-update-example-to-master-version.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0005-core-Prefer-BR-EDR-over-LE-if-it-set-in-advertisemen.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0006-core-device-Fix-not-connecting-services-properly.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0007-core-device-Fix-marking-auto-connect-flag.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0008-core-device-Prefer-bonded-bearers-when-connecting.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0009-input-hog-Use-.accept-and-.disconnect-instead-of-att.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0010-src-device-Free-bonding-while-failed-to-pair-device.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0011-core-Fix-BR-EDR-pairing-for-dual-mode-devices.patch rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/0001-hcitool-do-not-show-unsupported-refresh-option.patch (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/0002-hcitool-increase-the-shown-connection-limit-to-20.patch (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/0003-port-test-discovery-to-python3.patch (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41/0012-QCA_bluetooth_chip_support.patch => bluez5-5.46/0004-QCA_bluetooth_chip_support.patch} (59%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41/0013-hciattach_rome-Respect-the-user-indication-for-noflo.patch => bluez5-5.46/0005-hciattach_rome-Respect-the-user-indication-for-noflo.patch} (95%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41/0014-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch => bluez5-5.46/0006-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch} (96%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41/0015-hciattach-Add-verbosity-option.patch => bluez5-5.46/0007-hciattach-Add-verbosity-option.patch} (99%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/ccimx6qpsbc/bluetooth-init (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/ccimx6qpsbc/main.conf (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/ccimx6sbc/bluetooth-init (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/ccimx6sbc/main.conf (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/ccimx6ul/bluetooth-init (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5-5.41 => bluez5-5.46}/ccimx6ul/main.conf (100%) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5_5.41.bbappend => bluez5_5.46.bbappend} (50%) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0004-example-gatt-server-update-example-to-master-version.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0004-example-gatt-server-update-example-to-master-version.patch deleted file mode 100644 index 081a65dbc..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0004-example-gatt-server-update-example-to-master-version.patch +++ /dev/null @@ -1,124 +0,0 @@ -From: Isaac Hermida -Date: Wed, 27 Sep 2017 10:00:15 +0200 -Subject: [PATCH] example-gatt-server: update example to master version - -Current test example was not registering correctly the services, so the BLEGATT -server was not working properly. -Update this example to current version in master (commit ed63d7e5a9f6). - -Note: In order to run it, the bluetoothd daemon needs to be started with the -experimental (-E) flag and needs to enable and advertise the BLE -functionallity (btmgmt le on/connectable on/advertisement on). - -https://jira.digi.com/browse/DEL-5023 - -Signed-off-by: Isaac Hermida ---- - test/example-gatt-server | 28 +++++++++++++++++++++------- - 1 file changed, 21 insertions(+), 7 deletions(-) - -diff --git a/test/example-gatt-server b/test/example-gatt-server -index 84905f3d0856..24aaff973b11 100755 ---- a/test/example-gatt-server -+++ b/test/example-gatt-server -@@ -42,6 +42,9 @@ class FailedException(dbus.exceptions.DBusException): - - - class Application(dbus.service.Object): -+ """ -+ org.bluez.GattApplication1 interface implementation -+ """ - def __init__(self, bus): - self.path = '/' - self.services = [] -@@ -74,6 +77,9 @@ class Application(dbus.service.Object): - - - class Service(dbus.service.Object): -+ """ -+ org.bluez.GattService1 interface implementation -+ """ - PATH_BASE = '/org/bluez/example/service' - - def __init__(self, bus, index, uuid, primary): -@@ -121,6 +127,9 @@ class Service(dbus.service.Object): - - - class Characteristic(dbus.service.Object): -+ """ -+ org.bluez.GattCharacteristic1 interface implementation -+ """ - def __init__(self, bus, index, uuid, flags, service): - self.path = service.path + '/char' + str(index) - self.bus = bus -@@ -195,6 +204,9 @@ class Characteristic(dbus.service.Object): - - - class Descriptor(dbus.service.Object): -+ """ -+ org.bluez.GattDescriptor1 interface implementation -+ """ - def __init__(self, bus, index, uuid, flags, characteristic): - self.path = characteristic.path + '/desc' + str(index) - self.bus = bus -@@ -222,7 +234,7 @@ class Descriptor(dbus.service.Object): - if interface != GATT_DESC_IFACE: - raise InvalidArgsException() - -- return self.get_properties()[GATT_CHRC_IFACE] -+ return self.get_properties()[GATT_DESC_IFACE] - - @dbus.service.method(GATT_DESC_IFACE, - in_signature='a{sv}', -@@ -426,7 +438,7 @@ class TestService(Service): - TEST_SVC_UUID = '12345678-1234-5678-1234-56789abcdef0' - - def __init__(self, bus, index): -- Service.__init__(self, bus, index, self.TEST_SVC_UUID, False) -+ Service.__init__(self, bus, index, self.TEST_SVC_UUID, True) - self.add_characteristic(TestCharacteristic(bus, 0, self)) - self.add_characteristic(TestEncryptCharacteristic(bus, 1, self)) - self.add_characteristic(TestSecureCharacteristic(bus, 2, self)) -@@ -523,11 +535,11 @@ class TestEncryptCharacteristic(Characteristic): - CharacteristicUserDescriptionDescriptor(bus, 3, self)) - - def ReadValue(self, options): -- print('TestCharacteristic Read: ' + repr(self.value)) -+ print('TestEncryptCharacteristic Read: ' + repr(self.value)) - return self.value - - def WriteValue(self, value, options): -- print('TestCharacteristic Write: ' + repr(value)) -+ print('TestEncryptCharacteristic Write: ' + repr(value)) - self.value = value - - class TestEncryptDescriptor(Descriptor): -@@ -564,16 +576,16 @@ class TestSecureCharacteristic(Characteristic): - ['secure-read', 'secure-write'], - service) - self.value = [] -- self.add_descriptor(TestEncryptDescriptor(bus, 2, self)) -+ self.add_descriptor(TestSecureDescriptor(bus, 2, self)) - self.add_descriptor( - CharacteristicUserDescriptionDescriptor(bus, 3, self)) - - def ReadValue(self, options): -- print('TestCharacteristic Read: ' + repr(self.value)) -+ print('TestSecureCharacteristic Read: ' + repr(self.value)) - return self.value - - def WriteValue(self, value, options): -- print('TestCharacteristic Write: ' + repr(value)) -+ print('TestSecureCharacteristic Write: ' + repr(value)) - self.value = value - - -@@ -636,6 +648,8 @@ def main(): - - mainloop = GObject.MainLoop() - -+ print('Registering GATT application...') -+ - service_manager.RegisterApplication(app.get_path(), {}, - reply_handler=register_app_cb, - error_handler=register_app_error_cb) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0005-core-Prefer-BR-EDR-over-LE-if-it-set-in-advertisemen.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0005-core-Prefer-BR-EDR-over-LE-if-it-set-in-advertisemen.patch deleted file mode 100644 index 310dd5a1b..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0005-core-Prefer-BR-EDR-over-LE-if-it-set-in-advertisemen.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 2f78f64aee11dde478fd76f1e15bb1b977ba7099 Mon Sep 17 00:00:00 2001 -From: Luiz Augusto von Dentz -Date: Wed, 10 Aug 2016 16:23:56 +0300 -Subject: [PATCH 1/7] core: Prefer BR/EDR over LE if it set in advertisement - flag - -This makes the code prefer BR/EDR if the last advertisement has it set -in the flags. ---- - src/adapter.c | 5 ++++- - src/device.c | 6 +++++- - 2 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/src/adapter.c b/src/adapter.c -index 37423985dfb4..ddabf2de5462 100644 ---- a/src/adapter.c -+++ b/src/adapter.c -@@ -5488,8 +5488,11 @@ static void update_found_devices(struct btd_adapter *adapter, - * supports this we can make the non-zero check conditional. - */ - if (bdaddr_type != BDADDR_BREDR && eir_data.flags && -- !(eir_data.flags & EIR_BREDR_UNSUP)) -+ !(eir_data.flags & EIR_BREDR_UNSUP)) { - device_set_bredr_support(dev); -+ /* Update last seen for BR/EDR in case its flag is set */ -+ device_update_last_seen(dev, BDADDR_BREDR); -+ } - - if (eir_data.name != NULL && eir_data.name_complete) - device_store_cached_name(dev, eir_data.name); -diff --git a/src/device.c b/src/device.c -index 82704f8bb343..7f40af44cd01 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -1763,7 +1763,11 @@ static uint8_t select_conn_bearer(struct btd_device *dev) - if (dev->le && (!dev->bredr || bredr_last == NVAL_TIME)) - return dev->bdaddr_type; - -- if (bredr_last < le_last) -+ /* -+ * Prefer BR/EDR if time is the same since it might be from an -+ * advertisement with BR/EDR flag set. -+ */ -+ if (bredr_last <= le_last) - return BDADDR_BREDR; - - return dev->bdaddr_type; diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0006-core-device-Fix-not-connecting-services-properly.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0006-core-device-Fix-not-connecting-services-properly.patch deleted file mode 100644 index 11fa4e12f..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0006-core-device-Fix-not-connecting-services-properly.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 727cf85d5c710193df9b386b2a87afccbbc766ff Mon Sep 17 00:00:00 2001 -From: Luiz Augusto von Dentz -Date: Fri, 12 Aug 2016 11:20:10 +0300 -Subject: [PATCH 2/7] core/device: Fix not connecting services properly - -Device.Connect shall check if the service discovery is pending or no -service have been connected yet before switching to LE otherwise these -services may never be connected. ---- - src/device.c | 15 ++++++++++++--- - 1 file changed, 12 insertions(+), 3 deletions(-) - -diff --git a/src/device.c b/src/device.c -index 7f40af44cd01..460a9980fc63 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -1779,9 +1779,18 @@ static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg, - struct btd_device *dev = user_data; - uint8_t bdaddr_type; - -- if (dev->bredr_state.connected) -- bdaddr_type = dev->bdaddr_type; -- else if (dev->le_state.connected && dev->bredr) -+ if (dev->bredr_state.connected) { -+ /* -+ * Check if services have been resolved and there is at list -+ * one connected before switching to connect LE. -+ */ -+ if (dev->bredr_state.svc_resolved && -+ find_service_with_state(dev->services, -+ BTD_SERVICE_STATE_CONNECTED)) -+ bdaddr_type = dev->bdaddr_type; -+ else -+ bdaddr_type = BDADDR_BREDR; -+ } else if (dev->le_state.connected && dev->bredr) - bdaddr_type = BDADDR_BREDR; - else - bdaddr_type = select_conn_bearer(dev); diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0007-core-device-Fix-marking-auto-connect-flag.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0007-core-device-Fix-marking-auto-connect-flag.patch deleted file mode 100644 index 39278978b..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0007-core-device-Fix-marking-auto-connect-flag.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 7e6b4a0de4580af0cefa8b3d45677f2f9f103f65 Mon Sep 17 00:00:00 2001 -From: Luiz Augusto von Dentz -Date: Mon, 22 Aug 2016 13:04:15 +0300 -Subject: [PATCH 3/7] core/device: Fix marking auto-connect flag - -Device auto-connect shall be set only if the profile is able to accept -incoming connections, this fixes the wrong behavior or connecting LE -with dual mode devices immediatelly after probing service as profiles -may have auto-connect flag for outgoing connection (usually BR/EDR only). ---- - src/device.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/device.c b/src/device.c -index 460a9980fc63..0b13a3190539 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -4084,7 +4084,10 @@ static struct btd_service *probe_service(struct btd_device *device, - return NULL; - } - -- if (profile->auto_connect) -+ /* Only set auto connect if profile has set the flag and can really -+ * accept connections. -+ */ -+ if (profile->auto_connect && profile->accept) - device_set_auto_connect(device, TRUE); - - return service; diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0008-core-device-Prefer-bonded-bearers-when-connecting.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0008-core-device-Prefer-bonded-bearers-when-connecting.patch deleted file mode 100644 index bf111f2f2..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0008-core-device-Prefer-bonded-bearers-when-connecting.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 3a908f611b0ea84e3388215ae800d9bec05b10b6 Mon Sep 17 00:00:00 2001 -From: Luiz Augusto von Dentz -Date: Tue, 23 Aug 2016 12:58:03 +0300 -Subject: [PATCH 4/7] core/device: Prefer bonded bearers when connecting - -When attempting to connect a dual-mode device prefer bonded bearer if -only one has been marked as bonded. This prevents connecting to a -different bearer after pairing is complete and cross transport pairing -is not supported. ---- - src/device.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/src/device.c b/src/device.c -index 0b13a3190539..ade74e58a3bf 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -1742,6 +1742,12 @@ static uint8_t select_conn_bearer(struct btd_device *dev) - time_t bredr_last = NVAL_TIME, le_last = NVAL_TIME; - time_t current = time(NULL); - -+ /* Prefer bonded bearer in case only one is bonded */ -+ if (dev->bredr_state.bonded && !dev->le_state.bonded ) -+ return BDADDR_BREDR; -+ else if (!dev->bredr_state.bonded && dev->le_state.bonded) -+ return dev->bdaddr_type; -+ - if (dev->bredr_seen) { - bredr_last = current - dev->bredr_seen; - if (bredr_last > SEEN_TRESHHOLD) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0009-input-hog-Use-.accept-and-.disconnect-instead-of-att.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0009-input-hog-Use-.accept-and-.disconnect-instead-of-att.patch deleted file mode 100644 index 168932afc..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0009-input-hog-Use-.accept-and-.disconnect-instead-of-att.patch +++ /dev/null @@ -1,137 +0,0 @@ -From ddaa8ad58cd798c218ed9cc2c798cdaac6ed4924 Mon Sep 17 00:00:00 2001 -From: Luiz Augusto von Dentz -Date: Mon, 26 Sep 2016 16:44:03 +0300 -Subject: [PATCH 5/7] input/hog: Use .accept and .disconnect instead of attio - -This adds .accept and .disconnect callbacks instead of attio which -is deprecated. ---- - profiles/input/hog.c | 56 ++++++++++++++++++++++++++-------------------------- - src/device.c | 8 ++++++++ - src/device.h | 1 + - 3 files changed, 37 insertions(+), 28 deletions(-) - -diff --git a/profiles/input/hog.c b/profiles/input/hog.c -index a934c6238525..b25437917188 100644 ---- a/profiles/input/hog.c -+++ b/profiles/input/hog.c -@@ -69,24 +69,6 @@ struct hog_device { - static gboolean suspend_supported = FALSE; - static struct queue *devices = NULL; - --static void attio_connected_cb(GAttrib *attrib, gpointer user_data) --{ -- struct hog_device *dev = user_data; -- -- DBG("HoG connected"); -- -- bt_hog_attach(dev->hog, attrib); --} -- --static void attio_disconnected_cb(gpointer user_data) --{ -- struct hog_device *dev = user_data; -- -- DBG("HoG disconnected"); -- -- bt_hog_detach(dev->hog); --} -- - static struct hog_device *hog_device_new(struct btd_device *device, - struct gatt_primary *prim) - { -@@ -115,15 +97,6 @@ static struct hog_device *hog_device_new(struct btd_device *device, - - dev->device = btd_device_ref(device); - -- /* -- * TODO: Remove attio callback and use .accept once using -- * bt_gatt_client. -- */ -- dev->attioid = btd_device_add_attio_callback(device, -- attio_connected_cb, -- attio_disconnected_cb, -- dev); -- - if (!devices) - devices = queue_new(); - -@@ -142,7 +115,6 @@ static void hog_device_free(void *data) - devices = NULL; - } - -- btd_device_remove_attio_callback(dev->device, dev->attioid); - btd_device_unref(dev->device); - bt_hog_unref(dev->hog); - free(dev); -@@ -215,11 +187,39 @@ static void hog_remove(struct btd_service *service) - hog_device_free(dev); - } - -+static int hog_accept(struct btd_service *service) -+{ -+ struct hog_device *dev = btd_service_get_user_data(service); -+ struct btd_device *device = btd_service_get_device(service); -+ GAttrib *attrib = btd_device_get_attrib(device); -+ -+ /* TODO: Replace GAttrib with bt_gatt_client */ -+ bt_hog_attach(dev->hog, attrib); -+ -+ btd_service_connecting_complete(service, 0); -+ -+ return 0; -+} -+ -+static int hog_disconnect(struct btd_service *service) -+{ -+ struct hog_device *dev = btd_service_get_user_data(service); -+ -+ bt_hog_detach(dev->hog); -+ -+ btd_service_disconnecting_complete(service, 0); -+ -+ return 0; -+} -+ - static struct btd_profile hog_profile = { - .name = "input-hog", - .remote_uuid = HOG_UUID, - .device_probe = hog_probe, - .device_remove = hog_remove, -+ .accept = hog_accept, -+ .disconnect = hog_disconnect, -+ .auto_connect = true, - }; - - static int hog_init(void) -diff --git a/src/device.c b/src/device.c -index ade74e58a3bf..2a77a2e67232 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -5921,6 +5921,14 @@ struct bt_gatt_client *btd_device_get_gatt_client(struct btd_device *device) - return device->client; - } - -+void *btd_device_get_attrib(struct btd_device *device) -+{ -+ if (!device) -+ return NULL; -+ -+ return device->attrib; -+} -+ - struct bt_gatt_server *btd_device_get_gatt_server(struct btd_device *device) - { - if (!device) -diff --git a/src/device.h b/src/device.h -index db108278a12e..387f598fb2e5 100644 ---- a/src/device.h -+++ b/src/device.h -@@ -70,6 +70,7 @@ GSList *btd_device_get_primaries(struct btd_device *device); - struct gatt_db *btd_device_get_gatt_db(struct btd_device *device); - struct bt_gatt_client *btd_device_get_gatt_client(struct btd_device *device); - struct bt_gatt_server *btd_device_get_gatt_server(struct btd_device *device); -+void *btd_device_get_attrib(struct btd_device *device); - void btd_device_gatt_set_service_changed(struct btd_device *device, - uint16_t start, uint16_t end); - bool device_attach_att(struct btd_device *dev, GIOChannel *io); diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0010-src-device-Free-bonding-while-failed-to-pair-device.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0010-src-device-Free-bonding-while-failed-to-pair-device.patch deleted file mode 100644 index 3e11556d4..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0010-src-device-Free-bonding-while-failed-to-pair-device.patch +++ /dev/null @@ -1,99 +0,0 @@ -From c0202538bc31e25f37fc45681d07873c8a127ecb Mon Sep 17 00:00:00 2001 -From: Jiangbo Wu -Date: Sun, 2 Oct 2016 20:38:31 +0800 -Subject: [PATCH 6/7] src/device: Free bonding while failed to pair device - -device unable pair since another pairng is in progress, and need to -free bonding before it created for next pairing. ---- - src/device.c | 62 +++++++++++++++++++++++++++++++----------------------------- - 1 file changed, 32 insertions(+), 30 deletions(-) - -diff --git a/src/device.c b/src/device.c -index 2a77a2e67232..97d7c4e899f6 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -2330,6 +2330,35 @@ static void create_bond_req_exit(DBusConnection *conn, void *user_data) - } - } - -+static void bonding_request_free(struct bonding_req *bonding) -+{ -+ if (!bonding) -+ return; -+ -+ if (bonding->listener_id) -+ g_dbus_remove_watch(dbus_conn, bonding->listener_id); -+ -+ if (bonding->msg) -+ dbus_message_unref(bonding->msg); -+ -+ if (bonding->cb_iter) -+ g_free(bonding->cb_iter); -+ -+ if (bonding->agent) { -+ agent_cancel(bonding->agent); -+ agent_unref(bonding->agent); -+ bonding->agent = NULL; -+ } -+ -+ if (bonding->retry_timer) -+ g_source_remove(bonding->retry_timer); -+ -+ if (bonding->device) -+ bonding->device->bonding = NULL; -+ -+ g_free(bonding); -+} -+ - static DBusMessage *pair_device(DBusConnection *conn, DBusMessage *msg, - void *data) - { -@@ -2400,8 +2429,10 @@ static DBusMessage *pair_device(DBusConnection *conn, DBusMessage *msg, - BDADDR_BREDR, io_cap); - } - -- if (err < 0) -+ if (err < 0) { -+ bonding_request_free(device->bonding); - return btd_error_failed(msg, strerror(-err)); -+ } - - return NULL; - } -@@ -2442,35 +2473,6 @@ static DBusMessage *new_authentication_return(DBusMessage *msg, uint8_t status) - } - } - --static void bonding_request_free(struct bonding_req *bonding) --{ -- if (!bonding) -- return; -- -- if (bonding->listener_id) -- g_dbus_remove_watch(dbus_conn, bonding->listener_id); -- -- if (bonding->msg) -- dbus_message_unref(bonding->msg); -- -- if (bonding->cb_iter) -- g_free(bonding->cb_iter); -- -- if (bonding->agent) { -- agent_cancel(bonding->agent); -- agent_unref(bonding->agent); -- bonding->agent = NULL; -- } -- -- if (bonding->retry_timer) -- g_source_remove(bonding->retry_timer); -- -- if (bonding->device) -- bonding->device->bonding = NULL; -- -- g_free(bonding); --} -- - static void device_cancel_bonding(struct btd_device *device, uint8_t status) - { - struct bonding_req *bonding = device->bonding; diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0011-core-Fix-BR-EDR-pairing-for-dual-mode-devices.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0011-core-Fix-BR-EDR-pairing-for-dual-mode-devices.patch deleted file mode 100644 index f667587a9..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0011-core-Fix-BR-EDR-pairing-for-dual-mode-devices.patch +++ /dev/null @@ -1,189 +0,0 @@ -From 4fbef59d01931111c3181194ec4d38cbcb4da45a Mon Sep 17 00:00:00 2001 -From: Szymon Janc -Date: Fri, 21 Oct 2016 21:41:18 +0200 -Subject: [PATCH 7/7] core: Fix BR/EDR pairing for dual mode devices - -For dual mode devices we need to pass address type used in pairing -events to reply with correct one on agent reply. Otherwise reply for -BR/EDR pairing of dual mode device would use address type (which is -valid only for LE address) resulting in reply being ignored by kernel -and eventually pairing timeout. ---- - src/adapter.c | 7 ++++--- - src/device.c | 31 +++++++++++++++++-------------- - src/device.h | 10 +++++----- - 3 files changed, 26 insertions(+), 22 deletions(-) - -diff --git a/src/adapter.c b/src/adapter.c -index ddabf2de5462..5ebe3d7c8eec 100644 ---- a/src/adapter.c -+++ b/src/adapter.c -@@ -6180,7 +6180,7 @@ static void user_confirm_request_callback(uint16_t index, uint16_t length, - return; - } - -- err = device_confirm_passkey(device, btohl(ev->value), -+ err = device_confirm_passkey(device, ev->addr.type, btohl(ev->value), - ev->confirm_hint); - if (err < 0) { - btd_error(adapter->dev_id, -@@ -6254,7 +6254,7 @@ static void user_passkey_request_callback(uint16_t index, uint16_t length, - return; - } - -- err = device_request_passkey(device); -+ err = device_request_passkey(device, ev->addr.type); - if (err < 0) { - btd_error(adapter->dev_id, - "device_request_passkey: %s", strerror(-err)); -@@ -6293,7 +6293,8 @@ static void user_passkey_notify_callback(uint16_t index, uint16_t length, - - DBG("passkey %06u entered %u", passkey, ev->entered); - -- err = device_notify_passkey(device, passkey, ev->entered); -+ err = device_notify_passkey(device, ev->addr.type, passkey, -+ ev->entered); - if (err < 0) - btd_error(adapter->dev_id, - "device_notify_passkey: %s", strerror(-err)); -diff --git a/src/device.c b/src/device.c -index 97d7c4e899f6..d6be3fcf82c2 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -127,6 +127,7 @@ struct authentication_req { - auth_type_t type; - struct agent *agent; - struct btd_device *device; -+ uint8_t addr_type; - uint32_t passkey; - char *pincode; - gboolean secure; -@@ -5644,7 +5645,7 @@ static void confirm_cb(struct agent *agent, DBusError *err, void *data) - return; - - btd_adapter_confirm_reply(device->adapter, &device->bdaddr, -- device->bdaddr_type, -+ auth->addr_type, - err ? FALSE : TRUE); - - agent_unref(device->authr->agent); -@@ -5665,7 +5666,7 @@ static void passkey_cb(struct agent *agent, DBusError *err, - passkey = INVALID_PASSKEY; - - btd_adapter_passkey_reply(device->adapter, &device->bdaddr, -- device->bdaddr_type, passkey); -+ auth->addr_type, passkey); - - agent_unref(device->authr->agent); - device->authr->agent = NULL; -@@ -5683,7 +5684,9 @@ static void display_pincode_cb(struct agent *agent, DBusError *err, void *data) - } - - static struct authentication_req *new_auth(struct btd_device *device, -- auth_type_t type, gboolean secure) -+ uint8_t addr_type, -+ auth_type_t type, -+ gboolean secure) - { - struct authentication_req *auth; - struct agent *agent; -@@ -5711,6 +5714,7 @@ static struct authentication_req *new_auth(struct btd_device *device, - auth->agent = agent; - auth->device = device; - auth->type = type; -+ auth->addr_type = addr_type; - auth->secure = secure; - device->authr = auth; - -@@ -5722,7 +5726,7 @@ int device_request_pincode(struct btd_device *device, gboolean secure) - struct authentication_req *auth; - int err; - -- auth = new_auth(device, AUTH_TYPE_PINCODE, secure); -+ auth = new_auth(device, BDADDR_BREDR, AUTH_TYPE_PINCODE, secure); - if (!auth) - return -EPERM; - -@@ -5736,12 +5740,12 @@ int device_request_pincode(struct btd_device *device, gboolean secure) - return err; - } - --int device_request_passkey(struct btd_device *device) -+int device_request_passkey(struct btd_device *device, uint8_t type) - { - struct authentication_req *auth; - int err; - -- auth = new_auth(device, AUTH_TYPE_PASSKEY, FALSE); -+ auth = new_auth(device, type, AUTH_TYPE_PASSKEY, FALSE); - if (!auth) - return -EPERM; - -@@ -5755,14 +5759,13 @@ int device_request_passkey(struct btd_device *device) - return err; - } - --int device_confirm_passkey(struct btd_device *device, uint32_t passkey, -- uint8_t confirm_hint) -- -+int device_confirm_passkey(struct btd_device *device, uint8_t type, -+ int32_t passkey, uint8_t confirm_hint) - { - struct authentication_req *auth; - int err; - -- auth = new_auth(device, AUTH_TYPE_CONFIRM, FALSE); -+ auth = new_auth(device, type, AUTH_TYPE_CONFIRM, FALSE); - if (!auth) - return -EPERM; - -@@ -5783,8 +5786,8 @@ int device_confirm_passkey(struct btd_device *device, uint32_t passkey, - return err; - } - --int device_notify_passkey(struct btd_device *device, uint32_t passkey, -- uint8_t entered) -+int device_notify_passkey(struct btd_device *device, uint8_t type, -+ uint32_t passkey, uint8_t entered) - { - struct authentication_req *auth; - int err; -@@ -5794,7 +5797,7 @@ int device_notify_passkey(struct btd_device *device, uint32_t passkey, - if (auth->type != AUTH_TYPE_NOTIFY_PASSKEY) - return -EPERM; - } else { -- auth = new_auth(device, AUTH_TYPE_NOTIFY_PASSKEY, FALSE); -+ auth = new_auth(device, type, AUTH_TYPE_NOTIFY_PASSKEY, FALSE); - if (!auth) - return -EPERM; - } -@@ -5814,7 +5817,7 @@ int device_notify_pincode(struct btd_device *device, gboolean secure, - struct authentication_req *auth; - int err; - -- auth = new_auth(device, AUTH_TYPE_NOTIFY_PINCODE, secure); -+ auth = new_auth(device, BDADDR_BREDR, AUTH_TYPE_NOTIFY_PINCODE, secure); - if (!auth) - return -EPERM; - -diff --git a/src/device.h b/src/device.h -index 387f598fb2e5..dd7c4f300be1 100644 ---- a/src/device.h -+++ b/src/device.h -@@ -110,11 +110,11 @@ int device_bonding_attempt_retry(struct btd_device *device); - long device_bonding_last_duration(struct btd_device *device); - void device_bonding_restart_timer(struct btd_device *device); - int device_request_pincode(struct btd_device *device, gboolean secure); --int device_request_passkey(struct btd_device *device); --int device_confirm_passkey(struct btd_device *device, uint32_t passkey, -- uint8_t confirm_hint); --int device_notify_passkey(struct btd_device *device, uint32_t passkey, -- uint8_t entered); -+int device_request_passkey(struct btd_device *device, uint8_t type); -+int device_confirm_passkey(struct btd_device *device, uint8_t type, -+ int32_t passkey, uint8_t confirm_hint); -+int device_notify_passkey(struct btd_device *device, uint8_t type, -+ uint32_t passkey, uint8_t entered); - int device_notify_pincode(struct btd_device *device, gboolean secure, - const char *pincode); - void device_cancel_authentication(struct btd_device *device, gboolean aborted); diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0001-hcitool-do-not-show-unsupported-refresh-option.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0001-hcitool-do-not-show-unsupported-refresh-option.patch similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0001-hcitool-do-not-show-unsupported-refresh-option.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0001-hcitool-do-not-show-unsupported-refresh-option.patch diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0002-hcitool-increase-the-shown-connection-limit-to-20.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0002-hcitool-increase-the-shown-connection-limit-to-20.patch similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0002-hcitool-increase-the-shown-connection-limit-to-20.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0002-hcitool-increase-the-shown-connection-limit-to-20.patch diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0003-port-test-discovery-to-python3.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0003-port-test-discovery-to-python3.patch similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0003-port-test-discovery-to-python3.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0003-port-test-discovery-to-python3.patch diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0012-QCA_bluetooth_chip_support.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0004-QCA_bluetooth_chip_support.patch similarity index 59% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0012-QCA_bluetooth_chip_support.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0004-QCA_bluetooth_chip_support.patch index 1f6e178c4..f407ad7df 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0012-QCA_bluetooth_chip_support.patch +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0004-QCA_bluetooth_chip_support.patch @@ -1,39 +1,28 @@ -Add hciattach rome support for Qualcomm chip QCA6564 +From: Jose Diaz de Grenu +Date: Mon, 8 Jan 2018 10:29:51 +0100 +Subject: [PATCH 1/4] Add hciattach rome support for Qualcomm chip QCA6564 This is a multiple patch including all the specific qualcomm commits to add support for its chip in bluez stack (hciattach rome). Signed-off-by: Isaac Hermida - -From e6d2fb7efcde66f9ab22a42bd6d7039a4f0c02cd Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Tue, 19 Aug 2014 20:23:01 +0530 -Subject: [PATCH 01/19] bluetooth : Add bluetooth support for QCA6174 chip. - -Register the QCA6174 initialization routine with hciattach for -downloading firmware patches to the bluetooth controller. -Add optional support 'f' to control installation of line -discipline driver. Invoke hciattach from command line and -download the firmware patches: - hciattach /dev/ttyHS0 qca 3000000 -t120 flow -f0 - -Change-Id: I87f2927d7096904071a02d73d3afef0dc34db414 -Signed-off-by: Rupesh Tatiya +Signed-off-by: Jose Diaz de Grenu --- Makefile.tools | 3 +- - tools/hciattach.c | 25 +- - tools/hciattach.h | 8 +- - tools/hciattach_rome.c | 1578 ++++++++++++++++++++++++++++++++++++++++++++++++ - tools/hciattach_rome.h | 317 ++++++++++ - 5 files changed, 1926 insertions(+), 5 deletions(-) + profiles/audio/avrcp.c | 27 +- + tools/hciattach.c | 45 +- + tools/hciattach.h | 14 +- + tools/hciattach_rome.c | 1941 ++++++++++++++++++++++++++++++++++++++++++++++++ + tools/hciattach_rome.h | 390 ++++++++++ + 6 files changed, 2406 insertions(+), 14 deletions(-) create mode 100644 tools/hciattach_rome.c create mode 100644 tools/hciattach_rome.h diff --git a/Makefile.tools b/Makefile.tools -index 0d5f1431e013..8f087c597490 100644 +index 0fd6dec87078..f1a1def979e1 100644 --- a/Makefile.tools +++ b/Makefile.tools -@@ -164,7 +164,8 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ +@@ -283,7 +283,8 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ tools/hciattach_ath3k.c \ tools/hciattach_qualcomm.c \ tools/hciattach_intel.c \ @@ -43,8 +32,72 @@ index 0d5f1431e013..8f087c597490 100644 tools_hciattach_LDADD = lib/libbluetooth-internal.la tools_hciconfig_SOURCES = tools/hciconfig.c tools/csr.h tools/csr.c +diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c +index 2c1434da26d0..99bb59d69053 100644 +--- a/profiles/audio/avrcp.c ++++ b/profiles/audio/avrcp.c +@@ -2084,13 +2084,19 @@ static gboolean avrcp_get_play_status_rsp(struct avctp *conn, uint8_t code, + void *user_data) + { + struct avrcp *session = user_data; +- struct avrcp_player *player = session->controller->player; +- struct media_player *mp = player->user_data; ++ struct avrcp_player *player; ++ struct media_player *mp; + struct avrcp_header *pdu = (void *) operands; + uint32_t duration; + uint32_t position; + uint8_t status; + ++ if (!session || !session->controller) ++ return FALSE; ++ ++ player = session->controller->player; ++ mp = player->user_data; ++ + if (pdu == NULL || code == AVC_CTYPE_REJECTED || + ntohs(pdu->params_len) != 9) + return FALSE; +@@ -2148,12 +2154,18 @@ static gboolean avrcp_player_value_rsp(struct avctp *conn, uint8_t code, + void *user_data) + { + struct avrcp *session = user_data; +- struct avrcp_player *player = session->controller->player; +- struct media_player *mp = player->user_data; ++ struct avrcp_player *player; ++ struct media_player *mp; + struct avrcp_header *pdu = (void *) operands; + uint8_t count; + int i; + ++ if (!session || !session->controller) ++ return FALSE; ++ ++ player = session->controller->player; ++ mp = player->user_data; ++ + if (pdu == NULL) { + media_player_set_setting(mp, "Error", "Timeout"); + return FALSE; +@@ -2305,10 +2317,15 @@ static gboolean avrcp_get_element_attributes_rsp(struct avctp *conn, + void *user_data) + { + struct avrcp *session = user_data; +- struct avrcp_player *player = session->controller->player; ++ struct avrcp_player *player; + struct avrcp_header *pdu = (void *) operands; + uint8_t count; + ++ if (!session || !session->controller) ++ return FALSE; ++ ++ player = session->controller->player; ++ + if (code == AVC_CTYPE_REJECTED) + return FALSE; + diff --git a/tools/hciattach.c b/tools/hciattach.c -index fad176c9b804..73811d4c4c2a 100644 +index fad176c9b804..dda639cabca3 100644 --- a/tools/hciattach.c +++ b/tools/hciattach.c @@ -69,6 +69,8 @@ struct uart_t { @@ -56,31 +109,67 @@ index fad176c9b804..73811d4c4c2a 100644 static volatile sig_atomic_t __io_canceled = 0; static void sig_hup(int sig) -@@ -263,6 +265,12 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) +@@ -107,16 +109,34 @@ int read_hci_event(int fd, unsigned char* buf, int size) + { + int remain, r; + int count = 0; ++ fd_set infids; ++ struct timeval timeout; + + if (size <= 0) + return -1; + ++ FD_ZERO (&infids); ++ FD_SET (fd, &infids); ++ timeout.tv_sec = 3; ++ timeout.tv_usec = 0; ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { ++ fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); ++ return -1; ++ } ++ else ++ fprintf(stderr, "%s: Data(HCI-CMD-COMP-EVENT) available in TTY Serial buffer\n", __FUNCTION__); ++ + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + while (1) { + r = read(fd, buf, 1); +- if (r <= 0) ++ if (r <= 0) { ++ fprintf(stderr, "%s: read() failed with return value: %d\n", ++ __FUNCTION__, r); + return -1; ++ } + if (buf[0] == 0x04) + break; + } +@@ -263,6 +283,12 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) return ath3k_post(fd, u->pm); } +static int qca(int fd, struct uart_t *u, struct termios *ti) +{ + fprintf(stderr,"qca\n"); -+ return qca_soc_init(fd, u->bdaddr); ++ return qca_soc_init(fd, u->speed, u->bdaddr); +} + static int qualcomm(int fd, struct uart_t *u, struct termios *ti) { return qualcomm_init(fd, u->speed, ti, u->bdaddr); -@@ -1093,6 +1101,10 @@ struct uart_t uart[] = { +@@ -1093,6 +1119,10 @@ struct uart_t uart[] = { { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + /* QCA ROME */ -+ { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, ++ { "qca", 0x0000, 0x0000, HCI_UART_IBS, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, + /* QUALCOMM BTS */ { "qualcomm", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL }, -@@ -1195,6 +1207,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) +@@ -1195,6 +1225,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) goto fail; } @@ -88,7 +177,7 @@ index fad176c9b804..73811d4c4c2a 100644 /* Set TTY to N_HCI line discipline */ i = N_HCI; if (ioctl(fd, TIOCSETD, &i) < 0) { -@@ -1211,6 +1224,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) +@@ -1211,6 +1242,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) perror("Can't set device"); goto fail; } @@ -96,7 +185,7 @@ index fad176c9b804..73811d4c4c2a 100644 if (u->post && u->post(fd, u, &ti) < 0) goto fail; -@@ -1249,7 +1263,7 @@ int main(int argc, char *argv[]) +@@ -1249,7 +1281,7 @@ int main(int argc, char *argv[]) printpid = 0; raw = 0; @@ -105,7 +194,7 @@ index fad176c9b804..73811d4c4c2a 100644 switch(opt) { case 'b': send_break = 1; -@@ -1282,6 +1296,11 @@ int main(int argc, char *argv[]) +@@ -1282,6 +1314,11 @@ int main(int argc, char *argv[]) raw = 1; break; @@ -117,7 +206,7 @@ index fad176c9b804..73811d4c4c2a 100644 default: usage(); exit(1); -@@ -1350,6 +1369,7 @@ int main(int argc, char *argv[]) +@@ -1350,6 +1387,7 @@ int main(int argc, char *argv[]) case 5: u->bdaddr = argv[optind]; break; @@ -125,7 +214,7 @@ index fad176c9b804..73811d4c4c2a 100644 } } -@@ -1426,12 +1446,15 @@ int main(int argc, char *argv[]) +@@ -1426,12 +1464,15 @@ int main(int argc, char *argv[]) break; } @@ -142,40 +231,46 @@ index fad176c9b804..73811d4c4c2a 100644 return 0; } diff --git a/tools/hciattach.h b/tools/hciattach.h -index 4279a3361749..0656a845223c 100644 +index 249aab49e90d..481e3a65f685 100644 --- a/tools/hciattach.h +++ b/tools/hciattach.h -@@ -39,9 +39,10 @@ +@@ -39,12 +39,13 @@ #define HCI_UART_H4DS 3 #define HCI_UART_LL 4 #define HCI_UART_ATH3K 5 -#define HCI_UART_INTEL 6 -#define HCI_UART_BCM 7 -#define HCI_UART_QCA 8 +-#define HCI_UART_AG6XX 9 +-#define HCI_UART_NOKIA 10 +-#define HCI_UART_MRVL 11 +#define HCI_UART_IBS 6 +#define HCI_UART_INTEL 7 +#define HCI_UART_BCM 8 +#define HCI_UART_QCA 9 ++#define HCI_UART_AG6XX 10 ++#define HCI_UART_NOKIA 11 ++#define HCI_UART_MRVL 12 #define HCI_UART_RAW_DEVICE 0 #define HCI_UART_RESET_ON_INIT 1 -@@ -63,6 +64,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, +@@ -66,6 +67,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti); int ath3k_post(int fd, int pm); int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); -+int qca_soc_init(int fd, char *bdaddr); ++int qca_soc_init(int fd, int speed, char *bdaddr); int intel_init(int fd, int init_speed, int *speed, struct termios *ti); int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, const char *bdaddr); diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c new file mode 100644 -index 000000000000..f31be43c09e4 +index 000000000000..59bdc16e4e8f --- /dev/null +++ b/tools/hciattach_rome.c -@@ -0,0 +1,1578 @@ +@@ -0,0 +1,1941 @@ +/* + * -+ * Copyright (c) 2013, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * Copyright 2012 The Android Open Source Project @@ -206,6 +301,7 @@ index 000000000000..f31be43c09e4 + +#define LOG_TAG "bt_vendor" +#include ++#include +#include +#include +#include @@ -237,9 +333,11 @@ index 000000000000..f31be43c09e4 +patch_info rampatch_patch_info; +int rome_ver = ROME_VER_UNKNOWN; +unsigned char gTlv_type; ++unsigned char gtlv_dwndcfg; +char *rampatch_file_path; +char *nvm_file_path; +vnd_userial_cb_t vnd_userial; ++unsigned char wait_vsc_evt = TRUE; +/****************************************************************************** +** Extern variables +******************************************************************************/ @@ -312,6 +410,16 @@ index 000000000000..f31be43c09e4 + unsigned int tcio_baud; + fprintf(stderr, "## userial_vendor_set_baud: %d\n", userial_baud); + ++ if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) { ++ perror("Can't get port settings"); ++ return; ++ } ++ cfmakeraw(&vnd_userial.termios); ++ vnd_userial.termios.c_cflag |= CLOCAL; ++ vnd_userial.termios.c_cflag |= CREAD; ++ vnd_userial.termios.c_cflag |= CS8; ++ tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); ++ + userial_to_tcio_baud(userial_baud, &tcio_baud); + + cfsetospeed(&vnd_userial.termios, tcio_baud); @@ -341,6 +449,8 @@ index 000000000000..f31be43c09e4 + } + cfmakeraw(&ti); + ti.c_cflag |= CLOCAL; ++ ti.c_cflag |= CREAD; ++ ti.c_cflag |= CS8; + + switch(op) + { @@ -500,12 +610,39 @@ index 000000000000..f31be43c09e4 +} + + ++int wait_for_data(int fd, int maxTimeOut) ++{ ++ fd_set infids; ++ struct timeval timeout; ++ ++ if (maxTimeOut <= 0) { ++ fprintf(stderr, "%s: Invalid timeout value specified", __func__); ++ return -EINVAL; ++ } ++ ++ FD_ZERO (&infids); ++ FD_SET (fd, &infids); ++ timeout.tv_sec = maxTimeOut; ++ timeout.tv_usec = 0; ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { ++ fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut); ++ return -1; ++ } ++ else ++ fprintf(stderr, "%s: HCI-VS-EVENT available in TTY Serial buffer\n", ++ __FUNCTION__); ++ ++ return 1; ++} ++ +/* + * Read an VS HCI event from the given file descriptor. + */ +int read_vs_hci_event(int fd, unsigned char* buf, int size) +{ -+ int remain, r; ++ int remain, r, retry = 0; + int count = 0; + + if (size <= 0) { @@ -513,17 +650,47 @@ index 000000000000..f31be43c09e4 + return -1; + } + -+ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", __FUNCTION__); ++ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", ++ __FUNCTION__); ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) ++ return -1; + + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + /* It will keep reading until find 0x04 byte */ + while (1) { ++ /* Read UART Buffer for HCI-DATA */ + r = read(fd, buf, 1); -+ if (r <= 0) -+ return -1; -+ if (buf[0] == 0x04) ++ if (r <= 0) { ++ fprintf(stderr, "%s: read() failed. error: %d\n", ++ __FUNCTION__, r); ++ return -1; ++ } ++ ++ /* Check if received data is HCI-DATA or not. ++ * If not HCI-DATA, then retry reading the UART Buffer once. ++ * Sometimes there could be corruption on the UART lines and to ++ * avoid that retry once reading the UART Buffer for HCI-DATA. ++ */ ++ if (buf[0] == 0x04) { /* Recvd. HCI DATA */ ++ retry = 0; + break; ++ } ++ else if (retry < MAX_RETRY_CNT){ /* Retry mechanism */ ++ retry++; ++ fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d", ++ __FUNCTION__, buf[0]); ++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) ++ return -1; ++ else /* Data available in UART Buffer: Continue to read */ ++ continue; ++ } ++ else { /* RETRY failed : Exiting with failure */ ++ fprintf(stderr, "%s: RETRY failed!", __FUNCTION__); ++ return -1; ++ } + } + count++; + @@ -572,14 +739,16 @@ index 000000000000..f31be43c09e4 + goto failed; + } + -+ /* Check for response from the Controller */ -+ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { -+ ret = -ETIMEDOUT; -+ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -+ goto failed; ++ if (wait_vsc_evt) { ++ /* Check for response from the Controller */ ++ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { ++ ret = -ETIMEDOUT; ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto failed; ++ } ++ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); + } + -+ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); +failed: + return ret; +} @@ -722,7 +891,7 @@ index 000000000000..f31be43c09e4 + -1, PATCH_HDR_LEN + 1); + + /* Total length of the packet to be sent to the Controller */ -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); @@ -771,7 +940,7 @@ index 000000000000..f31be43c09e4 + index, MAX_DATA_PER_SEGMENT); + + /* Total length of the packet to be sent to the Controller */ -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); @@ -808,7 +977,7 @@ index 000000000000..f31be43c09e4 + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Total length of the packet to be sent to the Controller */ -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); @@ -925,7 +1094,7 @@ index 000000000000..f31be43c09e4 + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); @@ -955,7 +1124,7 @@ index 000000000000..f31be43c09e4 + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + + /* Send HCI Command packet to Controller */ + err = write(fd, cmd, size); @@ -974,6 +1143,44 @@ index 000000000000..f31be43c09e4 + return err; +} + ++int get_value_from_config(char *file_path,char *param) ++{ ++ FILE *pfile = NULL; ++ char *line = NULL; ++ char *pch = NULL; ++ char param_str[20]; ++ int bytes_read = 0, position; ++ int ret = -1; ++ ++ if (!file_path || !param) { ++ fprintf(stderr,"Invalid arguments\n"); ++ return -EINVAL; ++ } ++ ++ pfile = fopen(file_path, "r" ); ++ if (!pfile) { ++ fprintf(stderr, "Failed to open %s\n", file_path); ++ return ret; ++ } ++ ++ while (getline(&line, &bytes_read, pfile) > 0 ) { ++ if (line[0] != '#' && line[0] != '\n') { ++ pch = memchr(line, '=', strlen(line)); ++ if (pch != NULL) { ++ position = pch - line; ++ strncpy(param_str, line, position); ++ if (strncmp(param_str, param, position) == 0) { ++ ret = atoi(pch + 1); ++ break; ++ } ++ } ++ } ++ } ++ free(line); ++ fclose(pfile); ++ return ret; ++} ++ +int rome_get_tlv_file(char *file_path) +{ + FILE * pFile; @@ -984,6 +1191,8 @@ index 000000000000..f31be43c09e4 + tlv_nvm_hdr *nvm_ptr; + unsigned char data_buf[PRINT_BUF_SIZE]={0,}; + unsigned char *nvm_byte_ptr; ++ unsigned char bdaddr[6]; ++ unsigned short pcm_value, ibs_value; + + fprintf(stderr, "File Open (%s)\n", file_path); + pFile = fopen ( file_path , "r" ); @@ -994,7 +1203,13 @@ index 000000000000..f31be43c09e4 + + /* Get File Size */ + fseek (pFile , 0 , SEEK_END); -+ fileSize = ftell (pFile); ++ ++ if((fileSize = ftell(pFile)) < 0) { ++ fprintf(stderr, "%s: fail to get current file position\n", file_path); ++ fclose (pFile); ++ return -1; ++ } ++ + rewind (pFile); + + pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); @@ -1019,6 +1234,7 @@ index 000000000000..f31be43c09e4 + + /* To handle different event between rampatch and NVM */ + gTlv_type = ptlv_header->tlv_type; ++ gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg; + + if(ptlv_header->tlv_type == TLV_TYPE_PATCH){ + fprintf(stderr, "====================================================\n"); @@ -1026,10 +1242,11 @@ index 000000000000..f31be43c09e4 + fprintf(stderr, "Length\t\t\t : %d bytes\n", (ptlv_header->tlv_length1) | + (ptlv_header->tlv_length2 << 8) | + (ptlv_header->tlv_length3 << 16)); -+ fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv_data_len); -+ fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv_patch_data_len); ++ fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len); ++ fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); + fprintf(stderr, "Signing Format Version\t : 0x%x\n", ptlv_header->tlv.patch.sign_ver); + fprintf(stderr, "Signature Algorithm\t\t : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); ++ fprintf(stderr, "Event Handling\t\t\t : 0x%x", ptlv_header->tlv.patch.dwnd_cfg); + fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved1); + fprintf(stderr, "Product ID\t\t\t : 0x%04x\n", ptlv_header->tlv.patch.prod_id); + fprintf(stderr, "Rom Build Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.build_ver); @@ -1061,15 +1278,52 @@ index 000000000000..f31be43c09e4 + nvm_byte_ptr+=sizeof(tlv_nvm_hdr); + + /* Write BD Address */ -+ if(nvm_ptr->tag_id == TAG_NUM_2){ -+ memcpy(nvm_byte_ptr, vnd_local_bd_addr, 6); -+ fprintf(stderr, "BD Address: %.02x:%.02x:%.02x:%.02x:%.02x:%.02x\n", ++ if(nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(&bdaddr) == 0) { ++ memcpy(nvm_byte_ptr, bdaddr, 6); ++ fprintf(stderr, "Overriding default BD ADDR with user" ++ " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n", + *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), + *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); + } + -+ for(i =0;(itag_len && (i*3 + 2) tag_id == TAG_NUM_17) { ++ if ((ibs_value = ++ get_value_from_config(FW_CONFIG_FILE_PATH, "IBS")) >= 0) { ++ if (ibs_value == FWCONF_IBS_DISABLE) { ++ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &= ++ (~(FWCONF_IBS_ENABLE << ++ FWCONF_IBS_VAL_BIT)); ++ } else if (ibs_value == FWCONF_IBS_ENABLE) { ++ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] |= ++ (FWCONF_IBS_ENABLE << ++ FWCONF_IBS_VAL_BIT); ++ } ++ } ++ } ++ /* Read from file and check what PCM Configuration is required: ++ * Master = 0 /Slave = 1 */ ++ /* Override PCM configuration */ ++ if (nvm_ptr->tag_id == TAG_NUM_44) { ++ if ((pcm_value = ++ get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) { ++ ++ if (pcm_value == FWCONF_PCM_SLAVE) { ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |= ++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |= ++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); ++ } else if (pcm_value == FWCONF_PCM_MASTER) { ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &= ++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &= ++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); ++ } ++ } ++ } ++ ++ for(i =0;(itag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++) ++ snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", ++ (char *)data_buf, *(nvm_byte_ptr + i)); + + fprintf(stderr, "TAG Data\t\t\t : %s\n", data_buf); + @@ -1096,7 +1350,7 @@ index 000000000000..f31be43c09e4 + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + -+ fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d\n", __FUNCTION__, index, seg_size); ++ fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d wait_cc_evt = 0x%x\n", __FUNCTION__, index, seg_size, wait_cc_evt); + + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); @@ -1129,7 +1383,8 @@ index 000000000000..f31be43c09e4 +int rome_tlv_dnld_req(int fd, int tlv_size) +{ + int total_segment, remain_size, i, err = -1; -+ unsigned char wait_cc_evt; ++ unsigned char wait_cc_evt = FALSE; ++ unsigned int rom = rome_ver >> 16; + + total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; + remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ @@ -1138,19 +1393,85 @@ index 000000000000..f31be43c09e4 + fprintf(stderr, "%s: TLV size: %d, Total Seg num: %d, remain size: %d\n", + __FUNCTION__,tlv_size, total_segment, remain_size); + -+ for(i=0;i= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) -+ && !remain_size && ((i+1) == total_segment))? FALSE: TRUE; ++ if (gTlv_type == TLV_TYPE_PATCH) { ++ /* Prior to Rome version 3.2(including inital few rampatch release of ++ * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After ++ * few release of rampatch for Rome 3.2, the mechamism is changed to ++ * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now ++ */ ++ switch(gtlv_dwndcfg) ++ { ++ case ROME_SKIP_EVT_NONE: ++ wait_vsc_evt = TRUE; ++ wait_cc_evt = TRUE; ++ fprintf(stderr, "%s: Event handling type: ROME_SKIP_EVT_NONE", __func__); ++ break; ++ case ROME_SKIP_EVT_VSE_CC: ++ wait_vsc_evt = FALSE; ++ wait_cc_evt = FALSE; ++ fprintf(stderr, "%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__); ++ break; ++ /* Not handled for now */ ++ case ROME_SKIP_EVT_VSE: ++ case ROME_SKIP_EVT_CC: ++ default: ++ fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg); ++ break; ++ } ++ } else { ++ wait_vsc_evt = TRUE; ++ wait_cc_evt = TRUE; ++ } ++ ++ for(i = 0; i < total_segment; i++) { ++ if((i+1) == total_segment) { ++ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && ++ (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is from 1.1 to 3.1 ++ * 1. No CCE for the last command segment but all other segment ++ * 2. All the command segments get VSE including the last one ++ */ ++ wait_cc_evt = !remain_size ? FALSE: TRUE; ++ } else if ((rom == ROME_PATCH_VER_0302) && ++ (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is 3.2 ++ * 1. None of the command segments receive CCE ++ * 2. No command segments receive VSE except the last one ++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is ++ * same as Rome 2.1, 2.2, 3.0 ++ */ ++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { ++ wait_cc_evt = !remain_size ? FALSE: TRUE; ++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { ++ wait_vsc_evt = !remain_size ? TRUE: FALSE; ++ } ++ } ++ } ++ + if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) + goto error; + } + -+ /* In case remain data still remain, last rampatch segment command will not wait -+ for command complete event here */ -+ wait_cc_evt = ((rome_ver >= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) -+ && remain_size )? FALSE:TRUE; ++ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && ++ (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is from 1.1 to 3.1 ++ * 1. No CCE for the last command segment but all other segment ++ * 2. All the command segments get VSE including the last one ++ */ ++ wait_cc_evt = remain_size ? FALSE: TRUE; ++ } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) { ++ /* If the Rome version is 3.2 ++ * 1. None of the command segments receive CCE ++ * 2. No command segments receive VSE except the last one ++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is ++ * same as Rome 2.1, 2.2, 3.0 ++ */ ++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { ++ wait_cc_evt = remain_size ? FALSE: TRUE; ++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { ++ wait_vsc_evt = remain_size ? TRUE: FALSE; ++ } ++ } + + if(remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); + @@ -1490,56 +1811,31 @@ index 000000000000..f31be43c09e4 + +} + -+int rome_disable_sleep(int fd) ++static void flow_control(int fd, int opt) +{ -+ int size, err = 0; -+ unsigned char cmd[HCI_MAX_CMD_SIZE]; -+ unsigned char rsp[HCI_MAX_EVENT_SIZE]; -+ hci_command_hdr *cmd_hdr; -+ int flags; ++ struct termios c_opt; + -+ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); -+ -+ cmd_hdr = (void *) (cmd + 1); -+ cmd[0] = HCI_COMMAND_PKT; -+ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, NVM_ACCESS_CODE); -+ cmd_hdr->plen = VSC_DISABLE_IBS_LEN; -+ cmd[4] = 0x01; -+ cmd[5] = 0x1B; -+ cmd[6] = 0x01; -+ cmd[7] = 0x00; -+ -+ /* Total length of the packet to be sent to the Controller */ -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_DISABLE_IBS_LEN); -+ /* Send the HCI command packet to UART for transmission */ -+ fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) ; -+ err = write(fd, cmd, size); -+ if (err != size) { -+ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); -+ goto error; ++ ioctl(fd, TIOCMGET, &c_opt); ++ c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */ ++ c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ ++ c_opt.c_cflag &= ~CSIZE; ++ c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); ++ if (opt == MSM_ENABLE_FLOW_CTRL) ++ c_opt.c_cflag |= CRTSCTS; ++ else if (opt == MSM_DISABLE_FLOW_CTRL) ++ c_opt.c_cflag &= ~CRTSCTS; ++ else { ++ fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); ++ return; + } -+ -+ /* Check for response from the Controller */ -+ if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { -+ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -+ goto error; -+ } -+ -+ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); -+ -+ /* Wait for command complete event */ -+ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); -+ if ( err < 0) { -+ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); -+ goto error; -+ } -+ fprintf(stderr, "%s\n", __FUNCTION__); -+error: -+ return err; -+ ++ c_opt.c_iflag = IGNPAR; ++ c_opt.c_oflag = 0; ++ c_opt.c_lflag = 0; ++ ioctl(fd, TIOCMSET, &c_opt); +} + -+int rome_set_baudrate_req(int fd) ++ ++int rome_set_baudrate_req(int fd, int local_baud_rate, int controller_baud_rate) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; @@ -1553,10 +1849,14 @@ index 000000000000..f31be43c09e4 + cmd[0] = HCI_COMMAND_PKT; + cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); + cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; -+ cmd[4] = BAUDRATE_115200; ++ cmd[4] = controller_baud_rate; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); ++ ++ /* Flow off during baudrate change */ ++ flow_control(fd, MSM_DISABLE_FLOW_CTRL); ++ + /* Send the HCI command packet to UART for transmission */ + fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3],cmd[4]) ; + err = write(fd, cmd, size); @@ -1564,6 +1864,11 @@ index 000000000000..f31be43c09e4 + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } ++ /* Change Local UART baudrate to high speed UART */ ++ userial_vendor_set_baud(local_baud_rate); ++ ++ /* Flow on after changing local uart baudrate */ ++ flow_control(fd, MSM_ENABLE_FLOW_CTRL); + + /* Check for response from the Controller */ + if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { @@ -1586,7 +1891,7 @@ index 000000000000..f31be43c09e4 +} + + -+int rome_hci_reset_req(int fd) ++int rome_hci_reset_req(int fd, char baud) +{ + int size, err = 0; + unsigned char cmd[HCI_MAX_CMD_SIZE]; @@ -1606,6 +1911,9 @@ index 000000000000..f31be43c09e4 + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); + ++ /* Flow off during baudrate change */ ++ flow_control(fd, MSM_DISABLE_FLOW_CTRL); ++ + /* Send the HCI command packet to UART for transmission */ + fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); + err = write(fd, cmd, size); @@ -1614,6 +1922,12 @@ index 000000000000..f31be43c09e4 + goto error; + } + ++ /* Change Local UART baudrate to high speed UART */ ++ userial_vendor_set_baud(baud); ++ ++ /* Flow on after changing local uart baudrate */ ++ flow_control(fd, MSM_ENABLE_FLOW_CTRL); ++ + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if ( err < 0) { @@ -1626,14 +1940,129 @@ index 000000000000..f31be43c09e4 + +} + ++int read_bd_address(unsigned char *bdaddr) ++{ ++ int fd = -1; ++ int readPtr = 0; ++ unsigned char data[BD_ADDR_LEN]; + -+int qca_soc_init(int fd, char *bdaddr) ++ /* Open the persist file for reading device address*/ ++ fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY); ++ if(fd < 0) ++ { ++ fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__); ++ return -1; ++ } ++ ++ /* Read the NVM Header : fp will be advanced by readPtr number of bytes */ ++ readPtr = read(fd, data, PERSIST_HEADER_LEN); ++ if (readPtr > 0) ++ fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__, ++ data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]); ++ else { ++ fprintf(stderr, "%s: Read from persist memory failed : Programming default" ++ " BD ADDR\n"); ++ close(fd); ++ return -1; ++ } ++ ++ /* Check for BD ADDR length before programming */ ++ if(data[NVITEM_SIZE] != BD_ADDR_LEN) { ++ fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n"); ++ close(fd); ++ return -1; ++ } ++ ++ /* Read the BD ADDR info */ ++ readPtr = read(fd, data, BD_ADDR_LEN); ++ if (readPtr > 0) ++ fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0], ++ data[1], data[2], data[3], data[4], data[5]); ++ else { ++ fprintf(stderr, "%s: Read from persist memory failed : Programming default" ++ " BD ADDR\n"); ++ close(fd); ++ return -1; ++ } ++ memcpy(bdaddr, data, BD_ADDR_LEN); ++ close(fd); ++ return 0; ++} ++ ++int isSpeedValid(int speed, int *local_baud_rate, int *controller_baud_rate) ++{ ++ switch(speed) { ++ case 9600: ++ *local_baud_rate = USERIAL_BAUD_9600; ++ *controller_baud_rate = BAUDRATE_9600; ++ break; ++ case 19200: ++ *local_baud_rate = USERIAL_BAUD_19200; ++ *controller_baud_rate = BAUDRATE_19200; ++ break; ++ case 57600: ++ *local_baud_rate = USERIAL_BAUD_57600; ++ *controller_baud_rate = BAUDRATE_57600; ++ break; ++ case 115200: ++ *local_baud_rate = USERIAL_BAUD_115200; ++ *controller_baud_rate = BAUDRATE_115200; ++ break; ++ case 230400: ++ *local_baud_rate = USERIAL_BAUD_230400; ++ *controller_baud_rate = BAUDRATE_230400; ++ break; ++ case 460800: ++ *local_baud_rate = USERIAL_BAUD_460800; ++ *controller_baud_rate = BAUDRATE_460800; ++ break; ++ case 921600: ++ *local_baud_rate = USERIAL_BAUD_921600; ++ *controller_baud_rate = BAUDRATE_921600; ++ break; ++ case 1000000: ++ *local_baud_rate = USERIAL_BAUD_1M; ++ *controller_baud_rate = BAUDRATE_1000000; ++ break; ++ case 2000000: ++ *local_baud_rate = USERIAL_BAUD_2M; ++ *controller_baud_rate = BAUDRATE_2000000; ++ break; ++ case 3000000: ++ *local_baud_rate = USERIAL_BAUD_3M; ++ *controller_baud_rate = BAUDRATE_3000000; ++ break; ++ case 4000000: ++ *local_baud_rate = USERIAL_BAUD_4M; ++ *controller_baud_rate = BAUDRATE_4000000; ++ break; ++ case 300: ++ case 600: ++ case 1200: ++ case 2400: ++ default: ++ fprintf(stderr, "Invalid baud rate passed!\n"); ++ *local_baud_rate = *controller_baud_rate = -1; ++ break; ++ } ++ return -1; ++} ++ ++int qca_soc_init(int fd, int speed, char *bdaddr) +{ + int err = -1; -+ int size; ++ int size, local_baud_rate = 0, controller_baud_rate = 0; + -+ fprintf(stderr, " %s \n", __FUNCTION__); + vnd_userial.fd = fd; ++ ++#ifdef _PLATFORM_MDM_ ++ /* Vote for UART CLK prior to FW download */ ++ err = ioctl(fd, USERIAL_OP_CLK_ON); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to vote UART CLK ON\n", __func__); ++ return -1; ++ } ++#endif + /* Get Rome version information */ + if((err = rome_patch_ver_req(fd)) <0){ + fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); @@ -1680,7 +2109,7 @@ index 000000000000..f31be43c09e4 + } + + /* Change baud rate 115.2 kbps to 3Mbps*/ -+ err = rome_hci_reset_req(fd); ++ err = rome_hci_reset_req(fd, local_baud_rate); + if ( err <0 ) { + fprintf(stderr, "HCI Reset Failed !!\n"); + goto error; @@ -1702,11 +2131,40 @@ index 000000000000..f31be43c09e4 + nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; + goto download; + case ROME_VER_3_0: -+ case TUFELLO_VER_1_0: + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; ++ goto download; ++ case ROME_VER_3_2: ++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; ++ nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; ++ goto download; ++ case TUFELLO_VER_1_0: ++ rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; ++ nvm_file_path = TF_NVM_TLV_1_0_0_PATH; ++ goto download; ++ case TUFELLO_VER_1_1: ++ rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH; ++ nvm_file_path = TF_NVM_TLV_1_0_1_PATH; + +download: ++ /* Check if user requested for 115200 kbps */ ++ if (speed == 115200) { ++ local_baud_rate = USERIAL_BAUD_115200; ++ controller_baud_rate = BAUDRATE_115200; ++ } ++ else { ++ /* Change only if baud rate requested is valid or not */ ++ isSpeedValid(speed, &local_baud_rate, &controller_baud_rate); ++ if (local_baud_rate < 0 || controller_baud_rate < 0) ++ goto error; ++ ++ err = rome_set_baudrate_req(fd, local_baud_rate, controller_baud_rate); ++ if (err < 0) { ++ fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); ++ goto error; ++ } ++ } ++ + /* Donwload TLV files (rampatch, NVM) */ + err = rome_download_tlv_file(fd); + if (err < 0) { @@ -1715,30 +2173,23 @@ index 000000000000..f31be43c09e4 + } + fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); + -+ /* Change baud rate back to user requested */ -+ fprintf(stderr, "Changing baud rate back from 3M --> 115K\n"); -+ err = rome_set_baudrate_req(fd); ++ /* ++ * Overriding the baud rate value in NVM file with the user ++ * requested baud rate, since default baud rate in NVM file is 3M. ++ */ ++ err = rome_set_baudrate_req(fd, local_baud_rate, controller_baud_rate); + if (err < 0) { + fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); + goto error; + } -+ fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__); -+ -+ fprintf(stderr, "%s: Disabling In Band Sleep functionality\n", __FUNCTION__); -+ err = rome_disable_sleep(fd); -+ if (err < 0) { -+ fprintf(stderr, "%s: Failed to disable IBS!\n", __FUNCTION__); -+ goto error; -+ } -+ fprintf(stderr, "%s: IBS disabled successfully \n", __FUNCTION__); + + /* Perform HCI reset here*/ -+ err = rome_hci_reset_req(fd); ++ err = rome_hci_reset_req(fd, local_baud_rate); + if ( err <0 ) { + fprintf(stderr, "HCI Reset Failed !!!\n"); + goto error; + } -+ fprintf(stderr, "HCI Reset is done\n"); ++ fprintf(stderr, "HCI Reset is done\n"); + + break; + case ROME_VER_UNKNOWN: @@ -1749,18 +2200,25 @@ index 000000000000..f31be43c09e4 + } + +error: ++#ifdef _PLATFORM_MDM_ ++ /* Vote UART CLK OFF post to FW download */ ++ err = ioctl(fd, USERIAL_OP_CLK_OFF); ++ if (err < 0) ++ fprintf(stderr, "%s: Failed to vote UART CLK OFF!!!\n", __func__); ++#endif ++ + return err; +} diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h new file mode 100644 -index 000000000000..aa59965643ec +index 000000000000..89f7db3bef86 --- /dev/null +++ b/tools/hciattach_rome.h -@@ -0,0 +1,317 @@ +@@ -0,0 +1,390 @@ +/* -+ * Copyright 2012 The Android Open Source Project -+ * Copyright (c) 2013, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Not a Contribution. ++ * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. @@ -1793,6 +2251,20 @@ index 000000000000..aa59965643ec +#define HCI_EVENT_PKT 0x04 +#define HCI_VENDOR_PKT 0xff +#define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) ++ ++#define NVITEM 0 ++#define RDWR_PROT 1 ++#define NVITEM_SIZE 2 ++#define PERSIST_HEADER_LEN 3 ++#define BD_ADDR_LEN 6 ++#define MSM_DISABLE_FLOW_CTRL 0 ++#define MSM_ENABLE_FLOW_CTRL 1 ++ ++#ifdef _PLATFORM_MDM_ ++#define USERIAL_OP_CLK_ON 0x5441 ++#define USERIAL_OP_CLK_OFF 0x5442 ++#endif ++ +unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +typedef enum { + USERIAL_OP_FLOW_ON, @@ -1828,6 +2300,29 @@ index 000000000000..aa59965643ec +#define USERIAL_BAUD_4M 15 +#define USERIAL_BAUD_AUTO 16 + ++/* Vendor specific baud rate values */ ++#define UART_Baud_Rate_Baud_9600 4 ++#define UART_Baud_Rate_Baud_19200 3 ++#define UART_Baud_Rate_Baud_57600 1 ++#define UART_Baud_Rate_Baud_115200 0 ++#define UART_Baud_Rate_Baud_230400 5 ++#define UART_Baud_Rate_Baud_460800 7 ++#define UART_Baud_Rate_Baud_921600 10 ++#define UART_Baud_Rate_Baud_1000000 11 ++#define UART_Baud_Rate_Baud_2000000 13 ++#define UART_Baud_Rate_Baud_3000000 14 ++#define UART_Baud_Rate_Baud_4000000 15 ++ ++#define UART_Baud_Rate_Baud_250000 6 ++#define UART_Baud_Rate_Baud_500000 8 ++#define UART_Baud_Rate_Baud_720000 9 ++#define UART_Baud_Rate_Baud_125000 12 ++#define UART_Baud_Rate_Baud_1600000 16 ++#define UART_Baud_Rate_Baud_3200000 17 ++#define UART_Baud_Rate_Baud_3500000 18 ++ ++ ++ +#ifndef FALSE +#define FALSE 0 +#endif @@ -1928,9 +2423,27 @@ index 000000000000..aa59965643ec +#define TAG_END 0xFF +#define NVM_ACCESS_SET 0x01 +#define TAG_NUM_OFFSET 5 -+#define TAG_NUM_2 2 ++#define TAG_NUM_2 2 ++#define TAG_NUM_17 (17) ++#define TAG_NUM_44 44 +#define TAG_BDADDR_OFFSET 7 + ++/* FW PCM Configuration */ ++#define FWCONF_PCM_MS_OFFSET_1 9 ++#define FWCONF_PCM_MS_OFFSET_2 33 ++#define FWCONF_PCM_SLAVE 1 ++#define FWCONF_PCM_MASTER 0 ++#define FWCONF_PCM_ROLE_BIT_OFFSET 4 ++ ++/* FW IBS Configuration */ ++#define FWCONF_IBS_DISABLE (0) ++#define FWCONF_IBS_ENABLE (1) ++#define FWCONF_IBS_VAL_BIT (7) ++#define FWCONF_IBS_VAL_OFFSET (0) ++ ++#define MAX_RETRY_CNT 1 ++#define SELECT_TIMEOUT 3 ++ +/* NVM Tags specifically used for ROME 1.0 */ +#define ROME_1_0_100022_1 0x101000221 +#define ROME_1_0_100019 0x101000190 @@ -1953,8 +2466,20 @@ index 000000000000..aa59965643ec +#define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" +#define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/qca/rampatch_tlv_3.0.tlv" +#define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" ++#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/qca/rampatch_tlv_3.2.tlv" ++#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/qca/nvm_tlv_3.2.bin" ++#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv" ++#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/qca/nvm_tlv_tf_1.0.bin" ++#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.1.tlv" ++#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/nvm_tlv_tf_1.1.bin" + ++/* This header value in rampatch file decides event handling mechanism in the HOST */ ++#define ROME_SKIP_EVT_NONE 0x00 ++#define ROME_SKIP_EVT_VSE 0x01 ++#define ROME_SKIP_EVT_CC 0x02 ++#define ROME_SKIP_EVT_VSE_CC 0x03 + ++#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf" +/****************************************************************************** +** Local type definitions +******************************************************************************/ @@ -1995,9 +2520,12 @@ index 000000000000..aa59965643ec +} __attribute__ ((packed)) patch_info; + +typedef struct { ++ unsigned int tlv_data_len; ++ unsigned int tlv_patch_data_len; + unsigned char sign_ver; + unsigned char sign_algorithm; -+ unsigned short reserved1; ++ unsigned char dwnd_cfg; ++ unsigned char reserved1; + unsigned short prod_id; + unsigned short build_ver; + unsigned short patch_ver; @@ -2017,8 +2545,6 @@ index 000000000000..aa59965643ec + unsigned char tlv_length1; + unsigned char tlv_length2; + unsigned char tlv_length3; -+ unsigned int tlv_data_len; -+ unsigned int tlv_patch_data_len; + + union{ + tlv_patch_hdr patch; @@ -2054,7 +2580,8 @@ index 000000000000..aa59965643ec + ROME_PATCH_VER_0100 = 0x0100, + ROME_PATCH_VER_0101 = 0x0101, + ROME_PATCH_VER_0200 = 0x0200, -+ ROME_PATCH_VER_0300 = 0x0300 ++ ROME_PATCH_VER_0300 = 0x0300, ++ ROME_PATCH_VER_0302 = 0x0302 + }; + +enum{ @@ -2062,6 +2589,8 @@ index 000000000000..aa59965643ec + ROME_SOC_ID_11 = 0x00000011, + ROME_SOC_ID_13 = 0x00000013, + ROME_SOC_ID_22 = 0x00000022, ++ ROME_SOC_ID_23 = 0x00000023, ++ ROME_SOC_ID_44 = 0x00000044 +}; + +enum{ @@ -2071,2120 +2600,8 @@ index 000000000000..aa59965643ec + ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), + ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), + ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), -+ TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ) -+}; -+#endif /* HW_ROME_H */ - -From 333676e63694e137558e7a685d2fa1a50c499436 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Thu, 11 Sep 2014 19:20:02 +0530 -Subject: [PATCH 02/19] bluetooth: Enable bluetooth low power mode - functionality - -During periods of inactivity the bluetooth controller and the -application processor will indicate each other to enter into -low power mode and signal each other when they have data to be -exchanged, thereby saving considerable amount of power. - -Change-Id: I9e0d579ac8a9d61a2ebde78b031f4101cb6bc443 -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tools/hciattach.c b/tools/hciattach.c -index 73811d4c4c2a..e3a915061440 100644 ---- a/tools/hciattach.c -+++ b/tools/hciattach.c -@@ -1102,7 +1102,7 @@ struct uart_t uart[] = { - FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, - - /* QCA ROME */ -- { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, -+ { "qca", 0x0000, 0x0000, HCI_UART_IBS, 115200, 115200, - FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, - - /* QUALCOMM BTS */ - -From 0518592a10bff2ac0b99e4081bd01154f2eeacb6 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Thu, 11 Sep 2014 18:57:45 +0530 -Subject: [PATCH 03/19] bluetooth: Fix bug in firmware parsing mechanism - -Reorganize the RAMPATCH members to be present as part of the -RAMPATCH header structre instead of the main firmware structure - -Change-Id: If523e1bb20edcd52b7c6f623c07af492e6305bd0 -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach_rome.c | 4 ++-- - tools/hciattach_rome.h | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index f31be43c09e4..122a0f4b89bc 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -851,8 +851,8 @@ int rome_get_tlv_file(char *file_path) - fprintf(stderr, "Length\t\t\t : %d bytes\n", (ptlv_header->tlv_length1) | - (ptlv_header->tlv_length2 << 8) | - (ptlv_header->tlv_length3 << 16)); -- fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv_data_len); -- fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv_patch_data_len); -+ fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len); -+ fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); - fprintf(stderr, "Signing Format Version\t : 0x%x\n", ptlv_header->tlv.patch.sign_ver); - fprintf(stderr, "Signature Algorithm\t\t : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); - fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved1); -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index aa59965643ec..07127f30a70a 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -236,6 +236,8 @@ typedef struct { - } __attribute__ ((packed)) patch_info; - - typedef struct { -+ unsigned int tlv_data_len; -+ unsigned int tlv_patch_data_len; - unsigned char sign_ver; - unsigned char sign_algorithm; - unsigned short reserved1; -@@ -258,8 +260,6 @@ typedef struct { - unsigned char tlv_length1; - unsigned char tlv_length2; - unsigned char tlv_length3; -- unsigned int tlv_data_len; -- unsigned int tlv_patch_data_len; - - union{ - tlv_patch_hdr patch; - -From 78f1ab9c20956f4e6f009d7bc2b94fe1d4474a08 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Mon, 8 Sep 2014 15:11:02 +0530 -Subject: [PATCH 04/19] bluetooth: Configure BD Address - -Read the BD Address programmed by user from persist location. -If there is no user programmed BD address then use the default -BD address present in the firmware file. - -Change-Id: Id702d1476bae765dfd23f88542bfd5a8a1f26056 -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach_rome.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++--- - tools/hciattach_rome.h | 7 +++++++ - 2 files changed, 60 insertions(+), 3 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 122a0f4b89bc..947e1abb96c4 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -809,6 +809,7 @@ int rome_get_tlv_file(char *file_path) - tlv_nvm_hdr *nvm_ptr; - unsigned char data_buf[PRINT_BUF_SIZE]={0,}; - unsigned char *nvm_byte_ptr; -+ unsigned char bdaddr[6]; - - fprintf(stderr, "File Open (%s)\n", file_path); - pFile = fopen ( file_path , "r" ); -@@ -886,9 +887,10 @@ int rome_get_tlv_file(char *file_path) - nvm_byte_ptr+=sizeof(tlv_nvm_hdr); - - /* Write BD Address */ -- if(nvm_ptr->tag_id == TAG_NUM_2){ -- memcpy(nvm_byte_ptr, vnd_local_bd_addr, 6); -- fprintf(stderr, "BD Address: %.02x:%.02x:%.02x:%.02x:%.02x:%.02x\n", -+ if(nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(&bdaddr) == 0) { -+ memcpy(nvm_byte_ptr, bdaddr, 6); -+ fprintf(stderr, "Overriding default BD ADDR with user" -+ " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n", - *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), - *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); - } -@@ -1451,6 +1453,54 @@ error: - - } - -+int read_bd_address(unsigned char *bdaddr) -+{ -+ int fd = -1; -+ int readPtr = 0; -+ unsigned char data[BD_ADDR_LEN]; -+ -+ /* Open the persist file for reading device address*/ -+ fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY); -+ if(fd < 0) -+ { -+ fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__); -+ return -1; -+ } -+ -+ /* Read the NVM Header : fp will be advanced by readPtr number of bytes */ -+ readPtr = read(fd, data, PERSIST_HEADER_LEN); -+ if (readPtr > 0) -+ fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__, -+ data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]); -+ else { -+ fprintf(stderr, "%s: Read from persist memory failed : Programming default" -+ " BD ADDR\n"); -+ close(fd); -+ return -1; -+ } -+ -+ /* Check for BD ADDR length before programming */ -+ if(data[NVITEM_SIZE] != BD_ADDR_LEN) { -+ fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n"); -+ close(fd); -+ return -1; -+ } -+ -+ /* Read the BD ADDR info */ -+ readPtr = read(fd, data, BD_ADDR_LEN); -+ if (readPtr > 0) -+ fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0], -+ data[1], data[2], data[3], data[4], data[5]); -+ else { -+ fprintf(stderr, "%s: Read from persist memory failed : Programming default" -+ " BD ADDR\n"); -+ close(fd); -+ return -1; -+ } -+ memcpy(bdaddr, data, BD_ADDR_LEN); -+ close(fd); -+ return 0; -+} - - int qca_soc_init(int fd, char *bdaddr) - { -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 07127f30a70a..a4abe9f73080 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -34,6 +34,13 @@ - #define HCI_EVENT_PKT 0x04 - #define HCI_VENDOR_PKT 0xff - #define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) -+ -+#define NVITEM 0 -+#define RDWR_PROT 1 -+#define NVITEM_SIZE 2 -+#define PERSIST_HEADER_LEN 3 -+#define BD_ADDR_LEN 6 -+ - unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - typedef enum { - USERIAL_OP_FLOW_ON, - -From 7f148243e9d36427734de874f291911e1f3d60d0 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Mon, 8 Sep 2014 14:33:24 +0530 -Subject: [PATCH 05/19] bluetooth: Remove unused functions in the firmware - download process - -rome_disable_sleep() function is not used anywhere in the code and -hence remove it. - -Change-Id: Iec1f9b1478850af3023ff297493693283a5338d7 -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach_rome.c | 48 ------------------------------------------------ - 1 file changed, 48 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 947e1abb96c4..4fcbdf2ab82a 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1317,54 +1317,6 @@ error: - - } - --int rome_disable_sleep(int fd) --{ -- int size, err = 0; -- unsigned char cmd[HCI_MAX_CMD_SIZE]; -- unsigned char rsp[HCI_MAX_EVENT_SIZE]; -- hci_command_hdr *cmd_hdr; -- int flags; -- -- memset(cmd, 0x0, HCI_MAX_CMD_SIZE); -- -- cmd_hdr = (void *) (cmd + 1); -- cmd[0] = HCI_COMMAND_PKT; -- cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, NVM_ACCESS_CODE); -- cmd_hdr->plen = VSC_DISABLE_IBS_LEN; -- cmd[4] = 0x01; -- cmd[5] = 0x1B; -- cmd[6] = 0x01; -- cmd[7] = 0x00; -- -- /* Total length of the packet to be sent to the Controller */ -- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_DISABLE_IBS_LEN); -- /* Send the HCI command packet to UART for transmission */ -- fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) ; -- err = write(fd, cmd, size); -- if (err != size) { -- fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); -- goto error; -- } -- -- /* Check for response from the Controller */ -- if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { -- fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -- goto error; -- } -- -- fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); -- -- /* Wait for command complete event */ -- err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); -- if ( err < 0) { -- fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); -- goto error; -- } -- fprintf(stderr, "%s\n", __FUNCTION__); --error: -- return err; -- --} - - int rome_set_baudrate_req(int fd) - { - -From 175fe3690522afc91f38933f821e4b00bd1a12c8 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Mon, 8 Sep 2014 14:31:18 +0530 -Subject: [PATCH 06/19] bluetooth: Enable 3Mbps baud rate support - -Allow APPS PROC and BT Controller to operate at 3Mbps baud rate -for faster exchange of commands, events and data between the two - -Change-Id: I55651633027ea60a762b11abea84fe1abd6574a9 -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach_rome.c | 63 ++++++++++++++++++++++++++++++++++++++------------ - 1 file changed, 48 insertions(+), 15 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 4fcbdf2ab82a..d0e2935b9997 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -166,6 +166,7 @@ int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) - } - cfmakeraw(&ti); - ti.c_cflag |= CLOCAL; -+ ti.c_cflag |= CREAD; - - switch(op) - { -@@ -332,6 +333,8 @@ int read_vs_hci_event(int fd, unsigned char* buf, int size) - { - int remain, r; - int count = 0; -+ fd_set infids; -+ struct timeval timeout; - - if (size <= 0) { - fprintf(stderr, "Invalid size arguement!\n"); -@@ -340,6 +343,16 @@ int read_vs_hci_event(int fd, unsigned char* buf, int size) - - fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", __FUNCTION__); - -+ FD_ZERO (&infids); -+ FD_SET (fd, &infids); -+ timeout.tv_sec = 3; -+ timeout.tv_usec = 0; /* half second is a long time at 115.2 Kbps */ -+ -+ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) -+ fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); -+ else -+ fprintf(stderr, "%s: Data available in TTY Serial buffer\n", __FUNCTION__); -+ - /* The first byte identifies the packet type. For HCI event packets, it - * should be 0x04, so we read until we get to the 0x04. */ - /* It will keep reading until find 0x04 byte */ -@@ -1332,10 +1345,16 @@ int rome_set_baudrate_req(int fd) - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); - cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; -- cmd[4] = BAUDRATE_115200; -+ cmd[4] = BAUDRATE_3000000; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); -+ /* Flow off during baudrate change */ -+ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) -+ { -+ fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); -+ goto error; -+ } - /* Send the HCI command packet to UART for transmission */ - fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3],cmd[4]) ; - err = write(fd, cmd, size); -@@ -1343,7 +1362,15 @@ int rome_set_baudrate_req(int fd) - fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); - goto error; - } -+ /* Change Local UART baudrate to high speed UART */ -+ userial_vendor_set_baud(USERIAL_BAUD_3M); - -+ /* Flow on after changing local uart baudrate */ -+ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) -+ { -+ fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); -+ return err; -+ } - /* Check for response from the Controller */ - if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { - fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -@@ -1385,6 +1412,12 @@ int rome_hci_reset_req(int fd) - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); - -+ /* Flow off during baudrate change */ -+ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) -+ { -+ fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); -+ goto error; -+ } - /* Send the HCI command packet to UART for transmission */ - fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); - err = write(fd, cmd, size); -@@ -1393,6 +1426,15 @@ int rome_hci_reset_req(int fd) - goto error; - } - -+ /* Change Local UART baudrate to high speed UART */ -+ userial_vendor_set_baud(USERIAL_BAUD_3M); -+ -+ /* Flow on after changing local uart baudrate */ -+ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) -+ { -+ fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); -+ return err; -+ } - /* Wait for command complete event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { -@@ -1534,16 +1576,7 @@ int qca_soc_init(int fd, char *bdaddr) - nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; - - download: -- /* Donwload TLV files (rampatch, NVM) */ -- err = rome_download_tlv_file(fd); -- if (err < 0) { -- fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); -- goto error; -- } -- fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); -- -- /* Change baud rate back to user requested */ -- fprintf(stderr, "Changing baud rate back from 3M --> 115K\n"); -+ /* Change baud rate 115.2 kbps to 3Mbps*/ - err = rome_set_baudrate_req(fd); - if (err < 0) { - fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); -@@ -1551,13 +1584,13 @@ download: - } - fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__); - -- fprintf(stderr, "%s: Disabling In Band Sleep functionality\n", __FUNCTION__); -- err = rome_disable_sleep(fd); -+ /* Donwload TLV files (rampatch, NVM) */ -+ err = rome_download_tlv_file(fd); - if (err < 0) { -- fprintf(stderr, "%s: Failed to disable IBS!\n", __FUNCTION__); -+ fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); - goto error; - } -- fprintf(stderr, "%s: IBS disabled successfully \n", __FUNCTION__); -+ fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); - - /* Perform HCI reset here*/ - err = rome_hci_reset_req(fd); - -From 1911a9d5799d110a7d010e154b44e43c65e838ff Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Tue, 30 Sep 2014 12:13:00 +0530 -Subject: [PATCH 07/19] bluetooth: Check TTY buffer for data availability - before reading - -When operating at higher baud rates check the TTY buffer for -availability of data before proceeding to read. Call select() with -a 3 sec timeout value to check for the availablitiy of data. -select() will return once data is available in the TTY buffers -and will allow read() to fetch the data. If data is not available -in the TTY buffer until the timeout valueexpires, do not proceed -to read the data from the TTY buffers as there is none. - -Occasionally corrupt data is received on UART lines while we wait -for vendor specific event from Controller. Expected vendor specific -events are received after the corrupt data. But we do not retry -and exit and this causes firmware download failures. So, retry once -if we did not get HCI event. - -Change-Id: I3b672a7762403690f8b934ca216492f16285e8da -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach.c | 20 ++++++++++++- - tools/hciattach_rome.c | 77 +++++++++++++++++++++++++++++++++++++++----------- - tools/hciattach_rome.h | 3 ++ - 3 files changed, 83 insertions(+), 17 deletions(-) - -diff --git a/tools/hciattach.c b/tools/hciattach.c -index e3a915061440..c3cf10843303 100644 ---- a/tools/hciattach.c -+++ b/tools/hciattach.c -@@ -109,16 +109,34 @@ int read_hci_event(int fd, unsigned char* buf, int size) - { - int remain, r; - int count = 0; -+ fd_set infids; -+ struct timeval timeout; - - if (size <= 0) - return -1; - -+ FD_ZERO (&infids); -+ FD_SET (fd, &infids); -+ timeout.tv_sec = 3; -+ timeout.tv_usec = 0; -+ -+ /* Check whether data is available in TTY buffer before calling read() */ -+ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { -+ fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); -+ return -1; -+ } -+ else -+ fprintf(stderr, "%s: Data(HCI-CMD-COMP-EVENT) available in TTY Serial buffer\n", __FUNCTION__); -+ - /* The first byte identifies the packet type. For HCI event packets, it - * should be 0x04, so we read until we get to the 0x04. */ - while (1) { - r = read(fd, buf, 1); -- if (r <= 0) -+ if (r <= 0) { -+ fprintf(stderr, "%s: read() failed with return value: %d\n", -+ __FUNCTION__, r); - return -1; -+ } - if (buf[0] == 0x04) - break; - } -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index d0e2935b9997..d2687b1ef01a 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -326,42 +326,87 @@ failed: - } - - -+int wait_for_data(int fd, int maxTimeOut) -+{ -+ fd_set infids; -+ struct timeval timeout; -+ -+ if (maxTimeOut <= 0) { -+ fprintf(stderr, "%s: Invalid timeout value specified", __func__); -+ return -EINVAL; -+ } -+ -+ FD_ZERO (&infids); -+ FD_SET (fd, &infids); -+ timeout.tv_sec = maxTimeOut; -+ timeout.tv_usec = 0; -+ -+ /* Check whether data is available in TTY buffer before calling read() */ -+ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { -+ fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut); -+ return -1; -+ } -+ else -+ fprintf(stderr, "%s: HCI-VS-EVENT available in TTY Serial buffer\n", -+ __FUNCTION__); -+ -+ return 1; -+} -+ - /* - * Read an VS HCI event from the given file descriptor. - */ - int read_vs_hci_event(int fd, unsigned char* buf, int size) - { -- int remain, r; -+ int remain, r, retry = 0; - int count = 0; -- fd_set infids; -- struct timeval timeout; - - if (size <= 0) { - fprintf(stderr, "Invalid size arguement!\n"); - return -1; - } - -- fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", __FUNCTION__); -- -- FD_ZERO (&infids); -- FD_SET (fd, &infids); -- timeout.tv_sec = 3; -- timeout.tv_usec = 0; /* half second is a long time at 115.2 Kbps */ -+ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", -+ __FUNCTION__); - -- if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) -- fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); -- else -- fprintf(stderr, "%s: Data available in TTY Serial buffer\n", __FUNCTION__); -+ /* Check whether data is available in TTY buffer before calling read() */ -+ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) -+ return -1; - - /* The first byte identifies the packet type. For HCI event packets, it - * should be 0x04, so we read until we get to the 0x04. */ - /* It will keep reading until find 0x04 byte */ - while (1) { -+ /* Read UART Buffer for HCI-DATA */ - r = read(fd, buf, 1); -- if (r <= 0) -- return -1; -- if (buf[0] == 0x04) -+ if (r <= 0) { -+ fprintf(stderr, "%s: read() failed. error: %d\n", -+ __FUNCTION__, r); -+ return -1; -+ } -+ -+ /* Check if received data is HCI-DATA or not. -+ * If not HCI-DATA, then retry reading the UART Buffer once. -+ * Sometimes there could be corruption on the UART lines and to -+ * avoid that retry once reading the UART Buffer for HCI-DATA. -+ */ -+ if (buf[0] == 0x04) { /* Recvd. HCI DATA */ -+ retry = 0; - break; -+ } -+ else if (retry < MAX_RETRY_CNT){ /* Retry mechanism */ -+ retry++; -+ fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d", -+ __FUNCTION__, buf[0]); -+ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) -+ return -1; -+ else /* Data available in UART Buffer: Continue to read */ -+ continue; -+ } -+ else { /* RETRY failed : Exiting with failure */ -+ fprintf(stderr, "%s: RETRY failed!", __FUNCTION__); -+ return -1; -+ } - } - count++; - -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index a4abe9f73080..3efb71995c45 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -179,6 +179,9 @@ typedef struct - #define TAG_NUM_2 2 - #define TAG_BDADDR_OFFSET 7 - -+#define MAX_RETRY_CNT 1 -+#define SELECT_TIMEOUT 3 -+ - /* NVM Tags specifically used for ROME 1.0 */ - #define ROME_1_0_100022_1 0x101000221 - #define ROME_1_0_100019 0x101000190 - -From 9d81b1dd643966ba6f2ffb3f7658a24cfcb37df4 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Wed, 20 Aug 2014 12:13:19 +0530 -Subject: [PATCH 08/19] bluetooth : Add support for TUFEELO firmware download - -Add TUFELLO chip version to allow firmware download. - -Change-Id: Ie3760fa64e8345bf9a84b2f047fde0ac1003b393 ---- - tools/hciattach_rome.c | 5 ++++- - tools/hciattach_rome.h | 3 ++- - 2 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index d2687b1ef01a..84dfc97b5140 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1616,9 +1616,12 @@ int qca_soc_init(int fd, char *bdaddr) - nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; - goto download; - case ROME_VER_3_0: -- case TUFELLO_VER_1_0: - rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; - nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; -+ goto download; -+ case TUFELLO_VER_1_0: -+ rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; -+ nvm_file_path = TF_NVM_TLV_1_0_0_PATH; - - download: - /* Change baud rate 115.2 kbps to 3Mbps*/ -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 3efb71995c45..9d18c576fcae 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -204,7 +204,8 @@ typedef struct - #define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" - #define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/qca/rampatch_tlv_3.0.tlv" - #define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" -- -+#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv" -+#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin" - - /****************************************************************************** - ** Local type definitions - -From ac12a2a733ad6cc6eed8ccdd3462d1fe1969fc54 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Mon, 8 Dec 2014 14:52:16 +0530 -Subject: [PATCH 09/19] bluetooth: Add support for ROME 3.2 SOC. - -Add firmware download support for ROME 3.2 version. As part -of this, the Bluetooth on time is optimized based on event -handling while downloading rampatch files.From ROME 3.2 onwards, -the VS and command complete events will be sent depending the flag -indication present in the header. HOST can wait for VS and command -complete events only if specified in the header info. This greatly -reduces the time spent by HOST in waiting for 2 events from the -Controller before downloading each segment of the RAMPATCH file - -Change-Id: I9c4227a7a529455f4d120b2c9d065f3ec6b439e9 ---- - tools/hciattach_rome.c | 104 ++++++++++++++++++++++++++++++++++++++++++------- - tools/hciattach_rome.h | 16 +++++++- - 2 files changed, 103 insertions(+), 17 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 84dfc97b5140..c6d528f118e1 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -62,9 +62,11 @@ unsigned char *pdata_buffer = NULL; - patch_info rampatch_patch_info; - int rome_ver = ROME_VER_UNKNOWN; - unsigned char gTlv_type; -+unsigned char gtlv_dwndcfg; - char *rampatch_file_path; - char *nvm_file_path; - vnd_userial_cb_t vnd_userial; -+unsigned char wait_vsc_evt = TRUE; - /****************************************************************************** - ** Extern variables - ******************************************************************************/ -@@ -455,14 +457,16 @@ int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) - goto failed; - } - -- /* Check for response from the Controller */ -- if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { -- ret = -ETIMEDOUT; -- fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -- goto failed; -+ if (wait_vsc_evt) { -+ /* Check for response from the Controller */ -+ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { -+ ret = -ETIMEDOUT; -+ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -+ goto failed; -+ } -+ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); - } - -- fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); - failed: - return ret; - } -@@ -903,6 +907,7 @@ int rome_get_tlv_file(char *file_path) - - /* To handle different event between rampatch and NVM */ - gTlv_type = ptlv_header->tlv_type; -+ gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg; - - if(ptlv_header->tlv_type == TLV_TYPE_PATCH){ - fprintf(stderr, "====================================================\n"); -@@ -914,6 +919,7 @@ int rome_get_tlv_file(char *file_path) - fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); - fprintf(stderr, "Signing Format Version\t : 0x%x\n", ptlv_header->tlv.patch.sign_ver); - fprintf(stderr, "Signature Algorithm\t\t : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); -+ fprintf(stderr, "Event Handling\t\t\t : 0x%x", ptlv_header->tlv.patch.dwnd_cfg); - fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved1); - fprintf(stderr, "Product ID\t\t\t : 0x%04x\n", ptlv_header->tlv.patch.prod_id); - fprintf(stderr, "Rom Build Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.build_ver); -@@ -1023,19 +1029,83 @@ int rome_tlv_dnld_req(int fd, int tlv_size) - fprintf(stderr, "%s: TLV size: %d, Total Seg num: %d, remain size: %d\n", - __FUNCTION__,tlv_size, total_segment, remain_size); - -- for(i=0;i= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) -- && !remain_size && ((i+1) == total_segment))? FALSE: TRUE; -+ if (gTlv_type == TLV_TYPE_PATCH) { -+ /* Prior to Rome version 3.2(including inital few rampatch release of -+ * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After -+ * few release of rampatch for Rome 3.2, the mechamism is changed to -+ * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now -+ */ -+ switch(gtlv_dwndcfg) -+ { -+ case ROME_SKIP_EVT_NONE: -+ wait_vsc_evt = TRUE; -+ wait_cc_evt = TRUE; -+ fprintf(stderr, "%s: Event handling type: ROME_SKIP_EVT_NONE", __func__); -+ break; -+ case ROME_SKIP_EVT_VSE_CC: -+ wait_vsc_evt = FALSE; -+ wait_cc_evt = FALSE; -+ fprintf(stderr, "%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__); -+ break; -+ /* Not handled for now */ -+ case ROME_SKIP_EVT_VSE: -+ case ROME_SKIP_EVT_CC: -+ default: -+ fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg); -+ break; -+ } -+ } else { -+ wait_vsc_evt = TRUE; -+ wait_cc_evt = TRUE; -+ } -+ -+ for(i = 0; i < total_segment; i++) { -+ if((i+1) == total_segment) { -+ if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && -+ (gTlv_type == TLV_TYPE_PATCH)) { -+ /* If the Rome version is from 1.1 to 3.1 -+ * 1. No CCE for the last command segment but all other segment -+ * 2. All the command segments get VSE including the last one -+ */ -+ wait_cc_evt = !remain_size ? FALSE: TRUE; -+ } else if ((rome_ver == ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { -+ /* If the Rome version is 3.2 -+ * 1. None of the command segments receive CCE -+ * 2. No command segments receive VSE except the last one -+ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is -+ * same as Rome 2.1, 2.2, 3.0 -+ */ -+ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { -+ wait_cc_evt = !remain_size ? FALSE: TRUE; -+ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { -+ wait_vsc_evt = !remain_size ? TRUE: FALSE; -+ } -+ } -+ } -+ - if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) - goto error; - } - -- /* In case remain data still remain, last rampatch segment command will not wait -- for command complete event here */ -- wait_cc_evt = ((rome_ver >= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) -- && remain_size )? FALSE:TRUE; -+ if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { -+ /* If the Rome version is from 1.1 to 3.1 -+ * 1. No CCE for the last command segment but all other segment -+ * 2. All the command segments get VSE including the last one -+ */ -+ wait_cc_evt = remain_size ? FALSE: TRUE; -+ } else if ((rome_ver == ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { -+ /* If the Rome version is 3.2 -+ * 1. None of the command segments receive CCE -+ * 2. No command segments receive VSE except the last one -+ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is -+ * same as Rome 2.1, 2.2, 3.0 -+ */ -+ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { -+ wait_cc_evt = remain_size ? FALSE: TRUE; -+ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { -+ wait_vsc_evt = remain_size ? TRUE: FALSE; -+ } -+ } - - if(remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); - -@@ -1619,6 +1689,10 @@ int qca_soc_init(int fd, char *bdaddr) - rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; - nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; - goto download; -+ case ROME_VER_3_2: -+ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; -+ nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; -+ goto download; - case TUFELLO_VER_1_0: - rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; - nvm_file_path = TF_NVM_TLV_1_0_0_PATH; -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 9d18c576fcae..77e85e7e7b19 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -204,9 +204,17 @@ typedef struct - #define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" - #define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/qca/rampatch_tlv_3.0.tlv" - #define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" -+#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/qca/rampatch_tlv_3.2.tlv" -+#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/qca/nvm_tlv_3.2.bin" - #define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv" - #define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin" - -+/* This header value in rampatch file decides event handling mechanism in the HOST */ -+#define ROME_SKIP_EVT_NONE 0x00 -+#define ROME_SKIP_EVT_VSE 0x01 -+#define ROME_SKIP_EVT_CC 0x02 -+#define ROME_SKIP_EVT_VSE_CC 0x03 -+ - /****************************************************************************** - ** Local type definitions - ******************************************************************************/ -@@ -251,7 +259,8 @@ typedef struct { - unsigned int tlv_patch_data_len; - unsigned char sign_ver; - unsigned char sign_algorithm; -- unsigned short reserved1; -+ unsigned char dwnd_cfg; -+ unsigned char reserved1; - unsigned short prod_id; - unsigned short build_ver; - unsigned short patch_ver; -@@ -306,7 +315,8 @@ enum{ - ROME_PATCH_VER_0100 = 0x0100, - ROME_PATCH_VER_0101 = 0x0101, - ROME_PATCH_VER_0200 = 0x0200, -- ROME_PATCH_VER_0300 = 0x0300 -+ ROME_PATCH_VER_0300 = 0x0300, -+ ROME_PATCH_VER_0302 = 0x0302 - }; - - enum{ -@@ -314,6 +324,7 @@ enum{ - ROME_SOC_ID_11 = 0x00000011, - ROME_SOC_ID_13 = 0x00000013, - ROME_SOC_ID_22 = 0x00000022, -+ ROME_SOC_ID_44 = 0x00000044 - }; - - enum{ -@@ -323,6 +334,7 @@ enum{ - ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), - ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), - ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), + ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ), - TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ) - }; - #endif /* HW_ROME_H */ - -From f7cc3b22522cfc66a7c4126630c6222f22be17f6 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Thu, 4 Dec 2014 17:23:58 +0530 -Subject: [PATCH 10/19] bluetooth: Use correct TTY ioctl calls for flow control - operations - -BT firmware download application is using incorrect APIs for -performing flow off and flow on operations. As a result, the local -UART Controller is detecting breaks errors on the UART HW lines. - -Appliaction should use TIOCMGET and TIOCMSET ioctl()'s for flow -control operations instead of the tcsetattr() call. Also, the -application should set the value of "number of bits per character" -value to 8 and not as 5. - -Due to incorrect APIs used for flow control operation and wrong -value configured for CSIZE parameter, the local UART Controller -detected break errors on the UART HW lines. This caused the -firmware download operation to fail and resulted in BT ON failure. - -Change-Id: Id0ac1276609eceb528163860cc87267aaa50fede ---- - tools/hciattach_rome.c | 67 +++++++++++++++++++++++++++++++++----------------- - tools/hciattach_rome.h | 6 +++-- - 2 files changed, 49 insertions(+), 24 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index c6d528f118e1..1e689273b851 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1,6 +1,6 @@ - /* - * -- * Copyright (c) 2013, The Linux Foundation. All rights reserved. -+ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Copyright 2012 The Android Open Source Project -@@ -31,6 +31,7 @@ - - #define LOG_TAG "bt_vendor" - #include -+#include - #include - #include - #include -@@ -139,6 +140,16 @@ void userial_vendor_set_baud(unsigned char userial_baud) - unsigned int tcio_baud; - fprintf(stderr, "## userial_vendor_set_baud: %d\n", userial_baud); - -+ if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) { -+ perror("Can't get port settings"); -+ return; -+ } -+ cfmakeraw(&vnd_userial.termios); -+ vnd_userial.termios.c_cflag |= CLOCAL; -+ vnd_userial.termios.c_cflag |= CREAD; -+ vnd_userial.termios.c_cflag |= CS8; -+ tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); -+ - userial_to_tcio_baud(userial_baud, &tcio_baud); - - cfsetospeed(&vnd_userial.termios, tcio_baud); -@@ -169,6 +180,7 @@ int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) - cfmakeraw(&ti); - ti.c_cflag |= CLOCAL; - ti.c_cflag |= CREAD; -+ ti.c_cflag |= CS8; - - switch(op) - { -@@ -1445,6 +1457,29 @@ error: - - } - -+static void flow_control(int fd, int opt) -+{ -+ struct termios c_opt; -+ -+ ioctl(fd, TIOCMGET, &c_opt); -+ c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */ -+ c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ -+ c_opt.c_cflag &= ~CSIZE; -+ c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); -+ if (MSM_ENABLE_FLOW_CTRL) -+ c_opt.c_cflag |= CRTSCTS; -+ else if (MSM_DISABLE_FLOW_CTRL) -+ c_opt.c_cflag |= ~CRTSCTS; -+ else { -+ fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); -+ return; -+ } -+ c_opt.c_iflag = IGNPAR; -+ c_opt.c_oflag = 0; -+ c_opt.c_lflag = 0; -+ ioctl(fd, TIOCMSET, &c_opt); -+} -+ - - int rome_set_baudrate_req(int fd) - { -@@ -1464,12 +1499,10 @@ int rome_set_baudrate_req(int fd) - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); -+ - /* Flow off during baudrate change */ -- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) -- { -- fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); -- goto error; -- } -+ flow_control(fd, MSM_DISABLE_FLOW_CTRL); -+ - /* Send the HCI command packet to UART for transmission */ - fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3],cmd[4]) ; - err = write(fd, cmd, size); -@@ -1481,11 +1514,8 @@ int rome_set_baudrate_req(int fd) - userial_vendor_set_baud(USERIAL_BAUD_3M); - - /* Flow on after changing local uart baudrate */ -- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) -- { -- fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); -- return err; -- } -+ flow_control(fd, MSM_ENABLE_FLOW_CTRL); -+ - /* Check for response from the Controller */ - if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { - fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); -@@ -1528,11 +1558,8 @@ int rome_hci_reset_req(int fd) - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); - - /* Flow off during baudrate change */ -- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) -- { -- fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); -- goto error; -- } -+ flow_control(fd, MSM_DISABLE_FLOW_CTRL); -+ - /* Send the HCI command packet to UART for transmission */ - fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); - err = write(fd, cmd, size); -@@ -1545,11 +1572,8 @@ int rome_hci_reset_req(int fd) - userial_vendor_set_baud(USERIAL_BAUD_3M); - - /* Flow on after changing local uart baudrate */ -- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) -- { -- fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); -- return err; -- } -+ flow_control(fd, MSM_ENABLE_FLOW_CTRL); -+ - /* Wait for command complete event */ - err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); - if ( err < 0) { -@@ -1616,7 +1640,6 @@ int qca_soc_init(int fd, char *bdaddr) - int err = -1; - int size; - -- fprintf(stderr, " %s \n", __FUNCTION__); - vnd_userial.fd = fd; - /* Get Rome version information */ - if((err = rome_patch_ver_req(fd)) <0){ -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 77e85e7e7b19..ef3647e6a69b 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -1,7 +1,7 @@ - /* -- * Copyright 2012 The Android Open Source Project -- * Copyright (c) 2013, The Linux Foundation. All rights reserved. -+ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. - * Not a Contribution. -+ * Copyright 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. -@@ -40,6 +40,8 @@ - #define NVITEM_SIZE 2 - #define PERSIST_HEADER_LEN 3 - #define BD_ADDR_LEN 6 -+#define MSM_ENABLE_FLOW_CTRL 16 -+#define MSM_DISABLE_FLOW_CTRL 17 - - unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - typedef enum { - -From bd7d1fce8de4639445563442a8448468d671fad2 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Tue, 20 Jan 2015 12:43:20 +0530 -Subject: [PATCH 11/19] bluetooth: Add support for multi baud rate - -Currently BT operates only at 3M baud rate. Provide option -to configure the pre-defined baud rate values as supported by the -target platform. - -Change-Id: I4bbaf7db01ffb983c38dca7c4a4a56f579c678a8 ---- - tools/hciattach.c | 2 +- - tools/hciattach.h | 2 +- - tools/hciattach_rome.c | 109 ++++++++++++++++++++++++++++++++++++++++++------- - tools/hciattach_rome.h | 23 +++++++++++ - 4 files changed, 119 insertions(+), 17 deletions(-) - -diff --git a/tools/hciattach.c b/tools/hciattach.c -index c3cf10843303..dda639cabca3 100644 ---- a/tools/hciattach.c -+++ b/tools/hciattach.c -@@ -286,7 +286,7 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) - static int qca(int fd, struct uart_t *u, struct termios *ti) - { - fprintf(stderr,"qca\n"); -- return qca_soc_init(fd, u->bdaddr); -+ return qca_soc_init(fd, u->speed, u->bdaddr); - } - - static int qualcomm(int fd, struct uart_t *u, struct termios *ti) -diff --git a/tools/hciattach.h b/tools/hciattach.h -index 0656a845223c..49e59321fcac 100644 ---- a/tools/hciattach.h -+++ b/tools/hciattach.h -@@ -64,7 +64,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, - struct termios *ti); - int ath3k_post(int fd, int pm); - int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); --int qca_soc_init(int fd, char *bdaddr); -+int qca_soc_init(int fd, int speed, char *bdaddr); - int intel_init(int fd, int init_speed, int *speed, struct termios *ti); - int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti, - const char *bdaddr); -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 1e689273b851..37974290ae0a 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1481,7 +1481,7 @@ static void flow_control(int fd, int opt) - } - - --int rome_set_baudrate_req(int fd) -+int rome_set_baudrate_req(int fd, int local_baud_rate, int controller_baud_rate) - { - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; -@@ -1495,7 +1495,7 @@ int rome_set_baudrate_req(int fd) - cmd[0] = HCI_COMMAND_PKT; - cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF); - cmd_hdr->plen = VSC_SET_BAUDRATE_REQ_LEN; -- cmd[4] = BAUDRATE_3000000; -+ cmd[4] = controller_baud_rate; - - /* Total length of the packet to be sent to the Controller */ - size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); -@@ -1511,7 +1511,7 @@ int rome_set_baudrate_req(int fd) - goto error; - } - /* Change Local UART baudrate to high speed UART */ -- userial_vendor_set_baud(USERIAL_BAUD_3M); -+ userial_vendor_set_baud(local_baud_rate); - - /* Flow on after changing local uart baudrate */ - flow_control(fd, MSM_ENABLE_FLOW_CTRL); -@@ -1537,7 +1537,7 @@ error: - } - - --int rome_hci_reset_req(int fd) -+int rome_hci_reset_req(int fd, char baud) - { - int size, err = 0; - unsigned char cmd[HCI_MAX_CMD_SIZE]; -@@ -1569,7 +1569,7 @@ int rome_hci_reset_req(int fd) - } - - /* Change Local UART baudrate to high speed UART */ -- userial_vendor_set_baud(USERIAL_BAUD_3M); -+ userial_vendor_set_baud(baud); - - /* Flow on after changing local uart baudrate */ - flow_control(fd, MSM_ENABLE_FLOW_CTRL); -@@ -1635,10 +1635,69 @@ int read_bd_address(unsigned char *bdaddr) - return 0; - } - --int qca_soc_init(int fd, char *bdaddr) -+int isSpeedValid(int speed, int *local_baud_rate, int *controller_baud_rate) -+{ -+ switch(speed) { -+ case 9600: -+ *local_baud_rate = USERIAL_BAUD_9600; -+ *controller_baud_rate = BAUDRATE_9600; -+ break; -+ case 19200: -+ *local_baud_rate = USERIAL_BAUD_19200; -+ *controller_baud_rate = BAUDRATE_19200; -+ break; -+ case 57600: -+ *local_baud_rate = USERIAL_BAUD_57600; -+ *controller_baud_rate = BAUDRATE_57600; -+ break; -+ case 115200: -+ *local_baud_rate = USERIAL_BAUD_115200; -+ *controller_baud_rate = BAUDRATE_115200; -+ break; -+ case 230400: -+ *local_baud_rate = USERIAL_BAUD_230400; -+ *controller_baud_rate = BAUDRATE_230400; -+ break; -+ case 460800: -+ *local_baud_rate = USERIAL_BAUD_460800; -+ *controller_baud_rate = BAUDRATE_460800; -+ break; -+ case 921600: -+ *local_baud_rate = USERIAL_BAUD_921600; -+ *controller_baud_rate = BAUDRATE_921600; -+ break; -+ case 1000000: -+ *local_baud_rate = USERIAL_BAUD_1M; -+ *controller_baud_rate = BAUDRATE_1000000; -+ break; -+ case 2000000: -+ *local_baud_rate = USERIAL_BAUD_2M; -+ *controller_baud_rate = BAUDRATE_2000000; -+ break; -+ case 3000000: -+ *local_baud_rate = USERIAL_BAUD_3M; -+ *controller_baud_rate = BAUDRATE_3000000; -+ break; -+ case 4000000: -+ *local_baud_rate = USERIAL_BAUD_4M; -+ *controller_baud_rate = BAUDRATE_4000000; -+ break; -+ case 300: -+ case 600: -+ case 1200: -+ case 2400: -+ default: -+ fprintf(stderr, "Invalid baud rate passed!\n"); -+ *local_baud_rate = *controller_baud_rate = -1; -+ break; -+ } -+ return -1; -+} -+ -+int qca_soc_init(int fd, int speed, char *bdaddr) - { - int err = -1; -- int size; -+ int size, local_baud_rate = 0, controller_baud_rate = 0; - - vnd_userial.fd = fd; - /* Get Rome version information */ -@@ -1687,7 +1746,7 @@ int qca_soc_init(int fd, char *bdaddr) - } - - /* Change baud rate 115.2 kbps to 3Mbps*/ -- err = rome_hci_reset_req(fd); -+ err = rome_hci_reset_req(fd, local_baud_rate); - if ( err <0 ) { - fprintf(stderr, "HCI Reset Failed !!\n"); - goto error; -@@ -1721,13 +1780,23 @@ int qca_soc_init(int fd, char *bdaddr) - nvm_file_path = TF_NVM_TLV_1_0_0_PATH; - - download: -- /* Change baud rate 115.2 kbps to 3Mbps*/ -- err = rome_set_baudrate_req(fd); -- if (err < 0) { -- fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); -- goto error; -+ /* Check if user requested for 115200 kbps */ -+ if (speed == 115200) { -+ local_baud_rate = USERIAL_BAUD_115200; -+ controller_baud_rate = BAUDRATE_115200; - } -- fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__); -+ else { -+ /* Change only if baud rate requested is valid or not */ -+ isSpeedValid(speed, &local_baud_rate, &controller_baud_rate); -+ if (local_baud_rate < 0 || controller_baud_rate < 0) -+ goto error; -+ -+ err = rome_set_baudrate_req(fd, local_baud_rate, controller_baud_rate); -+ if (err < 0) { -+ fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); -+ goto error; -+ } -+ } - - /* Donwload TLV files (rampatch, NVM) */ - err = rome_download_tlv_file(fd); -@@ -1737,8 +1806,18 @@ download: - } - fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); - -+ /* -+ * Overriding the baud rate value in NVM file with the user -+ * requested baud rate, since default baud rate in NVM file is 3M. -+ */ -+ err = rome_set_baudrate_req(fd, local_baud_rate, controller_baud_rate); -+ if (err < 0) { -+ fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); -+ goto error; -+ } -+ - /* Perform HCI reset here*/ -- err = rome_hci_reset_req(fd); -+ err = rome_hci_reset_req(fd, local_baud_rate); - if ( err <0 ) { - fprintf(stderr, "HCI Reset Failed !!!\n"); - goto error; -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index ef3647e6a69b..1500ddd3a79f 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -78,6 +78,29 @@ typedef struct - #define USERIAL_BAUD_4M 15 - #define USERIAL_BAUD_AUTO 16 - -+/* Vendor specific baud rate values */ -+#define UART_Baud_Rate_Baud_9600 4 -+#define UART_Baud_Rate_Baud_19200 3 -+#define UART_Baud_Rate_Baud_57600 1 -+#define UART_Baud_Rate_Baud_115200 0 -+#define UART_Baud_Rate_Baud_230400 5 -+#define UART_Baud_Rate_Baud_460800 7 -+#define UART_Baud_Rate_Baud_921600 10 -+#define UART_Baud_Rate_Baud_1000000 11 -+#define UART_Baud_Rate_Baud_2000000 13 -+#define UART_Baud_Rate_Baud_3000000 14 -+#define UART_Baud_Rate_Baud_4000000 15 -+ -+#define UART_Baud_Rate_Baud_250000 6 -+#define UART_Baud_Rate_Baud_500000 8 -+#define UART_Baud_Rate_Baud_720000 9 -+#define UART_Baud_Rate_Baud_125000 12 -+#define UART_Baud_Rate_Baud_1600000 16 -+#define UART_Baud_Rate_Baud_3200000 17 -+#define UART_Baud_Rate_Baud_3500000 18 -+ -+ -+ - #ifndef FALSE - #define FALSE 0 - #endif - -From 7dc9c5e316aa9a22899259ce296136b2e257735d Mon Sep 17 00:00:00 2001 -From: Kamal Negi -Date: Tue, 30 Dec 2014 19:15:08 +0530 -Subject: [PATCH 12/19] Override PCM Settings by reading configuration file - -Configure the PCM role as master or slave depending upon -the platform's support. This configuration is provided -in the config file which is read during the firmware -download process and the default PCM configuration is -overwritten with this value. - -Change-Id: If0eae58b4cd32d75b3bcb669bc73dca67652473c -Signed-off-by: Kamal Negi ---- - tools/hciattach_rome.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++--- - tools/hciattach_rome.h | 8 ++++++ - 2 files changed, 71 insertions(+), 4 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 37974290ae0a..99866e23e99e 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1,6 +1,6 @@ - /* - * -- * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. -+ * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. - * Not a Contribution. - * - * Copyright 2012 The Android Open Source Project -@@ -873,6 +873,44 @@ error: - return err; - } - -+int get_value_from_config(char *file_path,char *param) -+{ -+ FILE *pfile = NULL; -+ char *line = NULL; -+ char *pch = NULL; -+ char param_str[20]; -+ int bytes_read = 0, position; -+ int ret = -1; -+ -+ if (!file_path || !param) { -+ fprintf(stderr,"Invalid arguments\n"); -+ return -EINVAL; -+ } -+ -+ pfile = fopen(file_path, "r" ); -+ if (!pfile) { -+ fprintf(stderr, "Failed to open %s\n", file_path); -+ return ret; -+ } -+ -+ while (getline(&line, &bytes_read, pfile) > 0 ) { -+ if (line[0] != '#' && line[0] != '\n') { -+ pch = memchr(line, '=', strlen(line)); -+ if (pch != NULL) { -+ position = pch - line; -+ strncpy(param_str, line, position); -+ if (strncmp(param_str, param, position) == 0) { -+ ret = atoi(pch + 1); -+ break; -+ } -+ } -+ } -+ } -+ free(line); -+ fclose(pfile); -+ return ret; -+} -+ - int rome_get_tlv_file(char *file_path) - { - FILE * pFile; -@@ -884,7 +922,7 @@ int rome_get_tlv_file(char *file_path) - unsigned char data_buf[PRINT_BUF_SIZE]={0,}; - unsigned char *nvm_byte_ptr; - unsigned char bdaddr[6]; -- -+ unsigned short pcm_value; - fprintf(stderr, "File Open (%s)\n", file_path); - pFile = fopen ( file_path , "r" ); - if (pFile==NULL) {; -@@ -970,9 +1008,30 @@ int rome_get_tlv_file(char *file_path) - *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), - *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); - } -+ /* Read from file and check what PCM Configuration is required: -+ * Master = 0 /Slave = 1 */ -+ /* Override PCM configuration */ -+ if (nvm_ptr->tag_id == TAG_NUM_44) { -+ if ((pcm_value = -+ get_value_from_config(PCM_CONFIG_FILE_PATH, "PCM")) >= 0) { -+ -+ if (pcm_value == PCM_SLAVE) { -+ nvm_byte_ptr[PCM_MS_OFFSET_1] |= -+ (1 << PCM_ROLE_BIT_OFFSET); -+ nvm_byte_ptr[PCM_MS_OFFSET_2] |= -+ (1 << PCM_ROLE_BIT_OFFSET); -+ } else if (pcm_value == PCM_MASTER) { -+ nvm_byte_ptr[PCM_MS_OFFSET_1] &= -+ (~(1 << PCM_ROLE_BIT_OFFSET)); -+ nvm_byte_ptr[PCM_MS_OFFSET_2] &= -+ (~(1 << PCM_ROLE_BIT_OFFSET)); -+ } -+ } -+ } - -- for(i =0;(itag_len && (i*3 + 2) tag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++) -+ snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", -+ (char *)data_buf, *(nvm_byte_ptr + i)); - - fprintf(stderr, "TAG Data\t\t\t : %s\n", data_buf); - -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 1500ddd3a79f..f591c10e4f2b 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -202,8 +202,15 @@ typedef struct - #define NVM_ACCESS_SET 0x01 - #define TAG_NUM_OFFSET 5 - #define TAG_NUM_2 2 -+#define TAG_NUM_44 44 - #define TAG_BDADDR_OFFSET 7 - -+#define PCM_MS_OFFSET_1 9 -+#define PCM_MS_OFFSET_2 33 -+ -+#define PCM_SLAVE 1 -+#define PCM_MASTER 0 -+#define PCM_ROLE_BIT_OFFSET 4 - #define MAX_RETRY_CNT 1 - #define SELECT_TIMEOUT 3 - -@@ -240,6 +247,7 @@ typedef struct - #define ROME_SKIP_EVT_CC 0x02 - #define ROME_SKIP_EVT_VSE_CC 0x03 - -+#define PCM_CONFIG_FILE_PATH "/etc/bluetooth/pcm.conf" - /****************************************************************************** - ** Local type definitions - ******************************************************************************/ - -From 9eb8220969598d63be3b918b49b6258387629bf3 Mon Sep 17 00:00:00 2001 -From: Rupesh Tatiya -Date: Thu, 29 Jan 2015 15:36:27 +0530 -Subject: [PATCH 13/19] Add support for Tufello 1.1 SOC - -Enable mechanism to download firmware for Tufello 1.1 SOC. -Also, use correct firmware file path for Tufello 1.0. - -Change-Id: I915e48023e45de9e2550336a3de9a07f2b788189 -Signed-off-by: Rupesh Tatiya ---- - tools/hciattach_rome.c | 29 ++++++++++++++++++----------- - tools/hciattach_rome.h | 10 +++++++--- - 2 files changed, 25 insertions(+), 14 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 99866e23e99e..fee36f904e04 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -621,7 +621,7 @@ int rome_edl_set_patch_request(int fd) - -1, PATCH_HDR_LEN + 1); - - /* Total length of the packet to be sent to the Controller */ -- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); -@@ -670,7 +670,7 @@ int rome_edl_patch_download_request(int fd) - index, MAX_DATA_PER_SEGMENT); - - /* Total length of the packet to be sent to the Controller */ -- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Initialize the RSP packet everytime to 0 */ - memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); -@@ -707,7 +707,7 @@ int rome_edl_patch_download_request(int fd) - memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); - - /* Total length of the packet to be sent to the Controller */ -- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); -@@ -824,7 +824,7 @@ int rome_attach_rampatch(int fd) - -1, EDL_PATCH_CMD_LEN); - - /* Total length of the packet to be sent to the Controller */ -- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); - - /* Send HCI Command packet to Controller */ - err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); -@@ -854,7 +854,7 @@ int rome_rampatch_reset(int fd) - -1, EDL_PATCH_CMD_LEN); - - /* Total length of the packet to be sent to the Controller */ -- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); -+ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); - - /* Send HCI Command packet to Controller */ - err = write(fd, cmd, size); -@@ -1058,7 +1058,7 @@ int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc - unsigned char cmd[HCI_MAX_CMD_SIZE]; - unsigned char rsp[HCI_MAX_EVENT_SIZE]; - -- fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d\n", __FUNCTION__, index, seg_size); -+ fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d wait_cc_evt = 0x%x\n", __FUNCTION__, index, seg_size, wait_cc_evt); - - /* Frame the HCI CMD PKT to be sent to Controller*/ - frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); -@@ -1092,6 +1092,7 @@ int rome_tlv_dnld_req(int fd, int tlv_size) - { - int total_segment, remain_size, i, err = -1; - unsigned char wait_cc_evt; -+ unsigned int rom = rome_ver >> 16; - - total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; - remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ -@@ -1132,14 +1133,15 @@ int rome_tlv_dnld_req(int fd, int tlv_size) - - for(i = 0; i < total_segment; i++) { - if((i+1) == total_segment) { -- if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && -+ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && - (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is from 1.1 to 3.1 - * 1. No CCE for the last command segment but all other segment - * 2. All the command segments get VSE including the last one - */ - wait_cc_evt = !remain_size ? FALSE: TRUE; -- } else if ((rome_ver == ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { -+ } else if ((rom == ROME_PATCH_VER_0302) && -+ (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is 3.2 - * 1. None of the command segments receive CCE - * 2. No command segments receive VSE except the last one -@@ -1158,13 +1160,14 @@ int rome_tlv_dnld_req(int fd, int tlv_size) - goto error; - } - -- if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { -+ if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) && -+ (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is from 1.1 to 3.1 - * 1. No CCE for the last command segment but all other segment - * 2. All the command segments get VSE including the last one - */ - wait_cc_evt = remain_size ? FALSE: TRUE; -- } else if ((rome_ver == ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) { -+ } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) { - /* If the Rome version is 3.2 - * 1. None of the command segments receive CCE - * 2. No command segments receive VSE except the last one -@@ -1837,6 +1840,10 @@ int qca_soc_init(int fd, int speed, char *bdaddr) - case TUFELLO_VER_1_0: - rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH; - nvm_file_path = TF_NVM_TLV_1_0_0_PATH; -+ goto download; -+ case TUFELLO_VER_1_1: -+ rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH; -+ nvm_file_path = TF_NVM_TLV_1_0_1_PATH; - - download: - /* Check if user requested for 115200 kbps */ -@@ -1881,7 +1888,7 @@ download: - fprintf(stderr, "HCI Reset Failed !!!\n"); - goto error; - } -- fprintf(stderr, "HCI Reset is done\n"); -+ fprintf(stderr, "HCI Reset is done\n"); - - break; - case ROME_VER_UNKNOWN: -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index f591c10e4f2b..95d5f1e8a5c2 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -238,8 +238,10 @@ typedef struct - #define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" - #define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/qca/rampatch_tlv_3.2.tlv" - #define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/qca/nvm_tlv_3.2.bin" --#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/rampatch_tlv_tf_1.0.tlv" --#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/nvm_tlv_tf_1.0.bin" -+#define TF_RAMPATCH_TLV_1_0_0_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv" -+#define TF_NVM_TLV_1_0_0_PATH "/lib/firmware/qca/nvm_tlv_tf_1.0.bin" -+#define TF_RAMPATCH_TLV_1_0_1_PATH "/lib/firmware/qca/rampatch_tlv_tf_1.1.tlv" -+#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/nvm_tlv_tf_1.1.bin" - - /* This header value in rampatch file decides event handling mechanism in the HOST */ - #define ROME_SKIP_EVT_NONE 0x00 -@@ -357,6 +359,7 @@ enum{ - ROME_SOC_ID_11 = 0x00000011, - ROME_SOC_ID_13 = 0x00000013, - ROME_SOC_ID_22 = 0x00000022, -+ ROME_SOC_ID_23 = 0x00000023, - ROME_SOC_ID_44 = 0x00000044 - }; - -@@ -368,6 +371,7 @@ enum{ - ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ), - ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ), - ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ), -- TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ) + TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ), + TUFELLO_VER_1_1 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_23 ) - }; - #endif /* HW_ROME_H */ - -From f55d710cf43d008e42ce06ead49dc0dfbf97d3a1 Mon Sep 17 00:00:00 2001 -From: Anantha Krishnan -Date: Wed, 4 Feb 2015 12:29:07 +0530 -Subject: [PATCH 14/19] bluetooth: Vote UART CLK ON prior to firmware download - process - -Before starting the firmware download process, vote UART CLK ON -to avoid triggering the dynamic suspend of UART driver. Post -firmware download and in error scenarios vote UART CLK OFF. - -As per design, the UART driver enters into dynamic suspend if -there are no activity on the UART lines for 100ms. Depending upon -the rampatch size, the BT Controller takes time to apply the -downloaded rampatch segments and in sending the vendor specific -event. If the BT Controller takes > 100ms time in sending the -vendor specific event, the UART driver enters into suspend state. - -As a result, UART driver fails to process the last vendor specific -event sent by the BT Controller. The VSE sent by BT Controller -wakes up the UART driver, but the data is not processed causing -firmware download failures. - -Hence, vote UART CLK ON prior to firmware download process and -vote UART CLK OFF post firmware download proess and in error -scenarios. - -Change-Id: I447ded33ad1cfaa020b491effce368fbfe41f894 ---- - tools/hciattach_rome.c | 13 +++++++++++++ - tools/hciattach_rome.h | 2 ++ - 2 files changed, 15 insertions(+) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index fee36f904e04..574ceac6c750 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1762,6 +1762,14 @@ int qca_soc_init(int fd, int speed, char *bdaddr) - int size, local_baud_rate = 0, controller_baud_rate = 0; - - vnd_userial.fd = fd; -+ -+ /* Vote for UART CLK prior to FW download */ -+ err = ioctl(fd, USERIAL_OP_CLK_ON); -+ if (err < 0) { -+ fprintf(stderr, "%s: Failed to vote UART CLK ON\n", __func__); -+ return -1; -+ } -+ - /* Get Rome version information */ - if((err = rome_patch_ver_req(fd)) <0){ - fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); -@@ -1899,5 +1907,10 @@ download: - } - - error: -+ /* Vote UART CLK OFF post to FW download */ -+ err = ioctl(fd, USERIAL_OP_CLK_OFF); -+ if (err < 0) -+ fprintf(stderr, "%s: Failed to vote UART CLK OFF!!!\n", __func__); -+ - return err; - } -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 95d5f1e8a5c2..20264f9978d9 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -42,6 +42,8 @@ - #define BD_ADDR_LEN 6 - #define MSM_ENABLE_FLOW_CTRL 16 - #define MSM_DISABLE_FLOW_CTRL 17 -+#define USERIAL_OP_CLK_ON 0x5441 -+#define USERIAL_OP_CLK_OFF 0x5442 - - unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - typedef enum { - -From b09f8b12c937ec58df0581b2d95493e036c86432 Mon Sep 17 00:00:00 2001 -From: Kamal Negi -Date: Thu, 30 Apr 2015 15:53:06 +0530 -Subject: [PATCH 15/19] Override IBS settings by reading configuration file - -Configure the IBS value in Firmware by reading the -configuration file.This configuration value is -provided in the config file which is read during -the firmware download process and the default -configuration value is overwritten with this value. - -Change-Id: I47992a573b3137ac9bfb80538727981f56b328c4 -Signed-off-by: Kamal Negi ---- - tools/hciattach_rome.c | 42 +++++++++++++++++++++++++++++------------- - tools/hciattach_rome.h | 24 ++++++++++++++++-------- - 2 files changed, 45 insertions(+), 21 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 574ceac6c750..6a3f33867c12 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -922,7 +922,8 @@ int rome_get_tlv_file(char *file_path) - unsigned char data_buf[PRINT_BUF_SIZE]={0,}; - unsigned char *nvm_byte_ptr; - unsigned char bdaddr[6]; -- unsigned short pcm_value; -+ unsigned short pcm_value, ibs_value; -+ - fprintf(stderr, "File Open (%s)\n", file_path); - pFile = fopen ( file_path , "r" ); - if (pFile==NULL) {; -@@ -1008,23 +1009,38 @@ int rome_get_tlv_file(char *file_path) - *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), - *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); - } -+ -+ if (nvm_ptr->tag_id == TAG_NUM_17) { -+ if ((ibs_value = -+ get_value_from_config(FW_CONFIG_FILE_PATH, "IBS")) >= 0) { -+ if (ibs_value == FWCONF_IBS_DISABLE) { -+ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &= -+ (~(FWCONF_IBS_ENABLE << -+ FWCONF_IBS_VAL_BIT)); -+ } else if (ibs_value == FWCONF_IBS_ENABLE) { -+ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] |= -+ (FWCONF_IBS_ENABLE << -+ FWCONF_IBS_VAL_BIT); -+ } -+ } -+ } - /* Read from file and check what PCM Configuration is required: - * Master = 0 /Slave = 1 */ - /* Override PCM configuration */ - if (nvm_ptr->tag_id == TAG_NUM_44) { - if ((pcm_value = -- get_value_from_config(PCM_CONFIG_FILE_PATH, "PCM")) >= 0) { -- -- if (pcm_value == PCM_SLAVE) { -- nvm_byte_ptr[PCM_MS_OFFSET_1] |= -- (1 << PCM_ROLE_BIT_OFFSET); -- nvm_byte_ptr[PCM_MS_OFFSET_2] |= -- (1 << PCM_ROLE_BIT_OFFSET); -- } else if (pcm_value == PCM_MASTER) { -- nvm_byte_ptr[PCM_MS_OFFSET_1] &= -- (~(1 << PCM_ROLE_BIT_OFFSET)); -- nvm_byte_ptr[PCM_MS_OFFSET_2] &= -- (~(1 << PCM_ROLE_BIT_OFFSET)); -+ get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) { -+ -+ if (pcm_value == FWCONF_PCM_SLAVE) { -+ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |= -+ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); -+ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |= -+ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); -+ } else if (pcm_value == FWCONF_PCM_MASTER) { -+ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &= -+ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); -+ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &= -+ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); - } - } - } -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 20264f9978d9..8eaeeed8bc96 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -203,16 +203,24 @@ typedef struct - #define TAG_END 0xFF - #define NVM_ACCESS_SET 0x01 - #define TAG_NUM_OFFSET 5 --#define TAG_NUM_2 2 --#define TAG_NUM_44 44 -+#define TAG_NUM_2 2 -+#define TAG_NUM_17 (17) -+#define TAG_NUM_44 44 - #define TAG_BDADDR_OFFSET 7 - --#define PCM_MS_OFFSET_1 9 --#define PCM_MS_OFFSET_2 33 -+/* FW PCM Configuration */ -+#define FWCONF_PCM_MS_OFFSET_1 9 -+#define FWCONF_PCM_MS_OFFSET_2 33 -+#define FWCONF_PCM_SLAVE 1 -+#define FWCONF_PCM_MASTER 0 -+#define FWCONF_PCM_ROLE_BIT_OFFSET 4 -+ -+/* FW IBS Configuration */ -+#define FWCONF_IBS_DISABLE (0) -+#define FWCONF_IBS_ENABLE (1) -+#define FWCONF_IBS_VAL_BIT (7) -+#define FWCONF_IBS_VAL_OFFSET (0) - --#define PCM_SLAVE 1 --#define PCM_MASTER 0 --#define PCM_ROLE_BIT_OFFSET 4 - #define MAX_RETRY_CNT 1 - #define SELECT_TIMEOUT 3 - -@@ -251,7 +259,7 @@ typedef struct - #define ROME_SKIP_EVT_CC 0x02 - #define ROME_SKIP_EVT_VSE_CC 0x03 - --#define PCM_CONFIG_FILE_PATH "/etc/bluetooth/pcm.conf" -+#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf" - /****************************************************************************** - ** Local type definitions - ******************************************************************************/ - -From b307659dc988054c1fef32c131417cfab2b74c3e Mon Sep 17 00:00:00 2001 -From: Dibyendu Roy -Date: Fri, 22 May 2015 18:57:05 +0530 -Subject: [PATCH 16/19] bluetooth: Fix flow control operation - -Flow off operation was not actually happening at the UART line level, -since the argument passed was not being used correctly. As a result, -sometimes command complete and VS event were sent by BT SOC even -before the local UART Controller could change its baud rate to the -newer one(3 Mbps). This led to VS event being processed -incorrectly which in turn causes baud rate change to fail. - -CRs-Fixed: 844730 -Change-Id: I06d8c4ed7807aa47dd5498642c7a23c9189a1cff -Signed-off-by: Dibyendu Roy ---- - tools/hciattach_rome.c | 6 +++--- - tools/hciattach_rome.h | 4 ++-- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 6a3f33867c12..0d7014f1d2f6 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1544,10 +1544,10 @@ static void flow_control(int fd, int opt) - c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ - c_opt.c_cflag &= ~CSIZE; - c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); -- if (MSM_ENABLE_FLOW_CTRL) -+ if (opt == MSM_ENABLE_FLOW_CTRL) - c_opt.c_cflag |= CRTSCTS; -- else if (MSM_DISABLE_FLOW_CTRL) -- c_opt.c_cflag |= ~CRTSCTS; -+ else if (opt == MSM_DISABLE_FLOW_CTRL) -+ c_opt.c_cflag &= ~CRTSCTS; - else { - fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); - return; -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 8eaeeed8bc96..3fdaf208e522 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -40,8 +40,8 @@ - #define NVITEM_SIZE 2 - #define PERSIST_HEADER_LEN 3 - #define BD_ADDR_LEN 6 --#define MSM_ENABLE_FLOW_CTRL 16 --#define MSM_DISABLE_FLOW_CTRL 17 -+#define MSM_DISABLE_FLOW_CTRL 0 -+#define MSM_ENABLE_FLOW_CTRL 1 - #define USERIAL_OP_CLK_ON 0x5441 - #define USERIAL_OP_CLK_OFF 0x5442 - - -From bec6be1174e250c60b48b51933ab6f80a27a093e Mon Sep 17 00:00:00 2001 -From: Dibyendu Roy -Date: Thu, 11 Jun 2015 12:07:43 +0530 -Subject: [PATCH 17/19] Adding MDM specific code under _PLATFORM_MDM_ - -This patch is added to comment out the commit -84cc0e12983b5761c67789ef93fd6fb164c7314d in x86 as -dynamic suspend feature is not available in x86. However, -this code shall be active for MDM platform due to -dynamic suspend feature. - -Change-Id: I998f0521b4a5f9744412db40f2c2d3bff2ac3d11 ---- - tools/hciattach_rome.c | 5 ++++- - tools/hciattach_rome.h | 3 +++ - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 0d7014f1d2f6..1891de24e21a 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -1779,13 +1779,14 @@ int qca_soc_init(int fd, int speed, char *bdaddr) - - vnd_userial.fd = fd; - -+#ifdef _PLATFORM_MDM_ - /* Vote for UART CLK prior to FW download */ - err = ioctl(fd, USERIAL_OP_CLK_ON); - if (err < 0) { - fprintf(stderr, "%s: Failed to vote UART CLK ON\n", __func__); - return -1; - } -- -+#endif - /* Get Rome version information */ - if((err = rome_patch_ver_req(fd)) <0){ - fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); -@@ -1923,10 +1924,12 @@ download: - } - - error: -+#ifdef _PLATFORM_MDM_ - /* Vote UART CLK OFF post to FW download */ - err = ioctl(fd, USERIAL_OP_CLK_OFF); - if (err < 0) - fprintf(stderr, "%s: Failed to vote UART CLK OFF!!!\n", __func__); -+#endif - - return err; - } -diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h -index 3fdaf208e522..89f7db3bef86 100644 ---- a/tools/hciattach_rome.h -+++ b/tools/hciattach_rome.h -@@ -42,8 +42,11 @@ - #define BD_ADDR_LEN 6 - #define MSM_DISABLE_FLOW_CTRL 0 - #define MSM_ENABLE_FLOW_CTRL 1 -+ -+#ifdef _PLATFORM_MDM_ - #define USERIAL_OP_CLK_ON 0x5441 - #define USERIAL_OP_CLK_OFF 0x5442 -+#endif - - unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - typedef enum { - -From 5ab2a193c11eaa8a68a0e060a560a5bd2ee2459c Mon Sep 17 00:00:00 2001 -From: Dibyendu Roy -Date: Mon, 6 Jul 2015 13:30:53 +0530 -Subject: [PATCH 18/19] Bluetooth: Fix static analysis issues - -Change-Id: Ida91f012544c39a8aaa6e7db23f1d5b68d3bec08 ---- - tools/hciattach_rome.c | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c -index 1891de24e21a..59bdc16e4e8f 100644 ---- a/tools/hciattach_rome.c -+++ b/tools/hciattach_rome.c -@@ -933,7 +933,13 @@ int rome_get_tlv_file(char *file_path) - - /* Get File Size */ - fseek (pFile , 0 , SEEK_END); -- fileSize = ftell (pFile); -+ -+ if((fileSize = ftell(pFile)) < 0) { -+ fprintf(stderr, "%s: fail to get current file position\n", file_path); -+ fclose (pFile); -+ return -1; -+ } -+ - rewind (pFile); - - pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); -@@ -1107,7 +1113,7 @@ int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc - int rome_tlv_dnld_req(int fd, int tlv_size) - { - int total_segment, remain_size, i, err = -1; -- unsigned char wait_cc_evt; -+ unsigned char wait_cc_evt = FALSE; - unsigned int rom = rome_ver >> 16; - - total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; - -From ca52faad6e23bee353e3315f136efb43d1e9d143 Mon Sep 17 00:00:00 2001 -From: Kamal Negi -Date: Fri, 8 May 2015 15:01:02 +0530 -Subject: [PATCH 19/19] Handle NULL Pointer derefrencing in AVRCP Target role - -Check NULL pointer to AVRCP controller role initialized or not. -If remote device don't support the AVRCP target role, then HOST dont -initialize AVRCP controller role and directly dereference the controller -role and segfault happens. - -Change-Id: Ibbb9452f17a576c3a79a53ea72e0211982752144 -Signed-off-by: Kamal Negi ---- - profiles/audio/avrcp.c | 27 ++++++++++++++++++++++----- - 1 file changed, 22 insertions(+), 5 deletions(-) - -diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c -index c100149acf42..d8cb0ed96a1f 100644 ---- a/profiles/audio/avrcp.c -+++ b/profiles/audio/avrcp.c -@@ -2082,13 +2082,19 @@ static gboolean avrcp_get_play_status_rsp(struct avctp *conn, uint8_t code, - void *user_data) - { - struct avrcp *session = user_data; -- struct avrcp_player *player = session->controller->player; -- struct media_player *mp = player->user_data; -+ struct avrcp_player *player; -+ struct media_player *mp; - struct avrcp_header *pdu = (void *) operands; - uint32_t duration; - uint32_t position; - uint8_t status; - -+ if (!session || !session->controller) -+ return FALSE; -+ -+ player = session->controller->player; -+ mp = player->user_data; -+ - if (pdu == NULL || code == AVC_CTYPE_REJECTED || - ntohs(pdu->params_len) != 9) - return FALSE; -@@ -2146,12 +2152,18 @@ static gboolean avrcp_player_value_rsp(struct avctp *conn, uint8_t code, - void *user_data) - { - struct avrcp *session = user_data; -- struct avrcp_player *player = session->controller->player; -- struct media_player *mp = player->user_data; -+ struct avrcp_player *player; -+ struct media_player *mp; - struct avrcp_header *pdu = (void *) operands; - uint8_t count; - int i; - -+ if (!session || !session->controller) -+ return FALSE; -+ -+ player = session->controller->player; -+ mp = player->user_data; -+ - if (pdu == NULL) { - media_player_set_setting(mp, "Error", "Timeout"); - return FALSE; -@@ -2303,10 +2315,15 @@ static gboolean avrcp_get_element_attributes_rsp(struct avctp *conn, - void *user_data) - { - struct avrcp *session = user_data; -- struct avrcp_player *player = session->controller->player; -+ struct avrcp_player *player; - struct avrcp_header *pdu = (void *) operands; - uint8_t count; - -+ if (!session || !session->controller) -+ return FALSE; -+ -+ player = session->controller->player; -+ - if (code == AVC_CTYPE_REJECTED) - return FALSE; - ++}; ++#endif /* HW_ROME_H */ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0013-hciattach_rome-Respect-the-user-indication-for-noflo.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0005-hciattach_rome-Respect-the-user-indication-for-noflo.patch similarity index 95% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0013-hciattach_rome-Respect-the-user-indication-for-noflo.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0005-hciattach_rome-Respect-the-user-indication-for-noflo.patch index e5d76303a..20d79ab56 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0013-hciattach_rome-Respect-the-user-indication-for-noflo.patch +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0005-hciattach_rome-Respect-the-user-indication-for-noflo.patch @@ -1,6 +1,6 @@ -From: Alex Gonzalez -Date: Thu, 6 Apr 2017 09:27:09 +0200 -Subject: [PATCH] hciattach_rome: Respect the user indication for noflow +From: Jose Diaz de Grenu +Date: Mon, 8 Jan 2018 10:30:18 +0100 +Subject: [PATCH 2/4] hciattach_rome: Respect the user indication for noflow When hciattach is called with noflow, it should not assume the hardware supports hardware flow control. @@ -9,6 +9,7 @@ Basically, use 'flow' or 'noflow' on the hciattach command line arguments to indicate whether to use or not hardware flow control. Signed-off-by: Alex Gonzalez +Signed-off-by: Jose Diaz de Grenu --- tools/hciattach.c | 2 +- tools/hciattach.h | 2 +- @@ -30,10 +31,10 @@ index dda639cabca3..81d78ab3f69a 100644 static int qualcomm(int fd, struct uart_t *u, struct termios *ti) diff --git a/tools/hciattach.h b/tools/hciattach.h -index 49e59321fcac..3524e716c847 100644 +index 481e3a65f685..5f2764cca0b0 100644 --- a/tools/hciattach.h +++ b/tools/hciattach.h -@@ -64,7 +64,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, +@@ -67,7 +67,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti); int ath3k_post(int fd, int pm); int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0014-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0006-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch similarity index 96% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0014-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0006-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch index 208f587a2..49c58975b 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0014-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0006-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch @@ -1,11 +1,12 @@ -From: Alex Gonzalez -Date: Thu, 6 Apr 2017 14:37:57 +0200 -Subject: [PATCH] hciattach: If the user supplies a bdaddr, use it +From: Jose Diaz de Grenu +Date: Mon, 8 Jan 2018 10:30:27 +0100 +Subject: [PATCH 3/4] hciattach: If the user supplies a bdaddr, use it The QCA6564 has no non-volatile configuration file for the bluetooth MAC, so use the one supplied on the command line. Signed-off-by: Alex Gonzalez +Signed-off-by: Jose Diaz de Grenu --- tools/hciattach.c | 4 +-- tools/hciattach_rome.c | 76 ++++++++++---------------------------------------- diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0015-hciattach-Add-verbosity-option.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0007-hciattach-Add-verbosity-option.patch similarity index 99% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0015-hciattach-Add-verbosity-option.patch rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0007-hciattach-Add-verbosity-option.patch index d1e540a92..790d248bb 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/0015-hciattach-Add-verbosity-option.patch +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/0007-hciattach-Add-verbosity-option.patch @@ -1,10 +1,11 @@ -From: Alex Gonzalez -Date: Mon, 10 Apr 2017 12:44:00 +0200 -Subject: [PATCH] hciattach: Add verbosity option +From: Jose Diaz de Grenu +Date: Mon, 8 Jan 2018 10:30:49 +0100 +Subject: [PATCH 4/4] hciattach: Add verbosity option And reduce the verbosity of the hciattach_rome plugin. Signed-off-by: Alex Gonzalez +Signed-off-by: Jose Diaz de Grenu --- lib/bluetooth.h | 3 + tools/hciattach.c | 13 ++- diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6qpsbc/bluetooth-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6qpsbc/bluetooth-init similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6qpsbc/bluetooth-init rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6qpsbc/bluetooth-init diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6qpsbc/main.conf b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6qpsbc/main.conf similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6qpsbc/main.conf rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6qpsbc/main.conf diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6sbc/bluetooth-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6sbc/bluetooth-init similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6sbc/bluetooth-init rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6sbc/bluetooth-init diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6sbc/main.conf b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6sbc/main.conf similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6sbc/main.conf rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6sbc/main.conf diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6ul/bluetooth-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6ul/bluetooth-init similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6ul/bluetooth-init rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6ul/bluetooth-init diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6ul/main.conf b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6ul/main.conf similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5-5.41/ccimx6ul/main.conf rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.46/ccimx6ul/main.conf diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.41.bbappend b/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.46.bbappend similarity index 50% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5_5.41.bbappend rename to meta-digi-dey/recipes-connectivity/bluez/bluez5_5.46.bbappend index 2c7439747..03a6d6d7c 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.41.bbappend +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.46.bbappend @@ -8,21 +8,13 @@ SRC_URI += " \ file://0001-hcitool-do-not-show-unsupported-refresh-option.patch \ file://0002-hcitool-increase-the-shown-connection-limit-to-20.patch \ file://0003-port-test-discovery-to-python3.patch \ - file://0004-example-gatt-server-update-example-to-master-version.patch \ - file://0005-core-Prefer-BR-EDR-over-LE-if-it-set-in-advertisemen.patch \ - file://0006-core-device-Fix-not-connecting-services-properly.patch \ - file://0007-core-device-Fix-marking-auto-connect-flag.patch \ - file://0008-core-device-Prefer-bonded-bearers-when-connecting.patch \ - file://0009-input-hog-Use-.accept-and-.disconnect-instead-of-att.patch \ - file://0010-src-device-Free-bonding-while-failed-to-pair-device.patch \ - file://0011-core-Fix-BR-EDR-pairing-for-dual-mode-devices.patch \ " QCA6564_COMMON_PATCHES = " \ - file://0012-QCA_bluetooth_chip_support.patch \ - file://0013-hciattach_rome-Respect-the-user-indication-for-noflo.patch \ - file://0014-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch \ - file://0015-hciattach-Add-verbosity-option.patch \ + file://0004-QCA_bluetooth_chip_support.patch \ + file://0005-hciattach_rome-Respect-the-user-indication-for-noflo.patch \ + file://0006-hciattach-If-the-user-supplies-a-bdaddr-use-it.patch \ + file://0007-hciattach-Add-verbosity-option.patch \ " SRC_URI_append_ccimx6ul = " ${QCA6564_COMMON_PATCHES}" @@ -30,14 +22,14 @@ SRC_URI_append_ccimx6qpsbc = " ${QCA6564_COMMON_PATCHES}" inherit update-rc.d -PACKAGECONFIG_append = " experimental" +PACKAGECONFIG_append = " testing" do_install_append() { install -d ${D}${sysconfdir}/init.d/ install -m 0755 ${WORKDIR}/bluetooth-init ${D}${sysconfdir}/init.d/bluetooth-init install -m 0644 ${WORKDIR}/main.conf ${D}${sysconfdir}/bluetooth/ - if [ -n "${@bb.utils.contains('PACKAGECONFIG', 'experimental', 'experimental', '', d)}" ]; then - sed -i '/^SSD_OPTIONS/a SSD_OPTIONS="${SSD_OPTIONS} --experimental"' ${D}${INIT_D_DIR}/bluetooth + if [ -n "${@bb.utils.contains('PACKAGECONFIG', 'testing', 'testing', '', d)}" ]; then + sed -i '/^SSD_OPTIONS/a SSD_OPTIONS="${SSD_OPTIONS} --testing"' ${D}${INIT_D_DIR}/bluetooth fi }