monitor: Close the mgmt channel if control tracing is available
diff --git a/monitor/control.c b/monitor/control.c
index 26aecfd..f6b2291 100644
--- a/monitor/control.c
+++ b/monitor/control.c
@@ -57,6 +57,7 @@
 
 static struct btsnoop *btsnoop_file = NULL;
 static bool hcidump_fallback = false;
+static int mgmt_control_fd = -1;
 
 struct control_data {
 	uint16_t channel;
@@ -1043,7 +1044,7 @@
 
 	mainloop_add_fd(data->fd, EPOLLIN, data_callback, data, free_data);
 
-	return 0;
+	return data->fd;
 }
 
 static void client_callback(int fd, uint32_t events, void *user_data)
@@ -1446,7 +1447,16 @@
 		return 0;
 	}
 
-	open_channel(HCI_CHANNEL_CONTROL);
+	mgmt_control_fd = open_channel(HCI_CHANNEL_CONTROL);
 
 	return 0;
 }
+
+void control_disable_legacy(void)
+{
+	if (mgmt_control_fd < 0)
+		return;
+
+	close(mgmt_control_fd);
+	mgmt_control_fd = -1;
+}
diff --git a/monitor/control.h b/monitor/control.h
index 55384db..05db635 100644
--- a/monitor/control.h
+++ b/monitor/control.h
@@ -29,5 +29,6 @@
 void control_server(const char *path);
 int control_tty(const char *path, unsigned int speed);
 int control_tracing(void);
+void control_disable_legacy(void);
 
 void control_message(uint16_t opcode, const void *data, uint16_t size);
diff --git a/monitor/packet.c b/monitor/packet.c
index 42bcf69..e708507 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -3894,6 +3894,7 @@
 					data + sizeof(*ul) + ul->ident_len);
 		break;
 	case BTSNOOP_OPCODE_CTRL_OPEN:
+		control_disable_legacy();
 		packet_ctrl_open(tv, cred, index, data, size);
 		break;
 	case BTSNOOP_OPCODE_CTRL_CLOSE: