Initialize Tizen 2.3
[adaptation/devices/nfc-plugin-nxp.git] / src / phLlcNfc_Frame.c
1 /*
2  * Copyright (C) 2010 NXP Semiconductors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*!
18 * \file  phLlcNfc_Frame.c
19 * \brief To append the I or S or U frames (LLC header).
20 *
21 * Project: NFC-FRI-1.1
22 *
23 * $Date: Tue Jun  1 14:41:26 2010 $
24 * $Author: ing02260 $
25 * $Revision: 1.88 $
26 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $
27 *
28 */
29
30 /*************************** Includes *******************************/
31 #include <phNfcTypes.h>
32 #include <phNfcStatus.h>
33 #include <phOsalNfc.h>
34 #include <phOsalNfc_Timer.h>
35 #include <phNfcInterface.h>
36 #include <phLlcNfc_DataTypes.h>
37 #include <phLlcNfc_Frame.h>
38 #include <phLlcNfc_Interface.h>
39 #include <phLlcNfc_Timer.h>
40 #ifdef ANDROID
41 #include <string.h>
42 #endif
43
44 /*********************** End of includes ****************************/
45
46 /***************************** Macros *******************************/
47
48 /************************ End of macros *****************************/
49
50 /***************************** Global variables *******************************/
51
52 #ifdef LLC_RELEASE_FLAG
53     extern uint8_t             g_release_flag;
54 #endif /* #ifdef LLC_RELEASE_FLAG */
55 /************************ End of global variables *****************************/
56
57 /*********************** Local functions ****************************/
58 static 
59 void 
60 phLlcNfc_H_UpdateCrc(
61     uint8_t     crcByte, 
62     uint16_t    *pCrc
63 );
64
65 /**
66 * \ingroup grp_hal_nfc_llc_helper
67 *
68 * \brief LLC helper functions <b>process the received U frame</b> function
69 *
70 * \copydoc page_reg This function is to process the U frame received from 
71 *       the device
72 *
73 * \param[in] psLlcCtxt          Llc main structure information
74 * \param[in] llcPacket          LLC packet information, inlcuding length information
75 *
76 * \retval NFCSTATUS_SUCCESS                Operation successful.
77 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
78 *
79 */
80 static 
81 NFCSTATUS 
82 phLlcNfc_H_ProcessUFrame (  
83     phLlcNfc_Context_t      *psLlcCtxt 
84 );
85
86 /**
87 * \ingroup grp_hal_nfc_llc_helper
88 *
89 * \brief LLC helper functions <b>process the received S frame</b> function
90 *
91 * \copydoc page_reg This function is to process the S frame received from 
92 *       the device
93 *
94 * \param[in] psLlcCtxt          Llc main structure information
95 *
96 * \retval NFCSTATUS_SUCCESS                Operation successful.
97 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
98 *
99 */
100 static 
101 void 
102 phLlcNfc_H_ProcessSFrame (  
103     phLlcNfc_Context_t      *psLlcCtxt
104 );
105
106 /**
107 * \ingroup grp_hal_nfc_llc_helper
108 *
109 * \brief LLC helper functions <b>Update I frame list</b> function
110 *
111 * \copydoc page_reg This function checks the nr value with the stored I frames 
112 *   and deletes the nodes which has been acknowledged.
113 *
114 * \param[in/out] psFrameInfo    Frame structure information
115 * \param[in/out] psListInfo     List information
116 *
117 * \retval number of deleted frames
118 *
119 */
120 static 
121 uint8_t 
122 phLlcNfc_H_UpdateIFrameList(
123     phLlcNfc_Frame_t        *psFrameInfo, 
124     phLlcNfc_StoreIFrame_t  *psListInfo
125 );
126
127 /**
128 * \ingroup grp_hal_nfc_llc_helper
129 *
130 * \brief LLC helper functions \b Delete list function
131 *
132 * \copydoc page_reg Delete the front node from the list
133 *
134 * \param[in] psFrameInfo    Frame structure information
135 *
136 * \retval NFCSTATUS_SUCCESS                Operation successful.
137 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
138 *
139 */
140 static 
141 void 
142 phLlcNfc_H_DeleteIFrame (
143                              phLlcNfc_StoreIFrame_t      *psList
144                              );
145
146 /**
147 * \ingroup grp_hal_nfc_llc_helper
148 *
149 * \brief LLC helper functions <b>Get the LLC header</b> function
150 *
151 * \copydoc page_reg This function checks for the correctness fo the llc header
152 *
153 * \param[in] llcHeader      The byte which gives the header information
154 *
155 * \retval phLlcNfc_eU_frame      U frame type.
156 * \retval phLlcNfc_eI_frame      I frame type.
157 * \retval phLlcNfc_eS_frame      S frame type.
158 * \retval phLlcNfc_eErr_frame    Error type
159 *
160 */
161 static
162 phLlcNfc_FrameType_t 
163 phLlcNfc_H_ChkGetLlcFrameType (
164                                uint8_t     llcHeader
165                                );
166
167 /**
168 * \ingroup grp_hal_nfc_llc_helper
169 *
170 * \brief LLC helper functions \b Peek the data function
171 *
172 * \copydoc page_reg Get the packet information from the front node from the list
173 *
174 * \param[in] psListInfo The List information
175 * \param[in] packetinfo The packet information from the front node of the list 
176 *
177 * \retval NFCSTATUS_SUCCESS                Operation successful.
178 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
179 *
180 */
181 static
182 NFCSTATUS  
183 phLlcNfc_H_IFrameList_Peek (
184                            phLlcNfc_StoreIFrame_t      *psList, 
185                            phLlcNfc_LlcPacket_t        **psPacketinfo, 
186                            uint8_t                     position
187                            );
188
189 /**
190 * \ingroup grp_hal_nfc_llc_helper
191 *
192 * \brief LLC helper functions <b>Update U frame information</b> function
193 *
194 * \copydoc page_reg This function updates the U frame information in the 
195 *       phLlcNfc_sFrame_t structure
196 *
197 * \param[in/out] psFrameInfo        Frame information structure
198 * \param[in]     llcPayload         Llc payload information
199 *
200 * \retval NFCSTATUS_SUCCESS                Operation successful.
201 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
202 *
203 */
204 static
205 NFCSTATUS 
206 phLlcNfc_H_Update_ReceivedRSETInfo (    
207                             phLlcNfc_Frame_t    *psFrameInfo, 
208                             phLlcNfc_Payload_t  llcInfo
209                             );
210
211 /**
212 * \ingroup grp_hal_nfc_llc_helper
213 *
214 * \brief LLC Reset frame information function
215 *
216 * \copydoc page_reg resets ns and nr value, when ack for U frame is received
217 *
218 * \param[in, out] psLlcCtxt     Llc main structure information
219 *
220 * \retval NFCSTATUS_SUCCESS                Operation successful.
221 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
222 *
223 */
224 static 
225 void 
226 phLlcNfc_H_ResetFrameInfo (
227                       phLlcNfc_Context_t  *psLlcCtxt
228                       );
229
230 /**
231 * \ingroup grp_hal_nfc_llc_helper
232 *
233 * \brief LLC Reset frame sending function
234 *
235 * \copydoc page_reg Send URSET frame to PN544
236 *
237 * \param[in, out] psLlcCtxt     Llc main structure information
238 *
239 * \retval NFCSTATUS_SUCCESS                 Operation successful.
240 * \retval NFCSTATUS_BUSY                    Write is pended, so wait till it completes.
241 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
242 *
243 */
244 NFCSTATUS  
245 phLlcNfc_H_SendRSETFrame (
246                       phLlcNfc_Context_t  *psLlcCtxt
247                       );
248
249 /**
250 * \ingroup grp_hal_nfc_llc_helper
251 *
252 * \brief LLC helper functions <b>process the received I frame</b> function
253 *
254 * \copydoc page_reg This function is to process the I frame received from 
255 *       the device
256 *
257 * \param[in] psLlcCtxt          Llc main structure information
258 *
259 * \retval NFCSTATUS_SUCCESS                Operation successful.
260 * \retval NFCSTATUS_INVALID_PARAMETER      At least one parameter of the function is invalid.
261 *
262 */
263 void 
264 phLlcNfc_H_ProcessIFrame (  
265     phLlcNfc_Context_t      *psLlcCtxt 
266 );
267
268 /******************** End of Local functions ************************/
269
270 /********************** Global variables ****************************/
271
272 /******************** End of Global Variables ***********************/
273
274 void phLlcNfc_H_Frame_Init (
275     phLlcNfc_Context_t  *psLlcCtxt
276 )
277 {
278     
279     if (NULL != psLlcCtxt)
280     {
281         /* Set all the other values to 0 */
282         (void)memset (&psLlcCtxt->s_frameinfo.s_llcpacket, 0, 
283                     sizeof(phLlcNfc_LlcPacket_t));
284
285         psLlcCtxt->s_frameinfo.window_size = 
286             PH_LLCNFC_U_FRAME_MAX_WIN_SIZE;
287         /* Initialise the window size, N(S) and N(R) */
288 #ifdef PIGGY_BACK
289         psLlcCtxt->s_frameinfo.s_recv_store.winsize_cnt = 0;
290 #endif
291         psLlcCtxt->s_frameinfo.s_send_store.winsize_cnt = 0;
292         psLlcCtxt->s_frameinfo.n_s = 0;
293         psLlcCtxt->s_frameinfo.n_r = 0;
294         psLlcCtxt->s_frameinfo.rejected_ns = DEFAULT_PACKET_INPUT;
295     }
296 }
297
298 void 
299 phLlcNfc_H_Frame_DeInit (
300     phLlcNfc_Frame_t    *psFrameInfo
301 )
302 {
303     if (NULL != psFrameInfo)
304     {
305         /* Empty the frame information */
306         (void)memset(&psFrameInfo->s_llcpacket, 0,
307             sizeof(phLlcNfc_LlcPacket_t));
308     }
309 }
310
311 NFCSTATUS
312 phLlcNfc_H_CreateUFramePayload (
313     phLlcNfc_Context_t      *psLlcCtxt, 
314     phLlcNfc_LlcPacket_t    *psLlcPacket, 
315     uint8_t                 *pLlcPacketLength, 
316     phLlcNfc_LlcCmd_t       cmdType
317 )
318 {
319     /* 
320         U frame packet (RSET)
321         Byte 0 = Length (4 to 6 bytes) 
322         Byte 1 = Header
323         Byte 2 = window size (2 >= window size <= 4)
324         Byte 3 = capabilities (SREJ option enable/disable) (optional)
325         Byte 4 = Baud rate (optional)
326         Byte 5 = CRC1
327         Byte 6 = CRC2
328     */
329     NFCSTATUS           result = PHNFCSTVAL(CID_NFC_LLC, 
330                                             NFCSTATUS_INVALID_PARAMETER);
331     phLlcNfc_Buffer_t   *ps_llc_buf = NULL;
332     uint8_t             index = 0;
333
334     if ((NULL != psLlcCtxt) && (NULL != psLlcPacket) 
335         && (NULL != pLlcPacketLength) && 
336         ((phLlcNfc_e_rset == cmdType) || (phLlcNfc_e_ua == cmdType)))
337     {
338         result = NFCSTATUS_SUCCESS;
339         ps_llc_buf = &(psLlcPacket->s_llcbuf);
340         /* Get the header information */
341         ps_llc_buf->sllcpayload.llcheader = 
342                             (uint8_t)PH_LLCNFC_U_HEADER_INIT;
343         if (phLlcNfc_e_rset == cmdType)
344         {
345             /* RSET command */
346             ps_llc_buf->sllcpayload.llcheader = 
347                         (uint8_t)SET_BITS8(
348                             ps_llc_buf->sllcpayload.llcheader, 
349                             PH_LLCNFC_U_FRAME_START_POS, 
350                             PH_LLCNFC_U_FRAME_NO_OF_POS, 
351                             (uint8_t)phLlcNfc_e_rset);
352             /* Default window size */
353             ps_llc_buf->sllcpayload.llcpayload[index] = 
354                                 PH_LLCNFC_U_FRAME_MAX_WIN_SIZE;
355             index++;
356             /* Endpoint capabilities, SREJ not supported */
357             ps_llc_buf->sllcpayload.llcpayload[index] = 
358                                 PH_LLCNFC_SREJ_BYTE_VALUE;
359             index++;
360 #ifdef ENABLE_BAUDRATE
361             /* baud rate 0x00 = 9600, 0x05 = 115200 */
362             ps_llc_buf->sllcpayload.llcpayload[index] = 
363                             (uint8_t)phLlcNfc_e_115200;
364             index++;
365 #endif /* #ifdef ENABLE_BAUDRATE */
366             
367         }
368         else
369         {
370             /* UA frame */
371             ps_llc_buf->sllcpayload.llcheader = (uint8_t)
372                 SET_BITS8(ps_llc_buf->sllcpayload.llcheader, 
373                             PH_LLCNFC_U_FRAME_START_POS,
374                             PH_LLCNFC_U_FRAME_NO_OF_POS, 
375                             (uint8_t)phLlcNfc_e_ua);          
376         }
377         /* LLC length byte updated (index + 2 CRC bytes + 
378         1 byte of header) */
379         ps_llc_buf->llc_length_byte = (index + 
380                             PH_LLCNFC_NUM_OF_CRC_BYTES + 1);
381         /* Total LLC buffer size */
382         *pLlcPacketLength = psLlcPacket->llcbuf_len = 
383                         (ps_llc_buf->llc_length_byte + 1);
384         /* 
385         psLlcPacket->s_llcbuf : 
386                 consists llc length byte + llc header + data + CRC 
387                 (which needs to be calculated by the below function)
388         psLlcPacket->llcbuf_len : 
389                 Total length of the above buffer
390         psLlcPacket->llcbuf_len - 2 : 
391                 -2 because the CRC has to be calculated, only for the 
392                 bytes which has llc length byte + llc header + data. 
393                 But total length (llcbuf_len) consists of above mentioned 
394                 things with 2 byte CRC 
395         psLlcPacket->s_llcbuf.sllcpayload.llcpayload : 
396                 consists only data (no length byte and no llc header)
397         (psLlcPacket->llcbuf_len - 4) : 
398                 is the array index of the first CRC byte to be calculated
399         (psLlcPacket->llcbuf_len - 3) : 
400                 is the array index of the second CRC byte to be calculated
401         */
402         index = psLlcPacket->llcbuf_len;
403
404         phLlcNfc_H_ComputeCrc((uint8_t *)ps_llc_buf, 
405                 (psLlcPacket->llcbuf_len - 2),
406                 &(ps_llc_buf->sllcpayload.llcpayload[(index - 4)]),
407                 &(ps_llc_buf->sllcpayload.llcpayload[(index - 3)]));
408     }
409
410     return result;
411 }
412
413 NFCSTATUS
414 phLlcNfc_H_CreateSFramePayload (
415     phLlcNfc_Frame_t    *psFrameInfo, 
416     phLlcNfc_LlcPacket_t    *psLlcPacket,
417     phLlcNfc_LlcCmd_t   cmdType
418 )
419 {
420     /* 
421         S frame packet (RR or RNR or REJ or SREJ). Total bytes = 4
422         Byte 0 = Length (Length = 3 always for S frame) 
423         Byte 1 = Header
424         Byte 2 = CRC1
425         Byte 3 = CRC2
426     */
427     NFCSTATUS               result = NFCSTATUS_SUCCESS;
428     phLlcNfc_Buffer_t       *ps_llc_buf = NULL;
429     uint8_t                 length = 0;
430     
431     ps_llc_buf = &(psLlcPacket->s_llcbuf);
432
433     /* Initial S frame header */
434     ps_llc_buf->sllcpayload.llcheader = PH_LLCNFC_S_HEADER_INIT;
435     /* Update the N(R) value */
436     ps_llc_buf->sllcpayload.llcheader = (uint8_t)SET_BITS8(
437                                 ps_llc_buf->sllcpayload.llcheader, 
438                                 PH_LLCNFC_NR_START_BIT_POS, 
439                                 PH_LLCNFC_NR_NS_NO_OF_BITS, 
440                                 psFrameInfo->n_r);
441
442     /* Update the type bits of S frame */
443     ps_llc_buf->sllcpayload.llcheader = (uint8_t)
444                 (ps_llc_buf->sllcpayload.llcheader | (uint8_t)cmdType);
445
446     /* Maximum S frame length */
447     psLlcPacket->llcbuf_len = (uint8_t)PH_LLCNFC_MAX_S_FRAME_LEN;
448     /* S frame length byte value */
449     ps_llc_buf->llc_length_byte = (uint8_t)
450                             (psLlcPacket->llcbuf_len - 1);
451
452     /* 
453         psFrameInfo->s_llcpacket.s_llcbuf : 
454                 consists llc length byte + llc header + data + CRC 
455                 (which needs to be calculated by the below function)
456         psFrameInfo->s_llcpacket.llcbuf_len : 
457                 Total length of the above buffer
458         psFrameInfo->s_llcpacket.llcbuf_len - 2 : 
459                 -2 because the CRC has to be calculated, only for the 
460                 bytes which has llc length byte + llc header + data. 
461                 But total length (llcbuf_len) consists of above mentioned 
462                 things with 2 byte CRC 
463         psFrameInfo->s_llcpacket.s_llcbuf.sllcpayload.llcpayload : 
464                 consists only data (no length byte and no llc header)
465         psFrameInfo->s_llcpacket.s_llcbuf.sllcpayload.llcpayload : 
466                 contains only data sent by user. 
467         (psFrameInfo->s_llcpacket.llcbuf_len - 4) : 
468                 is the array index of the first CRC byte to be calculated
469         (psFrameInfo->s_llcpacket.llcbuf_len - 3) : 
470                 is the array index of the second CRC byte to be calculated
471     */
472     length = psLlcPacket->llcbuf_len;
473     phLlcNfc_H_ComputeCrc(
474         (uint8_t *)ps_llc_buf, (length - 2),
475         &(ps_llc_buf->sllcpayload.llcpayload[(length - 4)]),
476         &(ps_llc_buf->sllcpayload.llcpayload[(length - 3)]));
477
478     return result;
479 }
480
481 NFCSTATUS
482 phLlcNfc_H_CreateIFramePayload (
483     phLlcNfc_Frame_t        *psFrameInfo, 
484     phLlcNfc_LlcPacket_t    *psLlcPacket, 
485     uint8_t                 *pLlcBuf, 
486     uint8_t                 llcBufLength
487 )
488 {
489     NFCSTATUS           result = PHNFCSTVAL(CID_NFC_LLC, 
490                                             NFCSTATUS_INVALID_PARAMETER);
491     phLlcNfc_Buffer_t   *ps_llc_buf = NULL;
492
493     if ((NULL != psFrameInfo) && (NULL != psLlcPacket) && 
494         (NULL != pLlcBuf) && (llcBufLength > 0))
495     {
496         result = NFCSTATUS_SUCCESS;
497         ps_llc_buf = &(psLlcPacket->s_llcbuf);
498
499         (void)memcpy(&(ps_llc_buf->sllcpayload.llcpayload[0]),
500                         pLlcBuf, llcBufLength);
501
502         psLlcPacket->llcbuf_len = (uint8_t)llcBufLength; 
503         
504         /* I frame header byte */
505         ps_llc_buf->sllcpayload.llcheader = PH_LLCNFC_I_HEADER_INIT;
506
507         /* Set the N(S) value */
508         ps_llc_buf->sllcpayload.llcheader = (uint8_t)
509             SET_BITS8(
510                     ps_llc_buf->sllcpayload.llcheader, 
511                     PH_LLCNFC_NS_START_BIT_POS, 
512                     PH_LLCNFC_NR_NS_NO_OF_BITS, 
513                     psFrameInfo->n_s);
514
515         /* Set the N(R) value */
516         ps_llc_buf->sllcpayload.llcheader = (uint8_t)
517             SET_BITS8(
518                     ps_llc_buf->sllcpayload.llcheader, 
519                     PH_LLCNFC_NR_START_BIT_POS, 
520                     PH_LLCNFC_NR_NS_NO_OF_BITS, 
521                     psFrameInfo->n_r);
522             
523         /* Update the length byte, llc length byte value includes 
524             data + CRC bytes + llc length byte */
525         ps_llc_buf->llc_length_byte = 
526                 (psLlcPacket->llcbuf_len + 
527                 PH_LLCNFC_NUM_OF_CRC_BYTES + 1);
528
529         /* Update total length, Total length is always equal to 
530             llc length byte + 1 */
531         psLlcPacket->llcbuf_len = 
532                 (ps_llc_buf->llc_length_byte + 1);
533         
534         /* 
535             psFrameInfo->s_llcpacket.s_llcbuf : 
536                     consists llc length byte + llc header + data + CRC (which 
537                     needs to be calculated by the below function)
538             psFrameInfo->s_llcpacket.llcbuf_len : 
539                     Total length of the above buffer
540             psFrameInfo->s_llcpacket.llcbuf_len - 2 : 
541                     -2 because the CRC has to be calculated, only for the 
542                     bytes which has llc length byte + llc header + data. 
543                     But total length (llcbuf_len) consists of above mentioned 
544                     things with 2 byte CRC 
545             psFrameInfo->s_llcpacket.s_llcbuf.sllcpayload.llcpayload : 
546                     contains only data sent by user. 
547             (psFrameInfo->s_llcpacket.llcbuf_len - 4) : 
548                     is the array index of the first CRC byte to be calculated
549             (psFrameInfo->s_llcpacket.llcbuf_len - 3) : 
550                     is the array index of the second CRC byte to be calculated
551
552         */
553         phLlcNfc_H_ComputeCrc(
554             (uint8_t*)ps_llc_buf, 
555             (psLlcPacket->llcbuf_len - 2),
556             &(ps_llc_buf->sllcpayload.llcpayload
557                         [(psLlcPacket->llcbuf_len - 4)]), 
558             &(ps_llc_buf->sllcpayload.llcpayload
559                         [(psLlcPacket->llcbuf_len - 3)]));
560
561
562     }
563
564     return result;
565 }
566
567 static
568 phLlcNfc_FrameType_t 
569 phLlcNfc_H_ChkGetLlcFrameType (
570     uint8_t llcHeader
571 )
572 {
573     phLlcNfc_FrameType_t    frame_type = phLlcNfc_eErr_frame;
574
575     /* Mask the header byte to know the actual frame types */
576     switch((llcHeader & PH_LLCNFC_LLC_HEADER_MASK))
577     {
578         case PH_LLCNFC_U_HEADER_INIT:
579         {
580             frame_type = phLlcNfc_eU_frame;
581             break;
582         }
583
584         case PH_LLCNFC_S_HEADER_INIT:
585         {
586             frame_type = phLlcNfc_eS_frame;
587             break;
588         }
589
590         default:
591         {
592             if (PH_LLCNFC_I_HEADER_INIT == 
593                 (PH_LLCNFC_I_FRM_HEADER_MASK & llcHeader))
594             {
595                 frame_type = phLlcNfc_eI_frame;
596             }
597             else
598             {
599                 frame_type = phLlcNfc_eErr_frame;
600             }
601             break;
602         }
603     }
604     return frame_type;
605 }
606
607 static
608 NFCSTATUS 
609 phLlcNfc_H_Update_ReceivedRSETInfo (    
610     phLlcNfc_Frame_t    *psFrameInfo, 
611     phLlcNfc_Payload_t  llcInfo
612 )
613 {
614     NFCSTATUS   result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_FORMAT);
615     uint8_t     payload_index = 0;
616
617     if ((llcInfo.llcpayload[payload_index] >= PH_LLCNFC_U_FRAME_MIN_WIN_SIZE) && 
618         (llcInfo.llcpayload[payload_index] <= PH_LLCNFC_U_FRAME_MAX_WIN_SIZE))
619     {
620         result = NFCSTATUS_SUCCESS;
621         /* From the received buffer, get the window size from the 
622             3rd byte (recvUBufLen[3]) of the buffer */
623         psFrameInfo->window_size = llcInfo.llcpayload[payload_index];
624         payload_index = (uint8_t)(payload_index + 1);
625
626         /* If 4th byte of the receive buffer (pRecvUBuf[4]) is 
627             0x01 then SREJ can come from the device*/
628         psFrameInfo->srej_on_off = ((PH_LLCNFC_SREJ_BYTE_VALUE == 
629                         llcInfo.llcpayload[payload_index])?
630                         PH_LLCNFC_SREJ_BYTE_VALUE:0);
631
632         /* For present implementation, this should be always false 
633         later stage remove if statement to work */
634         if (PH_LLCNFC_SREJ_BYTE_VALUE != psFrameInfo->srej_on_off)
635         {
636             result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_FORMAT);
637         }
638         else
639         {
640             payload_index = (uint8_t)(payload_index + 1);
641
642             
643             if (llcInfo.llcpayload[payload_index] > 
644                 (uint8_t)phLlcNfc_e_1228000)
645             {
646                 /* Error byte */
647                 result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_FORMAT);
648             }
649             else
650             {
651                 /* Get the baud rate from the 5th byte of the receive buffer */
652                 psFrameInfo->baud_rate = (phLlcNfc_LlcBaudRate_t)
653                                         (llcInfo.llcpayload[payload_index]);
654             }
655         }
656     }
657
658     return result;
659 }
660
661 static 
662 uint8_t 
663 phLlcNfc_H_UpdateIFrameList(
664     phLlcNfc_Frame_t        *psFrameInfo, 
665     phLlcNfc_StoreIFrame_t  *psListInfo
666 )
667 {
668     NFCSTATUS               result = NFCSTATUS_SUCCESS;
669     phLlcNfc_LlcPacket_t    *pspktInfo = NULL;
670     uint8_t                 while_exit = FALSE;
671     uint8_t                 nr = 0;
672     uint8_t                 ns = 0;
673     uint8_t                 no_of_del_frames = 0;
674
675     PHNFC_UNUSED_VARIABLE(result);
676     if(0 == psListInfo->winsize_cnt)
677     {
678         while_exit = TRUE;
679     }
680     while (FALSE == while_exit)
681     {
682         /* Get the first node from the list */
683         result = phLlcNfc_H_IFrameList_Peek (psListInfo, &pspktInfo, 
684                                             DEFAULT_PACKET_INPUT);
685         if (NULL != pspktInfo)
686         {
687             /* Get the N(R) value of the received packet and N(S) value of the 
688                 sent stored i frame */
689             ns = (uint8_t)GET_BITS8 ( 
690                     pspktInfo->s_llcbuf.sllcpayload.llcheader, 
691                     PH_LLCNFC_NS_START_BIT_POS, 
692                     PH_LLCNFC_NR_NS_NO_OF_BITS);
693
694             nr = (uint8_t)GET_BITS8( 
695                     psFrameInfo->s_recvpacket.s_llcbuf.sllcpayload.llcheader, 
696                     PH_LLCNFC_NR_START_BIT_POS, 
697                     PH_LLCNFC_NR_NS_NO_OF_BITS);            
698             
699             /* Check the value of each i frame N(S) and 
700                 received ACKs N(R) */
701 #if 0
702             if(((ns <= nr) && ((nr - ns) <= psFrameInfo->window_size)) 
703                 || ((ns > nr) && (((PH_LLCNFC_MOD_NS_NR + nr) - ns) <= 
704                 PH_LLCNFC_U_FRAME_MAX_WIN_SIZE)))
705 #endif
706             if(((ns < nr) && ((nr - ns) <= psFrameInfo->window_size)) 
707                 || ((ns > nr) && (((PH_LLCNFC_MOD_NS_NR + nr) - ns) <= 
708                 PH_LLCNFC_U_FRAME_MAX_WIN_SIZE)))
709             {
710                 phLlcNfc_H_DeleteIFrame (psListInfo);
711                 no_of_del_frames = (uint8_t)(no_of_del_frames + 1);
712             }
713             else
714             {
715                 while_exit = TRUE;
716             }
717
718             if(0 == psListInfo->winsize_cnt)
719             {
720                 while_exit = TRUE;
721             }
722         }
723         else
724         {
725             while_exit = TRUE;
726         }
727     }
728     return no_of_del_frames;
729 }
730
731 NFCSTATUS 
732 phLlcNfc_H_SendUserIFrame (
733     phLlcNfc_Context_t      *psLlcCtxt, 
734     phLlcNfc_StoreIFrame_t  *psListInfo
735 )
736 {
737     NFCSTATUS               result = NFCSTATUS_SUCCESS;    
738     phLlcNfc_Frame_t        *ps_frame_info = NULL;
739     phLlcNfc_LlcPacket_t    s_create_packet;
740     phLlcNfc_LlcPacket_t    *ps_get_packet = NULL;
741     phLlcNfc_Payload_t      *ps_llc_payload = NULL;
742     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
743     uint8_t                 llc_header = 0, 
744                             length = 0;
745
746     if ((NULL == psLlcCtxt) || (NULL == psListInfo))
747     {
748         result = PHNFCSTVAL (CID_NFC_LLC, NFCSTATUS_INVALID_PARAMETER);
749     }
750     else if (0 == psListInfo->winsize_cnt)
751     {
752         result = PHNFCSTVAL (CID_NFC_LLC, NFCSTATUS_NOT_ALLOWED);
753     }
754     else
755     {
756         ps_frame_info = &(psLlcCtxt->s_frameinfo);
757         ps_store_frame = &(ps_frame_info->s_send_store);
758
759         if (
760             (ps_frame_info->n_s != ((ps_store_frame->winsize_cnt + 
761             ps_store_frame->start_pos) % PH_LLCNFC_MOD_NS_NR))
762             )
763         {
764             /* Get the stored I frame, only if the new frame is sent 
765                 from the upper layer */
766             result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
767                                                 ps_frame_info->n_s);
768         }
769
770         if (NULL != ps_get_packet)
771         {
772             llc_header = ps_get_packet->s_llcbuf.sllcpayload.llcheader;
773
774             /* Update n(r) value for the header */
775             llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
776
777             /* Create the packet */
778             (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
779                         sizeof (phLlcNfc_LlcPacket_t));
780
781             s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
782             ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
783
784             /* Length of the complete llc buffer, sent to PN544 */
785             length = s_create_packet.llcbuf_len;
786
787             /* Compute CRC for the created packet */
788             phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf),
789                         (length - 2),
790                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), 
791                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
792
793             /* Send the i frame */
794             result = phLlcNfc_Interface_Write (psLlcCtxt,
795                             (uint8_t *)&(s_create_packet.s_llcbuf),
796                             (uint32_t)s_create_packet.llcbuf_len);
797
798             ps_frame_info->write_status = result;
799
800             if (NFCSTATUS_BUSY == PHNFCSTATUS (result))
801             {
802                 /* The below check is added because, write is already pended by some other 
803                     operation, so it has to complete, when it completes, then immediately 
804                     next write shall be called using the below updated variable 
805
806                     The below variable is checked for the resend or rejected i frame 
807                     because if due to timer or reject frame from PN544, an I frame 
808                     has been sent (means write has been pended then the variable shall 
809                     not be overwritten.
810                 */
811                 ps_frame_info->write_wait_call = (phLlcNfc_eSentFrameType_t)
812                             (((resend_i_frame == ps_frame_info->write_wait_call) || 
813                             (rejected_i_frame == ps_frame_info->write_wait_call)) ? 
814                             ps_frame_info->write_wait_call : user_i_frame);
815             }
816             else
817             {
818                 if (NFCSTATUS_PENDING == result)
819                 {
820                     /* Start the timer */
821                     (void)phLlcNfc_StartTimers (PH_LLCNFC_GUARDTIMER, 
822                                                 ps_frame_info->n_s);
823                     
824                     /* "sent_frame_type is updated" only if the data is 
825                         written to the lower layer */
826                     ps_frame_info->sent_frame_type = user_i_frame;
827                 }
828             }
829         }
830     }
831     return result;
832 }
833
834 NFCSTATUS 
835 phLlcNfc_H_SendRejectedIFrame (
836     phLlcNfc_Context_t      *psLlcCtxt, 
837     phLlcNfc_StoreIFrame_t  *psListInfo, 
838     uint8_t                 ns_rejected
839 )
840 {
841     NFCSTATUS               result = NFCSTATUS_SUCCESS;    
842     phLlcNfc_Frame_t        *ps_frame_info = NULL;
843     phLlcNfc_LlcPacket_t    s_create_packet;
844     phLlcNfc_LlcPacket_t    *ps_get_packet = NULL;
845     phLlcNfc_Payload_t      *ps_llc_payload = NULL;
846     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
847     uint8_t                 llc_header = 0;
848     uint8_t                 length = 0;
849
850     if ((NULL == psLlcCtxt) || (NULL == psListInfo))
851     {
852         result = PHNFCSTVAL (CID_NFC_LLC, NFCSTATUS_INVALID_PARAMETER);
853     }
854     else if (0 == psListInfo->winsize_cnt)
855     {
856         result = PHNFCSTVAL (CID_NFC_LLC, NFCSTATUS_NOT_ALLOWED);
857     }
858     else
859     {
860         ps_frame_info = &(psLlcCtxt->s_frameinfo);
861         ps_store_frame = &(ps_frame_info->s_send_store);
862
863
864         if (ns_rejected < (uint8_t)(ps_store_frame->winsize_cnt + 
865             ps_store_frame->start_pos))
866         {
867             /* To send rejected frame, first thing shall be done is 
868                 windows size count shall be checked. if the 
869                 start position 
870                 */
871             if (invalid_frame != 
872                 ps_store_frame->s_llcpacket[ns_rejected].frame_to_send)
873             {
874                 /* Above check is added to know only if   */
875                 result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
876                                                     ns_rejected);
877             }
878             else
879             {
880                 ps_frame_info->rejected_ns = DEFAULT_PACKET_INPUT;
881                 /* Get the stored I frame, only if the new frame is sent 
882                     from the upper layer */
883                 result = phLlcNfc_H_SendUserIFrame (psLlcCtxt, psListInfo);
884             }
885         }
886
887         if (NULL != ps_get_packet)
888         {
889             llc_header = ps_get_packet->s_llcbuf.sllcpayload.llcheader;
890
891             /* Update n(r) value for the header */
892             llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
893
894             /* Create the packet */
895             (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
896                         sizeof (phLlcNfc_LlcPacket_t));
897
898             s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
899             ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
900
901             /* Length of the complete llc buffer, sent to PN544 */
902             length = s_create_packet.llcbuf_len;
903
904             /* Compute CRC for the created packet */
905             phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf),
906                         (length - 2),
907                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), 
908                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
909
910             /* Send the i frame */
911             result = phLlcNfc_Interface_Write (psLlcCtxt, 
912                             (uint8_t *)&(s_create_packet.s_llcbuf),
913                             (uint32_t)s_create_packet.llcbuf_len);
914
915             ps_frame_info->write_status = result;
916
917             if (NFCSTATUS_BUSY == PHNFCSTATUS (result))
918             {
919                 /* Already a frame is sent and response is waited for the sent frame, 
920                     so update the below variable */
921                 ps_frame_info->write_wait_call = (phLlcNfc_eSentFrameType_t)
922                                 (((ns_rejected != ps_store_frame->start_pos) && 
923                                 (resend_i_frame != ps_frame_info->write_wait_call))?
924                                 rejected_i_frame : ps_frame_info->write_wait_call);
925             }
926             else
927             {
928                 /* NFCSTATUS_PENDING means that the no other write is pending, apart  
929                     from the present write 
930
931                 Start the timer */
932                 (void)phLlcNfc_StartTimers (PH_LLCNFC_GUARDTIMER, ns_rejected);
933                 
934                 /* "sent_frame_type is updated" only if the data is 
935                     written to the lower layer. This will be used in the write 
936                     response callback and also indicates, what is the frame sent 
937                     and why
938                  */
939                 ps_frame_info->sent_frame_type = rejected_i_frame;
940
941                 if ((ns_rejected + 1) < ps_frame_info->n_s)
942                 {
943                     ps_frame_info->rejected_ns = (uint8_t)(ns_rejected + 1);
944
945                     ps_frame_info->write_status = PHNFCSTVAL(CID_NFC_LLC, 
946                                                     NFCSTATUS_BUSY);
947
948                     if (invalid_frame == 
949                         ps_store_frame->s_llcpacket[ns_rejected].frame_to_send)
950                     {
951                         ps_frame_info->rejected_ns = DEFAULT_PACKET_INPUT;
952                         ps_frame_info->write_wait_call = user_i_frame; 
953                     }
954                     else
955                     {                        
956                         ps_frame_info->write_wait_call = rejected_i_frame;
957                     }
958                 }
959                 else
960                 {
961                     ps_frame_info->rejected_ns = DEFAULT_PACKET_INPUT;
962                     /* This check is added to see that new frame has arrived 
963                         from the upper layer */
964                     if (ps_frame_info->n_s < (ps_store_frame->start_pos + 
965                         ps_store_frame->winsize_cnt))
966                     {
967                         ps_frame_info->write_wait_call = user_i_frame;
968                     }
969                 }
970             }
971         }
972     }
973     return result;
974 }
975
976 NFCSTATUS 
977 phLlcNfc_H_SendTimedOutIFrame (
978     phLlcNfc_Context_t      *psLlcCtxt, 
979     phLlcNfc_StoreIFrame_t  *psListInfo, 
980     uint8_t                 frame_to_send
981 )
982 {
983     NFCSTATUS               result = NFCSTATUS_SUCCESS;    
984     phLlcNfc_Frame_t        *ps_frame_info = NULL;
985     phLlcNfc_Timerinfo_t    *ps_timer_info = NULL;
986     phLlcNfc_LlcPacket_t    s_create_packet;
987     phLlcNfc_LlcPacket_t    *ps_get_packet = NULL;
988     phLlcNfc_Payload_t      *ps_llc_payload = NULL;
989     phLlcNfc_StoreIFrame_t  *ps_store_frame = NULL;
990         
991     PHNFC_UNUSED_VARIABLE(frame_to_send);
992     if((NULL == psLlcCtxt) || (NULL == psListInfo))
993     {
994         result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_PARAMETER);
995     }
996     else if (psListInfo->winsize_cnt == 0)
997     {
998         result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_NOT_ALLOWED);
999     }
1000     else
1001     {
1002         uint8_t                 llc_header = 0;
1003         uint8_t                 length = 0;
1004         uint8_t                 timer_count = 0;
1005         uint8_t                 timer_index = 0;
1006         uint8_t                 ns_index = 0;
1007
1008         ps_frame_info = &(psLlcCtxt->s_frameinfo);
1009         ps_timer_info = &(psLlcCtxt->s_timerinfo);
1010         ps_store_frame = &(ps_frame_info->s_send_store);        
1011         
1012         timer_index = ps_timer_info->index_to_send;
1013         timer_count = ps_timer_info->guard_to_count;
1014         ns_index = ps_timer_info->timer_ns_value[timer_index];
1015
1016         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL WIN SIZE CNT : 0x%02X\n", ps_store_frame->winsize_cnt);
1017         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL START POS : 0x%02X\n", ps_store_frame->start_pos);
1018         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL N S value : 0x%02X\n", ps_frame_info->n_s);
1019         PH_LLCNFC_DEBUG("SEND TIMEOUT TIMER INDEX : 0x%02X\n", timer_index);
1020         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL frame type : 0x%02X\n", ps_timer_info->frame_type[timer_index]);
1021
1022         if (resend_i_frame == ps_timer_info->frame_type[timer_index])
1023         {
1024             /* Get the stored I frame */
1025             result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet,
1026                                                 ns_index);
1027         }        
1028
1029         PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Packet : 0x%p\n", ps_get_packet);
1030         if (NULL != ps_get_packet)
1031         {
1032             llc_header = ps_get_packet->s_llcbuf.sllcpayload.llcheader;
1033
1034             /* Update n(r) value for the header */
1035             llc_header = (uint8_t)(llc_header | ps_frame_info->n_r);
1036
1037             /* create the packet */
1038             (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet,
1039                         sizeof (phLlcNfc_LlcPacket_t));
1040
1041             s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header;
1042             ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload);
1043
1044             /* Length of the complete llc buffer, sent to PN544 */
1045             length = s_create_packet.llcbuf_len;
1046
1047             /* Compute CRC */
1048             phLlcNfc_H_ComputeCrc((uint8_t *)&(s_create_packet.s_llcbuf),
1049                         (length - 2),
1050                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]),
1051                         (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)]));
1052
1053             /* Send the i frame */
1054             result = phLlcNfc_Interface_Write (psLlcCtxt, 
1055                             (uint8_t *)&(s_create_packet.s_llcbuf),
1056                             (uint32_t)s_create_packet.llcbuf_len);
1057
1058             ps_frame_info->write_status = result;
1059             PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Write status : 0x%02X\n", result);
1060
1061             if (NFCSTATUS_BUSY == PHNFCSTATUS (result))
1062             {
1063                 ps_frame_info->write_wait_call = resend_i_frame;
1064             }
1065             else
1066             {
1067                 /* result = NFCSTATUS_PENDING and 
1068                     Timer is not started because the remaining timer 
1069                     will be running */
1070                 uint16_t                time_out_value = 0;
1071
1072                 /* Each frame has the send count, so increment this 
1073                     as soon as the frame is sent */
1074                 ps_timer_info->iframe_send_count[timer_index] = (uint8_t)
1075                             (ps_timer_info->iframe_send_count[timer_index] + 1);
1076
1077                 PH_LLCNFC_DEBUG("SEND TIMEOUT CALL timer index : 0x%02X\n", timer_index);
1078
1079                 if (timer_index > 0)
1080                 {                    
1081                     PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]);
1082                     /* Copy the maximum time-out value. */
1083                     time_out_value = (uint16_t)
1084                         ((ps_timer_info->guard_to_value[(timer_index - 1)] >= 
1085                         PH_LLCNFC_GUARD_TO_VALUE) ? 
1086                         (ps_timer_info->guard_to_value[(timer_index - 1)] + 
1087                         PH_LLCNFC_RESOLUTION): 
1088                         PH_LLCNFC_GUARD_TO_VALUE);
1089                 }
1090                 else
1091                 {
1092                     /* If the timer_index is 0 means, the previous timed out  
1093                         frame is the last frame in the list */
1094                     time_out_value = (uint16_t)
1095                         ((ps_timer_info->guard_to_value[(timer_count - 1)] >= 
1096                         PH_LLCNFC_GUARD_TO_VALUE) ? 
1097                         (ps_timer_info->guard_to_value[(timer_count - 1)] + 
1098                         PH_LLCNFC_RESOLUTION):
1099                         PH_LLCNFC_GUARD_TO_VALUE);
1100                 }
1101
1102                 ps_timer_info->guard_to_value[timer_index] = time_out_value;
1103
1104                 ps_frame_info->sent_frame_type = resend_i_frame;
1105
1106                 ps_timer_info->frame_type[timer_index] = invalid_frame;
1107
1108                 PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Next frame type : 0x%02X\n", ps_timer_info->frame_type[((timer_index + 1) % PH_LLCNFC_MAX_ACK_GUARD_TIMER)]);
1109                 /* Now check if next timer has expired, if yes, 
1110                     set the index to next, on receiving the write response 
1111                     callback for this send, then next frame can be sent */
1112                 if (resend_i_frame == 
1113                     ps_timer_info->frame_type[((timer_index + 1) % 
1114                     PH_LLCNFC_MAX_ACK_GUARD_TIMER)])
1115                 {
1116                     /* If next frame has to be sent, then update write wait */
1117                     ps_frame_info->write_status = NFCSTATUS_BUSY;
1118                     ps_frame_info->write_wait_call = resend_i_frame;
1119                     ps_timer_info->index_to_send = (uint8_t)
1120                                             ((timer_index + 1) % 
1121                                             PH_LLCNFC_MAX_ACK_GUARD_TIMER);
1122                 }
1123                 else
1124                 {
1125                     /* Timer is not expired, 
1126                         Now, Check if the new frame is ready to be sent, if yes, 
1127                         then update the variable */
1128                     if (
1129                         (ps_frame_info->n_s != ((ps_store_frame->winsize_cnt + 
1130                         ps_store_frame->start_pos) % PH_LLCNFC_MOD_NS_NR))
1131                         )
1132                     {
1133                         ps_frame_info->write_status = PHNFCSTVAL (CID_NFC_LLC, 
1134                                                     NFCSTATUS_BUSY);
1135                         ps_frame_info->write_wait_call = user_i_frame;
1136                     }
1137                 }
1138
1139 #if 0
1140                 result = phLlcNfc_StartTimers (PH_LLCNFC_GUARDTIMER, 
1141                                         ((llc_header >> 
1142                                         PH_LLCNFC_NS_START_BIT_POS) | 
1143                                         MAX_NS_NR_VALUE));
1144 #endif /* #if 0 */
1145
1146             }            
1147         }
1148         else
1149         {
1150             if (
1151                 (ps_frame_info->n_s != ((ps_store_frame->winsize_cnt + 
1152                 ps_store_frame->start_pos) % PH_LLCNFC_MOD_NS_NR))
1153                 )
1154             {
1155                 ps_frame_info->write_status = PHNFCSTVAL (CID_NFC_LLC, 
1156                                             NFCSTATUS_BUSY);
1157                 ps_frame_info->write_wait_call = user_i_frame;
1158             }
1159         }
1160     }
1161     
1162     return result;
1163 }
1164
1165
1166 void 
1167 phLlcNfc_H_ProcessIFrame (  
1168     phLlcNfc_Context_t      *psLlcCtxt 
1169 )
1170 {
1171     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
1172     uint8_t                     ns_index = 0;    
1173 #if defined (LLC_SEND_RR_ACK)
1174     /* uint8_t                     nr_index = 0; */
1175 #endif /* #if defined (LLC_SEND_RR_ACK) */
1176     phLlcNfc_Frame_t            *ps_frame_info = NULL;
1177     phLlcNfc_StoreIFrame_t      *ps_store_frame = NULL;
1178     phLlcNfc_LlcPacket_t        *ps_recv_pkt = NULL;
1179     phLlcNfc_LlcCmd_t           cmdtype = phLlcNfc_e_error;
1180     phLlcNfc_eSentFrameType_t   eframe_type = invalid_frame;
1181     uint8_t                     dont_send_s_frame = FALSE;
1182     uint8_t                     no_of_del_frames = 0;
1183     phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
1184
1185 #ifdef RECV_NR_CHECK_ENABLE
1186     uint8_t                     recvd_nr = 0;    
1187 #endif /* #ifdef RECV_NR_CHECK_ENABLE */
1188
1189     ps_frame_info = &(psLlcCtxt->s_frameinfo);
1190     ps_store_frame = &(ps_frame_info->s_send_store);
1191     ps_recv_pkt = &(ps_frame_info->s_recvpacket);
1192
1193     PHNFC_UNUSED_VARIABLE(result);
1194     /* Received buffer, N(S) value */
1195     ns_index = (uint8_t)GET_BITS8( 
1196                         ps_recv_pkt->s_llcbuf.sllcpayload.llcheader, 
1197                         PH_LLCNFC_NS_START_BIT_POS, 
1198                         PH_LLCNFC_NR_NS_NO_OF_BITS);
1199
1200     PH_LLCNFC_DEBUG("NS START POS BEFORE DEL : 0x%02X\n", ps_store_frame->start_pos);
1201     PH_LLCNFC_DEBUG("WIN SIZE BEFORE DEL : 0x%02X\n", ps_store_frame->winsize_cnt);
1202
1203     /* Correct frame is received, so remove the stored i frame info */
1204     no_of_del_frames = phLlcNfc_H_UpdateIFrameList (ps_frame_info, 
1205                                 &(ps_frame_info->s_send_store));
1206
1207     PH_LLCNFC_DEBUG("NS START POS AFTER DEL : 0x%02X\n", ps_store_frame->start_pos);
1208     PH_LLCNFC_DEBUG("WIN SIZE AFTER DEL : 0x%02X\n", ps_store_frame->winsize_cnt);
1209
1210 #ifdef RECV_NR_CHECK_ENABLE
1211
1212     recvd_nr = (uint8_t)GET_BITS8( 
1213                         ps_recv_pkt->s_llcbuf.sllcpayload.llcheader, 
1214                         PH_LLCNFC_NR_START_BIT_POS, 
1215                         PH_LLCNFC_NR_NS_NO_OF_BITS);
1216
1217     if (((ps_frame_info->n_s > recvd_nr) && 
1218         (0 == ((ps_frame_info->n_s + 1) % PH_LLCNFC_MOD_NS_NR)))
1219         || (recvd_nr > ps_frame_info->n_s))
1220
1221 #else /* #ifdef RECV_NR_CHECK_ENABLE */
1222
1223     if (no_of_del_frames > 0)
1224
1225 #endif /* #ifdef RECV_NR_CHECK_ENABLE */
1226     {
1227         phLlcNfc_StopTimers (PH_LLCNFC_GUARDTIMER, no_of_del_frames);
1228     }
1229
1230     /* Received buffer, N(S) value = N(R) of host (our 
1231         structure) then send RR type of s frame else send 
1232         REJ type of s frame */
1233     if ((ns_index == ps_frame_info->n_r)
1234 #if defined (LLC_SEND_RR_ACK)
1235
1236         || ((ns_index < ps_frame_info->n_r) && 
1237             ((ps_frame_info->n_r - ns_index) < ps_frame_info->window_size))
1238         || ((ns_index > ps_frame_info->n_r) && 
1239             ((ns_index - ps_frame_info->n_r) > ps_frame_info->window_size))
1240
1241 #endif /* #if defined (LLC_SEND_RR_ACK) */
1242          )
1243     {
1244         PH_LLCNFC_PRINT(" Type bits of S frame to be sent is RR \n");
1245         ps_frame_info->recv_error_count = 0;
1246         ps_frame_info->send_error_count = 0;
1247
1248         psLlcCtxt->recvbuf_length = (ps_recv_pkt->llcbuf_len - 
1249                                     PH_LLCNFC_LEN_APPEND);
1250
1251         (void)memcpy ((void *)psLlcCtxt->precv_buf, (void *)(
1252                         ps_recv_pkt->s_llcbuf.sllcpayload.llcpayload), 
1253                         psLlcCtxt->recvbuf_length);
1254         
1255 #if defined (LLC_SEND_RR_ACK)
1256
1257         if (((ns_index < ps_frame_info->n_r) && 
1258             ((ps_frame_info->n_r - ns_index) < ps_frame_info->window_size))
1259             || ((ns_index > ps_frame_info->n_r) && 
1260             ((ns_index - ps_frame_info->n_r) > ps_frame_info->window_size)))
1261         {
1262             ps_frame_info->n_r = ((ns_index + 1) 
1263                                 % PH_LLCNFC_MOD_NS_NR);
1264         }
1265         else
1266
1267 #endif /* #if defined (LLC_SEND_RR_ACK) */
1268         {            
1269             /* Update the N(R) value in I and S frame context  */
1270             ps_frame_info->n_r = ((ps_frame_info->n_r + 1)
1271                                     % PH_LLCNFC_MOD_NS_NR);
1272
1273 #ifdef PIGGY_BACK
1274             ps_frame_info->resp_recvd_count = (uint8_t)
1275                                     (ps_frame_info->resp_recvd_count + 1);
1276 #endif /* #ifdef PIGGY_BACK */
1277
1278         }
1279
1280         if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
1281         {
1282             /* Any how write cannot be done and some frame is ready to be sent 
1283             so this frame will act as the ACK */            
1284             result = phLlcNfc_H_WriteWaitCall (psLlcCtxt);
1285         }
1286         else 
1287         {
1288             if (
1289                 (ps_frame_info->n_s != ((ps_store_frame->winsize_cnt + 
1290                 ps_store_frame->start_pos) % PH_LLCNFC_MOD_NS_NR))
1291                 )
1292             {
1293                 /* If user has sent a frame and DAL write is busy, then 
1294                 it has to be sent */
1295                 result = phLlcNfc_H_SendUserIFrame (psLlcCtxt, ps_store_frame);
1296             }
1297         }
1298
1299         if (NFCSTATUS_PENDING == result)
1300         {
1301             dont_send_s_frame = TRUE;
1302 #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB
1303             phLlcNfc_H_SendInfo (psLlcCtxt);
1304 #endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */        
1305         }
1306         else
1307         {
1308             cmdtype = phLlcNfc_e_rr;
1309             /* If i frame is sent from the stored list, it got the correct 
1310                 acknowledge i frame, so now for an i frame , s frame acknowledge 
1311                 is sent */
1312             eframe_type = ((resend_i_frame == ps_frame_info->sent_frame_type)?
1313                             resend_s_frame : s_frame);
1314         }
1315
1316 #ifdef PIGGY_BACK
1317         phLlcNfc_H_SendInfo (psLlcCtxt);
1318 #endif /* #ifdef PIGGY_BACK */
1319
1320     }
1321     else
1322     {
1323         ps_frame_info->send_error_count = (uint8_t)
1324                                 (ps_frame_info->send_error_count + 1);
1325
1326 #ifdef LLC_SEND_ERROR_COUNT
1327
1328         if (ps_frame_info->send_error_count < RECV_ERROR_FRAME_COUNT)
1329
1330 #endif /* #ifdef LLC_SEND_ERROR_COUNT */
1331         {
1332
1333 #ifdef LLC_RR_INSTEAD_OF_REJ
1334
1335             if (((ps_frame_info->n_r > 0) && (ns_index == (ps_frame_info->n_r - 1)))
1336                 || ((0 == ps_frame_info->n_r) &&
1337                 (ns_index == (PH_LLCNFC_MOD_NS_NR - 1))))
1338             {
1339                 cmdtype = phLlcNfc_e_rr;
1340                 eframe_type = rej_rr_s_frame;
1341             }
1342             else
1343
1344 #endif /* #ifdef LLC_RR_INSTEAD_OF_REJ */
1345             {
1346                 cmdtype = phLlcNfc_e_rej;
1347                 eframe_type = ((resend_i_frame == ps_frame_info->sent_frame_type)?
1348                                 resend_rej_s_frame : reject_s_frame);
1349             }
1350         }
1351
1352 #ifdef LLC_SEND_ERROR_COUNT
1353         else
1354         {
1355 #ifdef LLC_RSET_INSTEAD_OF_EXCEPTION
1356
1357             result = phLlcNfc_H_SendRSETFrame (psLlcCtxt);
1358
1359 #else /* #ifdef LLC_RSET_INSTEAD_OF_EXCEPTION */
1360
1361             dont_send_s_frame = TRUE;
1362             PH_LLCNFC_DEBUG("SEND ERROR COUNT : 0x%02X\n", ps_frame_info->send_error_count);
1363             /* Error count has reached the limit, raise exception */
1364             notifyinfo.status = PHNFCSTVAL(CID_NFC_LLC, 
1365                                             NFCSTATUS_BOARD_COMMUNICATION_ERROR);
1366 #if 0
1367             phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1); 
1368 #endif /* #if 0 */
1369                 /* Resend done, no answer from the device */
1370             psLlcCtxt->cb_for_if.notify (
1371                             psLlcCtxt->cb_for_if.pif_ctxt,
1372                             psLlcCtxt->phwinfo, 
1373                             NFC_NOTIFY_DEVICE_ERROR, 
1374                             &notifyinfo);
1375
1376 #endif /* #ifdef LLC_RSET_INSTEAD_OF_EXCEPTION */
1377         }
1378 #endif /* #ifdef LLC_SEND_ERROR_COUNT */
1379     }
1380
1381 #ifdef LLC_RELEASE_FLAG
1382
1383     if (FALSE == g_release_flag)
1384
1385 #endif /* #ifdef LLC_RELEASE_FLAG */
1386     {
1387         (void)phLlcNfc_Interface_Read(psLlcCtxt,
1388                         PH_LLCNFC_READWAIT_OFF, 
1389                         &(ps_recv_pkt->s_llcbuf.llc_length_byte),
1390                         (uint8_t)PH_LLCNFC_BYTES_INIT_READ);
1391     
1392 #ifdef PIGGY_BACK
1393         /* Check if any write call is performed or not */
1394         if (NFCSTATUS_PENDING != result)
1395         {
1396             /* No write is performed, So, now check */
1397             if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status))
1398             {
1399                 /* Any how write cannot be done and some frame is ready to be sent
1400                 so this frame will act as the ACK */
1401                 result = phLlcNfc_H_WriteWaitCall (psLlcCtxt);
1402             }
1403         }
1404
1405         if (NFCSTATUS_PENDING != result)
1406         {
1407             if (ps_frame_info->window_size == ps_frame_info->resp_recvd_count)
1408             {
1409                 phLlcNfc_LlcPacket_t    s_packet_info;
1410                 /* Create S frame */
1411                 (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype);
1412
1413                 result = phLlcNfc_Interface_Write(psLlcCtxt,
1414                             (uint8_t *)&(s_packet_info.s_llcbuf),
1415                             (uint32_t)(s_packet_info.llcbuf_len));
1416
1417
1418                 if (0 == ps_frame_info->send_error_count)
1419                 {
1420                     ps_frame_info->write_wait_call = invalid_frame;
1421                 }
1422                 ps_frame_info->sent_frame_type = eframe_type;
1423             }
1424             else
1425             {
1426                 result = phLlcNfc_StartTimers (PH_LLCNFC_ACKTIMER, 0);
1427             }
1428         }
1429 #else /* #ifdef PIGGY_BACK */
1430
1431         if ((TRUE != ps_frame_info->write_pending) &&  
1432             (PH_LLCNFC_READPEND_REMAIN_BYTE != ps_frame_info->read_pending) && 
1433             (FALSE == dont_send_s_frame))
1434         {
1435             phLlcNfc_LlcPacket_t    s_packet_info = {0};
1436             /* Create S frame */
1437             (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype);
1438
1439             result = phLlcNfc_Interface_Write(psLlcCtxt,
1440                         (uint8_t *)&(s_packet_info.s_llcbuf),
1441                         (uint32_t)(s_packet_info.llcbuf_len));
1442
1443
1444             if (0 == ps_frame_info->send_error_count)
1445             {
1446                 ps_frame_info->write_wait_call = invalid_frame;
1447             }
1448             ps_frame_info->sent_frame_type = eframe_type;
1449         }
1450 #endif /* #ifdef PIGGY_BACK */
1451     }
1452
1453     return ;
1454 }
1455
1456 static 
1457 NFCSTATUS 
1458 phLlcNfc_H_ProcessUFrame (  
1459     phLlcNfc_Context_t      *psLlcCtxt
1460 )
1461 {
1462     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
1463     phLlcNfc_Frame_t            *ps_frame_info = NULL;
1464     phLlcNfc_LlcPacket_t        *ps_uframe_pkt = NULL;
1465 #ifdef LLC_URSET_NO_DELAY
1466     phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
1467 #else /* #ifdef LLC_URSET_NO_DELAY */
1468     uint32_t                    delay_timer_id = 
1469                                 PH_OSALNFC_INVALID_TIMER_ID;
1470 #endif /* #ifdef LLC_URSET_NO_DELAY */
1471     uint8_t                     cmdtype = phLlcNfc_e_error;
1472
1473     phLlcNfc_StopTimers(PH_LLCNFC_CONNECTIONTIMER, 0);
1474     ps_frame_info = &(psLlcCtxt->s_frameinfo);
1475     ps_uframe_pkt = &(ps_frame_info->s_recvpacket);
1476     /* Check the command type */
1477     cmdtype = (ps_uframe_pkt->s_llcbuf.sllcpayload.llcheader & 
1478                 PH_LLCNFC_U_FRAME_MODIFIER_MASK);
1479     PHNFC_UNUSED_VARIABLE(result);
1480     switch(cmdtype)
1481     {
1482         case phLlcNfc_e_rset:
1483         {
1484             psLlcCtxt->s_frameinfo.rset_recvd = TRUE;
1485             /* command type is RSET, so update the U frame parameters */
1486             result = phLlcNfc_H_Update_ReceivedRSETInfo (ps_frame_info, 
1487                                 ps_uframe_pkt->s_llcbuf.sllcpayload);
1488             /* Create a UA frame */
1489             result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt, 
1490                                             ps_uframe_pkt, 
1491                                             &(ps_uframe_pkt->llcbuf_len), 
1492                                             phLlcNfc_e_ua);
1493
1494             if (NFCSTATUS_SUCCESS == result)
1495             {
1496                 /* Call DAL write */
1497                 result = phLlcNfc_Interface_Write( psLlcCtxt, 
1498                                     (uint8_t*)&(ps_uframe_pkt->s_llcbuf), 
1499                                     (uint32_t)ps_uframe_pkt->llcbuf_len);
1500
1501                 phLlcNfc_H_ResetFrameInfo(psLlcCtxt);
1502                 ps_frame_info->write_status = result;
1503                 ps_frame_info->write_wait_call = invalid_frame;
1504                 if (NFCSTATUS_PENDING == result)
1505                 {
1506                     ps_frame_info->sent_frame_type = 
1507                             ((ps_frame_info->sent_frame_type != init_u_rset_frame) ?
1508                             u_a_frame : init_u_a_frame);
1509                 }
1510                 else
1511                 {
1512                     if (NFCSTATUS_BUSY == PHNFCSTATUS(result))
1513                     {
1514                         ps_frame_info->write_wait_call = 
1515                             ((ps_frame_info->sent_frame_type != init_u_rset_frame) ?
1516                             u_a_frame : init_u_a_frame);
1517                         result = NFCSTATUS_PENDING;
1518                     }
1519                 }
1520             }
1521             break;
1522         }
1523         case phLlcNfc_e_ua:
1524         {
1525             phLlcNfc_H_ResetFrameInfo (psLlcCtxt);
1526             /* Add timer here, to delay the next command to the PN544 */
1527 #ifdef LLC_URSET_NO_DELAY
1528             if (ps_frame_info->s_send_store.winsize_cnt > 0)
1529             {
1530 #if 0
1531                 /* Resend I frame */
1532                 result = phLlcNfc_H_SendTimedOutIFrame (psLlcCtxt, 
1533                                 &(ps_frame_info->s_send_store, 0);
1534 #else
1535                 result = phLlcNfc_H_SendUserIFrame (psLlcCtxt, 
1536                                 &(ps_frame_info->s_send_store));
1537 #endif /* #if 0 */
1538             }
1539             else 
1540             {
1541                 if ((init_u_rset_frame == ps_frame_info->sent_frame_type) && 
1542                     (NULL != psLlcCtxt->cb_for_if.notify))
1543                 {
1544                     ps_frame_info->sent_frame_type = write_resp_received;
1545                     notifyinfo.status = NFCSTATUS_SUCCESS;
1546                     /* Send the notification to the upper layer */
1547                     psLlcCtxt->cb_for_if.notify(
1548                                 psLlcCtxt->cb_for_if.pif_ctxt, 
1549                                 psLlcCtxt->phwinfo, 
1550                                 NFC_NOTIFY_INIT_COMPLETED, 
1551                                 &notifyinfo);
1552                 }
1553             }
1554 #else /* #ifdef LLC_URSET_NO_DELAY */
1555             delay_timer_id = phOsalNfc_Timer_Create ();
1556             phOsalNfc_Timer_Start (delay_timer_id, LLC_URSET_DELAY_TIME_OUT, 
1557                                     phLlcNfc_URSET_Delay_Notify, (void*)0);
1558 #endif /* #ifdef LLC_URSET_NO_DELAY */
1559             break;
1560         }
1561         default:
1562         {
1563             result = PHNFCSTVAL(CID_NFC_LLC, 
1564                                 NFCSTATUS_INVALID_FORMAT);
1565             break;
1566         }
1567     }
1568     return result;
1569 }
1570
1571 static 
1572 void 
1573 phLlcNfc_H_ProcessSFrame (  
1574     phLlcNfc_Context_t      *psLlcCtxt)
1575 {
1576     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
1577     uint8_t                     cmdtype = phLlcNfc_e_error;
1578 #if 0
1579                                 prev_win_count = 0;
1580 #endif /* #if 0 */
1581     phNfc_sTransactionInfo_t    compinfo = {0, 0, 0, 0, 0};
1582     phLlcNfc_Frame_t            *ps_frame_info = NULL;
1583     phLlcNfc_StoreIFrame_t      *ps_store_frame = NULL;
1584     phLlcNfc_LlcPacket_t        *ps_recv_pkt = NULL;
1585     uint8_t                     no_of_del_frames = 0;
1586     phNfc_sCompletionInfo_t     notifyinfo = {0,0,0};
1587     
1588     ps_frame_info = &(psLlcCtxt->s_frameinfo);
1589     ps_recv_pkt = &(ps_frame_info->s_recvpacket);
1590     ps_store_frame = &(ps_frame_info->s_send_store);
1591
1592     cmdtype = (ps_recv_pkt->s_llcbuf.sllcpayload.llcheader & 
1593                 PH_LLCNFC_S_FRAME_TYPE_MASK);
1594     PHNFC_UNUSED_VARIABLE(result);
1595
1596     PH_LLCNFC_DEBUG("NS START POS BEFORE DEL : 0x%02X\n", ps_store_frame->start_pos);
1597     PH_LLCNFC_DEBUG("WIN SIZE BEFORE DEL : 0x%02X\n", ps_store_frame->winsize_cnt);
1598
1599     /* Correct frame is received, so remove the 
1600         stored i frame info for the acknowledged frames */
1601     no_of_del_frames = phLlcNfc_H_UpdateIFrameList (ps_frame_info, 
1602                                         &(ps_frame_info->s_send_store));
1603
1604     PH_LLCNFC_DEBUG("NS START POS AFTER DEL : 0x%02X\n", ps_store_frame->start_pos);
1605     PH_LLCNFC_DEBUG("WIN SIZE AFTER DEL : 0x%02X\n", ps_store_frame->winsize_cnt);
1606
1607 #if 0
1608     prev_win_count = ps_frame_info->s_send_store.winsize_cnt;
1609 #endif /* #if 0 */
1610
1611     /* Pend the read */
1612     result = phLlcNfc_Interface_Read (psLlcCtxt, 
1613                             PH_LLCNFC_READWAIT_OFF, 
1614                             &(ps_recv_pkt->s_llcbuf.llc_length_byte),
1615                             (uint8_t)PH_LLCNFC_BYTES_INIT_READ);    
1616     switch(cmdtype)
1617     {
1618         case phLlcNfc_e_rr:
1619         case phLlcNfc_e_rej:
1620         {
1621             /* RR frame received */
1622             phLlcNfc_StopTimers (PH_LLCNFC_GUARDTIMER, no_of_del_frames);
1623
1624             if (phLlcNfc_e_rr == cmdtype)
1625             {
1626                 ps_frame_info->recv_error_count = 0;
1627                 ps_frame_info->send_error_count = 0;
1628             }
1629             else
1630             {
1631                 ps_frame_info->recv_error_count = (uint8_t)
1632                                 (ps_frame_info->recv_error_count + 1);
1633             }
1634
1635             if (ps_frame_info->recv_error_count >= RECV_ERROR_FRAME_COUNT)
1636             {
1637                 /* Do nothing */
1638             }
1639             else if (NFCSTATUS_BUSY == PHNFCSTATUS(ps_frame_info->write_status))
1640             {
1641                 result = phLlcNfc_H_WriteWaitCall (psLlcCtxt);
1642             }
1643             else 
1644             {
1645                 if (
1646                     (ps_frame_info->n_s != ((ps_store_frame->winsize_cnt + 
1647                     ps_store_frame->start_pos) % PH_LLCNFC_MOD_NS_NR))
1648                     )
1649                 {
1650                     /* If user has sent a frame and DAL write is busy, then 
1651                         it has to be sent */
1652                     result = phLlcNfc_H_SendUserIFrame (psLlcCtxt, ps_store_frame);
1653                 }
1654             }
1655
1656             if ((0 != psLlcCtxt->send_cb_len) && 
1657                 (ps_store_frame->winsize_cnt < ps_frame_info->window_size))
1658             {
1659                 /* Due to the window size count (i.e., count has reached 
1660                     the limit), send completion was not sent for the previous 
1661                     send from the upper layer. So to allow next send from the 
1662                     upper layer, send completion is called */
1663                 compinfo.length = (uint16_t)psLlcCtxt->send_cb_len;
1664                 compinfo.status = NFCSTATUS_SUCCESS;
1665                 
1666                 if (NULL != psLlcCtxt->cb_for_if.send_complete)
1667                 {
1668                     psLlcCtxt->send_cb_len = 0;
1669                     /* Call the send callback, if the window size 
1670                         count becomes less than actual window size */
1671                     psLlcCtxt->cb_for_if.send_complete (
1672                                 psLlcCtxt->cb_for_if.pif_ctxt, 
1673                                 psLlcCtxt->phwinfo, &compinfo);
1674                 }
1675             }
1676             break;
1677         }
1678
1679 #if 0
1680         case phLlcNfc_e_rej:
1681         {
1682             ps_frame_info->recv_error_count = (uint8_t)
1683                                 (ps_frame_info->recv_error_count + 1);
1684             /* RR frame received */
1685             phLlcNfc_StopTimers (PH_LLCNFC_GUARDTIMER, no_of_del_frames);
1686
1687             if (ps_frame_info->recv_error_count < RECV_ERROR_FRAME_COUNT)
1688             {
1689                 /* Below check is added because if PN544 sends REJ to a frame, but 
1690                     the next frame has already been sent from PN544, then 
1691                 Send the user I frame */
1692                 result = phLlcNfc_H_SendUserIFrame (psLlcCtxt, ps_store_frame);
1693             }
1694             break;
1695         }
1696 #endif /* #if 0 */
1697
1698         case phLlcNfc_e_rnr:
1699         {
1700             phLlcNfc_StopAllTimers ();
1701             ps_frame_info->recv_error_count = (uint8_t)
1702                                 (ps_frame_info->recv_error_count + 1);
1703             break;
1704         }
1705
1706         case phLlcNfc_e_srej:
1707         default:
1708         {
1709             ps_frame_info->recv_error_count = (uint8_t)
1710                                 (ps_frame_info->recv_error_count + 1);
1711             result = PHNFCSTVAL (CID_NFC_LLC, 
1712                                 NFCSTATUS_INVALID_FORMAT);
1713             break;
1714         }
1715     }
1716
1717     if (ps_frame_info->recv_error_count >= RECV_ERROR_FRAME_COUNT)
1718     {
1719 #ifdef LLC_RSET_INSTEAD_OF_EXCEPTION
1720
1721         result = phLlcNfc_H_SendRSETFrame (psLlcCtxt);
1722
1723 #else /* #ifdef LLC_RSET_INSTEAD_OF_EXCEPTION */
1724
1725         PH_LLCNFC_DEBUG("RECV ERROR COUNT : 0x%02X\n", ps_frame_info->recv_error_count);
1726         /* Raise the exception for CRC error received from the  */
1727         notifyinfo.status = PHNFCSTVAL(CID_NFC_LLC, 
1728                                 NFCSTATUS_BOARD_COMMUNICATION_ERROR);
1729 #if 0
1730         phOsalNfc_RaiseException(phOsalNfc_e_UnrecovFirmwareErr,1); 
1731 #endif /* #if 0 */
1732         /* Resend done, no answer from the device */
1733         psLlcCtxt->cb_for_if.notify (
1734                         psLlcCtxt->cb_for_if.pif_ctxt,
1735                         psLlcCtxt->phwinfo, 
1736                         NFC_NOTIFY_DEVICE_ERROR, 
1737                         &notifyinfo);
1738
1739 #endif /* #ifdef LLC_RSET_INSTEAD_OF_EXCEPTION */
1740     }
1741
1742     return ;
1743 }
1744
1745
1746 void 
1747 phLlcNfc_H_ComputeCrc(
1748     uint8_t     *pData, 
1749     uint8_t     length,
1750     uint8_t     *pCrc1, 
1751     uint8_t     *pCrc2
1752 )
1753 {
1754     uint8_t     crc_byte = 0, 
1755                 index = 0;
1756     uint16_t    crc = 0;
1757
1758 #ifdef CRC_A
1759         crc = 0x6363; /* ITU-V.41 */
1760 #else
1761         crc = 0xFFFF; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
1762 #endif /* #ifdef CRC_A */
1763
1764     do 
1765     {
1766         crc_byte = pData[index];
1767         phLlcNfc_H_UpdateCrc(crc_byte, &crc);
1768         index++;
1769     } while (index < length);
1770
1771 #ifndef INVERT_CRC
1772     crc = ~crc; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
1773 #endif /* #ifndef INVERT_CRC */
1774
1775     *pCrc1 = (uint8_t) (crc & 0xFF);
1776     *pCrc2 = (uint8_t) ((crc >> 8) & 0xFF);
1777     return;
1778 }
1779
1780 static 
1781 void 
1782 phLlcNfc_H_UpdateCrc(
1783     uint8_t     crcByte, 
1784     uint16_t    *pCrc
1785 )
1786 {
1787     crcByte = (crcByte ^ (uint8_t)((*pCrc) & 0x00FF));
1788     crcByte = (crcByte ^ (uint8_t)(crcByte << 4));
1789     *pCrc = (*pCrc >> 8) ^ ((uint16_t)crcByte << 8) ^
1790                 ((uint16_t)crcByte << 3) ^
1791                 ((uint16_t)crcByte >> 4);
1792 }
1793
1794 NFCSTATUS 
1795 phLlcNfc_H_StoreIFrame (
1796     phLlcNfc_StoreIFrame_t      *psList,
1797     phLlcNfc_LlcPacket_t        sPacketInfo
1798 )
1799 {
1800     NFCSTATUS   result = NFCSTATUS_SUCCESS;
1801     uint8_t     ns_index = 0, 
1802                 llc_header = 0;
1803
1804     if ((NULL == psList) || (0 == sPacketInfo.llcbuf_len) || 
1805         (PH_LLCNFC_I_HEADER_INIT != 
1806         (sPacketInfo.s_llcbuf.sllcpayload.llcheader & 
1807         PH_LLCNFC_I_FRM_HEADER_MASK)))
1808     {
1809         result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_PARAMETER);
1810     }
1811     else
1812     {
1813         /* Get the index from the start index */
1814         if(psList->winsize_cnt > 0)
1815         {
1816             ns_index = (uint8_t)((psList->start_pos + psList->winsize_cnt) % 
1817                                 PH_LLCNFC_MOD_NS_NR);
1818         }
1819         else
1820         {
1821             ns_index = psList->start_pos;
1822         }
1823
1824         llc_header = (uint8_t)(PH_LLCNFC_I_HEADER_INIT | (ns_index << 
1825                         PH_LLCNFC_NS_START_BIT_POS));
1826         sPacketInfo.s_llcbuf.sllcpayload.llcheader = llc_header;
1827
1828         (void)memcpy (&(psList->s_llcpacket[ns_index]), 
1829                         &(sPacketInfo), sizeof(phLlcNfc_LlcPacket_t));
1830
1831         /* This variable says that LLC has to send complete 
1832             callback for stored I frame */
1833         psList->s_llcpacket[ns_index].frame_to_send = invalid_frame;
1834
1835         psList->winsize_cnt++;        
1836     }
1837     return result;
1838 }
1839
1840 static
1841 void 
1842 phLlcNfc_H_DeleteIFrame (
1843     phLlcNfc_StoreIFrame_t      *psList
1844 )
1845 {    
1846     if (NULL != psList)
1847     {
1848         (void)memset( &(psList->s_llcpacket[psList->start_pos]), 
1849                         0, sizeof(phLlcNfc_LlcPacket_t));
1850
1851         /* Go to next N(S) position */
1852         psList->start_pos = ((psList->start_pos + 1) % 
1853                             PH_LLCNFC_MOD_NS_NR);
1854
1855         if (psList->winsize_cnt > 0)
1856         {
1857             psList->winsize_cnt--;
1858         }
1859     }
1860 }
1861
1862 static
1863 NFCSTATUS  
1864 phLlcNfc_H_IFrameList_Peek (
1865     phLlcNfc_StoreIFrame_t      *psList, 
1866     phLlcNfc_LlcPacket_t        **psPacketinfo, 
1867     uint8_t                     position
1868 )
1869 {
1870     NFCSTATUS   result = NFCSTATUS_SUCCESS;
1871     uint8_t     index = 0;
1872
1873     *psPacketinfo = NULL;
1874     if ((NULL != psList) && (psList->winsize_cnt > 0))
1875     {
1876         result = NFCSTATUS_SUCCESS;
1877         if ((position < (psList->start_pos + psList->winsize_cnt)) || 
1878             (DEFAULT_PACKET_INPUT == position))
1879         {
1880             index = (uint8_t)((DEFAULT_PACKET_INPUT == position) ? 
1881                     psList->start_pos : position);
1882             *psPacketinfo = &(psList->s_llcpacket[index]);
1883         }
1884     }
1885
1886     return result;
1887 }
1888
1889 NFCSTATUS 
1890 phLlcNfc_H_ProRecvFrame (
1891     phLlcNfc_Context_t      *psLlcCtxt
1892 )
1893 {
1894     NFCSTATUS               result = PHNFCSTVAL(CID_NFC_LLC, 
1895                                     NFCSTATUS_INVALID_PARAMETER);
1896     phLlcNfc_FrameType_t    frame_type = phLlcNfc_eErr_frame;
1897 #ifdef LLC_DATA_BYTES
1898     uint8_t                 *print_buf = (uint8_t *)
1899                             &(psLlcCtxt->s_frameinfo.s_recvpacket.s_llcbuf);
1900     uint8_t                 buf_len = 
1901                             psLlcCtxt->s_frameinfo.s_recvpacket.llcbuf_len;
1902     PH_LLCNFC_STRING("** Response ");
1903     
1904 #endif /* LLC_DATA_BYTES */
1905     if (NULL != psLlcCtxt)
1906     {
1907         result = NFCSTATUS_SUCCESS;
1908         /* Get the received frame type */
1909         frame_type = phLlcNfc_H_ChkGetLlcFrameType(
1910             psLlcCtxt->s_frameinfo.s_recvpacket.s_llcbuf.sllcpayload.llcheader);
1911
1912         /* Depending on the received frame type, process the 
1913         received buffer */
1914         switch(frame_type)
1915         {
1916             case phLlcNfc_eU_frame:
1917             {
1918                 PH_LLCNFC_PRINT("U frame received \n");
1919                 PH_LLCNFC_STRING("U frame ");
1920                 PH_LLCNFC_PRINT_DATA(print_buf, buf_len);
1921                 PH_LLCNFC_STRING(";\n");
1922                 result = phLlcNfc_H_ProcessUFrame(psLlcCtxt);
1923                 break;
1924             }
1925             case phLlcNfc_eI_frame:
1926             {
1927                 PH_LLCNFC_PRINT("I frame received \n");
1928                 PH_LLCNFC_STRING("I frame ");
1929                 PH_LLCNFC_PRINT_DATA(print_buf, buf_len);
1930                 PH_LLCNFC_STRING(";\n");
1931                 phLlcNfc_H_ProcessIFrame(psLlcCtxt);
1932                 break;
1933             }
1934             case phLlcNfc_eS_frame:
1935             {
1936                 PH_LLCNFC_PRINT("S frame received \n");
1937                 PH_LLCNFC_STRING("S frame ");
1938                 PH_LLCNFC_PRINT_DATA(print_buf, buf_len);
1939                 PH_LLCNFC_STRING(";\n");
1940                 phLlcNfc_H_ProcessSFrame(psLlcCtxt);
1941                 break;
1942             }
1943             case phLlcNfc_eErr_frame:
1944             default:
1945             {
1946                 PH_LLCNFC_PRINT("Error frame received \n");
1947                 result = PHNFCSTVAL(CID_NFC_LLC, NFCSTATUS_INVALID_FORMAT);
1948                 break;
1949             }
1950         }
1951         
1952     }
1953     return result;
1954 }
1955
1956 #ifdef CRC_ERROR_REJ
1957 NFCSTATUS 
1958 phLlcNfc_H_SendRejectFrame(
1959                       phLlcNfc_Context_t  *psLlcCtxt
1960                       )
1961 {
1962     NFCSTATUS       result = NFCSTATUS_SUCCESS;
1963     phLlcNfc_LlcPacket_t    s_packet_info = {0};
1964
1965     result = phLlcNfc_H_CreateSFramePayload(
1966                                     &(psLlcCtxt->s_frameinfo),
1967                                     &(s_packet_info),
1968                                     phLlcNfc_e_rej);
1969     /* Send the "S" frame to the lower layer */
1970     result = phLlcNfc_Interface_Write(psLlcCtxt,
1971         (uint8_t *)&(s_packet_info.s_llcbuf),
1972         (uint32_t)(s_packet_info.llcbuf_len));
1973
1974     if (NFCSTATUS_PENDING == result)
1975     {
1976         /* Increment the retry count of the reject frame */
1977         psLlcCtxt->s_frameinfo.recv_error_count = 
1978                         (psLlcCtxt->s_frameinfo.recv_error_count + 1);
1979     }
1980
1981
1982     return result;                  
1983 }
1984 #endif /* #ifdef CRC_ERROR_REJ */
1985
1986 static 
1987 void 
1988 phLlcNfc_H_ResetFrameInfo (
1989     phLlcNfc_Context_t  *psLlcCtxt
1990 )
1991 {
1992     uint8_t                     i = 0, 
1993                                 win_cnt = 0, 
1994                                 pos = 0, 
1995                                 while_exit = FALSE, 
1996                                 index_flag = FALSE;
1997     phLlcNfc_StoreIFrame_t      *ps_send_store = NULL;
1998     phLlcNfc_Buffer_t           *ps_buffer = NULL;
1999
2000     ps_send_store = &(psLlcCtxt->s_frameinfo.s_send_store);
2001     win_cnt = ps_send_store->winsize_cnt;
2002     pos = ps_send_store->start_pos;
2003     PH_LLCNFC_PRINT ("\n\nLLC : phLlcNfc_H_ResetFrameInfo called\n\n");
2004     PH_LLCNFC_DEBUG ("\n\nLLC : ps_send_store->start_pos %08X\n", ps_send_store->start_pos);
2005     PH_LLCNFC_DEBUG ("\n\nLLC : ps_send_store->winsize_cnt before reset %08X\n", ps_send_store->winsize_cnt);
2006
2007
2008     if (0 != pos)
2009     {
2010         /* If the start position of the ns = 0, then 
2011             no need to shift the stored llc data, 
2012             Else it has to be shifted to the first 
2013             index of the array */
2014         if(TRUE == ((pos + win_cnt) / 
2015                     PH_LLCNFC_MAX_I_FRAME_STORE))
2016         {
2017             /* 'i' is the array index, So to store data in the array, 
2018                 windows size count shall be subtracted by 1 */
2019             i = (win_cnt - 1);
2020             /* if window size > 1 and ns for 2 frames are 7 and 0, then 
2021                 to reset the ns index to 0, the frames are copied from 
2022                 the reverse order, so to do it a flag is declared */
2023             index_flag = TRUE;
2024             pos = (((pos - 1) + win_cnt) % PH_LLCNFC_MAX_I_FRAME_STORE);
2025         }
2026
2027         while (FALSE == while_exit)
2028         {
2029             (void)memcpy ((void *)&(ps_send_store->s_llcpacket[i]),  
2030                         (void *)&(ps_send_store->s_llcpacket[pos]), 
2031                         sizeof (phLlcNfc_LlcPacket_t));
2032
2033             ps_send_store->s_llcpacket[i].frame_to_send = invalid_frame;
2034             
2035             ps_buffer = &(ps_send_store->s_llcpacket[i].s_llcbuf);
2036             /* change n(s) value */
2037             ps_buffer->sllcpayload.llcheader = (uint8_t)
2038                                     (PH_LLCNFC_I_HEADER_INIT | 
2039                                     (i << PH_LLCNFC_NS_START_BIT_POS));
2040             if(TRUE == index_flag)
2041             {
2042                 if(0 == i)
2043                 {
2044                     while_exit = TRUE;
2045                 }
2046                 else
2047                 {
2048                     i = ((i - 1) % PH_LLCNFC_MAX_I_FRAME_STORE);
2049                     if (0 == pos)
2050                     {
2051                         pos = (PH_LLCNFC_MAX_I_FRAME_STORE - 1);
2052                     }
2053                     else
2054                     {
2055                         pos = ((pos - 1) % PH_LLCNFC_MAX_I_FRAME_STORE);
2056                     }
2057                 }                
2058             }
2059             else
2060             {
2061                 if (i >= win_cnt)
2062                 {
2063                     while_exit = TRUE;
2064                 }
2065                 else
2066                 {
2067                     i = ((i + 1) % PH_LLCNFC_MAX_I_FRAME_STORE);
2068                     pos = ((pos + 1) % PH_LLCNFC_MAX_I_FRAME_STORE);
2069                 }
2070                 
2071             }
2072         }
2073     }
2074     psLlcCtxt->s_timerinfo.guard_to_count = 0;
2075     psLlcCtxt->s_timerinfo.timer_flag = 0;
2076     ps_send_store->start_pos = 0;
2077     psLlcCtxt->s_frameinfo.n_r = psLlcCtxt->s_frameinfo.n_s = 0;
2078     if (ps_send_store->winsize_cnt > 0)
2079     {
2080         psLlcCtxt->s_frameinfo.rejected_ns = 0;
2081     }
2082     else
2083     {
2084         psLlcCtxt->s_frameinfo.rejected_ns = DEFAULT_PACKET_INPUT;
2085     }
2086
2087     PH_LLCNFC_DEBUG ("\n\nLLC : ps_send_store->winsize_cnt after reset %08X\n", ps_send_store->winsize_cnt);
2088     return;
2089 }
2090
2091 NFCSTATUS 
2092 phLlcNfc_H_WriteWaitCall (
2093     phLlcNfc_Context_t  *psLlcCtxt
2094     )
2095 {
2096     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
2097     phLlcNfc_StoreIFrame_t      *ps_store_info = NULL;
2098     phLlcNfc_Frame_t            *ps_frame_info = NULL;
2099     
2100     ps_frame_info = &(psLlcCtxt->s_frameinfo);
2101     ps_store_info = &(ps_frame_info->s_send_store);
2102
2103     PH_LLCNFC_PRINT ("\nLLC : phLlcNfc_H_WriteWaitCall call ..\n");
2104     PH_LLCNFC_DEBUG ("\n\nLLC : ps_frame_info->write_wait_call before call %08X\n", ps_frame_info->write_wait_call);
2105
2106     ps_frame_info->write_status = NFCSTATUS_PENDING;
2107     switch (ps_frame_info->write_wait_call)
2108     {
2109         case user_i_frame:
2110         {
2111             ps_frame_info->write_wait_call = invalid_frame;
2112             result = phLlcNfc_H_SendUserIFrame (psLlcCtxt, ps_store_info);
2113             break;
2114         }
2115
2116         case resend_i_frame:
2117         {
2118             ps_frame_info->write_wait_call = invalid_frame;
2119             result = phLlcNfc_H_SendTimedOutIFrame (psLlcCtxt, ps_store_info, 0);
2120             break;
2121         }
2122
2123         case rejected_i_frame:
2124         {
2125             ps_frame_info->write_wait_call = invalid_frame;
2126             result = phLlcNfc_H_SendRejectedIFrame (psLlcCtxt, ps_store_info, 
2127                                                     ps_frame_info->rejected_ns);
2128             break;
2129         }
2130
2131         case resend_s_frame:
2132         case reject_s_frame:
2133         case resend_rej_s_frame:
2134         {
2135             ps_frame_info->write_wait_call = invalid_frame;
2136             break;
2137         }
2138
2139         case u_rset_frame:
2140         {
2141             ps_frame_info->write_wait_call = invalid_frame;
2142             result = phLlcNfc_H_SendRSETFrame (psLlcCtxt);
2143             break;
2144         }
2145
2146         default :
2147         {
2148             ps_frame_info->write_wait_call = invalid_frame;
2149             break;
2150         }
2151     }
2152
2153     PH_LLCNFC_DEBUG ("\n\nLLC : ps_frame_info->write_wait_call after call %08X\n", ps_frame_info->write_wait_call);
2154     PH_LLCNFC_PRINT ("\nLLC : phLlcNfc_H_WriteWaitCall end ..\n");
2155     return result;
2156 }
2157
2158 NFCSTATUS  
2159 phLlcNfc_H_SendRSETFrame (
2160                       phLlcNfc_Context_t  *psLlcCtxt
2161                       )
2162 {
2163     NFCSTATUS                   result = NFCSTATUS_SUCCESS;
2164     phLlcNfc_LlcPacket_t        s_packet_info;
2165     phLlcNfc_Frame_t            *ps_frame_info = NULL;
2166     
2167     ps_frame_info = &(psLlcCtxt->s_frameinfo);
2168
2169     result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt,
2170                                     &(s_packet_info),
2171                                     &(s_packet_info.llcbuf_len),
2172                                     phLlcNfc_e_rset);
2173
2174     if (NFCSTATUS_SUCCESS == result)
2175     {
2176         /* Call DAL write */
2177         result = phLlcNfc_Interface_Write(psLlcCtxt,
2178                             (uint8_t*)&(s_packet_info.s_llcbuf),
2179                             (uint32_t)s_packet_info.llcbuf_len);
2180     }
2181
2182     ps_frame_info->write_status = result;
2183     if (NFCSTATUS_PENDING == result)
2184     {
2185         /* Start the timer */
2186         result = phLlcNfc_StartTimers (PH_LLCNFC_CONNECTIONTIMER, 0);
2187         if (NFCSTATUS_SUCCESS == result)
2188         {
2189             ps_frame_info->sent_frame_type = u_rset_frame;
2190             result = NFCSTATUS_PENDING;
2191         }
2192     }
2193     else
2194     {
2195         ps_frame_info->write_wait_call = u_rset_frame;
2196     }
2197
2198     return result;
2199 }
2200
2201