Bluetooth compatible list

i have 2 chinese clones i got for 6 euros both. one is marked CSR 4.0 and the other just V5.1. The V5.1 seems to somehow work (except the post above). The 4.0 one fails with the default net.bluetooth.usb_isoc_enable=1 but somehow works with it set to 0. (starting isosynchronous transfers on it fucks it up)
The CSR 4.0 one's default inquiry mode is set to extended and it seems the inquiry results come back as inquiry+rssi mode which is not supported by hccontrol so it needs some more hacking.
write inquiry mode is not supported by hccontrol either so i can't change it to 0 (standard inq)

this the data for the "CSR 4.0" one
Code:
[root@hp14 /usr/src/usr.sbin/bluetooth/hccontrol]#  hccontrol -n ubt0hci read_local_version_information
HCI version: Bluetooth HCI Specification 5.0 [0x9]
HCI revision: 0x810
LMP version: Bluetooth LMP 5.0 [0x9]
LMP sub-version: 0x2312
Manufacturer: Qualcomm Technologies International, Ltd. (QTIL) [0x0a]

usb data
  bLength = 0x0012
  bDescriptorType = 0x0001
  bcdUSB = 0x0200
  bDeviceClass = 0x00e0  <Wireless controller>
  bDeviceSubClass = 0x0001
  bDeviceProtocol = 0x0001
  bMaxPacketSize0 = 0x0040
  idVendor = 0x0a12
  idProduct = 0x0001
  bcdDevice = 0x8891
  iManufacturer = 0x0000  <no string>
  iProduct = 0x0002  <CSR8510 A10>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001
 
they are all chinese clones full of bugs and other shit but some of them can be made to work
search for "is_fake" "clone" "Barrot 8041a02"

mine have both
idVendor = 0x0a12<br> idProduct = 0x0001<br> bcdDevice = 0x8891
identical
just hci / lmp ver/rev differ
 
Anyway,I've chosen this keyboard for my phone : (it can be connected via USB) :

20240905_201258.webp


USB is better than BT. Unfortunately this keyboard does not include the touchpad. So I should find it somewhere,somewhat. As always I want it small and USB powered.
 
To be honest,I already found one nice touchpad,this one :

TrackPad.jpeg


But I don't like it very much for its size. 3 x 3 cm is too big. I would like to find one smaller,let's say 1 cm x 1 cm.
 
ok here are my 2 cheap dongles
Code:
CSR V4.0 Device
# hccontrol -n ubt0hci read_local_version_information
HCI version: Bluetooth HCI Specification 5.0 [0x9]
HCI revision: 0x810
LMP version: Bluetooth LMP 5.0 [0x9]
LMP sub-version: 0x2312
Manufacturer: Qualcomm Technologies International, Ltd. (QTIL) [0x0a]

usb data
  bLength = 0x0012
  bDescriptorType = 0x0001
  bcdUSB = 0x0200
  bDeviceClass = 0x00e0  <Wireless controller>
  bDeviceSubClass = 0x0001
  bDeviceProtocol = 0x0001
  bMaxPacketSize0 = 0x0040
  idVendor = 0x0a12
  idProduct = 0x0001
  bcdDevice = 0x8891
  iManufacturer = 0x0000  <no string>
  iProduct = 0x0002  <CSR8510 A10>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001
===================================================================

# V 5.1 Device
# hccontrol -n ubt0hci read_local_version_information
HCI version: Bluetooth HCI Specification 5.1 [0xa]
HCI revision: 0x89
LMP version: Bluetooth LMP 5.1 [0xa]
LMP sub-version: 0x89
Manufacturer: ? [0x8e7]

usb data
  bLength = 0x0012
  bDescriptorType = 0x0001
  bcdUSB = 0x0110
  bDeviceClass = 0x00e0  <Wireless controller>
  bDeviceSubClass = 0x0001
  bDeviceProtocol = 0x0001
  bMaxPacketSize0 = 0x0040
  idVendor = 0x0a12
  idProduct = 0x0001
  bcdDevice = 0x8891
  iManufacturer = 0x0000  <no string>
  iProduct = 0x0002  <USB2.0-BT>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001
i managed to connect an apple magic mouse with both and appearead to be working with bthidd (i used hcidump to watch output while moving / clicking / touching)
hccontrol patch for read/write inquiry mode and parse inquiry mode with rssi output
you need to copy the include from /usr/src to /usr/include/netgraph/bluetooth/include/ng_hci.h after patching against src if you want to build only hccontrol from /usr/src/usr.sbin/bluetooth/hccontrol/ (make install)
Diff:
diff -ubswr usr/src/sys/netgraph/bluetooth/include/ng_hci.h ng/usr/src/sys/netgraph/bluetooth/include/ng_hci.h
--- usr/src/sys/netgraph/bluetooth/include/ng_hci.h    2024-11-29 02:03:47.000000000 +0200
+++ ng/usr/src/sys/netgraph/bluetooth/include/ng_hci.h    2025-06-03 10:39:57.000000000 +0300
@@ -1374,6 +1374,19 @@

 typedef ng_hci_status_rp    ng_hci_write_page_scan_rp;

