Bluetooth: Add hooks for SCO and HCI commands
Change-Id: Ib8ec5c7a7dc6245c4f69c7b2d4596bd5aca9b493 Reviewed-on: https://review.haiku-os.org/c/haiku/+/11146 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
7ded2f66c4
commit
95844c4f15
@@ -98,7 +98,7 @@ typedef struct bt_hci_device {
|
|||||||
*/
|
*/
|
||||||
typedef struct bt_hci_transport_hooks {
|
typedef struct bt_hci_transport_hooks {
|
||||||
// to be filled by driver
|
// to be filled by driver
|
||||||
status_t (*SendCommand)(hci_id hciId, void* command);
|
status_t (*SendCommand)(hci_id hciId, net_buffer* nbuf);
|
||||||
status_t (*SendACL)(hci_id hciId, net_buffer* nbuf);
|
status_t (*SendACL)(hci_id hciId, net_buffer* nbuf);
|
||||||
status_t (*SendSCO)(hci_id hciId, net_buffer* nbuf);
|
status_t (*SendSCO)(hci_id hciId, net_buffer* nbuf);
|
||||||
status_t (*SendESCO)(hci_id hciId, net_buffer* nbuf);
|
status_t (*SendESCO)(hci_id hciId, net_buffer* nbuf);
|
||||||
@@ -153,6 +153,7 @@ typedef struct bt_hci_module_info {
|
|||||||
void* data, size_t count);
|
void* data, size_t count);
|
||||||
|
|
||||||
// To be called from upper layers
|
// To be called from upper layers
|
||||||
|
status_t (*PostCommand)(hci_id hid, net_buffer* buffer);
|
||||||
status_t (*PostACL)(hci_id hciId, net_buffer* buffer);
|
status_t (*PostACL)(hci_id hciId, net_buffer* buffer);
|
||||||
status_t (*PostSCO)(hci_id hciId, net_buffer* buffer);
|
status_t (*PostSCO)(hci_id hciId, net_buffer* buffer);
|
||||||
status_t (*PostESCO)(hci_id hciId, net_buffer* buffer);
|
status_t (*PostESCO)(hci_id hciId, net_buffer* buffer);
|
||||||
|
|||||||
@@ -295,6 +295,24 @@ UnregisterDriver(hci_id id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PostCommand(hci_id hciId, net_buffer* buffer)
|
||||||
|
{
|
||||||
|
if (buffer == NULL)
|
||||||
|
panic("passing null buffer");
|
||||||
|
|
||||||
|
bluetooth_device* device = FindDeviceByID(hciId);
|
||||||
|
if (device == NULL) {
|
||||||
|
ERROR("%s: No device 0x%" B_PRIx32 "\n", __func__, hciId);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->protocol = BT_COMMAND;
|
||||||
|
|
||||||
|
return device->hooks->SendCommand(hciId, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// PostACL
|
// PostACL
|
||||||
status_t
|
status_t
|
||||||
PostACL(hci_id hciId, net_buffer* buffer)
|
PostACL(hci_id hciId, net_buffer* buffer)
|
||||||
@@ -360,7 +378,16 @@ PostACL(hci_id hciId, net_buffer* buffer)
|
|||||||
status_t
|
status_t
|
||||||
PostSCO(hci_id hciId, net_buffer* buffer)
|
PostSCO(hci_id hciId, net_buffer* buffer)
|
||||||
{
|
{
|
||||||
return B_ERROR;
|
bluetooth_device* device = FindDeviceByID(hciId);
|
||||||
|
|
||||||
|
if (device == NULL) {
|
||||||
|
ERROR("%s: No device 0x%" B_PRIx32 "\n", __func__, hciId);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->protocol = BT_SCO;
|
||||||
|
|
||||||
|
return device->hooks->SendSCO(hciId, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -465,16 +492,17 @@ bluetooth_std_ops(int32 op, ...)
|
|||||||
|
|
||||||
bt_hci_module_info sBluetoothModule = {
|
bt_hci_module_info sBluetoothModule = {
|
||||||
{
|
{
|
||||||
BT_HCI_MODULE_NAME,
|
BT_HCI_MODULE_NAME,
|
||||||
B_KEEP_LOADED,
|
B_KEEP_LOADED,
|
||||||
bluetooth_std_ops
|
bluetooth_std_ops
|
||||||
},
|
},
|
||||||
RegisterDriver,
|
RegisterDriver,
|
||||||
UnregisterDriver,
|
UnregisterDriver,
|
||||||
FindDeviceByID,
|
FindDeviceByID,
|
||||||
PostTransportPacket,
|
PostTransportPacket,
|
||||||
PostACL,
|
PostCommand,
|
||||||
PostSCO,
|
PostACL,
|
||||||
|
PostSCO,
|
||||||
PostESCO
|
PostESCO
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <ByteOrder.h>
|
#include <ByteOrder.h>
|
||||||
#include <Drivers.h>
|
#include <Drivers.h>
|
||||||
|
#include <StackOrHeapArray.h>
|
||||||
|
|
||||||
#include <btModules.h>
|
#include <btModules.h>
|
||||||
|
|
||||||
@@ -441,11 +442,11 @@ device_removed(void* cookie)
|
|||||||
|
|
||||||
|
|
||||||
static bt_hci_transport_hooks bluetooth_hooks = {
|
static bt_hci_transport_hooks bluetooth_hooks = {
|
||||||
NULL,
|
&submit_nbuffer,
|
||||||
&submit_nbuffer,
|
&submit_nbuffer,
|
||||||
&submit_nbuffer,
|
&submit_nbuffer,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
H2
|
H2
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -477,8 +478,23 @@ submit_nbuffer(hci_id hid, net_buffer* nbuf)
|
|||||||
return submit_tx_sco(bdev, nbuf);
|
return submit_tx_sco(bdev, nbuf);
|
||||||
break;
|
break;
|
||||||
case BT_COMMAND:
|
case BT_COMMAND:
|
||||||
// not issued this way
|
{
|
||||||
break;
|
snet_buffer* snbuf = snb_fetch(&bdev->snetBufferRecycleTrash, nbuf->size);
|
||||||
|
if (snbuf == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
BStackOrHeapArray<uint8, 512> data(nbuf->size);
|
||||||
|
if (!data.IsValid()) {
|
||||||
|
snb_park(&bdev->snetBufferRecycleTrash, snbuf);
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
nb->read(nbuf, 0, data, nbuf->size);
|
||||||
|
snb_put(snbuf, data, nbuf->size);
|
||||||
|
|
||||||
|
return submit_tx_command(bdev, snbuf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case BT_ACL:
|
case BT_ACL:
|
||||||
return submit_tx_acl(bdev, nbuf);
|
return submit_tx_acl(bdev, nbuf);
|
||||||
|
|||||||
Reference in New Issue
Block a user