1d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/******************************************************************************
2d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
3d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
4d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  Copyright (C) 2015 NXP Semiconductors
5d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
6d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  Licensed under the Apache License, Version 2.0 (the "License");
7d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  you may not use this file except in compliance with the License.
8d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  You may obtain a copy of the License at
9d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
10d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  http://www.apache.org/licenses/LICENSE-2.0
11d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
12d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  Unless required by applicable law or agreed to in writing, software
13d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  distributed under the License is distributed on an "AS IS" BASIS,
14d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  See the License for the specific language governing permissions and
16d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *  limitations under the License.
17d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna *
18d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna ******************************************************************************/
19d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define LOG_TAG "EseAdaptation"
20d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <android/hardware/secure_element/1.0/ISecureElement.h>
21d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <android/hardware/secure_element/1.0/ISecureElementHalCallback.h>
22d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <android/hardware/secure_element/1.0/types.h>
23d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <hwbinder/ProcessState.h>
24d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <pthread.h>
25d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include "EseAdaptation.h"
26d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#include <log/log.h>
27d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
28d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::Return;
29d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::Void;
30d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::secure_element::V1_0::ISecureElement;
31d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::secure_element::V1_0::ISecureElementHalCallback;
32d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::hardware::hidl_vec;
33d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing android::sp;
34d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
35d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannausing vendor::nxp::nxpese::V1_0::INxpEse;
36d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
37d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern bool nfc_debug_enabled;
38d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
39d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern "C" void GKI_shutdown();
40d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern void resetConfig();
41d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern "C" void verify_stack_non_volatile_store();
42d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaextern "C" void delete_stack_non_volatile_store(bool forceDelete);
43d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
44d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation* EseAdaptation::mpInstance = NULL;
45d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex EseAdaptation::sLock;
46d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex EseAdaptation::sIoctlLock;
47d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannasp<INxpEse> EseAdaptation::mHalNxpEse;
48d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannasp<ISecureElement> EseAdaptation::mHal;
49d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannatHAL_ESE_CBACK* EseAdaptation::mHalCallback = NULL;
50d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannatHAL_ESE_DATA_CBACK* EseAdaptation::mHalDataCallback = NULL;
51d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalOpenCompletedEvent;
52d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalCloseCompletedEvent;
53d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
54d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#if (NXP_EXTNS == TRUE)
55d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalCoreResetCompletedEvent;
56d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalCoreInitCompletedEvent;
57d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar EseAdaptation::mHalInitCompletedEvent;
58d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define SIGNAL_NONE 0
59d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#define SIGNAL_SIGNALED 1
60d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannastatic uint8_t isSignaled = SIGNAL_NONE;
61d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannastatic uint8_t evt_status;
62d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna#endif
63d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
64d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
65d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
66d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::EseAdaptation()
67d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
68d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor
69d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
70d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
71d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
72d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
73d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation::EseAdaptation() {
74d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  memset(&mSpiHalEntryFuncs, 0, sizeof(mSpiHalEntryFuncs));
75d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
76d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
77d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
78d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
79d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::~EseAdaptation()
80d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
81d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor
82d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
83d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
84d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
85d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
86d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation::~EseAdaptation() { mpInstance = NULL; }
87d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
88d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
89d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
90d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::GetInstance()
91d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
92d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: access class singleton
93d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
94d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     pointer to the singleton object
95d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
96d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
97d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaEseAdaptation& EseAdaptation::GetInstance() {
98d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  AutoThreadMutex a(sLock);
99d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
100d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (!mpInstance) mpInstance = new EseAdaptation;
101d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return *mpInstance;
102d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
103d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
104d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
105d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
106d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::Initialize()
107d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
108d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class initializer
109d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
110d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
111d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
112d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
113d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::Initialize() {
114d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  const char* func = "EseAdaptation::Initialize";
115d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  uint8_t cmd_ese_nxp[] = {0x2F, 0x01, 0x01, 0x01};
116d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: enter", func);
117d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
118d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  mHalCallback = NULL;
119d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ese_nxp_IoctlInOutData_t* pInpOutData;
120d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pInpOutData =
121d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna      (ese_nxp_IoctlInOutData_t*)malloc(sizeof(ese_nxp_IoctlInOutData_t));
122d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  memset(pInpOutData, 0x00, sizeof(ese_nxp_IoctlInOutData_t));
123d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pInpOutData->inp.data.nxpCmd.cmd_len = sizeof(cmd_ese_nxp);
124d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  memcpy(pInpOutData->inp.data.nxpCmd.p_cmd, cmd_ese_nxp, sizeof(cmd_ese_nxp));
125d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  InitializeHalDeviceContext();
126d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (pInpOutData != NULL) free(pInpOutData);
127d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: exit", func);
128d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
129d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
130d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
131d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
132d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::signal()
133d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
134d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: signal the CondVar to release the thread that is waiting
135d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
136d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
137d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
138d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
139d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::signal() { mCondVar.signal(); }
140d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
141d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
142d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
143d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::Thread()
144d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
145d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Creates work threads
146d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
147d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
148d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
149d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
150d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannauint32_t EseAdaptation::Thread(uint32_t arg) {
151d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  const char* func = "EseAdaptation::Thread";
152d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: enter", func);
153d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  arg = 0;
154d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  { ThreadCondVar CondVar; }
155d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
156d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  EseAdaptation::GetInstance().signal();
157d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
158d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: exit", func);
159d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return 0;
160d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
161d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
162d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
163d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
164d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::GetHalEntryFuncs()
165d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
166d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Get the set of HAL entry points.
167d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
168d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     Functions pointers for HAL entry points.
169d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
170d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
171d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannatHAL_ESE_ENTRY* EseAdaptation::GetHalEntryFuncs() {
172d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "GetHalEntryFuncs: enter");
173d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return &mSpiHalEntryFuncs;
174d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
175d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
176d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
177d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
178d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::InitializeHalDeviceContext
179d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
180d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Ask the generic Android HAL to find the Broadcom-specific HAL.
181d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
182d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     None.
183d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
184d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
185d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
186d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::InitializeHalDeviceContext() {
187d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  const char* func = "EseAdaptation::InitializeHalDeviceContext";
188d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: enter", func);
189d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: INxpEse::tryGetService()", func);
190d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  mHalNxpEse = INxpEse::tryGetService();
191a392053f9ac85446ef04ba62fb46ec77833478b0Jizhou Liao  ALOGD_IF(mHalNxpEse == nullptr, "%s: Failed to retrieve the NXP ESE HAL!", func);
192d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if(mHalNxpEse != nullptr) {
193d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna    ALOGD_IF(nfc_debug_enabled, "%s: INxpEse::getService() returned %p (%s)",
194d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna             func, mHalNxpEse.get(),
195d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna             (mHalNxpEse->isRemote() ? "remote" : "local"));
196d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  }
197d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  /*Transceive NCI_INIT_CMD*/
198d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: exit", func);
199d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
200d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
201d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
202d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::HalDeviceContextDataCallback
203d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
204d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Translate generic Android HAL's callback into Broadcom-specific
205d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              callback function.
206d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
207d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     None.
208d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
209d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
210d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid EseAdaptation::HalDeviceContextDataCallback(uint16_t data_len,
211d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna                                                 uint8_t* p_data) {
212d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  const char* func = "EseAdaptation::HalDeviceContextDataCallback";
213d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s: len=%u", func, data_len);
214d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mHalDataCallback) mHalDataCallback(data_len, p_data);
215d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
216d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
217d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
218d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
219d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    IoctlCallback
220d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
221d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Callback from HAL stub for IOCTL api invoked.
222d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              Output data for IOCTL is sent as argument
223d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
224d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     None.
225d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
226d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
227d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid IoctlCallback(hidl_vec<uint8_t> outputData) {
228d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  const char* func = "IoctlCallback";
229d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ese_nxp_ExtnOutputData_t* pOutData =
230d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna      (ese_nxp_ExtnOutputData_t*)&outputData[0];
231d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s Ioctl Type=%lu", func,
232d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna           (unsigned long)pOutData->ioctlType);
233d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  EseAdaptation* pAdaptation = (EseAdaptation*)pOutData->context;
234d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  /*Output Data from stub->Proxy is copied back to output data
235d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna   * This data will be sent back to libese*/
236d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  memcpy(&pAdaptation->mCurrentIoctlData->out, &outputData[0],
237d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna         sizeof(ese_nxp_ExtnOutputData_t));
238d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
239d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
240d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
241d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    EseAdaptation::HalIoctl
242d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
243d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: Calls ioctl to the Ese driver.
244d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              If called with a arg value of 0x01 than wired access requested,
245d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              status of the requst would be updated to p_data.
246d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              If called with a arg value of 0x00 than wired access will be
247d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              released, status of the requst would be updated to p_data.
248d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              If called with a arg value of 0x02 than current p61 state would
249d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*be
250d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**              updated to p_data.
251d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
252d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     -1 or 0.
253d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
254d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
255d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannaint EseAdaptation::HalIoctl(long arg, void* p_data) {
256d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  const char* func = "EseAdaptation::HalIoctl";
257d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  hidl_vec<uint8_t> data;
258d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  AutoThreadMutex a(sIoctlLock);
259d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ese_nxp_IoctlInOutData_t* pInpOutData = (ese_nxp_IoctlInOutData_t*)p_data;
260d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s arg=%ld", func, arg);
261d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pInpOutData->inp.context = &EseAdaptation::GetInstance();
262d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  EseAdaptation::GetInstance().mCurrentIoctlData = pInpOutData;
263d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  data.setToExternal((uint8_t*)pInpOutData, sizeof(ese_nxp_IoctlInOutData_t));
264d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  if (mHalNxpEse != nullptr) mHalNxpEse->ioctl(arg, data, IoctlCallback);
265d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  ALOGD_IF(nfc_debug_enabled, "%s Ioctl Completed for Type=%lu", func,
266d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna           (unsigned long)pInpOutData->out.ioctlType);
267d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  return (pInpOutData->out.result);
268d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
269d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
270d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
271d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
272d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadMutex::ThreadMutex()
273d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
274d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor
275d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
276d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
277d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
278d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
279d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex::ThreadMutex() {
280d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_mutexattr_t mutexAttr;
281d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
282d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_mutexattr_init(&mutexAttr);
283d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_mutex_init(&mMutex, &mutexAttr);
284d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_mutexattr_destroy(&mutexAttr);
285d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
286d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
287d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
288d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
289d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadMutex::~ThreadMutex()
290d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
291d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor
292d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
293d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
294d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
295d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
296d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadMutex::~ThreadMutex() { pthread_mutex_destroy(&mMutex); }
297d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
298d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
299d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
300d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadMutex::lock()
301d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
302d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: lock kthe mutex
303d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
304d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
305d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
306d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
307d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadMutex::lock() { pthread_mutex_lock(&mMutex); }
308d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
309d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
310d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
311d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadMutex::unblock()
312d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
313d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: unlock the mutex
314d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
315d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
316d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
317d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
318d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadMutex::unlock() { pthread_mutex_unlock(&mMutex); }
319d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
320d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
321d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
322d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadCondVar::ThreadCondVar()
323d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
324d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor
325d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
326d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
327d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
328d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
329d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar::ThreadCondVar() {
330d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_condattr_t CondAttr;
331d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
332d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_condattr_init(&CondAttr);
333d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_cond_init(&mCondVar, &CondAttr);
334d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
335d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_condattr_destroy(&CondAttr);
336d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
337d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
338d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
339d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
340d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadCondVar::~ThreadCondVar()
341d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
342d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor
343d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
344d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
345d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
346d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
347d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaThreadCondVar::~ThreadCondVar() { pthread_cond_destroy(&mCondVar); }
348d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
349d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
350d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
351d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadCondVar::wait()
352d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
353d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: wait on the mCondVar
354d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
355d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
356d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
357d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
358d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadCondVar::wait() {
359d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_cond_wait(&mCondVar, *this);
360d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_mutex_unlock(*this);
361d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
362d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
363d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
364d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
365d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    ThreadCondVar::signal()
366d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
367d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: signal the mCondVar
368d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
369d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
370d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
371d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
372d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khannavoid ThreadCondVar::signal() {
373d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  AutoThreadMutex a(*this);
374d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna  pthread_cond_signal(&mCondVar);
375d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna}
376d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
377d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
378d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
379d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    AutoThreadMutex::AutoThreadMutex()
380d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
381d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class constructor, automatically lock the mutex
382d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
383d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
384d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
385d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
386d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaAutoThreadMutex::AutoThreadMutex(ThreadMutex& m) : mm(m) { mm.lock(); }
387d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna
388d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna/*******************************************************************************
389d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
390d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Function:    AutoThreadMutex::~AutoThreadMutex()
391d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
392d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Description: class destructor, automatically unlock the mutex
393d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
394d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna** Returns:     none
395d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna**
396d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove Khanna*******************************************************************************/
397d5f65e1c5b5c40f2e45f585d5796c7fd53ccd87aLove KhannaAutoThreadMutex::~AutoThreadMutex() { mm.unlock(); }
398