+#define NG_HCI_OCF_READ_INQUIRY_MODE        0x0044
+typedef struct {
+    u_int8_t        status;         /* 0x00 - success */
+    u_int8_t    inquiry_mode; /* Inquiry mode */
+} __attribute__ ((packed)) ng_hci_read_inquiry_mode_rp;
+
+#define NG_HCI_OCF_WRITE_INQUIRY_MODE        0x0045
+typedef struct {
+    u_int8_t    inquiry_mode; /* Inquiry mode */
+} __attribute__ ((packed)) ng_hci_write_inquiry_mode_cp;
+
+typedef ng_hci_status_rp    ng_hci_write_inquiry_mode_rp;
+
 #define NG_HCI_OCF_READ_LE_HOST_SUPPORTED  0x6c
 typedef struct {
     u_int8_t    status;         /* 0x00 - success */
@@ -1809,6 +1822,7 @@
 } __attribute__ ((packed)) ng_hci_inquiry_compl_ep;

 #define NG_HCI_EVENT_INQUIRY_RESULT        0x02
+#define NG_HCI_EVENT_INQUIRY_RESULT_RSSI    0x22
 typedef struct {
     u_int8_t    num_responses;      /* number of responses */
 /*    ng_hci_inquiry_response[num_responses]   -- see below */
@@ -1822,6 +1836,15 @@
     u_int8_t    uclass[NG_HCI_CLASS_SIZE];/* unit class */
     u_int16_t    clock_offset;             /* clock offset */
 } __attribute__ ((packed)) ng_hci_inquiry_response;
+
+typedef struct {
+    bdaddr_t    bdaddr;                   /* unit address */
+    u_int8_t    page_scan_rep_mode;       /* page scan rep. mode */
+    u_int8_t    reserved;             /* reserved */
+    u_int8_t    uclass[NG_HCI_CLASS_SIZE];/* unit class */
+    u_int16_t    clock_offset;             /* clock offset */
+    int8_t        rssi;                      /* Range: -127 to +20 dbm */
+} __attribute__ ((packed)) ng_hci_inquiry_response_rssi;

 #define NG_HCI_EVENT_CON_COMPL            0x03
 typedef struct {
diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c ng/usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c
--- usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c    2024-11-29 02:03:48.000000000 +0200
+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c    2025-06-03 08:59:38.000000000 +0300
@@ -138,6 +138,7 @@
     bit_set(filter.event_mask, NG_HCI_EVENT_COMMAND_STATUS - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_INQUIRY_COMPL - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_INQUIRY_RESULT - 1);
+    bit_set(filter.event_mask, NG_HCI_EVENT_INQUIRY_RESULT_RSSI - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_CON_COMPL - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_DISCON_COMPL - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_REMOTE_NAME_REQ_COMPL - 1);
diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c ng/usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c
--- usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c    2024-11-29 02:03:48.000000000 +0200
+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c    2025-06-02 22:01:56.000000000 +0300
@@ -1489,7 +1489,71 @@
     return (OK);
 } /* hci_write_page_scan_mode */

+
+/* Send Read_Inquiry_Mode command to the unit */
 static int
+hci_read_inquiry_mode(int s, int argc, char **argv)
+{
+    ng_hci_read_inquiry_mode_rp    rp;
+    int                n;
+
+    n = sizeof(rp);
+    if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+            NG_HCI_OCF_READ_INQUIRY_MODE),
+            (char *) &rp, &n) == ERROR)
+        return (ERROR);
+
+    if (rp.status != 0x00) {
+        fprintf(stdout, "Status: %s [%#02x]\n",
+            hci_status2str(rp.status), rp.status);
+        return (FAILED);
+    }
+
+    fprintf(stdout, "Inquiry mode: %#02x\n", rp.inquiry_mode);
+
+    return (OK);
+} /* hci_read_inquiry_mode */
+
+/* Send Write_Inquiry_Mode command to the unit */
+static int
+hci_write_inquiry_mode(int s, int argc, char **argv)
+{
+    ng_hci_write_inquiry_mode_cp    cp;
+    ng_hci_write_inquiry_mode_rp    rp;
+    int                n;
+
+    /* parse command arguments */
+    switch (argc) {
+    case 1:
+        if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
+            return (USAGE);
+
+        cp.inquiry_mode = (n & 0xff);
+        break;
+
+    default:
+        return (USAGE);
+    }
+
+    /* send command */
+    n = sizeof(rp);
+    if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+            NG_HCI_OCF_WRITE_INQUIRY_MODE),
+            (char const *) &cp, sizeof(cp),
+            (char *) &rp, &n) == ERROR)
+        return (ERROR);
+
+    if (rp.status != 0x00) {
+        fprintf(stdout, "Status: %s [%#02x]\n",
+            hci_status2str(rp.status), rp.status);
+        return (FAILED);
+    }
+
+    return (OK);
+} /* hci_write_inquiry_mode */
+
+
+static int
 hci_read_le_host_support(int s, int argc, char **argv)
 {
     ng_hci_read_le_host_supported_rp rp;
@@ -1945,6 +2009,22 @@
 "\t0x02 - Optional Page Scan Mode II\n" \
 "\t0x03 - Optional Page Scan Mode III",
 &hci_write_page_scan_mode
+},
+{
+"read_inquiry_mode",
+"\nThis command is used to read the default inquiry mode of the local\n" \
+"0 = Std, 1 = With RSSI, 2 = Extended.",
+&hci_read_inquiry_mode
+},
+{
+"write_inquiry_mode <inquiry_mode>",
+"\nThis command is used to write the default inquiry mode of the local\n" \
+"Bluetooth device. \n"\
+"\t<page_scan_mode> - dd; inquiry mode:\n" \
+"\t0x00 - Standard\n" \
+"\t0x01 - With RSSI included\n" \
+"\t0x02 - Extended (EID)",
+&hci_write_inquiry_mode
 },
 {
 "read_le_host_support",    \
diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/link_control.c ng/usr/src/usr.sbin/bluetooth/hccontrol/link_control.c
--- usr/src/usr.sbin/bluetooth/hccontrol/link_control.c    2024-11-29 02:03:48.000000000 +0200
+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/link_control.c    2025-06-03 10:35:38.000000000 +0300
@@ -38,6 +38,7 @@
 #include "hccontrol.h"

 static void hci_inquiry_response (int n, uint8_t **b);
+static void hci_inquiry_response_rssi (int n, uint8_t **b);

 /* Send Inquiry command to the unit */
 static int
@@ -114,7 +115,6 @@
         errno = EIO;
         return (ERROR);
     }
