Bluetooth: Adds isochronous usb endpoint to bluetooth h2generic driver

This changes the driver to scan all usb interfaces.

Change-Id: Ieebbabe549ff126e4c3df1e33f2993c2da66bb1d
Reviewed-on: https://review.haiku-os.org/c/haiku/+/11025
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
Haiku-Format: Haiku-format Bot <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
vighnesh-sawant
2026-06-01 08:31:21 +00:00
committed by Adrien Destugues
parent 30a47b2406
commit 7e713fa44e
2 changed files with 61 additions and 32 deletions
@@ -18,11 +18,12 @@
#include <btModules.h> #include <btModules.h>
#include "snet_buffer.h" #include "bluetooth/HCI/btHCI_transport.h"
#include "h2cfg.h" #include "h2cfg.h"
#include "h2debug.h" #include "h2debug.h"
#include "h2transactions.h" #include "h2transactions.h"
#include "h2util.h" #include "h2util.h"
#include "snet_buffer.h"
int32 api_version = B_CUR_DRIVER_API_VERSION; int32 api_version = B_CUR_DRIVER_API_VERSION;
@@ -316,36 +317,47 @@ device_added(usb_device dev, void** cookie)
config->interface_count); config->interface_count);
// Find endpoints that we need // Find endpoints that we need
uif = config->interface->active; for (size_t i = 0; i < config->interface_count; i++) {
for (e = 0; e < uif->descr->num_endpoints; e++) { uif = config->interface[i].active;
for (e = 0; e < uif->descr->num_endpoints; e++) {
ep = &uif->endpoint[e]; ep = &uif->endpoint[e];
switch (ep->descr->attributes & USB_ENDPOINT_ATTR_MASK) { switch (ep->descr->attributes & USB_ENDPOINT_ATTR_MASK) {
case USB_ENDPOINT_ATTR_INTERRUPT: case USB_ENDPOINT_ATTR_INTERRUPT:
if (ep->descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) if (ep->descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) {
{ new_bt_dev->intr_in_ep = ep;
new_bt_dev->intr_in_ep = ep; new_bt_dev->max_packet_size_intr_in = ep->descr->max_packet_size;
new_bt_dev->max_packet_size_intr_in TRACE("%s: INT in\n", __func__);
= ep->descr->max_packet_size; } else {
TRACE("%s: INT in\n", __func__); TRACE("%s: INT out\n", __func__);
} else { }
TRACE("%s: INT out\n", __func__); break;
}
break;
case USB_ENDPOINT_ATTR_BULK: case USB_ENDPOINT_ATTR_BULK:
if (ep->descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) { if (ep->descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) {
new_bt_dev->bulk_in_ep = ep; new_bt_dev->bulk_in_ep = ep;
new_bt_dev->max_packet_size_bulk_in new_bt_dev->max_packet_size_bulk_in = ep->descr->max_packet_size;
= ep->descr->max_packet_size; TRACE("%s: BULK in\n", __func__);
TRACE("%s: BULK int\n", __func__); } else {
} else { new_bt_dev->bulk_out_ep = ep;
new_bt_dev->bulk_out_ep = ep; new_bt_dev->max_packet_size_bulk_out = ep->descr->max_packet_size;
new_bt_dev->max_packet_size_bulk_out TRACE("%s: BULK out\n", __func__);
= ep->descr->max_packet_size; }
TRACE("%s: BULK out\n", __func__); break;
} #ifdef BT_DRIVER_SUPPORTS_SCO
break; case USB_ENDPOINT_ATTR_ISOCHRONOUS:
if (ep->descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) {
new_bt_dev->iso_in_ep = ep;
new_bt_dev->max_packet_size_isoc_in = ep->descr->max_packet_size;
TRACE("%s: ISO in found\n", __func__);
} else {
new_bt_dev->iso_out_ep = ep;
new_bt_dev->max_packet_size_isoc_out = ep->descr->max_packet_size;
TRACE("%s: ISO out found\n", __func__);
}
break;
#endif
}
} }
} }
@@ -355,6 +367,11 @@ device_added(usb_device dev, void** cookie)
goto bail; goto bail;
} }
if (!new_bt_dev->iso_in_ep || !new_bt_dev->iso_out_ep) {
ERROR("%s: Endpoints for BT SCO not found\n", __func__);
new_bt_dev->driver_info |= BT_SCO_NOT_WORKING;
}
// Look into the devices suported to understand this // Look into the devices suported to understand this
if (new_bt_dev->driver_info & BT_DIGIANSWER) if (new_bt_dev->driver_info & BT_DIGIANSWER)
new_bt_dev->ctrl_req = USB_TYPE_VENDOR; new_bt_dev->ctrl_req = USB_TYPE_VENDOR;
@@ -401,6 +418,10 @@ device_removed(void* cookie)
usb->cancel_queued_transfers(bdev->bulk_in_ep->handle); usb->cancel_queued_transfers(bdev->bulk_in_ep->handle);
if (bdev->bulk_out_ep != NULL) if (bdev->bulk_out_ep != NULL)
usb->cancel_queued_transfers(bdev->bulk_out_ep->handle); usb->cancel_queued_transfers(bdev->bulk_out_ep->handle);
if (bdev->iso_in_ep != NULL)
usb->cancel_queued_transfers(bdev->iso_in_ep->handle);
if (bdev->iso_out_ep != NULL)
usb->cancel_queued_transfers(bdev->iso_out_ep->handle);
bdev->connected = false; bdev->connected = false;
@@ -566,6 +587,12 @@ device_close(void* cookie)
if (bdev->bulk_out_ep!=NULL) if (bdev->bulk_out_ep!=NULL)
usb->cancel_queued_transfers(bdev->bulk_out_ep->handle); usb->cancel_queued_transfers(bdev->bulk_out_ep->handle);
if (bdev->iso_in_ep != NULL)
usb->cancel_queued_transfers(bdev->iso_in_ep->handle);
if (bdev->iso_out_ep != NULL)
usb->cancel_queued_transfers(bdev->iso_out_ep->handle);
} }
// TX // TX
@@ -84,9 +84,11 @@ struct bt_usb_dev {
const usb_endpoint_info* intr_in_ep; const usb_endpoint_info* intr_in_ep;
uint16 max_packet_size_intr_in; uint16 max_packet_size_intr_in;
#ifdef BLUETOOTH_SUPPORTS_SCO #ifdef BT_DRIVER_SUPPORTS_SCO
const usb_endpoint_info *iso_in_ep; const usb_endpoint_info* iso_in_ep;
const usb_endpoint_info *iso_out_ep; uint16 max_packet_size_isoc_in;
const usb_endpoint_info* iso_out_ep;
uint16 max_packet_size_isoc_out;
#endif #endif
/* This so called rooms, are for dumping the USB RX frames /* This so called rooms, are for dumping the USB RX frames