From d0f812651929ba36de26abfd12e43e9901184c42 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 30 Jan 2015 07:08:44 +0100 Subject: [PATCH] monitor: Decode Broadcom firmware and build information --- monitor/packet.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/monitor/packet.c b/monitor/packet.c index 8b1ee9b0b..c5a6656b5 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -2380,6 +2380,63 @@ static void print_manufacturer(uint16_t manufacturer) packet_print_company("Manufacturer", le16_to_cpu(manufacturer)); } +static const struct { + uint16_t ver; + const char *str; +} broadcom_subversion_table[] = { + { 0x210b, "BCM43142A0" }, /* 001.001.011 */ + { 0x2112, "BCM4314A0" }, /* 001.001.018 */ + { 0x2118, "BCM20702A0" }, /* 001.001.024 */ + { 0x2126, "BCM4335A0" }, /* 001.001.038 */ + { 0x220e, "BCM20702A1" }, /* 001.002.014 */ + { 0x230f, "BCM4354A2" }, /* 001.003.015 */ + { 0x4106, "BCM4335B0" }, /* 002.001.006 */ + { 0x410e, "BCM20702B0" }, /* 002.001.014 */ + { 0x6109, "BCM4335C0" }, /* 003.001.009 */ + { 0x610c, "BCM4354" }, /* 003.001.012 */ + { } +}; + +static void print_manufacturer_subversion(uint16_t manufacturer, + uint16_t subversion) +{ + uint16_t ver = le16_to_cpu(subversion); + const char *str = NULL; + int i; + + switch (le16_to_cpu(manufacturer)) { + case 15: + for (i = 0; broadcom_subversion_table[i].str; i++) { + if (broadcom_subversion_table[i].ver == ver) { + str = broadcom_subversion_table[i].str; + break; + } + } + + if (str) + print_field(" Firmware: %3.3u.%3.3u.%3.3u (%s)", + (ver & 0x7000) >> 13, + (ver & 0x1f00) >> 8, ver & 0x00ff, str); + else + print_field(" Firmware: %3.3u.%3.3u.%3.3u", + (ver & 0x7000) >> 13, + (ver & 0x1f00) >> 8, ver & 0x00ff); + break; + } +} + +static void print_manufacturer_revision(uint16_t manufacturer, + uint16_t revision) +{ + uint16_t rev = le16_to_cpu(revision); + + switch (le16_to_cpu(manufacturer)) { + case 15: + print_field(" Build: %4.4u", rev & 0x0fff); + break; + } +} + static const char *get_supported_command(int bit); static void print_commands(const uint8_t *commands) @@ -5333,6 +5390,8 @@ static void read_local_version_rsp(const void *data, uint8_t size) } print_manufacturer(rsp->manufacturer); + print_manufacturer_subversion(rsp->manufacturer, rsp->lmp_subver); + print_manufacturer_revision(rsp->manufacturer, rsp->hci_rev); } static void read_local_commands_rsp(const void *data, uint8_t size) @@ -7176,6 +7235,7 @@ static void remote_version_complete_evt(const void *data, uint8_t size) print_handle(evt->handle); print_lmp_version(evt->lmp_ver, evt->lmp_subver); print_manufacturer(evt->manufacturer); + print_manufacturer_subversion(evt->manufacturer, evt->lmp_subver); } static void qos_setup_complete_evt(const void *data, uint8_t size) -- 2.47.3