mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
77 lines
1.8 KiB
C
77 lines
1.8 KiB
C
![]() |
/* SPDX-License-Identifier: GPL-2.0-only */
|
||
|
/*
|
||
|
* Copyright (C) 2025 Google Corporation
|
||
|
*/
|
||
|
|
||
|
#ifndef __HCI_DRV_H
|
||
|
#define __HCI_DRV_H
|
||
|
|
||
|
#include <linux/types.h>
|
||
|
|
||
|
#include <net/bluetooth/bluetooth.h>
|
||
|
#include <net/bluetooth/hci.h>
|
||
|
|
||
|
struct hci_drv_cmd_hdr {
|
||
|
__le16 opcode;
|
||
|
__le16 len;
|
||
|
} __packed;
|
||
|
|
||
|
struct hci_drv_ev_hdr {
|
||
|
__le16 opcode;
|
||
|
__le16 len;
|
||
|
} __packed;
|
||
|
|
||
|
#define HCI_DRV_EV_CMD_STATUS 0x0000
|
||
|
struct hci_drv_ev_cmd_status {
|
||
|
__le16 opcode;
|
||
|
__u8 status;
|
||
|
} __packed;
|
||
|
|
||
|
#define HCI_DRV_EV_CMD_COMPLETE 0x0001
|
||
|
struct hci_drv_ev_cmd_complete {
|
||
|
__le16 opcode;
|
||
|
__u8 status;
|
||
|
__u8 data[];
|
||
|
} __packed;
|
||
|
|
||
|
#define HCI_DRV_STATUS_SUCCESS 0x00
|
||
|
#define HCI_DRV_STATUS_UNSPECIFIED_ERROR 0x01
|
||
|
#define HCI_DRV_STATUS_UNKNOWN_COMMAND 0x02
|
||
|
#define HCI_DRV_STATUS_INVALID_PARAMETERS 0x03
|
||
|
|
||
|
#define HCI_DRV_MAX_DRIVER_NAME_LENGTH 32
|
||
|
|
||
|
/* Common commands that make sense on all drivers start from 0x0000 */
|
||
|
#define HCI_DRV_OP_READ_INFO 0x0000
|
||
|
#define HCI_DRV_READ_INFO_SIZE 0
|
||
|
struct hci_drv_rp_read_info {
|
||
|
__u8 driver_name[HCI_DRV_MAX_DRIVER_NAME_LENGTH];
|
||
|
__le16 num_supported_commands;
|
||
|
__le16 supported_commands[];
|
||
|
} __packed;
|
||
|
|
||
|
/* Driver specific OGF (Opcode Group Field)
|
||
|
* Commands in this group may have different meanings across different drivers.
|
||
|
*/
|
||
|
#define HCI_DRV_OGF_DRIVER_SPECIFIC 0x01
|
||
|
|
||
|
int hci_drv_cmd_status(struct hci_dev *hdev, u16 cmd, u8 status);
|
||
|
int hci_drv_cmd_complete(struct hci_dev *hdev, u16 cmd, u8 status, void *rp,
|
||
|
size_t rp_len);
|
||
|
int hci_drv_process_cmd(struct hci_dev *hdev, struct sk_buff *cmd_skb);
|
||
|
|
||
|
struct hci_drv_handler {
|
||
|
int (*func)(struct hci_dev *hdev, void *data, u16 data_len);
|
||
|
size_t data_len;
|
||
|
};
|
||
|
|
||
|
struct hci_drv {
|
||
|
size_t common_handler_count;
|
||
|
const struct hci_drv_handler *common_handlers;
|
||
|
|
||
|
size_t specific_handler_count;
|
||
|
const struct hci_drv_handler *specific_handlers;
|
||
|
};
|
||
|
|
||
|
#endif /* __HCI_DRV_H */
|