-
     switch (e->event) {
     case NG_HCI_EVENT_INQUIRY_RESULT: {
         ng_hci_inquiry_result_ep    *ir =
@@ -129,7 +129,20 @@

         goto wait_for_more;
         }
+    case NG_HCI_EVENT_INQUIRY_RESULT_RSSI: {
+        ng_hci_inquiry_result_ep    *ir =
+                (ng_hci_inquiry_result_ep *)(e + 1);
+        uint8_t                *r = (uint8_t *)(ir + 1);

+        fprintf(stdout, "Inquiry result, num_responses=%d\n",
+            ir->num_responses);
+
+        for (n0 = 0; n0 < ir->num_responses; n0++)
+            hci_inquiry_response_rssi(n0, &r);
+
+        goto wait_for_more;
+        }
+
     case NG_HCI_EVENT_INQUIRY_COMPL:
         fprintf(stdout, "Inquiry complete. Status: %s [%#02x]\n",
             hci_status2str(*(b + sizeof(*e))), *(b + sizeof(*e)));
@@ -165,6 +178,25 @@

     *b += sizeof(*ir);
 } /* hci_inquiry_response */
+
+/* Print Inquiry_Result_Rssi event */
+static void
+hci_inquiry_response_rssi(int n, uint8_t **b)
+{
+    ng_hci_inquiry_response_rssi    *ir = (ng_hci_inquiry_response_rssi *)(*b);
+
+    fprintf(stdout, "Inquiry result #%d\n", n);
+    fprintf(stdout, "\tBD_ADDR: %s\n", hci_bdaddr2str(&ir->bdaddr));
+    fprintf(stdout, "\tPage Scan Rep. Mode: %#02x\n",
+        ir->page_scan_rep_mode);
+    fprintf(stdout, "\tClass: %02x:%02x:%02x\n",
+        ir->uclass[2], ir->uclass[1], ir->uclass[0]);
+    fprintf(stdout, "\tClock offset: %#04x\n",
+        le16toh(ir->clock_offset));
+    fprintf(stdout, "\tRssi: %d dBm\n",
+        le16toh(ir->rssi ));
+    *b += sizeof(*ir);
+} /* hci_inquiry_response_rssi */

 /* Send Create_Connection command to the unit */
 static int
 
Have you thought if the patches that u have applied work even for different models of BT dongles ?
the patch above is for userland should work for any supported hw. it might be not needed at all, one of my dongles works without the patch
 
the patch above is for userland should work for any supported hw. it might be not needed at all, one of my dongles works without the patch

For any supported hw : that's the point. That if it does not work maybe because the dongle is not supported because there is a bug or it is not supported,full stop.
 
I've got my BT dongle today :

Code:
ugen1.19: <Bluetooth Dongle (HCI mode) Cambridge Silicon Radio, Ltd> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)
 
Code:
marietto# hccontrol -n ubt0hci read_local_version_information

hccontrol: Could not find HCI nodes
marietto# service bluetooth start
/etc/rc.d/bluetooth: ERROR: Unsupported device:

marietto# service bluetooth start ubt0
/etc/rc.d/bluetooth: ERROR: Unable to setup Bluetooth stack for device ubt0

dmesg :

ubt0 on uhub1
ubt0: <vendor 0x0a12 BT DONGLE10, class 224/1, rev 2.00/88.91, addr 18> on usbus1
ng_hci_process_command_complete: ubt0hci - HCI command failed, OGF=0x3, OCF=0x22, status=0x1
ng_hci_process_command_complete: ubt0hci - HCI command failed, OGF=0x3, OCF=0x22, status=0x1
ng_hci_process_command_complete: ubt0hci - HCI command failed, OGF=0x3, OCF=0x22, status=0x1
ng_hci_process_command_complete: ubt0hci - HCI command failed, OGF=0x3, OCF=0x22, status=0x1
ng_hci_process_command_complete: ubt0hci - HCI command failed, OGF=0x3, OCF=0x22, status=0x1
ng_hci_process_command_complete: ubt0hci - HCI command failed, OGF=0x3, OCF=0x22, status=0x1
 
ok here are my 2 cheap dongles
Code:
CSR V4.0 Device
# hccontrol -n ubt0hci read_local_version_information
HCI version: Bluetooth HCI Specification 5.0 [0x9]
HCI revision: 0x810
LMP version: Bluetooth LMP 5.0 [0x9]
LMP sub-version: 0x2312
Manufacturer: Qualcomm Technologies International, Ltd. (QTIL) [0x0a]

usb data
  bLength = 0x0012
  bDescriptorType = 0x0001
  bcdUSB = 0x0200
  bDeviceClass = 0x00e0  <Wireless controller>
  bDeviceSubClass = 0x0001
  bDeviceProtocol = 0x0001
  bMaxPacketSize0 = 0x0040
  idVendor = 0x0a12
  idProduct = 0x0001
  bcdDevice = 0x8891
  iManufacturer = 0x0000  <no string>
  iProduct = 0x0002  <CSR8510 A10>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001
===================================================================

