Blame view

net/nfc/digital.h 5.57 KB
4b10884eb   Thierry Escande   NFC: Digital Prot...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  /*
   * NFC Digital Protocol stack
   * Copyright (c) 2013, Intel Corporation.
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   * more details.
   *
   */
  
  #ifndef __DIGITAL_H
  #define __DIGITAL_H
  
  #include <net/nfc/nfc.h>
  #include <net/nfc/digital.h>
2c66daecc   Thierry Escande   NFC Digital: Add ...
21
  #include <linux/crc-ccitt.h>
8c0695e49   Thierry Escande   NFC Digital: Add ...
22
  #include <linux/crc-itu-t.h>
2c66daecc   Thierry Escande   NFC Digital: Add ...
23

c5da0e4a3   Samuel Ortiz   NFC: digital: Rem...
24
25
26
  #define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s
  ", \
  				 __LINE__, req)
4b10884eb   Thierry Escande   NFC: Digital Prot...
27

59ee2361c   Thierry Escande   NFC Digital: Impl...
28
29
30
31
  #define DIGITAL_CMD_IN_SEND        0
  #define DIGITAL_CMD_TG_SEND        1
  #define DIGITAL_CMD_TG_LISTEN      2
  #define DIGITAL_CMD_TG_LISTEN_MDAA 3
bf30a67c9   Mark A. Greer   NFC: digital: Add...
32
  #define DIGITAL_CMD_TG_LISTEN_MD   4
59ee2361c   Thierry Escande   NFC Digital: Impl...
33
34
35
  
  #define DIGITAL_MAX_HEADER_LEN 7
  #define DIGITAL_CRC_LEN        2
7d0911c02   Thierry Escande   NFC Digital: Add ...
36
37
38
39
40
41
  #define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01
  #define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE
  
  #define DIGITAL_SENS_RES_NFC_DEP 0x0100
  #define DIGITAL_SEL_RES_NFC_DEP  0x40
  #define DIGITAL_SENSF_FELICA_SC  0xFFFF
2c66daecc   Thierry Escande   NFC Digital: Add ...
42
43
44
45
46
47
48
49
50
  #define DIGITAL_DRV_CAPS_IN_CRC(ddev) \
  	((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC)
  #define DIGITAL_DRV_CAPS_TG_CRC(ddev) \
  	((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC)
  
  struct digital_data_exch {
  	data_exchange_cb_t cb;
  	void *cb_context;
  };
59ee2361c   Thierry Escande   NFC Digital: Impl...
51
52
53
54
  struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
  				  unsigned int len);
  
  int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
1c7a4c24f   Thierry Escande   NFC Digital: Add ...
55
56
57
  		     struct sk_buff *skb, struct digital_tg_mdaa_params *params,
  		     u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
  		     void *cb_context);
59ee2361c   Thierry Escande   NFC Digital: Impl...
58
59
60
61
62
63
64
  
  int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
  static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev,
  				      struct sk_buff *skb, u16 timeout,
  				      nfc_digital_cmd_complete_t cmd_cb,
  				      void *cb_context)
  {
1c7a4c24f   Thierry Escande   NFC Digital: Add ...
65
66
  	return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout,
  				cmd_cb, cb_context);
59ee2361c   Thierry Escande   NFC Digital: Impl...
67
68
69
70
71
  }
  
  void digital_poll_next_tech(struct nfc_digital_dev *ddev);
  
  int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
247346073   Mark A. Greer   NFC: digital: Add...
72
  int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech);
8c0695e49   Thierry Escande   NFC Digital: Add ...
73
  int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
a381d4828   Mark A. Greer   NFC: digital: Add...
74
  int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
59ee2361c   Thierry Escande   NFC Digital: Impl...
75

c813007f9   Thierry Escande   NFC: digital: Add...
76
77
78
79
  int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
  				struct sk_buff *skb);
  int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
  				struct sk_buff *skb);
2c66daecc   Thierry Escande   NFC Digital: Add ...
80
81
82
83
  int digital_target_found(struct nfc_digital_dev *ddev,
  			 struct nfc_target *target, u8 protocol);
  
  int digital_in_recv_mifare_res(struct sk_buff *resp);
7d0911c02   Thierry Escande   NFC Digital: Add ...
84
85
86
87
88
89
  int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
  			    struct nfc_target *target, __u8 comm_mode, __u8 *gb,
  			    size_t gb_len);
  int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
  			    struct nfc_target *target, struct sk_buff *skb,
  			    struct digital_data_exch *data_exch);
1c7a4c24f   Thierry Escande   NFC Digital: Add ...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
  static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev,
  			struct sk_buff *skb, u16 timeout,
  			nfc_digital_cmd_complete_t cmd_cb, void *cb_context)
  {
  	return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout,
  				cmd_cb, cb_context);
  }
  
  void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
  			      struct sk_buff *resp);
  
  void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
  			       struct sk_buff *resp);
  
  static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
  				    nfc_digital_cmd_complete_t cb, void *arg)
  {
  	return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL,
  				timeout, cb, arg);
  }
  
  void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
  			     struct sk_buff *resp);
  
  int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
  
  int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
  int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
bf30a67c9   Mark A. Greer   NFC: digital: Add...
119
120
  void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
  			    struct sk_buff *resp);
1c7a4c24f   Thierry Escande   NFC Digital: Add ...
121

2c66daecc   Thierry Escande   NFC Digital: Add ...
122
123
124
125
  typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
  
  #define CRC_A_INIT 0x6363
  #define CRC_B_INIT 0xFFFF
8c0695e49   Thierry Escande   NFC Digital: Add ...
126
  #define CRC_F_INIT 0x0000
2c66daecc   Thierry Escande   NFC Digital: Add ...
127
128
129
130
131
132
133
134
135
136
137
138
139
  
  void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
  			 u8 bitwise_inv, u8 msb_first);
  
  static inline void digital_skb_add_crc_a(struct sk_buff *skb)
  {
  	digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
  }
  
  static inline void digital_skb_add_crc_b(struct sk_buff *skb)
  {
  	digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
  }
8c0695e49   Thierry Escande   NFC Digital: Add ...
140
141
142
143
  static inline void digital_skb_add_crc_f(struct sk_buff *skb)
  {
  	digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
  }
2c66daecc   Thierry Escande   NFC Digital: Add ...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  static inline void digital_skb_add_crc_none(struct sk_buff *skb)
  {
  	return;
  }
  
  int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
  			  u16 crc_init, u8 bitwise_inv, u8 msb_first);
  
  static inline int digital_skb_check_crc_a(struct sk_buff *skb)
  {
  	return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
  }
  
  static inline int digital_skb_check_crc_b(struct sk_buff *skb)
  {
  	return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
  }
8c0695e49   Thierry Escande   NFC Digital: Add ...
161
162
163
164
  static inline int digital_skb_check_crc_f(struct sk_buff *skb)
  {
  	return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
  }
2c66daecc   Thierry Escande   NFC Digital: Add ...
165
166
167
168
  static inline int digital_skb_check_crc_none(struct sk_buff *skb)
  {
  	return 0;
  }
4b10884eb   Thierry Escande   NFC: Digital Prot...
169
  #endif /* __DIGITAL_H */