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