xref: /haiku/src/add-ons/kernel/drivers/bluetooth/h2/h2generic/h2generic.h (revision b0e0298370e176a0209d824b1ba45e537e185f3e)
1 /*
2  * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
3  *
4  * All rights reserved. Distributed under the terms of the MIT License.
5  *
6  */
7 #ifndef _H2GENERIC_H_
8 #define _H2GENERIC_H_
9 
10 
11 #include <net_buffer.h>
12 #include <net_device.h>
13 
14 #include <OS.h>
15 #include <USB3.h>
16 
17 #include <util/list.h>
18 #include <bluetooth/HCI/btHCI.h>
19 #include <bluetooth/HCI/btHCI_transport.h>
20 
21 #include <btCoreData.h>
22 
23 #include "snet_buffer.h"
24 
25 
26 // USB definitions for the generic device move to h2cfg
27 #define UDCLASS_WIRELESS	0xe0
28 #define UDSUBCLASS_RF		0x01
29 #define UDPROTO_BLUETOOTH	0x01
30 
31 #define BLUETOOTH_DEVICE_TRANSPORT	"h2"
32 #define BLUETOOTH_DEVICE_NAME "generic"
33 #include "h2cfg.h"
34 
35 #define USB_TYPE_CLASS			(0x01 << 5)  /// Check if it is in some other header
36 #define USB_TYPE_VENDOR			(0x02 << 5)
37 
38 #define TOUCH(x) ((void)(x))
39 
40 // Expecting nobody is gonna have 16 USB-BT dongles connected in their system
41 #define MAX_BT_GENERIC_USB_DEVICES	16
42 
43 extern usb_module_info* usb;
44 extern bt_hci_module_info* hci;
45 extern struct bt_hci_module_info* btDevices;
46 extern struct net_buffer_module_info* nb;
47 extern struct bluetooth_core_data_module_info* btCoreData;
48 
49 #define MAX_COMMAND_WINDOW 1
50 #define MAX_ACL_OUT_WINDOW 4
51 #define MAX_ACL_IN_WINDOW  1
52 
53 #define MAX_NUM_QUEUED_PACKETS 1
54 #define NUM_BUFFERS 1
55 
56 typedef struct bt_usb_dev bt_usb_dev;
57 
58 struct bt_usb_dev {
59 	usb_device		dev;          /* opaque handle */
60 	hci_id					hdev; /* HCI device id*/
61 	bluetooth_device*		ndev;
62 
63 	char			name[B_OS_NAME_LENGTH];
64 	bool			connected;    /* is the device plugged into the USB? */
65 	int32			open_count;   /* number of clients of the device */
66 	int32			num;          /* instance number of the device */
67 
68 	sem_id			lock;         /* synchronize access to the device */
69 	sem_id			cmd_complete; /* To synchronize completitions */
70 
71 	size_t			actual_len;   /* length of data returned by command */
72 	status_t		cmd_status;   /* result of command */
73 
74 	uint8				ctrl_req;
75 	uint8				driver_info;
76 	uint32				state;
77 
78 	bt_hci_statistics	stat;
79 
80 	const	usb_endpoint_info*	bulk_in_ep;
81 			uint16				max_packet_size_bulk_in;
82 	const	usb_endpoint_info*	bulk_out_ep;
83 			uint16				max_packet_size_bulk_out;
84 	const	usb_endpoint_info*	intr_in_ep;
85 			uint16				max_packet_size_intr_in;
86 
87 #ifdef BLUETOOTH_SUPPORTS_SCO
88 	const usb_endpoint_info	*iso_in_ep;
89 	const usb_endpoint_info	*iso_out_ep;
90 #endif
91 
92 	/* This so called rooms, are for dumping the USB RX frames
93 	 * and try to reuse the allocations. see util submodule
94 	 */
95 	struct list eventRoom;
96 	struct list aclRoom;
97 
98 	// Tx buffers: net_buffers for BT_ACL and snet_buffers for BT_COMMAND
99 	// in the same array
100 	struct list	nbuffersTx[BT_DRIVER_TXCOVERAGE];
101 	uint32		nbuffersPendingTx[BT_DRIVER_TXCOVERAGE];
102 
103 	// Rx buffer
104 	net_buffer*		nbufferRx[BT_DRIVER_RXCOVERAGE];
105 	snet_buffer*	eventRx;
106 
107 	// for who ever needs preallocated buffers
108 	struct list		snetBufferRecycleTrash;
109 
110 };
111 
112 bt_usb_dev* fetch_device(bt_usb_dev* dev, hci_id hid);
113 
114 
115 static inline uint32
TEST_AND_SET(uint32 * byte,uint32 bit_mask)116 TEST_AND_SET(uint32 *byte, uint32 bit_mask)
117 {
118 	uint32 val = (*byte&bit_mask)!=0;
119 	*byte |= bit_mask;
120 	return val;
121 }
122 
123 
124 static inline uint32
TEST_AND_CLEAR(uint32 * byte,uint32 bit_mask)125 TEST_AND_CLEAR(uint32* byte, uint32 bit_mask)
126 {
127 	uint32 val = (*byte&bit_mask)!=0;
128 	*byte &= ~bit_mask;
129 	return val;
130 }
131 
132 
133 #endif
134