~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/driver-api/nfc/nfc-hci.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/driver-api/nfc/nfc-hci.rst (Version linux-6.12-rc7) and /Documentation/driver-api/nfc/nfc-hci.rst (Version linux-6.1.116)


  1 ========================                            1 ========================
  2 HCI backend for NFC Core                            2 HCI backend for NFC Core
  3 ========================                            3 ========================
  4                                                     4 
  5 - Author: Eric Lapuyade, Samuel Ortiz               5 - Author: Eric Lapuyade, Samuel Ortiz
  6 - Contact: eric.lapuyade@intel.com, samuel.ort      6 - Contact: eric.lapuyade@intel.com, samuel.ortiz@intel.com
  7                                                     7 
  8 General                                             8 General
  9 -------                                             9 -------
 10                                                    10 
 11 The HCI layer implements much of the ETSI TS 1     11 The HCI layer implements much of the ETSI TS 102 622 V10.2.0 specification. It
 12 enables easy writing of HCI-based NFC drivers.     12 enables easy writing of HCI-based NFC drivers. The HCI layer runs as an NFC Core
 13 backend, implementing an abstract nfc device a     13 backend, implementing an abstract nfc device and translating NFC Core API
 14 to HCI commands and events.                        14 to HCI commands and events.
 15                                                    15 
 16 HCI                                                16 HCI
 17 ---                                                17 ---
 18                                                    18 
 19 HCI registers as an nfc device with NFC Core.      19 HCI registers as an nfc device with NFC Core. Requests coming from userspace are
 20 routed through netlink sockets to NFC Core and     20 routed through netlink sockets to NFC Core and then to HCI. From this point,
 21 they are translated in a sequence of HCI comma     21 they are translated in a sequence of HCI commands sent to the HCI layer in the
 22 host controller (the chip). Commands can be ex     22 host controller (the chip). Commands can be executed synchronously (the sending
 23 context blocks waiting for response) or asynch     23 context blocks waiting for response) or asynchronously (the response is returned
 24 from HCI Rx context).                              24 from HCI Rx context).
 25 HCI events can also be received from the host      25 HCI events can also be received from the host controller. They will be handled
 26 and a translation will be forwarded to NFC Cor     26 and a translation will be forwarded to NFC Core as needed. There are hooks to
 27 let the HCI driver handle proprietary events o     27 let the HCI driver handle proprietary events or override standard behavior.
 28 HCI uses 2 execution contexts:                     28 HCI uses 2 execution contexts:
 29                                                    29 
 30 - one for executing commands : nfc_hci_msg_tx_     30 - one for executing commands : nfc_hci_msg_tx_work(). Only one command
 31   can be executing at any given moment.            31   can be executing at any given moment.
 32 - one for dispatching received events and comm     32 - one for dispatching received events and commands : nfc_hci_msg_rx_work().
 33                                                    33 
 34 HCI Session initialization                         34 HCI Session initialization
 35 --------------------------                         35 --------------------------
 36                                                    36 
 37 The Session initialization is an HCI standard      37 The Session initialization is an HCI standard which must unfortunately
 38 support proprietary gates. This is the reason      38 support proprietary gates. This is the reason why the driver will pass a list
 39 of proprietary gates that must be part of the      39 of proprietary gates that must be part of the session. HCI will ensure all
 40 those gates have pipes connected when the hci      40 those gates have pipes connected when the hci device is set up.
 41 In case the chip supports pre-opened gates and     41 In case the chip supports pre-opened gates and pseudo-static pipes, the driver
 42 can pass that information to HCI core.             42 can pass that information to HCI core.
 43                                                    43 
 44 HCI Gates and Pipes                                44 HCI Gates and Pipes
 45 -------------------                                45 -------------------
 46                                                    46 
 47 A gate defines the 'port' where some service c     47 A gate defines the 'port' where some service can be found. In order to access
 48 a service, one must create a pipe to that gate     48 a service, one must create a pipe to that gate and open it. In this
 49 implementation, pipes are totally hidden. The      49 implementation, pipes are totally hidden. The public API only knows gates.
 50 This is consistent with the driver need to sen     50 This is consistent with the driver need to send commands to proprietary gates
 51 without knowing the pipe connected to it.          51 without knowing the pipe connected to it.
 52                                                    52 
 53 Driver interface                                   53 Driver interface
 54 ----------------                                   54 ----------------
 55                                                    55 
 56 A driver is generally written in two parts : t     56 A driver is generally written in two parts : the physical link management and
 57 the HCI management. This makes it easier to ma     57 the HCI management. This makes it easier to maintain a driver for a chip that
 58 can be connected using various phy (i2c, spi,      58 can be connected using various phy (i2c, spi, ...)
 59                                                    59 
 60 HCI Management                                     60 HCI Management
 61 --------------                                     61 --------------
 62                                                    62 
 63 A driver would normally register itself with H     63 A driver would normally register itself with HCI and provide the following
 64 entry points::                                     64 entry points::
 65                                                    65 
 66   struct nfc_hci_ops {                             66   struct nfc_hci_ops {
 67         int (*open)(struct nfc_hci_dev *hdev);     67         int (*open)(struct nfc_hci_dev *hdev);
 68         void (*close)(struct nfc_hci_dev *hdev     68         void (*close)(struct nfc_hci_dev *hdev);
 69         int (*hci_ready) (struct nfc_hci_dev *     69         int (*hci_ready) (struct nfc_hci_dev *hdev);
 70         int (*xmit) (struct nfc_hci_dev *hdev,     70         int (*xmit) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
 71         int (*start_poll) (struct nfc_hci_dev      71         int (*start_poll) (struct nfc_hci_dev *hdev,
 72                            u32 im_protocols, u     72                            u32 im_protocols, u32 tm_protocols);
 73         int (*dep_link_up)(struct nfc_hci_dev      73         int (*dep_link_up)(struct nfc_hci_dev *hdev, struct nfc_target *target,
 74                            u8 comm_mode, u8 *g     74                            u8 comm_mode, u8 *gb, size_t gb_len);
 75         int (*dep_link_down)(struct nfc_hci_de     75         int (*dep_link_down)(struct nfc_hci_dev *hdev);
 76         int (*target_from_gate) (struct nfc_hc     76         int (*target_from_gate) (struct nfc_hci_dev *hdev, u8 gate,
 77                                  struct nfc_ta     77                                  struct nfc_target *target);
 78         int (*complete_target_discovered) (str     78         int (*complete_target_discovered) (struct nfc_hci_dev *hdev, u8 gate,
 79                                            str     79                                            struct nfc_target *target);
 80         int (*im_transceive) (struct nfc_hci_d     80         int (*im_transceive) (struct nfc_hci_dev *hdev,
 81                               struct nfc_targe     81                               struct nfc_target *target, struct sk_buff *skb,
 82                               data_exchange_cb     82                               data_exchange_cb_t cb, void *cb_context);
 83         int (*tm_send)(struct nfc_hci_dev *hde     83         int (*tm_send)(struct nfc_hci_dev *hdev, struct sk_buff *skb);
 84         int (*check_presence)(struct nfc_hci_d     84         int (*check_presence)(struct nfc_hci_dev *hdev,
 85                               struct nfc_targe     85                               struct nfc_target *target);
 86         int (*event_received)(struct nfc_hci_d     86         int (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event,
 87                               struct sk_buff *     87                               struct sk_buff *skb);
 88   };                                               88   };
 89                                                    89 
 90 - open() and close() shall turn the hardware o     90 - open() and close() shall turn the hardware on and off.
 91 - hci_ready() is an optional entry point that      91 - hci_ready() is an optional entry point that is called right after the hci
 92   session has been set up. The driver can use      92   session has been set up. The driver can use it to do additional initialization
 93   that must be performed using HCI commands.       93   that must be performed using HCI commands.
 94 - xmit() shall simply write a frame to the phy     94 - xmit() shall simply write a frame to the physical link.
 95 - start_poll() is an optional entrypoint that      95 - start_poll() is an optional entrypoint that shall set the hardware in polling
 96   mode. This must be implemented only if the h     96   mode. This must be implemented only if the hardware uses proprietary gates or a
 97   mechanism slightly different from the HCI st     97   mechanism slightly different from the HCI standard.
 98 - dep_link_up() is called after a p2p target h     98 - dep_link_up() is called after a p2p target has been detected, to finish
 99   the p2p connection setup with hardware param     99   the p2p connection setup with hardware parameters that need to be passed back
100   to nfc core.                                    100   to nfc core.
101 - dep_link_down() is called to bring the p2p l    101 - dep_link_down() is called to bring the p2p link down.
102 - target_from_gate() is an optional entrypoint    102 - target_from_gate() is an optional entrypoint to return the nfc protocols
103   corresponding to a proprietary gate.            103   corresponding to a proprietary gate.
104 - complete_target_discovered() is an optional     104 - complete_target_discovered() is an optional entry point to let the driver
105   perform additional proprietary processing ne    105   perform additional proprietary processing necessary to auto activate the
106   discovered target.                              106   discovered target.
107 - im_transceive() must be implemented by the d    107 - im_transceive() must be implemented by the driver if proprietary HCI commands
108   are required to send data to the tag. Some t    108   are required to send data to the tag. Some tag types will require custom
109   commands, others can be written to using the    109   commands, others can be written to using the standard HCI commands. The driver
110   can check the tag type and either do proprie    110   can check the tag type and either do proprietary processing, or return 1 to ask
111   for standard processing. The data exchange c    111   for standard processing. The data exchange command itself must be sent
112   asynchronously.                                 112   asynchronously.
113 - tm_send() is called to send data in the case    113 - tm_send() is called to send data in the case of a p2p connection
114 - check_presence() is an optional entry point     114 - check_presence() is an optional entry point that will be called regularly
115   by the core to check that an activated tag i    115   by the core to check that an activated tag is still in the field. If this is
116   not implemented, the core will not be able t    116   not implemented, the core will not be able to push tag_lost events to the user
117   space                                           117   space
118 - event_received() is called to handle an even    118 - event_received() is called to handle an event coming from the chip. Driver
119   can handle the event or return 1 to let HCI     119   can handle the event or return 1 to let HCI attempt standard processing.
120                                                   120 
121 On the rx path, the driver is responsible to p    121 On the rx path, the driver is responsible to push incoming HCP frames to HCI
122 using nfc_hci_recv_frame(). HCI will take care    122 using nfc_hci_recv_frame(). HCI will take care of re-aggregation and handling
123 This must be done from a context that can slee    123 This must be done from a context that can sleep.
124                                                   124 
125 PHY Management                                    125 PHY Management
126 --------------                                    126 --------------
127                                                   127 
128 The physical link (i2c, ...) management is def    128 The physical link (i2c, ...) management is defined by the following structure::
129                                                   129 
130   struct nfc_phy_ops {                            130   struct nfc_phy_ops {
131         int (*write)(void *dev_id, struct sk_b    131         int (*write)(void *dev_id, struct sk_buff *skb);
132         int (*enable)(void *dev_id);              132         int (*enable)(void *dev_id);
133         void (*disable)(void *dev_id);            133         void (*disable)(void *dev_id);
134   };                                              134   };
135                                                   135 
136 enable():                                         136 enable():
137         turn the phy on (power on), make it re    137         turn the phy on (power on), make it ready to transfer data
138 disable():                                        138 disable():
139         turn the phy off                          139         turn the phy off
140 write():                                          140 write():
141         Send a data frame to the chip. Note th    141         Send a data frame to the chip. Note that to enable higher
142         layers such as an llc to store the fra    142         layers such as an llc to store the frame for re-emission, this
143         function must not alter the skb. It mu    143         function must not alter the skb. It must also not return a positive
144         result (return 0 for success, negative    144         result (return 0 for success, negative for failure).
145                                                   145 
146 Data coming from the chip shall be sent direct    146 Data coming from the chip shall be sent directly to nfc_hci_recv_frame().
147                                                   147 
148 LLC                                               148 LLC
149 ---                                               149 ---
150                                                   150 
151 Communication between the CPU and the chip oft    151 Communication between the CPU and the chip often requires some link layer
152 protocol. Those are isolated as modules manage    152 protocol. Those are isolated as modules managed by the HCI layer. There are
153 currently two modules : nop (raw transfer) and !! 153 currently two modules : nop (raw transfert) and shdlc.
154 A new llc must implement the following functio    154 A new llc must implement the following functions::
155                                                   155 
156   struct nfc_llc_ops {                            156   struct nfc_llc_ops {
157         void *(*init) (struct nfc_hci_dev *hde    157         void *(*init) (struct nfc_hci_dev *hdev, xmit_to_drv_t xmit_to_drv,
158                        rcv_to_hci_t rcv_to_hci    158                        rcv_to_hci_t rcv_to_hci, int tx_headroom,
159                        int tx_tailroom, int *r    159                        int tx_tailroom, int *rx_headroom, int *rx_tailroom,
160                        llc_failure_t llc_failu    160                        llc_failure_t llc_failure);
161         void (*deinit) (struct nfc_llc *llc);     161         void (*deinit) (struct nfc_llc *llc);
162         int (*start) (struct nfc_llc *llc);       162         int (*start) (struct nfc_llc *llc);
163         int (*stop) (struct nfc_llc *llc);        163         int (*stop) (struct nfc_llc *llc);
164         void (*rcv_from_drv) (struct nfc_llc *    164         void (*rcv_from_drv) (struct nfc_llc *llc, struct sk_buff *skb);
165         int (*xmit_from_hci) (struct nfc_llc *    165         int (*xmit_from_hci) (struct nfc_llc *llc, struct sk_buff *skb);
166   };                                              166   };
167                                                   167 
168 init():                                           168 init():
169         allocate and init your private storage    169         allocate and init your private storage
170 deinit():                                         170 deinit():
171         cleanup                                   171         cleanup
172 start():                                          172 start():
173         establish the logical connection          173         establish the logical connection
174 stop ():                                          174 stop ():
175         terminate the logical connection          175         terminate the logical connection
176 rcv_from_drv():                                   176 rcv_from_drv():
177         handle data coming from the chip, goin    177         handle data coming from the chip, going to HCI
178 xmit_from_hci():                                  178 xmit_from_hci():
179         handle data sent by HCI, going to the     179         handle data sent by HCI, going to the chip
180                                                   180 
181 The llc must be registered with nfc before it     181 The llc must be registered with nfc before it can be used. Do that by
182 calling::                                         182 calling::
183                                                   183 
184         nfc_llc_register(const char *name, con    184         nfc_llc_register(const char *name, const struct nfc_llc_ops *ops);
185                                                   185 
186 Again, note that the llc does not handle the p    186 Again, note that the llc does not handle the physical link. It is thus very
187 easy to mix any physical link with any llc for    187 easy to mix any physical link with any llc for a given chip driver.
188                                                   188 
189 Included Drivers                                  189 Included Drivers
190 ----------------                                  190 ----------------
191                                                   191 
192 An HCI based driver for an NXP PN544, connecte    192 An HCI based driver for an NXP PN544, connected through I2C bus, and using
193 shdlc is included.                                193 shdlc is included.
194                                                   194 
195 Execution Contexts                                195 Execution Contexts
196 ------------------                                196 ------------------
197                                                   197 
198 The execution contexts are the following:         198 The execution contexts are the following:
199 - IRQ handler (IRQH):                             199 - IRQ handler (IRQH):
200 fast, cannot sleep. sends incoming frames to H    200 fast, cannot sleep. sends incoming frames to HCI where they are passed to
201 the current llc. In case of shdlc, the frame i    201 the current llc. In case of shdlc, the frame is queued in shdlc rx queue.
202                                                   202 
203 - SHDLC State Machine worker (SMW)                203 - SHDLC State Machine worker (SMW)
204                                                   204 
205   Only when llc_shdlc is used: handles shdlc r    205   Only when llc_shdlc is used: handles shdlc rx & tx queues.
206                                                   206 
207   Dispatches HCI cmd responses.                   207   Dispatches HCI cmd responses.
208                                                   208 
209 - HCI Tx Cmd worker (MSGTXWQ)                     209 - HCI Tx Cmd worker (MSGTXWQ)
210                                                   210 
211   Serializes execution of HCI commands.           211   Serializes execution of HCI commands.
212                                                   212 
213   Completes execution in case of response time    213   Completes execution in case of response timeout.
214                                                   214 
215 - HCI Rx worker (MSGRXWQ)                         215 - HCI Rx worker (MSGRXWQ)
216                                                   216 
217   Dispatches incoming HCI commands or events.     217   Dispatches incoming HCI commands or events.
218                                                   218 
219 - Syscall context from a userspace call (SYSCA    219 - Syscall context from a userspace call (SYSCALL)
220                                                   220 
221   Any entrypoint in HCI called from NFC Core      221   Any entrypoint in HCI called from NFC Core
222                                                   222 
223 Workflow executing an HCI command (using shdlc    223 Workflow executing an HCI command (using shdlc)
224 ----------------------------------------------    224 -----------------------------------------------
225                                                   225 
226 Executing an HCI command can easily be perform    226 Executing an HCI command can easily be performed synchronously using the
227 following API::                                   227 following API::
228                                                   228 
229   int nfc_hci_send_cmd (struct nfc_hci_dev *hd    229   int nfc_hci_send_cmd (struct nfc_hci_dev *hdev, u8 gate, u8 cmd,
230                         const u8 *param, size_    230                         const u8 *param, size_t param_len, struct sk_buff **skb)
231                                                   231 
232 The API must be invoked from a context that ca    232 The API must be invoked from a context that can sleep. Most of the time, this
233 will be the syscall context. skb will return t    233 will be the syscall context. skb will return the result that was received in
234 the response.                                     234 the response.
235                                                   235 
236 Internally, execution is asynchronous. So all     236 Internally, execution is asynchronous. So all this API does is to enqueue the
237 HCI command, setup a local wait queue on stack    237 HCI command, setup a local wait queue on stack, and wait_event() for completion.
238 The wait is not interruptible because it is gu    238 The wait is not interruptible because it is guaranteed that the command will
239 complete after some short timeout anyway.         239 complete after some short timeout anyway.
240                                                   240 
241 MSGTXWQ context will then be scheduled and inv    241 MSGTXWQ context will then be scheduled and invoke nfc_hci_msg_tx_work().
242 This function will dequeue the next pending co    242 This function will dequeue the next pending command and send its HCP fragments
243 to the lower layer which happens to be shdlc.     243 to the lower layer which happens to be shdlc. It will then start a timer to be
244 able to complete the command with a timeout er    244 able to complete the command with a timeout error if no response arrive.
245                                                   245 
246 SMW context gets scheduled and invokes nfc_shd    246 SMW context gets scheduled and invokes nfc_shdlc_sm_work(). This function
247 handles shdlc framing in and out. It uses the     247 handles shdlc framing in and out. It uses the driver xmit to send frames and
248 receives incoming frames in an skb queue fille    248 receives incoming frames in an skb queue filled from the driver IRQ handler.
249 SHDLC I(nformation) frames payload are HCP fra    249 SHDLC I(nformation) frames payload are HCP fragments. They are aggregated to
250 form complete HCI frames, which can be a respo    250 form complete HCI frames, which can be a response, command, or event.
251                                                   251 
252 HCI Responses are dispatched immediately from     252 HCI Responses are dispatched immediately from this context to unblock
253 waiting command execution. Response processing    253 waiting command execution. Response processing involves invoking the completion
254 callback that was provided by nfc_hci_msg_tx_w    254 callback that was provided by nfc_hci_msg_tx_work() when it sent the command.
255 The completion callback will then wake the sys    255 The completion callback will then wake the syscall context.
256                                                   256 
257 It is also possible to execute the command asy    257 It is also possible to execute the command asynchronously using this API::
258                                                   258 
259   static int nfc_hci_execute_cmd_async(struct     259   static int nfc_hci_execute_cmd_async(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd,
260                                        const u    260                                        const u8 *param, size_t param_len,
261                                        data_ex    261                                        data_exchange_cb_t cb, void *cb_context)
262                                                   262 
263 The workflow is the same, except that the API     263 The workflow is the same, except that the API call returns immediately, and
264 the callback will be called with the result fr    264 the callback will be called with the result from the SMW context.
265                                                   265 
266 Workflow receiving an HCI event or command        266 Workflow receiving an HCI event or command
267 ------------------------------------------        267 ------------------------------------------
268                                                   268 
269 HCI commands or events are not dispatched from    269 HCI commands or events are not dispatched from SMW context. Instead, they are
270 queued to HCI rx_queue and will be dispatched     270 queued to HCI rx_queue and will be dispatched from HCI rx worker
271 context (MSGRXWQ). This is done this way to al    271 context (MSGRXWQ). This is done this way to allow a cmd or event handler
272 to also execute other commands (for example, h    272 to also execute other commands (for example, handling the
273 NFC_HCI_EVT_TARGET_DISCOVERED event from PN544    273 NFC_HCI_EVT_TARGET_DISCOVERED event from PN544 requires to issue an
274 ANY_GET_PARAMETER to the reader A gate to get     274 ANY_GET_PARAMETER to the reader A gate to get information on the target
275 that was discovered).                             275 that was discovered).
276                                                   276 
277 Typically, such an event will be propagated to    277 Typically, such an event will be propagated to NFC Core from MSGRXWQ context.
278                                                   278 
279 Error management                                  279 Error management
280 ----------------                                  280 ----------------
281                                                   281 
282 Errors that occur synchronously with the execu    282 Errors that occur synchronously with the execution of an NFC Core request are
283 simply returned as the execution result of the    283 simply returned as the execution result of the request. These are easy.
284                                                   284 
285 Errors that occur asynchronously (e.g. in a ba    285 Errors that occur asynchronously (e.g. in a background protocol handling thread)
286 must be reported such that upper layers don't     286 must be reported such that upper layers don't stay ignorant that something
287 went wrong below and know that expected events    287 went wrong below and know that expected events will probably never happen.
288 Handling of these errors is done as follows:      288 Handling of these errors is done as follows:
289                                                   289 
290 - driver (pn544) fails to deliver an incoming     290 - driver (pn544) fails to deliver an incoming frame: it stores the error such
291   that any subsequent call to the driver will     291   that any subsequent call to the driver will result in this error. Then it
292   calls the standard nfc_shdlc_recv_frame() wi    292   calls the standard nfc_shdlc_recv_frame() with a NULL argument to report the
293   problem above. shdlc stores a EREMOTEIO stic    293   problem above. shdlc stores a EREMOTEIO sticky status, which will trigger
294   SMW to report above in turn.                    294   SMW to report above in turn.
295                                                   295 
296 - SMW is basically a background thread to hand    296 - SMW is basically a background thread to handle incoming and outgoing shdlc
297   frames. This thread will also check the shdl    297   frames. This thread will also check the shdlc sticky status and report to HCI
298   when it discovers it is not able to run anym    298   when it discovers it is not able to run anymore because of an unrecoverable
299   error that happened within shdlc or below. I    299   error that happened within shdlc or below. If the problem occurs during shdlc
300   connection, the error is reported through th    300   connection, the error is reported through the connect completion.
301                                                   301 
302 - HCI: if an internal HCI error happens (frame    302 - HCI: if an internal HCI error happens (frame is lost), or HCI is reported an
303   error from a lower layer, HCI will either co    303   error from a lower layer, HCI will either complete the currently executing
304   command with that error, or notify NFC Core     304   command with that error, or notify NFC Core directly if no command is
305   executing.                                      305   executing.
306                                                   306 
307 - NFC Core: when NFC Core is notified of an er    307 - NFC Core: when NFC Core is notified of an error from below and polling is
308   active, it will send a tag discovered event     308   active, it will send a tag discovered event with an empty tag list to the user
309   space to let it know that the poll operation    309   space to let it know that the poll operation will never be able to detect a
310   tag. If polling is not active and the error     310   tag. If polling is not active and the error was sticky, lower levels will
311   return it at next invocation.                   311   return it at next invocation.
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php