15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors
35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License.
65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at
75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software
115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and
145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License.
155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* =========================================================================== *
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \file  hHciNfc_AdminMgmt.c                                                  *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief HCI Admin Gate Management Routines.                                  *
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI-1.1                                                        *
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Date: Mon Apr  5 19:23:34 2010 $                                           *
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Author: ing04880 $                                                         *
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Revision: 1.47 $                                                           *
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*                                                                             *
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* =========================================================================== *
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly***************************** Header File Inclusion ****************************
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcCompId.h>
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_Pipe.h>
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_AdminMgmt.h>
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc_DevMgmt.h>
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h>
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly****************************** Macro Definitions *******************************
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define SESSION_INDEX       0x01U
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define MAX_PIPE_INDEX      0x02U
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define WHITELIST_INDEX     0x03U
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define HOST_LIST_INDEX     0x04U
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Max Whitelist Supported by the Device*/
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define SESSIONID_LEN       0x08U
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define WHITELIST_MAX_LEN   0x03U
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define HOST_LIST_MAX_LEN   0x05U
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Address Definitions for HW Configuration */
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define NFC_ADDRESS_UICC_SESSION        0x9EA2U
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Structure and Enumeration ***************************
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef enum phHciNfc_Admin_Seq{
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_PIPE_OPEN     = 0x00U,
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_GET_HOST_LIST,
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_GET_WHITE_LIST,
705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_GET_SESSION,
715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_VERIFY_SESSION,
725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_CLEAR_UICC_PIPES,
735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_CLEAR_PIPES,
745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_PIPE_REOPEN,
755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_CREATE_PIPES,
765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_SET_SESSION,
775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_SET_WHITE_LIST,
785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_UPDATE_PIPES,
795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_PIPE_CLOSE,
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_DELETE_PIPES,
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    ADMIN_END_SEQUENCE
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} phHciNfc_Admin_Seq_t;
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Information structure for the Admin Gate */
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellytypedef struct phHciNfc_AdminGate_Info{
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Current running Sequence of the Admin Management */
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Admin_Seq_t            current_seq;
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Next running Sequence of the Admin Management */
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Admin_Seq_t            next_seq;
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Pointer to the Admin Pipe Information */
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Pipe_Info_t            *admin_pipe_info;
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Sequence for the Pipe Initialisation */
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_PipeMgmt_Seq_t         pipe_seq;
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Session ID of the Device */
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                         session_id[SESSIONID_LEN];
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Max number of pipes that can be created on the Device */
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                         max_pipe;
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* List of Hosts that can be access the device Admin Gate. */
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                         whitelist[WHITELIST_MAX_LEN];
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Host List from the Host Controller */
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                         host_list[HOST_LIST_MAX_LEN];
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} phHciNfc_AdminGate_Info_t;
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Static Function Declaration **************************
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \ingroup grp_hci_nfc
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  The phHciNfc_Recv_Admin_Response function interprets the received AdminGate
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  response from the Host Controller Gate.
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \param[in]  psHciContext            psHciContext is the pointer to HCI Layer
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *                                      context Structure.
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \param[in]  pHwRef                  pHwRef is the Information of
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *                                      the Device Interface Link .
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \param[in,out]  pResponse           Response received from the Host Cotroller
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *                                      Admin gate.
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \param[in]  length                  length contains the length of the
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *                                      response received from the Host Controller.
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \retval NFCSTATUS_PENDING           AdminGate Response to be received is pending.
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \retval NFCSTATUS_SUCCESS           AdminGate Response received Successfully.
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *                                      could not be interpreted properly.
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  \retval Other errors                Errors related to the other layers
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Admin_Response(
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *psHciContext,
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *pHwRef,
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             *pResponse,
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             length
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint16_t            length
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                       );
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_InfoUpdate(
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext,
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHal_sHwReference_t    *pHwRef,
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t                 index,
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t                 *reg_value,
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t                 reg_length
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         );
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Cmd (
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *psContext,
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *pHwRef,
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             *pCmd,
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             length
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint16_t            length
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     );
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Event (
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *psContext,
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *pHwRef,
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             *pEvent,
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             length
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint16_t            length
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     );
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Function Definitions ***************************
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Initialisation of Admin Gate and Establish the Session .
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function initialses the Admin Gates and Establishes the Session by creating
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * all the required pipes and sets the Session ID
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_Initialise(
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext,
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                void                    *pHwRef
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                         )
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                           status = NFCSTATUS_SUCCESS;
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Pipe_Info_t                *p_pipe_info = NULL;
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t           *p_admin_info=NULL;
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                             length = 0;
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext)
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == pHwRef )
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        )
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( ( NULL == psHciContext->p_admin_info )
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            && (phHciNfc_Allocate_Resource((void **)(&p_admin_info),
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    sizeof(phHciNfc_AdminGate_Info_t))== NFCSTATUS_SUCCESS)
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly          )
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->p_admin_info = (void *) p_admin_info;
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->current_seq = ADMIN_PIPE_OPEN;
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->next_seq = ADMIN_END_SEQUENCE;
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info = NULL;
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info = (phHciNfc_AdminGate_Info_t * )
2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psHciContext->p_admin_info ;
2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NULL == p_admin_info)
2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI,
2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NFCSTATUS_INSUFFICIENT_RESOURCES);
2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(p_admin_info->current_seq)
2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Admin pipe open sequence , Initially open the Admin Pipe */
2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_PIPE_OPEN:
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(phHciNfc_Allocate_Resource((void **)(&p_pipe_info),
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        sizeof(phHciNfc_Pipe_Info_t))!= NFCSTATUS_SUCCESS)
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_INSUFFICIENT_RESOURCES);
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* Populate the pipe information in the pipe handle */
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ((phHciNfc_Pipe_Info_t *)p_pipe_info)->pipe.pipe_id =
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        PIPETYPE_STATIC_ADMIN;
2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ((phHciNfc_Pipe_Info_t *)p_pipe_info)->recv_resp =
2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &phHciNfc_Recv_Admin_Response;
2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ((phHciNfc_Pipe_Info_t *)p_pipe_info)->recv_cmd =
2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &phHciNfc_Recv_Admin_Cmd;
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        ((phHciNfc_Pipe_Info_t *)p_pipe_info)->recv_event =
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        &phHciNfc_Recv_Admin_Event;
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN] =
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                                    p_pipe_info ;
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Open_Pipe( psHciContext,
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                            pHwRef,p_pipe_info );
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if(status == NFCSTATUS_SUCCESS)
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_admin_info->admin_pipe_info = p_pipe_info ;
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_admin_info->next_seq = ADMIN_GET_SESSION;
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = NFCSTATUS_PENDING;
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_GET_SESSION:
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->reg_index = SESSION_INDEX;
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->prev_status =
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            (uint8_t)HCI_ADMIN_PIPE_ID,
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (uint8_t)ANY_GET_PARAMETER);
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NFCSTATUS_PENDING == p_pipe_info->prev_status )
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UICC_SESSION_RESET
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_CLEAR_UICC_PIPES;
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#elif defined (ESTABLISH_SESSION)
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_VERIFY_SESSION;
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_CLEAR_PIPES;
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UICC_SESSION_RESET
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_CLEAR_UICC_PIPES:
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    uint8_t config = 0x00;
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     /* TODO: Implement the Clear UICC PIPES Using
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      * Memory configuration.
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      */
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NFC_ADDRESS_UICC_SESSION , config );
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NFCSTATUS_PENDING == status )
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_CLEAR_PIPES;
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_VERIFY_SESSION:
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phHal_sHwConfig_t *p_hw_config =
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (phHal_sHwConfig_t *) psHciContext->p_config_params;
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phHal_sHwReference_t *p_hw_ref =
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (phHal_sHwReference_t *) pHwRef;
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    int             cmp_val = 0;
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    cmp_val = phOsalNfc_MemCompare(p_hw_config->session_id ,
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 p_hw_ref->session_id ,
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         sizeof(p_hw_ref->session_id));
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if((cmp_val == 0)
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        && ( HCI_SESSION == psHciContext->init_mode)
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        )
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->hci_mode = hciMode_Session;
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Update_Pipe( psHciContext, pHwRef,
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                &p_admin_info->pipe_seq );
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if((status == NFCSTATUS_SUCCESS)
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            && (NULL != p_pipe_info))
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_pipe_info->reg_index = MAX_PIPE_INDEX;
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = phHciNfc_Send_Generic_Cmd( psHciContext,
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    pHwRef, (uint8_t)HCI_ADMIN_PIPE_ID,
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    (uint8_t)ANY_GET_PARAMETER );
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_pipe_info->prev_status = status;
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if(NFCSTATUS_PENDING == status )
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                p_admin_info->next_seq = ADMIN_PIPE_CLOSE;
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                status = NFCSTATUS_SUCCESS;
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = PHNFCSTVAL(CID_NFC_HCI,
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_INVALID_HCI_SEQUENCE);
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        break;
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /* To clear the pipe information*/
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->hci_mode = hciMode_Override;
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->current_seq = ADMIN_CLEAR_PIPES;
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* fall through */
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_CLEAR_PIPES:
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->prev_status =
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phHciNfc_Send_Admin_Cmd( psHciContext,
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        pHwRef, ADM_CLEAR_ALL_PIPE,
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            length, p_pipe_info);
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = ((p_pipe_info->prev_status == NFCSTATUS_PENDING)?
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_SUCCESS :
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                p_pipe_info->prev_status);
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_SUCCESS)
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_PIPE_REOPEN;
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Admin pipe Re-Open sequence , Re-Open the Admin Pipe */
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_PIPE_REOPEN:
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Open_Pipe( psHciContext,
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                        pHwRef,p_pipe_info );
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_SUCCESS)
3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_CREATE_PIPES;
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_CREATE_PIPES:
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Create_All_Pipes( psHciContext, pHwRef,
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                        &p_admin_info->pipe_seq );
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(status == NFCSTATUS_SUCCESS)
3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_GET_WHITE_LIST;
3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_PENDING;
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_GET_WHITE_LIST:
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NULL == p_pipe_info )
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_HCI_SEQUENCE);
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_pipe_info->reg_index = WHITELIST_INDEX;
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Send_Generic_Cmd( psHciContext,
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                pHwRef, (uint8_t)HCI_ADMIN_PIPE_ID,
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                (uint8_t)ANY_GET_PARAMETER );
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_pipe_info->prev_status = status;
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if(HCI_SELF_TEST == psHciContext->init_mode)
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = ((NFCSTATUS_PENDING == status )?
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFCSTATUS_SUCCESS : status);
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        else
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            if(NFCSTATUS_PENDING == status )
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            {
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                p_admin_info->next_seq = ADMIN_GET_HOST_LIST;
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                /* status = NFCSTATUS_SUCCESS; */
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            }
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_GET_HOST_LIST:
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NULL == p_pipe_info )
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_HCI_SEQUENCE);
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_pipe_info->reg_index = HOST_LIST_INDEX;
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Send_Generic_Cmd( psHciContext,
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                pHwRef, (uint8_t)HCI_ADMIN_PIPE_ID,
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                (uint8_t)ANY_GET_PARAMETER );
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_pipe_info->prev_status = status;
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if(NFCSTATUS_PENDING == status )
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if defined(HOST_WHITELIST)
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_admin_info->next_seq = ADMIN_SET_WHITE_LIST;
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_admin_info->next_seq = ADMIN_SET_SESSION;
4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = NFCSTATUS_SUCCESS;
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_SET_WHITE_LIST:
4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NULL == p_pipe_info )
4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = PHNFCSTVAL(CID_NFC_HCI,
4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        NFCSTATUS_INVALID_HCI_SEQUENCE);
4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else
4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             i = 0;
4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        for (i = 0; i < WHITELIST_MAX_LEN - 2; i++ )
4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_admin_info->whitelist[i] = i + 2;
4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Set_Param(psHciContext, pHwRef,
4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                      p_pipe_info, WHITELIST_INDEX,
4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (uint8_t *)p_admin_info->whitelist, i );
4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if(NFCSTATUS_PENDING == status )
4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            p_admin_info->next_seq = ADMIN_SET_SESSION;
4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            status = NFCSTATUS_SUCCESS;
4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADMIN_SET_SESSION:
4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phHal_sHwConfig_t *p_hw_config =
4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (phHal_sHwConfig_t *) psHciContext->p_config_params;
4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = p_admin_info->admin_pipe_info;
4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Set_Param(psHciContext, pHwRef, p_pipe_info,
4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        SESSION_INDEX, (uint8_t *)(p_hw_config->session_id),
4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            sizeof(p_hw_config->session_id));
4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NFCSTATUS_PENDING == p_pipe_info->prev_status )
4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_admin_info->next_seq = ADMIN_PIPE_CLOSE;
5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = NFCSTATUS_SUCCESS;
5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default:
5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }/* End of the Sequence Switch */
5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }/* End of the Admin Info Memory Check */
5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }/* End of Null context Check */
5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef HOST_EMULATION
5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Creates the Card Emulation Gate Pipes .
5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function Creates the Card Emulation Gate.
5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_CE_Init(
5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext,
5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                void                    *pHwRef,
5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_GateID_t       ce_gate
5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             )
5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                           status = NFCSTATUS_SUCCESS;
5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* phHciNfc_Pipe_Info_t             *pipe_info = NULL; */
5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t           *p_admin_info=NULL;
5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) )
5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NULL != psHciContext->p_admin_info )
5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info = psHciContext->p_admin_info;
5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(ce_gate)
5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Card Emulation A Gate Pipe Creation */
5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case phHciNfc_CETypeAGate:
5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->pipe_seq = PIPE_CARD_A_CREATE;
5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Card Emulation B Gate Pipe Creation */
5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case phHciNfc_CETypeBGate:
5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->pipe_seq = PIPE_CARD_B_CREATE;
5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default:
5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED);
5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            } /* End of CE Gate Switch */
5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NFCSTATUS_SUCCESS == status)
5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phHciNfc_CE_Pipes_OP( psHciContext,
5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        pHwRef, &p_admin_info->pipe_seq );
5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(status == NFCSTATUS_SUCCESS)
5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->next_seq = ADMIN_END_SEQUENCE;
5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* status = NFCSTATUS_PENDING; */
5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }/* End of NULL Check for the Admin_Info */
5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    } /* End of Null Check for the Context */
5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Releases the resources allocated the Admin Management.
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function Releases the resources allocated the Admin Management
5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * and resets the hardware to the reset state.
5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_Release(
5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext,
5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                void                    *pHwRef,
5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_HostID_t        host_type
6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             )
6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                           status = NFCSTATUS_SUCCESS;
6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Pipe_Info_t                *p_pipe_info = NULL;
6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) )
6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NULL != psHciContext->p_admin_info )
6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(phHciNfc_UICCHostID != host_type)
6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                p_pipe_info = psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN];
6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phHciNfc_Close_Pipe( psHciContext,
6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    pHwRef, p_pipe_info );
6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }/* End of NULL Check for the Admin_Info */
6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    } /* End of Null Check for the Context */
6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Sends the HCI Admin Event to the corresponding peripheral device.
6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function sends the HCI Admin Events to the connected NFC Pheripheral
6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device
6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS
6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Send_Admin_Event (
6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      phHciNfc_sContext_t   *psHciContext,
6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      void                  *pHwRef,
6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      uint8_t               event,
6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      uint8_t               length,
6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      void                  *params
6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     )
6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t   *p_admin_info=NULL;
6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext)
6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == pHwRef)
6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      )
6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        psHciContext->tx_total = 0 ;
6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        length +=  HCP_HEADER_LEN ;
6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info = psHciContext->p_admin_info;
6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( EVT_HOT_PLUG ==   event )
6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Use the HCP Packet Structure to Construct the send HCP
6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                * Packet data.
6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                */
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (uint8_t) HCI_ADMIN_PIPE_ID,
6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    HCP_MSG_TYPE_EVENT, event);
6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INSTRUCTION);
6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NFCSTATUS_SUCCESS == status )
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT;
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->prev_msg = event ;
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->param_info = params ;
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->tx_total = length;
6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->response_pending = FALSE ;
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef );
6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_PENDING;
6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Sends the HCI Admin Commands to the corresponding peripheral device.
6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function sends the HCI Admin Commands to the connected NFC Pheripheral
6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS
6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Send_Admin_Cmd (
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      phHciNfc_sContext_t   *psHciContext,
7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      void                  *pHwRef,
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      uint8_t               cmd,
7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      uint8_t               length,
7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      void                  *params
7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     )
7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Message_t      *hcp_message = NULL;
7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t   *p_admin_info=NULL;
7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     i=0;
7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext)
7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == pHwRef)
7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == params)
7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      )
7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_pipe_info = (phHciNfc_Pipe_Info_t *)  params;
7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        psHciContext->tx_total = 0 ;
7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        length +=  HCP_HEADER_LEN ;
7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info = psHciContext->p_admin_info;
7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(  cmd )
7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case ADM_CREATE_PIPE:
7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Use the HCP Packet Structure to Construct the send HCP
7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                * Packet data.
7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                */
7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (uint8_t) HCI_ADMIN_PIPE_ID,
7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        HCP_MSG_TYPE_COMMAND, cmd);
7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_message = &(hcp_packet->msg.message);
7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Source HOST ID Parameter is not passed as a
7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 * parameter in the HCI SPEC */
7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* hcp_message->payload[i++] = p_pipe_info->pipe.source.host_id; */
7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_message->payload[i++] = p_pipe_info->pipe.source.gate_id;
7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_message->payload[i++] = p_pipe_info->pipe.dest.host_id;
7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_message->payload[i++] = p_pipe_info->pipe.dest.gate_id;
7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case ADM_DELETE_PIPE:
7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                uint8_t     pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pipe_id = p_pipe_info->pipe.pipe_id;
7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if( pipe_id < PIPETYPE_DYNAMIC )
7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* The Static Pipes cannot be Deleted */
7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI,
7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    NFCSTATUS_INVALID_PARAMETER );
7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_DEBUG("phHciNfc_Send_Admin_Cmd: Static Pipe %u "
7605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                "Cannot be Deleted \n",pipe_id);
7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
7635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
7645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* Use the HCP Packet Structure to Construct the send HCP
7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     * Packet data.
7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     */
7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
7695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            (uint8_t) HCI_ADMIN_PIPE_ID,
7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            HCP_MSG_TYPE_COMMAND, cmd);
7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    hcp_message = &(hcp_packet->msg.message);
7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    hcp_message->payload[i++] = pipe_id ;
7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case ADM_CLEAR_ALL_PIPE:
7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* Use the HCP Packet Structure to Construct the send HCP
7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 * Packet data.
7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 */
7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (uint8_t) HCI_ADMIN_PIPE_ID,
7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        HCP_MSG_TYPE_COMMAND, cmd);
7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                hcp_message = &(hcp_packet->msg.message);
7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* These are notifications and can not be sent by the Host */
7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* case ADM_NOTIFY_PIPE_CREATED: */
7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* case ADM_NOTIFY_PIPE_DELETED: */
7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* case ADM_NOTIFY_ALL_PIPE_CLEARED: */
7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND);
7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NFCSTATUS_SUCCESS == status )
7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND;
8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->prev_msg = cmd;
8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->param_info = p_pipe_info;
8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->tx_total = length;
8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            psHciContext->response_pending = TRUE;
8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef );
8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_PENDING;
8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Receives the HCI Response from the corresponding peripheral device.
8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
8175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function receives the HCI Command Response from the connected NFC
8185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Pheripheral device.
8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Recv_Admin_Response(
8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *psContext,
8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *pHwRef,
8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             *pResponse,
8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             length
8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint16_t            length
8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    )
8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (phHciNfc_sContext_t *)psContext ;
8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Message_t      *hcp_message = NULL;
8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t   *p_admin_info = NULL;
8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
8415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
8425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     prev_cmd = 0;
8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   prev_status = NFCSTATUS_SUCCESS;
8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext) || (NULL == pHwRef) )
8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if ( NULL == psHciContext->p_admin_info )
8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_packet = (phHciNfc_HCP_Packet_t *)pResponse;
8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_message = &hcp_packet->msg.message;
8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info = psHciContext->p_admin_info;
8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        prev_cmd = p_admin_info->admin_pipe_info->prev_msg ;
8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        prev_status = p_admin_info->admin_pipe_info->prev_status ;
8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(prev_status == NFCSTATUS_PENDING)
8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            switch(prev_cmd)
8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_SET_PARAMETER:
8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_GET_PARAMETER:
8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Admin_InfoUpdate(psHciContext,
8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (phHal_sHwReference_t *)pHwRef,
8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                p_admin_info->admin_pipe_info->reg_index,
8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    &pResponse[HCP_HEADER_LEN],
8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        (uint8_t)(length - HCP_HEADER_LEN));
8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_OPEN_PIPE:
8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ANY_CLOSE_PIPE:
8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phOsalNfc_FreeMemory(p_admin_info->admin_pipe_info);
8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->admin_pipe_info = NULL;
8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN] = NULL;
8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADM_CREATE_PIPE:
8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = (phHciNfc_Pipe_Info_t *)
8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        p_admin_info->admin_pipe_info->param_info;
8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pipe_id = hcp_message->payload[RESPONSE_PIPEID_OFFSET];
8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = phHciNfc_Update_PipeInfo(psHciContext,
8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        &(p_admin_info->pipe_seq), pipe_id, p_pipe_info);
8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NFCSTATUS_SUCCESS == status )
8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_pipe_list[pipe_id] = p_pipe_info;
8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_pipe_info->pipe.pipe_id = pipe_id;
8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
9025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADM_DELETE_PIPE:
9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info = (phHciNfc_Pipe_Info_t *)
9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    p_admin_info->admin_pipe_info->param_info;
9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if ( NULL != p_pipe_info )
9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        pipe_id = p_pipe_info->pipe.pipe_id;
9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Update_PipeInfo(
9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            psHciContext, &(p_admin_info->pipe_seq),
9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (uint8_t) HCI_UNKNOWN_PIPE_ID, p_pipe_info);
9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        if(NFCSTATUS_SUCCESS == status )
9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        {
9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            phOsalNfc_FreeMemory(p_pipe_info);
9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            psHciContext->p_pipe_list[pipe_id] = NULL;
9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        }
9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                case ADM_CLEAR_ALL_PIPE:
9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                default:
9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    HCI_DEBUG("%s: Default Statement Should Not Occur \n",
9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    "phHciNfc_Recv_Admin_Response");
9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    break;
9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( NFCSTATUS_SUCCESS == status )
9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if( NULL != p_admin_info->admin_pipe_info)
9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_SUCCESS;
9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            p_admin_info->current_seq = p_admin_info->next_seq;
9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
9445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Receives the HCI Admin Commands from the corresponding peripheral device.
9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function receives  the HCI Admin Commands from the connected NFC Pheripheral
9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device
9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS
9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Cmd (
9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *psContext,
9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *pHwRef,
9565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             *pCmd,
9575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
9585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             length
9595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint16_t            length
9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     )
9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (phHciNfc_sContext_t *)psContext ;
9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Message_t      *hcp_message = NULL;
9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t   *p_admin_info=NULL;
9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
9705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     index=0;
9715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
9725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     cmd = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;
9735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     response = (uint8_t) ANY_OK;
9745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext)
9775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == pHwRef)
9785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (HCP_HEADER_LEN > length )
9795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      )
9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
9825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
9845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_packet = (phHciNfc_HCP_Packet_t *)pCmd;
9865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_message = &hcp_packet->msg.message;
9875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info = psHciContext->p_admin_info;
9885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Get the Command instruction bits from the Message Header */
9895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        cmd = (uint8_t) GET_BITS8( hcp_message->msg_header,
9905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
9915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch( cmd )
9935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
9945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* These are notifications sent by the Host Controller */
9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case ADM_NOTIFY_PIPE_CREATED:
9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pipe_id = hcp_message->payload[RESPONSE_PIPEID_OFFSET];
9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                p_pipe_info = (phHciNfc_Pipe_Info_t *)
9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phOsalNfc_GetMemory(sizeof(phHciNfc_Pipe_Info_t));
1000f0096a6bac78ff99f255332771867f59b2d6d73bDejan REBRACA                memset(p_pipe_info, 0, sizeof(phHciNfc_Pipe_Info_t));
10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NULL != p_pipe_info)
10025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* The Source Host is the UICC Host */
10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->pipe.source.host_id =
10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    hcp_message->payload[index++];
10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* The Source Gate is same as the Destination Gate */
10075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->pipe.source.gate_id    =
10085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    hcp_message->payload[index++];
10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /* The Source Host is the Terminal Host */
10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->pipe.dest.host_id =
10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    hcp_message->payload[index++];
10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->pipe.dest.gate_id  =
10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    hcp_message->payload[index++];
10145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_pipe_info->pipe.pipe_id   =
10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    hcp_message->payload[index++];
10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
10175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phHciNfc_Update_PipeInfo(psHciContext,
10185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    &(p_admin_info->pipe_seq), pipe_id, p_pipe_info);
10195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if( NFCSTATUS_SUCCESS == status )
10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    psHciContext->p_pipe_list[pipe_id] = p_pipe_info;
10235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if (NULL != p_pipe_info)
10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        p_pipe_info->pipe.pipe_id = pipe_id;
10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
10275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
10285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
10305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case ADM_NOTIFY_PIPE_DELETED:
10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pipe_id = hcp_message->payload[index++];
10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                p_pipe_info = psHciContext->p_pipe_list[pipe_id];
10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if ( NULL != p_pipe_info )
10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        status = phHciNfc_Update_PipeInfo(
10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            psHciContext, &(p_admin_info->pipe_seq),
10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             (uint8_t) HCI_UNKNOWN_PIPE_ID, p_pipe_info);
10395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(NFCSTATUS_SUCCESS == status )
10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phOsalNfc_FreeMemory(p_pipe_info);
10425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        psHciContext->p_pipe_list[pipe_id] = NULL;
10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* TODO: Since we receive the Host ID, we need to clear
10485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             * all the pipes created with the host
10495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             */
10505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case ADM_NOTIFY_ALL_PIPE_CLEARED:
10515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
10525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
10535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
10545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* case ADM_CREATE_PIPE: */
10555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* case ADM_DELETE_PIPE: */
10565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* case ADM_CLEAR_ALL_PIPE: */
10575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
10585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
10595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                response = ANY_E_CMD_NOT_SUPPORTED;
10605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_COMMAND_NOT_SUPPORTED);
10615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
10625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
10635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
10645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
10655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
10665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                (uint8_t) HCI_ADMIN_PIPE_ID,
10675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                HCP_MSG_TYPE_RESPONSE, response );
10685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        psHciContext->tx_total = HCP_HEADER_LEN;
10695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef );
10705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info->admin_pipe_info->recv_msg_type = HCP_MSG_TYPE_COMMAND;
10725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info->admin_pipe_info->sent_msg_type = HCP_MSG_TYPE_RESPONSE;
10735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info->admin_pipe_info->prev_msg = response;
10745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info->admin_pipe_info->prev_status = NFCSTATUS_PENDING;
10755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
10765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
10775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
10785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
10795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
10805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Receives the HCI Admin Event from the corresponding peripheral device.
10815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
10825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * This function receives  the HCI Admin Events from the connected NFC Pheripheral
10835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * device
10845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
10855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
10865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS
10875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHciNfc_Recv_Admin_Event (
10885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *psContext,
10895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        void                *pHwRef,
10905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             *pEvent,
10915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef ONE_BYTE_LEN
10925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint8_t             length
10935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
10945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        uint16_t            length
10955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
10965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     )
10975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
10985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_sContext_t         *psHciContext =
10995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    (phHciNfc_sContext_t *)psContext ;
11005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
11015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_HCP_Message_t      *hcp_message = NULL;
11025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;
11035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
11045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( (NULL == psHciContext)
11065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == pHwRef)
11075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (HCP_HEADER_LEN > length )
11085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      )
11095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
11105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
11115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
11125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
11135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
11145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent;
11155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        hcp_message = &hcp_packet->msg.message;
11165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Get the Command instruction bits from the Message Header */
11175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        event = (uint8_t) GET_BITS8( hcp_message->msg_header,
11185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
11195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if( EVT_HOT_PLUG ==   event )
11215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
11225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phHciNfc_Send_Admin_Event ( psHciContext, pHwRef,
11235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                EVT_HOT_PLUG, 0 ,NULL);
11245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
11265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
11275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
11285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INSTRUCTION);
11295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
11305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
11335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
11345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
11355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic
11385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
11395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHciNfc_Admin_InfoUpdate(
11405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHciNfc_sContext_t     *psHciContext,
11415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                phHal_sHwReference_t    *pHwRef,
11425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t                 index,
11435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t                 *reg_value,
11445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uint8_t             reg_length
11455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                          )
11465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
11475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHciNfc_AdminGate_Info_t   *p_admin_info=NULL;
11485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                     i=0;
11495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
11505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL == reg_value)
11515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
11525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
11535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
11545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
11555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
11565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        p_admin_info = psHciContext->p_admin_info ;
11575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        HCI_PRINT_BUFFER("Admin Mgmt Info Buffer",reg_value,reg_length);
11585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(index)
11595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
11605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case SESSION_INDEX :
11615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
11625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                for(i=0 ;(reg_length == SESSIONID_LEN)&&(i < reg_length); i++)
11635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
11645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->session_id[i] = reg_value[i];
11655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pHwRef->session_id[i] = reg_value[i];
11665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
11675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
11685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
11695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case MAX_PIPE_INDEX :
11705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
11715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                p_admin_info->max_pipe = reg_value[i];
11725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
11735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
11745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case WHITELIST_INDEX :
11755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
11765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                for(i=0 ;(reg_length <= WHITELIST_MAX_LEN)&&(i < reg_length); i++)
11775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
11785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->whitelist[i] = reg_value[i];
11795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
11805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
11815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
11825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case HOST_LIST_INDEX :
11835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
11845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                for(i=0 ;(reg_length <= HOST_LIST_MAX_LEN)&&(i < reg_length); i++)
11855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
11865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    p_admin_info->host_list[i] = reg_value[i];
11875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
11885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
11895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
11905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
11915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
11925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
11935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
11945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            } /*End of the default Switch Case */
11955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        } /*End of the Index Switch */
11975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
11985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    } /* End of Context and the Identity information validity check */
11995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
12015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
12025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1203