# V 5.1 Device
# hccontrol -n ubt0hci read_local_version_information
HCI version: Bluetooth HCI Specification 5.1 [0xa]
HCI revision: 0x89
LMP version: Bluetooth LMP 5.1 [0xa]
LMP sub-version: 0x89
Manufacturer: ? [0x8e7]

usb data
  bLength = 0x0012
  bDescriptorType = 0x0001
  bcdUSB = 0x0110
  bDeviceClass = 0x00e0  <Wireless controller>
  bDeviceSubClass = 0x0001
  bDeviceProtocol = 0x0001
  bMaxPacketSize0 = 0x0040
  idVendor = 0x0a12
  idProduct = 0x0001
  bcdDevice = 0x8891
  iManufacturer = 0x0000  <no string>
  iProduct = 0x0002  <USB2.0-BT>
  iSerialNumber = 0x0000  <no string>
  bNumConfigurations = 0x0001
i managed to connect an apple magic mouse with both and appearead to be working with bthidd (i used hcidump to watch output while moving / clicking / touching)
hccontrol patch for read/write inquiry mode and parse inquiry mode with rssi output
you need to copy the include from /usr/src to /usr/include/netgraph/bluetooth/include/ng_hci.h after patching against src if you want to build only hccontrol from /usr/src/usr.sbin/bluetooth/hccontrol/ (make install)
Diff:
diff -ubswr usr/src/sys/netgraph/bluetooth/include/ng_hci.h ng/usr/src/sys/netgraph/bluetooth/include/ng_hci.h
--- usr/src/sys/netgraph/bluetooth/include/ng_hci.h    2024-11-29 02:03:47.000000000 +0200
+++ ng/usr/src/sys/netgraph/bluetooth/include/ng_hci.h    2025-06-03 10:39:57.000000000 +0300
@@ -1374,6 +1374,19 @@

 typedef ng_hci_status_rp    ng_hci_write_page_scan_rp;

+#define NG_HCI_OCF_READ_INQUIRY_MODE        0x0044
+typedef struct {
+    u_int8_t        status;         /* 0x00 - success */
+    u_int8_t    inquiry_mode; /* Inquiry mode */
+} __attribute__ ((packed)) ng_hci_read_inquiry_mode_rp;
+
+#define NG_HCI_OCF_WRITE_INQUIRY_MODE        0x0045
+typedef struct {
+    u_int8_t    inquiry_mode; /* Inquiry mode */
+} __attribute__ ((packed)) ng_hci_write_inquiry_mode_cp;
+
+typedef ng_hci_status_rp    ng_hci_write_inquiry_mode_rp;
+
 #define NG_HCI_OCF_READ_LE_HOST_SUPPORTED  0x6c
 typedef struct {
     u_int8_t    status;         /* 0x00 - success */
@@ -1809,6 +1822,7 @@
 } __attribute__ ((packed)) ng_hci_inquiry_compl_ep;

 #define NG_HCI_EVENT_INQUIRY_RESULT        0x02
+#define NG_HCI_EVENT_INQUIRY_RESULT_RSSI    0x22
 typedef struct {
     u_int8_t    num_responses;      /* number of responses */
 /*    ng_hci_inquiry_response[num_responses]   -- see below */
@@ -1822,6 +1836,15 @@
     u_int8_t    uclass[NG_HCI_CLASS_SIZE];/* unit class */
     u_int16_t    clock_offset;             /* clock offset */
 } __attribute__ ((packed)) ng_hci_inquiry_response;
+
+typedef struct {
+    bdaddr_t    bdaddr;                   /* unit address */
+    u_int8_t    page_scan_rep_mode;       /* page scan rep. mode */
+    u_int8_t    reserved;             /* reserved */
+    u_int8_t    uclass[NG_HCI_CLASS_SIZE];/* unit class */
+    u_int16_t    clock_offset;             /* clock offset */
+    int8_t        rssi;                      /* Range: -127 to +20 dbm */
+} __attribute__ ((packed)) ng_hci_inquiry_response_rssi;

 #define NG_HCI_EVENT_CON_COMPL            0x03
 typedef struct {
diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c ng/usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c
--- usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c    2024-11-29 02:03:48.000000000 +0200
+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/hccontrol.c    2025-06-03 08:59:38.000000000 +0300
@@ -138,6 +138,7 @@
     bit_set(filter.event_mask, NG_HCI_EVENT_COMMAND_STATUS - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_INQUIRY_COMPL - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_INQUIRY_RESULT - 1);
+    bit_set(filter.event_mask, NG_HCI_EVENT_INQUIRY_RESULT_RSSI - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_CON_COMPL - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_DISCON_COMPL - 1);
     bit_set(filter.event_mask, NG_HCI_EVENT_REMOTE_NAME_REQ_COMPL - 1);
diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c ng/usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c
--- usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c    2024-11-29 02:03:48.000000000 +0200
+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c    2025-06-02 22:01:56.000000000 +0300
@@ -1489,7 +1489,71 @@
     return (OK);
 } /* hci_write_page_scan_mode */

+
+/* Send Read_Inquiry_Mode command to the unit */
 static int
