^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef __LOCAL_HCI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define __LOCAL_HCI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <net/nfc/hci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct gate_pipe_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) u8 gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) u8 pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) struct hcp_message {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) u8 header; /* type -cmd,evt,rsp- + instruction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) u8 data[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct hcp_packet {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) u8 header; /* cbit+pipe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct hcp_message message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct hcp_exec_waiter {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) wait_queue_head_t *wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) bool exec_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) int exec_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct sk_buff *result_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct hci_msg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct list_head msg_l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct sk_buff_head msg_frags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) bool wait_response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) data_exchange_cb_t cb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) void *cb_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) unsigned long completion_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct hci_create_pipe_params {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u8 src_gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u8 dest_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) u8 dest_gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct hci_create_pipe_resp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u8 src_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) u8 src_gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u8 dest_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u8 dest_gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) u8 pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct hci_delete_pipe_noti {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u8 pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct hci_all_pipe_cleared_noti {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) u8 host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define NFC_HCI_FRAGMENT 0x7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define HCP_HEADER(type, instr) ((((type) & 0x03) << 6) | ((instr) & 0x3f))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define HCP_MSG_GET_TYPE(header) ((header & 0xc0) >> 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define HCP_MSG_GET_CMD(header) (header & 0x3f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int nfc_hci_hcp_message_tx(struct nfc_hci_dev *hdev, u8 pipe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u8 type, u8 instruction,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) const u8 *payload, size_t payload_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) data_exchange_cb_t cb, void *cb_context,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) unsigned long completion_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) void nfc_hci_hcp_message_rx(struct nfc_hci_dev *hdev, u8 pipe, u8 type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u8 instruction, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* HCP headers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define NFC_HCI_HCP_PACKET_HEADER_LEN 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define NFC_HCI_HCP_MESSAGE_HEADER_LEN 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define NFC_HCI_HCP_HEADER_LEN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* HCP types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define NFC_HCI_HCP_COMMAND 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define NFC_HCI_HCP_EVENT 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define NFC_HCI_HCP_RESPONSE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* Generic commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define NFC_HCI_ANY_SET_PARAMETER 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define NFC_HCI_ANY_GET_PARAMETER 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define NFC_HCI_ANY_OPEN_PIPE 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define NFC_HCI_ANY_CLOSE_PIPE 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* Reader RF commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define NFC_HCI_WR_XCHG_DATA 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Admin commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define NFC_HCI_ADM_CREATE_PIPE 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define NFC_HCI_ADM_DELETE_PIPE 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define NFC_HCI_ADM_NOTIFY_PIPE_CREATED 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define NFC_HCI_ADM_NOTIFY_PIPE_DELETED 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define NFC_HCI_ADM_CLEAR_ALL_PIPE 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define NFC_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* Generic responses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define NFC_HCI_ANY_OK 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define NFC_HCI_ANY_E_NOT_CONNECTED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define NFC_HCI_ANY_E_CMD_PAR_UNKNOWN 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define NFC_HCI_ANY_E_NOK 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define NFC_HCI_ANY_E_PIPES_FULL 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define NFC_HCI_ANY_E_REG_PAR_UNKNOWN 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define NFC_HCI_ANY_E_PIPE_NOT_OPENED 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define NFC_HCI_ANY_E_CMD_NOT_SUPPORTED 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define NFC_HCI_ANY_E_INHIBITED 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define NFC_HCI_ANY_E_TIMEOUT 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define NFC_HCI_ANY_E_REG_ACCESS_DENIED 0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define NFC_HCI_ANY_E_PIPE_ACCESS_DENIED 0x0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #endif /* __LOCAL_HCI_H */