xref: /linux/include/net/bluetooth/hci_drv.h (revision 1b98f357dadd6ea613a435fbaef1a5dd7b35fd21)
1*04425292SHsin-chen Chuang /* SPDX-License-Identifier: GPL-2.0-only */
2*04425292SHsin-chen Chuang /*
3*04425292SHsin-chen Chuang  * Copyright (C) 2025 Google Corporation
4*04425292SHsin-chen Chuang  */
5*04425292SHsin-chen Chuang 
6*04425292SHsin-chen Chuang #ifndef __HCI_DRV_H
7*04425292SHsin-chen Chuang #define __HCI_DRV_H
8*04425292SHsin-chen Chuang 
9*04425292SHsin-chen Chuang #include <linux/types.h>
10*04425292SHsin-chen Chuang 
11*04425292SHsin-chen Chuang #include <net/bluetooth/bluetooth.h>
12*04425292SHsin-chen Chuang #include <net/bluetooth/hci.h>
13*04425292SHsin-chen Chuang 
14*04425292SHsin-chen Chuang struct hci_drv_cmd_hdr {
15*04425292SHsin-chen Chuang 	__le16	opcode;
16*04425292SHsin-chen Chuang 	__le16	len;
17*04425292SHsin-chen Chuang } __packed;
18*04425292SHsin-chen Chuang 
19*04425292SHsin-chen Chuang struct hci_drv_ev_hdr {
20*04425292SHsin-chen Chuang 	__le16	opcode;
21*04425292SHsin-chen Chuang 	__le16	len;
22*04425292SHsin-chen Chuang } __packed;
23*04425292SHsin-chen Chuang 
24*04425292SHsin-chen Chuang #define HCI_DRV_EV_CMD_STATUS	0x0000
25*04425292SHsin-chen Chuang struct hci_drv_ev_cmd_status {
26*04425292SHsin-chen Chuang 	__le16	opcode;
27*04425292SHsin-chen Chuang 	__u8	status;
28*04425292SHsin-chen Chuang } __packed;
29*04425292SHsin-chen Chuang 
30*04425292SHsin-chen Chuang #define HCI_DRV_EV_CMD_COMPLETE	0x0001
31*04425292SHsin-chen Chuang struct hci_drv_ev_cmd_complete {
32*04425292SHsin-chen Chuang 	__le16	opcode;
33*04425292SHsin-chen Chuang 	__u8	status;
34*04425292SHsin-chen Chuang 	__u8	data[];
35*04425292SHsin-chen Chuang } __packed;
36*04425292SHsin-chen Chuang 
37*04425292SHsin-chen Chuang #define HCI_DRV_STATUS_SUCCESS			0x00
38*04425292SHsin-chen Chuang #define HCI_DRV_STATUS_UNSPECIFIED_ERROR	0x01
39*04425292SHsin-chen Chuang #define HCI_DRV_STATUS_UNKNOWN_COMMAND		0x02
40*04425292SHsin-chen Chuang #define HCI_DRV_STATUS_INVALID_PARAMETERS	0x03
41*04425292SHsin-chen Chuang 
42*04425292SHsin-chen Chuang #define HCI_DRV_MAX_DRIVER_NAME_LENGTH	32
43*04425292SHsin-chen Chuang 
44*04425292SHsin-chen Chuang /* Common commands that make sense on all drivers start from 0x0000 */
45*04425292SHsin-chen Chuang #define HCI_DRV_OP_READ_INFO	0x0000
46*04425292SHsin-chen Chuang #define HCI_DRV_READ_INFO_SIZE	0
47*04425292SHsin-chen Chuang struct hci_drv_rp_read_info {
48*04425292SHsin-chen Chuang 	__u8	driver_name[HCI_DRV_MAX_DRIVER_NAME_LENGTH];
49*04425292SHsin-chen Chuang 	__le16	num_supported_commands;
50*04425292SHsin-chen Chuang 	__le16	supported_commands[];
51*04425292SHsin-chen Chuang } __packed;
52*04425292SHsin-chen Chuang 
53*04425292SHsin-chen Chuang /* Driver specific OGF (Opcode Group Field)
54*04425292SHsin-chen Chuang  * Commands in this group may have different meanings across different drivers.
55*04425292SHsin-chen Chuang  */
56*04425292SHsin-chen Chuang #define HCI_DRV_OGF_DRIVER_SPECIFIC	0x01
57*04425292SHsin-chen Chuang 
58*04425292SHsin-chen Chuang int hci_drv_cmd_status(struct hci_dev *hdev, u16 cmd, u8 status);
59*04425292SHsin-chen Chuang int hci_drv_cmd_complete(struct hci_dev *hdev, u16 cmd, u8 status, void *rp,
60*04425292SHsin-chen Chuang 			 size_t rp_len);
61*04425292SHsin-chen Chuang int hci_drv_process_cmd(struct hci_dev *hdev, struct sk_buff *cmd_skb);
62*04425292SHsin-chen Chuang 
63*04425292SHsin-chen Chuang struct hci_drv_handler {
64*04425292SHsin-chen Chuang 	int (*func)(struct hci_dev *hdev, void *data, u16 data_len);
65*04425292SHsin-chen Chuang 	size_t data_len;
66*04425292SHsin-chen Chuang };
67*04425292SHsin-chen Chuang 
68*04425292SHsin-chen Chuang struct hci_drv {
69*04425292SHsin-chen Chuang 	size_t common_handler_count;
70*04425292SHsin-chen Chuang 	const struct hci_drv_handler *common_handlers;
71*04425292SHsin-chen Chuang 
72*04425292SHsin-chen Chuang 	size_t specific_handler_count;
73*04425292SHsin-chen Chuang 	const struct hci_drv_handler *specific_handlers;
74*04425292SHsin-chen Chuang };
75*04425292SHsin-chen Chuang 
76*04425292SHsin-chen Chuang #endif /* __HCI_DRV_H */
77