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