+hci_read_inquiry_mode(int s, int argc, char **argv)
+{
+    ng_hci_read_inquiry_mode_rp    rp;
+    int                n;
+
+    n = sizeof(rp);
+    if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+            NG_HCI_OCF_READ_INQUIRY_MODE),
+            (char *) &rp, &n) == ERROR)
+        return (ERROR);
+
+    if (rp.status != 0x00) {
+        fprintf(stdout, "Status: %s [%#02x]\n",
+            hci_status2str(rp.status), rp.status);
+        return (FAILED);
+    }
+
+    fprintf(stdout, "Inquiry mode: %#02x\n", rp.inquiry_mode);
+
+    return (OK);
+} /* hci_read_inquiry_mode */
+
+/* Send Write_Inquiry_Mode command to the unit */
+static int
+hci_write_inquiry_mode(int s, int argc, char **argv)
+{
+    ng_hci_write_inquiry_mode_cp    cp;
+    ng_hci_write_inquiry_mode_rp    rp;
+    int                n;
+
+    /* parse command arguments */
+    switch (argc) {
+    case 1:
+        if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
+            return (USAGE);
+
+        cp.inquiry_mode = (n & 0xff);
+        break;
+
+    default:
+        return (USAGE);
+    }
+
+    /* send command */
+    n = sizeof(rp);
+    if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+            NG_HCI_OCF_WRITE_INQUIRY_MODE),
+            (char const *) &cp, sizeof(cp),
+            (char *) &rp, &n) == ERROR)
+        return (ERROR);
+
+    if (rp.status != 0x00) {
+        fprintf(stdout, "Status: %s [%#02x]\n",
+            hci_status2str(rp.status), rp.status);
+        return (FAILED);
+    }
+
+    return (OK);
+} /* hci_write_inquiry_mode */
+
+
+static int
 hci_read_le_host_support(int s, int argc, char **argv)
 {
     ng_hci_read_le_host_supported_rp rp;
@@ -1945,6 +2009,22 @@
 "\t0x02 - Optional Page Scan Mode II\n" \
 "\t0x03 - Optional Page Scan Mode III",
 &hci_write_page_scan_mode
+},
+{
+"read_inquiry_mode",
+"\nThis command is used to read the default inquiry mode of the local\n" \
+"0 = Std, 1 = With RSSI, 2 = Extended.",
+&hci_read_inquiry_mode
+},
+{
+"write_inquiry_mode <inquiry_mode>",
+"\nThis command is used to write the default inquiry mode of the local\n" \
+"Bluetooth device. \n"\
+"\t<page_scan_mode> - dd; inquiry mode:\n" \
+"\t0x00 - Standard\n" \
+"\t0x01 - With RSSI included\n" \
+"\t0x02 - Extended (EID)",
+&hci_write_inquiry_mode
 },
 {
 "read_le_host_support",    \
diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/link_control.c ng/usr/src/usr.sbin/bluetooth/hccontrol/link_control.c
--- usr/src/usr.sbin/bluetooth/hccontrol/link_control.c    2024-11-29 02:03:48.000000000 +0200
+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/link_control.c    2025-06-03 10:35:38.000000000 +0300
@@ -38,6 +38,7 @@
 #include "hccontrol.h"

 static void hci_inquiry_response (int n, uint8_t **b);
+static void hci_inquiry_response_rssi (int n, uint8_t **b);

 /* Send Inquiry command to the unit */
 static int
@@ -114,7 +115,6 @@
         errno = EIO;
         return (ERROR);
     }
-
     switch (e->event) {
     case NG_HCI_EVENT_INQUIRY_RESULT: {
         ng_hci_inquiry_result_ep    *ir =
@@ -129,7 +129,20 @@

         goto wait_for_more;
         }
+    case NG_HCI_EVENT_INQUIRY_RESULT_RSSI: {
+        ng_hci_inquiry_result_ep    *ir =
+                (ng_hci_inquiry_result_ep *)(e + 1);
+        uint8_t                *r = (uint8_t *)(ir + 1);

+        fprintf(stdout, "Inquiry result, num_responses=%d\n",
+            ir->num_responses);
+
+        for (n0 = 0; n0 < ir->num_responses; n0++)
+            hci_inquiry_response_rssi(n0, &r);
+
+        goto wait_for_more;
+        }
+
     case NG_HCI_EVENT_INQUIRY_COMPL:
         fprintf(stdout, "Inquiry complete. Status: %s [%#02x]\n",
             hci_status2str(*(b + sizeof(*e))), *(b + sizeof(*e)));
@@ -165,6 +178,25 @@

     *b += sizeof(*ir);
 } /* hci_inquiry_response */
+
+/* Print Inquiry_Result_Rssi event */
+static void
+hci_inquiry_response_rssi(int n, uint8_t **b)
+{
+    ng_hci_inquiry_response_rssi    *ir = (ng_hci_inquiry_response_rssi *)(*b);
+
+    fprintf(stdout, "Inquiry result #%d\n", n);
+    fprintf(stdout, "\tBD_ADDR: %s\n", hci_bdaddr2str(&ir->bdaddr));
+    fprintf(stdout, "\tPage Scan Rep. Mode: %#02x\n",
+        ir->page_scan_rep_mode);
+    fprintf(stdout, "\tClass: %02x:%02x:%02x\n",
+        ir->uclass[2], ir->uclass[1], ir->uclass[0]);
+    fprintf(stdout, "\tClock offset: %#04x\n",
+        le16toh(ir->clock_offset));
+    fprintf(stdout, "\tRssi: %d dBm\n",
+        le16toh(ir->rssi ));
+    *b += sizeof(*ir);
+} /* hci_inquiry_response_rssi */

 /* Send Create_Connection command to the unit */
 static int


# nano /home/host_controller_baseband.patch

diff -ubswr /usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c /usr/src/usr.sbin/bluetooth/hccontrol/ng/host_controller_baseband.c
--- /usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c 2024-11-29 02:03:48.000000000 +0200
+++ /usr/src/usr.sbin/bluetooth/hccontrol/ng/host_controller_baseband.c 2025-06-02 22:01:56.000000000 +0300
@@ -1489,7 +1489,71 @@
return (OK);
} /* hci_write_page_scan_mode */

