|
|
218e99 |
From bc5c67b27d0c1d8ec6c4d09352f0de6b6cbddad0 Mon Sep 17 00:00:00 2001
|
|
|
218e99 |
From: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
Date: Mon, 16 Sep 2013 14:38:24 +0200
|
|
|
218e99 |
Subject: [PATCH 16/29] Preparation for usb-bt-dongle conditional build
|
|
|
218e99 |
|
|
|
218e99 |
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
Message-id: <0b3a39c76eac58a1b2f9f6c84016f234de0940c0.1379325610.git.mrezanin@redhat.com>
|
|
|
218e99 |
Patchwork-id: 54394
|
|
|
218e99 |
O-Subject: [RHEL7 qemu-kvm PATCH 1/2] Preparation for usb-bt-dongle conditional build
|
|
|
218e99 |
Bugzilla: 1001131
|
|
|
218e99 |
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
218e99 |
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
|
|
218e99 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
218e99 |
|
|
|
218e99 |
From: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
|
|
|
218e99 |
To allow disable usb-bt-dongle device using CONFIG_BLUETOOTH option, some of
|
|
|
218e99 |
functions in vl.c file has to be made accessible in dev-bluetooth.c. This is
|
|
|
218e99 |
pure code moving.
|
|
|
218e99 |
|
|
|
218e99 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
218e99 |
(cherry picked from commit 644e1a8a34d2f799bfeefae94b71593a2aa662ae)
|
|
|
218e99 |
---
|
|
|
218e99 |
hw/bt/core.c | 23 +++++++++++++++++++
|
|
|
218e99 |
hw/bt/hci.c | 48 +++++++++++++++++++++++++++++++++++++++
|
|
|
218e99 |
include/hw/bt.h | 3 +++
|
|
|
218e99 |
vl.c | 69 ---------------------------------------------------------
|
|
|
218e99 |
4 files changed, 74 insertions(+), 69 deletions(-)
|
|
|
218e99 |
|
|
|
218e99 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
---
|
|
|
218e99 |
hw/bt/core.c | 23 ++++++++++++++++++
|
|
|
218e99 |
hw/bt/hci.c | 48 ++++++++++++++++++++++++++++++++++++++
|
|
|
218e99 |
include/hw/bt.h | 3 ++
|
|
|
218e99 |
vl.c | 69 -------------------------------------------------------
|
|
|
218e99 |
4 files changed, 74 insertions(+), 69 deletions(-)
|
|
|
218e99 |
|
|
|
218e99 |
diff --git a/hw/bt/core.c b/hw/bt/core.c
|
|
|
218e99 |
index 49012e0..0ffc948 100644
|
|
|
218e99 |
--- a/hw/bt/core.c
|
|
|
218e99 |
+++ b/hw/bt/core.c
|
|
|
218e99 |
@@ -119,3 +119,26 @@ void bt_device_done(struct bt_device_s *dev)
|
|
|
218e99 |
|
|
|
218e99 |
*p = dev->next;
|
|
|
218e99 |
}
|
|
|
218e99 |
+
|
|
|
218e99 |
+static struct bt_vlan_s {
|
|
|
218e99 |
+ struct bt_scatternet_s net;
|
|
|
218e99 |
+ int id;
|
|
|
218e99 |
+ struct bt_vlan_s *next;
|
|
|
218e99 |
+} *first_bt_vlan;
|
|
|
218e99 |
+
|
|
|
218e99 |
+/* find or alloc a new bluetooth "VLAN" */
|
|
|
218e99 |
+struct bt_scatternet_s *qemu_find_bt_vlan(int id)
|
|
|
218e99 |
+{
|
|
|
218e99 |
+ struct bt_vlan_s **pvlan, *vlan;
|
|
|
218e99 |
+ for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
|
|
|
218e99 |
+ if (vlan->id == id)
|
|
|
218e99 |
+ return &vlan->net;
|
|
|
218e99 |
+ }
|
|
|
218e99 |
+ vlan = g_malloc0(sizeof(struct bt_vlan_s));
|
|
|
218e99 |
+ vlan->id = id;
|
|
|
218e99 |
+ pvlan = &first_bt_vlan;
|
|
|
218e99 |
+ while (*pvlan != NULL)
|
|
|
218e99 |
+ pvlan = &(*pvlan)->next;
|
|
|
218e99 |
+ *pvlan = vlan;
|
|
|
218e99 |
+ return &vlan->net;
|
|
|
218e99 |
+}
|
|
|
218e99 |
diff --git a/hw/bt/hci.c b/hw/bt/hci.c
|
|
|
218e99 |
index b53cd5d..64e1745 100644
|
|
|
218e99 |
--- a/hw/bt/hci.c
|
|
|
218e99 |
+++ b/hw/bt/hci.c
|
|
|
218e99 |
@@ -429,6 +429,24 @@ static const uint8_t bt_event_reserved_mask[8] = {
|
|
|
218e99 |
0xff, 0x9f, 0xfb, 0xff, 0x07, 0x18, 0x00, 0x00,
|
|
|
218e99 |
};
|
|
|
218e99 |
|
|
|
218e99 |
+
|
|
|
218e99 |
+static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
|
|
|
218e99 |
+{
|
|
|
218e99 |
+}
|
|
|
218e99 |
+
|
|
|
218e99 |
+static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
|
|
|
218e99 |
+{
|
|
|
218e99 |
+ return -ENOTSUP;
|
|
|
218e99 |
+}
|
|
|
218e99 |
+
|
|
|
218e99 |
+struct HCIInfo null_hci = {
|
|
|
218e99 |
+ .cmd_send = null_hci_send,
|
|
|
218e99 |
+ .sco_send = null_hci_send,
|
|
|
218e99 |
+ .acl_send = null_hci_send,
|
|
|
218e99 |
+ .bdaddr_set = null_hci_addr_set,
|
|
|
218e99 |
+};
|
|
|
218e99 |
+
|
|
|
218e99 |
+
|
|
|
218e99 |
static inline uint8_t *bt_hci_event_start(struct bt_hci_s *hci,
|
|
|
218e99 |
int evt, int len)
|
|
|
218e99 |
{
|
|
|
218e99 |
@@ -2176,6 +2194,36 @@ struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net)
|
|
|
218e99 |
return &s->info;
|
|
|
218e99 |
}
|
|
|
218e99 |
|
|
|
218e99 |
+struct HCIInfo *hci_init(const char *str)
|
|
|
218e99 |
+{
|
|
|
218e99 |
+ char *endp;
|
|
|
218e99 |
+ struct bt_scatternet_s *vlan = 0;
|
|
|
218e99 |
+
|
|
|
218e99 |
+ if (!strcmp(str, "null"))
|
|
|
218e99 |
+ /* null */
|
|
|
218e99 |
+ return &null_hci;
|
|
|
218e99 |
+ else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
|
|
|
218e99 |
+ /* host[:hciN] */
|
|
|
218e99 |
+ return bt_host_hci(str[4] ? str + 5 : "hci0");
|
|
|
218e99 |
+ else if (!strncmp(str, "hci", 3)) {
|
|
|
218e99 |
+ /* hci[,vlan=n] */
|
|
|
218e99 |
+ if (str[3]) {
|
|
|
218e99 |
+ if (!strncmp(str + 3, ",vlan=", 6)) {
|
|
|
218e99 |
+ vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
|
|
|
218e99 |
+ if (*endp)
|
|
|
218e99 |
+ vlan = 0;
|
|
|
218e99 |
+ }
|
|
|
218e99 |
+ } else
|
|
|
218e99 |
+ vlan = qemu_find_bt_vlan(0);
|
|
|
218e99 |
+ if (vlan)
|
|
|
218e99 |
+ return bt_new_hci(vlan);
|
|
|
218e99 |
+ }
|
|
|
218e99 |
+
|
|
|
218e99 |
+ fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
|
|
|
218e99 |
+
|
|
|
218e99 |
+ return 0;
|
|
|
218e99 |
+}
|
|
|
218e99 |
+
|
|
|
218e99 |
static void bt_hci_done(struct HCIInfo *info)
|
|
|
218e99 |
{
|
|
|
218e99 |
struct bt_hci_s *hci = hci_from_info(info);
|
|
|
218e99 |
diff --git a/include/hw/bt.h b/include/hw/bt.h
|
|
|
218e99 |
index 830af94..49a9d03 100644
|
|
|
218e99 |
--- a/include/hw/bt.h
|
|
|
218e99 |
+++ b/include/hw/bt.h
|
|
|
218e99 |
@@ -108,12 +108,15 @@ struct bt_device_s {
|
|
|
218e99 |
uint16_t clkoff; /* Note: Always little-endian */
|
|
|
218e99 |
};
|
|
|
218e99 |
|
|
|
218e99 |
+extern struct HCIInfo null_hci;
|
|
|
218e99 |
/* bt.c */
|
|
|
218e99 |
void bt_device_init(struct bt_device_s *dev, struct bt_scatternet_s *net);
|
|
|
218e99 |
void bt_device_done(struct bt_device_s *dev);
|
|
|
218e99 |
+struct bt_scatternet_s *qemu_find_bt_vlan(int id);
|
|
|
218e99 |
|
|
|
218e99 |
/* bt-hci.c */
|
|
|
218e99 |
struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net);
|
|
|
218e99 |
+struct HCIInfo *hci_init(const char *str);
|
|
|
218e99 |
|
|
|
218e99 |
/* bt-vhci.c */
|
|
|
218e99 |
void bt_vhci_init(struct HCIInfo *info);
|
|
|
218e99 |
diff --git a/vl.c b/vl.c
|
|
|
218e99 |
index 24536b5..d022f50 100644
|
|
|
218e99 |
--- a/vl.c
|
|
|
218e99 |
+++ b/vl.c
|
|
|
218e99 |
@@ -844,45 +844,6 @@ static int nb_hcis;
|
|
|
218e99 |
static int cur_hci;
|
|
|
218e99 |
static struct HCIInfo *hci_table[MAX_NICS];
|
|
|
218e99 |
|
|
|
218e99 |
-static struct bt_vlan_s {
|
|
|
218e99 |
- struct bt_scatternet_s net;
|
|
|
218e99 |
- int id;
|
|
|
218e99 |
- struct bt_vlan_s *next;
|
|
|
218e99 |
-} *first_bt_vlan;
|
|
|
218e99 |
-
|
|
|
218e99 |
-/* find or alloc a new bluetooth "VLAN" */
|
|
|
218e99 |
-static struct bt_scatternet_s *qemu_find_bt_vlan(int id)
|
|
|
218e99 |
-{
|
|
|
218e99 |
- struct bt_vlan_s **pvlan, *vlan;
|
|
|
218e99 |
- for (vlan = first_bt_vlan; vlan != NULL; vlan = vlan->next) {
|
|
|
218e99 |
- if (vlan->id == id)
|
|
|
218e99 |
- return &vlan->net;
|
|
|
218e99 |
- }
|
|
|
218e99 |
- vlan = g_malloc0(sizeof(struct bt_vlan_s));
|
|
|
218e99 |
- vlan->id = id;
|
|
|
218e99 |
- pvlan = &first_bt_vlan;
|
|
|
218e99 |
- while (*pvlan != NULL)
|
|
|
218e99 |
- pvlan = &(*pvlan)->next;
|
|
|
218e99 |
- *pvlan = vlan;
|
|
|
218e99 |
- return &vlan->net;
|
|
|
218e99 |
-}
|
|
|
218e99 |
-
|
|
|
218e99 |
-static void null_hci_send(struct HCIInfo *hci, const uint8_t *data, int len)
|
|
|
218e99 |
-{
|
|
|
218e99 |
-}
|
|
|
218e99 |
-
|
|
|
218e99 |
-static int null_hci_addr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
|
|
|
218e99 |
-{
|
|
|
218e99 |
- return -ENOTSUP;
|
|
|
218e99 |
-}
|
|
|
218e99 |
-
|
|
|
218e99 |
-static struct HCIInfo null_hci = {
|
|
|
218e99 |
- .cmd_send = null_hci_send,
|
|
|
218e99 |
- .sco_send = null_hci_send,
|
|
|
218e99 |
- .acl_send = null_hci_send,
|
|
|
218e99 |
- .bdaddr_set = null_hci_addr_set,
|
|
|
218e99 |
-};
|
|
|
218e99 |
-
|
|
|
218e99 |
struct HCIInfo *qemu_next_hci(void)
|
|
|
218e99 |
{
|
|
|
218e99 |
if (cur_hci == nb_hcis)
|
|
|
218e99 |
@@ -891,36 +852,6 @@ struct HCIInfo *qemu_next_hci(void)
|
|
|
218e99 |
return hci_table[cur_hci++];
|
|
|
218e99 |
}
|
|
|
218e99 |
|
|
|
218e99 |
-static struct HCIInfo *hci_init(const char *str)
|
|
|
218e99 |
-{
|
|
|
218e99 |
- char *endp;
|
|
|
218e99 |
- struct bt_scatternet_s *vlan = 0;
|
|
|
218e99 |
-
|
|
|
218e99 |
- if (!strcmp(str, "null"))
|
|
|
218e99 |
- /* null */
|
|
|
218e99 |
- return &null_hci;
|
|
|
218e99 |
- else if (!strncmp(str, "host", 4) && (str[4] == '\0' || str[4] == ':'))
|
|
|
218e99 |
- /* host[:hciN] */
|
|
|
218e99 |
- return bt_host_hci(str[4] ? str + 5 : "hci0");
|
|
|
218e99 |
- else if (!strncmp(str, "hci", 3)) {
|
|
|
218e99 |
- /* hci[,vlan=n] */
|
|
|
218e99 |
- if (str[3]) {
|
|
|
218e99 |
- if (!strncmp(str + 3, ",vlan=", 6)) {
|
|
|
218e99 |
- vlan = qemu_find_bt_vlan(strtol(str + 9, &endp, 0));
|
|
|
218e99 |
- if (*endp)
|
|
|
218e99 |
- vlan = 0;
|
|
|
218e99 |
- }
|
|
|
218e99 |
- } else
|
|
|
218e99 |
- vlan = qemu_find_bt_vlan(0);
|
|
|
218e99 |
- if (vlan)
|
|
|
218e99 |
- return bt_new_hci(vlan);
|
|
|
218e99 |
- }
|
|
|
218e99 |
-
|
|
|
218e99 |
- fprintf(stderr, "qemu: Unknown bluetooth HCI `%s'.\n", str);
|
|
|
218e99 |
-
|
|
|
218e99 |
- return 0;
|
|
|
218e99 |
-}
|
|
|
218e99 |
-
|
|
|
218e99 |
static int bt_hci_parse(const char *str)
|
|
|
218e99 |
{
|
|
|
218e99 |
struct HCIInfo *hci;
|
|
|
218e99 |
--
|
|
|
218e99 |
1.7.1
|
|
|
218e99 |
|