Diff between 38e393d00f29830500b772c32e95f47ef1fa899c and d0f812651929ba36de26abfd12e43e9901184c42

Changed Files

File Additions Deletions Status
monitor/packet.c +60 -0 modified

Full Patch

diff --git a/monitor/packet.c b/monitor/packet.c
index 8b1ee9b..c5a6656 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)