+
+/* Send Read_Inquiry_Mode command to the unit */
static int
+hci_read_inquiry_mode(int s, int argc, char **argv)
+{
+ ng_hci_read_inquiry_mode_rp rp;
+ int n;
+
+ n = sizeof(rp);
+ if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+ NG_HCI_OCF_READ_INQUIRY_MODE),
+ (char *) &rp, &n) == ERROR)
+ return (ERROR);
+
+ if (rp.status != 0x00) {
+ fprintf(stdout, "Status: %s [%#02x]\n",
+ hci_status2str(rp.status), rp.status);
+ return (FAILED);
+ }
+
+ fprintf(stdout, "Inquiry mode: %#02x\n", rp.inquiry_mode);
+
+ return (OK);
+} /* hci_read_inquiry_mode */
+
+/* Send Write_Inquiry_Mode command to the unit */
+static int
+hci_write_inquiry_mode(int s, int argc, char **argv)
+{
+ ng_hci_write_inquiry_mode_cp cp;
+ ng_hci_write_inquiry_mode_rp rp;
+ int n;
+
+ /* parse command arguments */
+ switch (argc) {
+ case 1:
+ if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
+ return (USAGE);
+
+ cp.inquiry_mode = (n & 0xff);
+ break;
+
+ default:
+ return (USAGE);
+ }
+
+ /* send command */
+ n = sizeof(rp);
+ if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+ NG_HCI_OCF_WRITE_INQUIRY_MODE),
+ (char const *) &cp, sizeof(cp),
+ (char *) &rp, &n) == ERROR)
+ return (ERROR);
+
+ if (rp.status != 0x00) {
+ fprintf(stdout, "Status: %s [%#02x]\n",
+ hci_status2str(rp.status), rp.status);
+ return (FAILED);
+ }
+
+ return (OK);
+} /* hci_write_inquiry_mode */
+
+
+static int
hci_read_le_host_support(int s, int argc, char **argv)
{
ng_hci_read_le_host_supported_rp rp;
@@ -1945,6 +2009,22 @@
"\t0x02 - Optional Page Scan Mode II\n" \
"\t0x03 - Optional Page Scan Mode III",
&hci_write_page_scan_mode
+},
+{
+"read_inquiry_mode",
+"\nThis command is used to read the default inquiry mode of the local\n" \
+"0 = Std, 1 = With RSSI, 2 = Extended.",
+&hci_read_inquiry_mode
+},
+{
+"write_inquiry_mode <inquiry_mode>",
+"\nThis command is used to write the default inquiry mode of the local\n" \
+"Bluetooth device. \n"\
+"\t<page_scan_mode> - dd; inquiry mode:\n" \
+"\t0x00 - Standard\n" \
+"\t0x01 - With RSSI included\n" \
+"\t0x02 - Extended (EID)",
+&hci_write_inquiry_mode
},
{
"read_le_host_support", \

then :

marietto# pwd
/usr/src/usr.sbin/bluetooth/hccontrol

marietto# ls

Makefile info.c
Makefile.depend le.c
adv_data.c link_control.c
bluetooth.device.conf link_policy.c
hccontrol-backup.c ng
hccontrol.8 node.c
hccontrol.c send_recv.c
hccontrol.h status.c
host_controller_baseband-backup.c util.c
host_controller_baseband.c

marietto# patch -C < /home/host_controller_baseband.patch
Hmm... Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ubswr usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c ng/usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c
|--- usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c 2024-11-29 02:03:48.000000000 +0200
|+++ ng/usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c 2025-06-02 22:01:56.000000000 +0300
--------------------------
Patching file host_controller_baseband.c using Plan A...
Hunk #1 failed at 1489.
Hunk #2 succeeded at 2009 with fuzz 1.
1 out of 2 hunks failed while patching host_controller_baseband.c
done
 
Code:
# nano /home/host_controller_baseband.patch

diff -ubswr /usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c /usr/src/usr.sbin/bluetooth/hccontrol/ng/host_controller_baseband.c
--- /usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c    2024-11-29 02:03:48.000000000 +0200
+++ /usr/src/usr.sbin/bluetooth/hccontrol/ng/host_controller_baseband.c    2025-06-02 22:01:56.000000000 +0300
@@ -1489,7 +1489,71 @@
     return (OK);
 } /* hci_write_page_scan_mode */

+
+/* Send Read_Inquiry_Mode command to the unit */
 static int
+hci_read_inquiry_mode(int s, int argc, char **argv)
+{
+    ng_hci_read_inquiry_mode_rp    rp;
+    int                n;
+
+    n = sizeof(rp);
+    if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+            NG_HCI_OCF_READ_INQUIRY_MODE),
+            (char *) &rp, &n) == ERROR)
+        return (ERROR);
+
+    if (rp.status != 0x00) {
+        fprintf(stdout, "Status: %s [%#02x]\n",
+            hci_status2str(rp.status), rp.status);
+        return (FAILED);
+    }
+
+    fprintf(stdout, "Inquiry mode: %#02x\n", rp.inquiry_mode);
+
+    return (OK);
+} /* hci_read_inquiry_mode */
+
+/* Send Write_Inquiry_Mode command to the unit */
+static int
+hci_write_inquiry_mode(int s, int argc, char **argv)
+{
+    ng_hci_write_inquiry_mode_cp    cp;
+    ng_hci_write_inquiry_mode_rp    rp;
+    int                n;
+
+    /* parse command arguments */
+    switch (argc) {
+    case 1:
+        if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
+            return (USAGE);
+
+        cp.inquiry_mode = (n & 0xff);
+        break;
+
+    default:
+        return (USAGE);
+    }
+
+    /* send command */
+    n = sizeof(rp);
+    if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
+            NG_HCI_OCF_WRITE_INQUIRY_MODE),
+            (char const *) &cp, sizeof(cp),
+            (char *) &rp, &n) == ERROR)
+        return (ERROR);
+
+    if (rp.status != 0x00) {
+        fprintf(stdout, "Status: %s [%#02x]\n",
+            hci_status2str(rp.status), rp.status);
+        return (FAILED);
+    }
+
+    return (OK);
+} /* hci_write_inquiry_mode */
+
+
+static int
 hci_read_le_host_support(int s, int argc, char **argv)
 {
     ng_hci_read_le_host_supported_rp rp;
@@ -1945,6 +2009,22 @@
 "\t0x02 - Optional Page Scan Mode II\n" \
 "\t0x03 - Optional Page Scan Mode III",
 &hci_write_page_scan_mode
+},
+{
+"read_inquiry_mode",
+"\nThis command is used to read the default inquiry mode of the local\n" \
+"0 = Std, 1 = With RSSI, 2 = Extended.",
+&hci_read_inquiry_mode
+},
+{
+"write_inquiry_mode <inquiry_mode>",
+"\nThis command is used to write the default inquiry mode of the local\n" \
+"Bluetooth device. \n"\
+"\t<page_scan_mode> - dd; inquiry mode:\n" \
+"\t0x00 - Standard\n" \
+"\t0x01 - With RSSI included\n" \
+"\t0x02 - Extended (EID)",
+&hci_write_inquiry_mode
 },
 {
 "read_le_host_support",    \

then :

Code:
marietto# pwd
/usr/src/usr.sbin/bluetooth/hccontrol

marietto# ls

Makefile                info.c
Makefile.depend                le.c
adv_data.c                link_control.c
bluetooth.device.conf            link_policy.c
hccontrol-backup.c            ng
hccontrol.8                node.c
hccontrol.c                send_recv.c
hccontrol.h                status.c
host_controller_baseband-backup.c    util.c
host_controller_baseband.c

marietto# patch -C < /home/host_controller_baseband.patch
    
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|diff -ubswr /usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c /usr/src/usr.sbin/bluetooth/hccontrol/ng/host_controller_baseband.c
|--- /usr/src/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c    2024-11-29 02:03:48.000000000 +0200
|+++ /usr/src/usr.sbin/bluetooth/hccontrol/ng/host_controller_baseband.c    2025-06-02 22:01:56.000000000 +0300
--------------------------
Patching file host_controller_baseband.c using Plan A...
Hunk #1 failed at 1489.
Hunk #2 succeeded at 2009 with fuzz 1.
1 out of 2 hunks failed while patching host_controller_baseband.c
done
 
stop bluetooth service, kld_unload ng_ubt and load this version (it may bypass barrot bug)
copy it /boot/kernel
make sure ng_ubt is unloaded before restarting bluetooth
 

Attachments

Code:
marietto# service bluetooth start ubt0
/etc/rc.d/bluetooth: ERROR: Unable to setup Bluetooth stack for device ubt0

marietto# kldstat | grep ubt
15    1 0xffffffff82b51000     a230 ng_ubt.ko

marietto#  hccontrol -n ubt0@hci inquiry
hccontrol: Could not find HCI nodes
 
Code:
marietto# service bluetooth start ubt0
OK
marietto# hccontrol -n ubt0@hci inquiry
Could not execute command "inquiry". Operation timed out
 
sh:
#!/bin/sh
#
# Copyright (c) 2005 Maksim Yevmenkin <m_evmenkin@yahoo.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#

# PROVIDE: bluetooth
# REQUIRE: DAEMON
# KEYWORD: nojail nostart

. /etc/rc.subr

name="bluetooth"
desc="Bluetooth setup script"
rcvar=
start_cmd="bluetooth_start"
stop_cmd="bluetooth_stop"
required_modules="ng_bluetooth ng_hci ng_l2cap ng_btsocket"

##############################################################################
# Read and parse Bluetooth device configuration file
##############################################################################

bluetooth_read_conf()
{
    local _err _file _line _namespace

    _file=$1
    _namespace=$2
    _err=0

    if [ ! -e $_file ]; then
        return 0
    fi

    if [ ! -f $_file -o ! -r $_file ]; then
        err 1 "Bluetooth configuration file $_file is not a file or not readable"
    fi

    while read _line
    do
        case "$_line" in
        \#*)
            continue
            ;;

        *)
            if [ -z "$_line" ]; then
                continue;
            fi


            if expr "$_line" : "[a-zA-Z0-9_]*=" > /dev/null 2>&1; then
                eval "${_namespace}${_line}"
            else
                warn "Unable to parse line \"$_line\" in $_file"
                _err=1
            fi
            ;;
        esac
    done < $_file

    return $_err
}

##############################################################################
# Setup Bluetooth stack. Create and connect nodes
##############################################################################

bluetooth_setup_stack()
{
    dev=$1
    shift
    hook=$1
    shift

    # Setup HCI
    ngctl mkpeer ${dev}: hci ${hook} drv \
        > /dev/null 2>&1 || return 1

    ngctl name ${dev}:${hook} ${dev}hci \
        > /dev/null 2>&1 || return 1

    ngctl msg ${dev}hci: set_debug ${bluetooth_device_hci_debug_level} \
        > /dev/null 2>&1 || return 1

    # Setup L2CAP
    ngctl mkpeer ${dev}hci: l2cap acl hci \
        > /dev/null 2>&1 || return 1

    ngctl name ${dev}hci:acl ${dev}l2cap \
        > /dev/null 2>&1 || return 1

    ngctl msg ${dev}l2cap: set_debug ${bluetooth_device_l2cap_debug_level} \
        > /dev/null 2>&1 || return 1

    # Connect HCI node to the Bluetooth sockets layer
    ngctl connect ${dev}hci: btsock_hci_raw: raw ${dev}raw \
        > /dev/null 2>&1 || return 1

    # Connect L2CAP node to Bluetooth sockets layer
    ngctl connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl \
        > /dev/null 2>&1 || return 1

    ngctl connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c \
        > /dev/null 2>&1 || return 1

    # Initilalize HCI node
    ${hccontrol} -n ${dev}hci reset \
        > /dev/null 2>&1 || return 1

    ${hccontrol} -n ${dev}hci read_bd_addr \
        > /dev/null 2>&1 || return 1

    ${hccontrol} -n ${dev}hci read_local_supported_features \
        > /dev/null 2>&1 || return 1

    ${hccontrol} -n ${dev}hci read_buffer_size \
        > /dev/null 2>&1 || return 1

    if checkyesno bluetooth_device_discoverable; then
        if checkyesno bluetooth_device_connectable; then
            ${hccontrol} -n ${dev}hci write_scan_enable 3 \
                > /dev/null 2>&1 || return 1
        else
            ${hccontrol} -n ${dev}hci write_scan_enable 1 \
                > /dev/null 2>&1 || return 1
        fi
    else
        if checkyesno bluetooth_device_connectable; then
            ${hccontrol} -n ${dev}hci write_scan_enable 2 \
                > /dev/null 2>&1 || return 1
        else
            ${hccontrol} -n ${dev}hci write_scan_enable 0 \
                > /dev/null 2>&1 || return 1
        fi
    fi


    ${hccontrol} -n ${dev}hci write_class_of_device ${bluetooth_device_class} \
        > /dev/null 2>&1 || return 1

    if checkyesno bluetooth_device_authentication_enable; then
        ${hccontrol} -n ${dev}hci write_authentication_enable 1 \
            > /dev/null 2>&1 || return 1
    else
        ${hccontrol} -n ${dev}hci write_authentication_enable 0 \
            > /dev/null 2>&1 || return 1
    fi


    if checkyesno bluetooth_device_role_switch; then
        ${hccontrol} -n ${dev}hci write_node_role_switch 1 \
            > /dev/null 2>&1 || return 1
    else
        ${hccontrol} -n ${dev}hci write_node_role_switch 0 \
            > /dev/null 2>&1 || return 1
    fi

    ${hccontrol} -n ${dev}hci change_local_name "${bluetooth_device_local_name}" \
        > /dev/null 2>&1 || return 1

    ${hccontrol} -n ${dev}hci initialize \
        > /dev/null 2>&1 || return 1

    return 0
}

##############################################################################
# Shutdown Bluetooth stack. Destroy all nodes
##############################################################################

bluetooth_shutdown_stack()
{
    dev=$1

    ngctl shutdown ${dev}hci: > /dev/null 2>&1
    ngctl shutdown ${dev}l2cap: > /dev/null 2>&1

    return 0
}

##############################################################################
# bluetooth_start()
##############################################################################

bluetooth_start()
{
    local _file

    dev=$1

    # Try to figure out device type by looking at device name
    case "${dev}" in
    # USB Bluetooth adapters
    ubt*)
        hook="hook"

        # Obtain unit number from device.
        unit=`expr ${dev} : 'ubt\([0-9]\{1,\}\)'`
        if [ -z "${unit}" ]; then
            err 1 "Unable to get ubt unit number: ${dev}"
        fi
        ;;

    # Unknown
    *)
        err 1 "Unsupported device: ${dev}"
        ;;
    esac

    # Be backward compatible and setup reasonable defaults
    bluetooth_device_authentication_enable="0"
    bluetooth_device_class="ff:01:0c"
    bluetooth_device_connectable="1"
    bluetooth_device_discoverable="0"
    bluetooth_device_encryption_mode="0"
    bluetooth_device_hci_debug_level="3"
    bluetooth_device_l2cap_debug_level="3"
    bluetooth_device_local_name="`/usr/bin/uname -n` (${dev})"
    bluetooth_device_role_switch="1"

    # Load default device configuration parameters
    _file="/etc/defaults/bluetooth.device.conf"

    if ! bluetooth_read_conf $_file bluetooth_device_ ; then
        err 1 "Unable to read default Bluetooth configuration from $_file"
    fi

    # Load device specific overrides
    _file="/etc/bluetooth/$dev.conf"

    if ! bluetooth_read_conf $_file bluetooth_device_ ; then
        err 1 "Unable to read Bluetooth device configuration from $_file"
    fi

    # Setup stack
    if ! bluetooth_setup_stack ${dev} ${hook} ; then
        bluetooth_shutdown_stack $dev
        err 1 "Unable to setup Bluetooth stack for device ${dev}"
    fi

    return 0
}

##############################################################################
# bluetooth_stop()
##############################################################################

bluetooth_stop()
{
    dev=$1

    # Try to figure out device type by looking at device name
    case "${dev}" in
    # USB Bluetooth adapters
    ubt*)
        ;;

    # Unknown
    *)
        err 1 "Unsupported device: ${dev}"
        ;;
    esac

    bluetooth_shutdown_stack ${dev}

    return 0
}

##############################################################################
# Start here
##############################################################################

load_rc_config $name
hccontrol="${bluetooth_hccontrol:-/usr/sbin/hccontrol}"

run_rc_command $*
 
Back
Top