18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without 48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are 58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met: 68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions of source code must retain the above copyright 78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * notice, this list of conditions and the following disclaimer. 88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions in binary form must reproduce the above 98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * copyright notice, this list of conditions and the following 108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * disclaimer in the documentation and/or other materials provided 118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * with the distribution. 128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Neither the name of The Linux Foundation, nor the names of its 138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * contributors may be used to endorse or promote products derived 148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * from this software without specific prior written permission. 158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */ 288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===================================================================== 308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam INCLUDE FILES FOR MODULE 328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam======================================================================*/ 348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdio.h> 358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <pthread.h> 368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <errno.h> 378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <string.h> 388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/select.h> 398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/time.h> 408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/types.h> 418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/stat.h> 428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <fcntl.h> 438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/mman.h> 448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <unistd.h> 458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdlib.h> 468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <assert.h> 478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_api_log.h> 488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <rpc/rpc.h> 508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Include RPC headers */ 528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "rpc_inc/loc_api_rpc_glue.h" 538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Callback init */ 558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "rpc_inc/loc_apicb_appinit.h" 568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Logging */ 588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_TAG "LocSvc_api_rpc_glue" 598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_NDDEBUG 0 608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#ifndef USE_GLIB 618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <utils/Log.h> 628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#endif /* USE_GLIB */ 638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Logging Improvement */ 658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "log_util.h" 668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h" 678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*Maximum number of Modem init*/ 688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_TRY_NUM 10 698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*Maximum number of Modem init*/ 718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_TRY_NUM 10 728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Uncomment to force ALOGD messages */ 748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam// #define ALOGD ALOGI 758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===================================================================== 778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam External declarations 788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam======================================================================*/ 798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 808c2d3d5afc51d3f35150f748f263870367771b6fEd TamCLIENT* loc_api_clnt = NULL; 818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Callback ID and pointer */ 838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOC_API_CB_MAX_CLIENTS 16 848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamtypedef struct 858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam uint32 cb_id; /* same as rpc/types.h */ 878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_event_cb_f_type *cb_func; /* callback func */ 888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_reset_notif_cb_f_type *rpc_cb; /* callback from RPC */ 898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type handle; /* stores handle for client closing */ 908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam void* user; /* user's own data handle */ 918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} loc_glue_cb_entry_s_type; 928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 938c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_glue_cb_entry_s_type loc_glue_callback_table[LOC_API_CB_MAX_CLIENTS]; 948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_FUNC_VERSION_BASE(a,b) a ## b 968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b) 978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) a ## v ## b 998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_CALLBACK_FUNC_VERSION(a,v,b) RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) 1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOC_GLUE_CHECK_INIT(ret_type) \ 1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (loc_api_clnt == NULL) { EXIT_LOG_CALLFLOW(%d, RPC_LOC_API_RPC_FAILURE); return (ret_type) RPC_LOC_API_RPC_FAILURE; } 1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \ 1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (stat != RPC_SUCCESS) { \ 1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s:%d] failure code %d", __func__, __LINE__, stat); \ 1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return (ret_type)((stat == RPC_SUBSYSTEM_RESTART) ? \ 1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam RPC_LOC_API_RPC_MODEM_RESTART : RPC_LOC_API_RPC_FAILURE); \ 1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Callback functions */ 1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Returns 1 if successful */ 1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tambool_t rpc_loc_event_cb_f_type_svc( 1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_event_cb_f_type_args *argp, 1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_event_cb_f_type_rets *ret, 1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam struct svc_req *req) 1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // The lower word of cd_id is the index 1198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int index = argp->cb_id & 0xFFFF; 1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Callback not registered, or unexpected ID (shouldn't happen) */ 1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (index >= LOC_API_CB_MAX_CLIENTS || loc_glue_callback_table[index].cb_func == NULL) 1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("Warning: No callback handler %d.\n", index); 1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret->loc_event_cb_f_type_result = 0; 1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 1; /* simply return */ 1278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGV("proc: %x prog: %x vers: %x\n", 1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int) req->rq_proc, 1318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int) req->rq_prog, 1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int) req->rq_vers); 1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGV("Callback received: %x (cb_id=%p handle=%d ret_ptr=%d)\n", 1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int) argp->loc_event, 1368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam argp->cb_id, 1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int) argp->loc_handle, 1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int) ret); 1398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Forward callback to real callback procedure */ 1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type loc_handle = argp->loc_handle; 1428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_event_mask_type loc_event = argp->loc_event; 1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam const rpc_loc_event_payload_u_type* loc_event_payload = 1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (const rpc_loc_event_payload_u_type*) argp->loc_event_payload; 1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Gives control to synchronous call handler */ 1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_api_callback_process_sync_call(loc_handle, loc_event, loc_event_payload); 1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int32 rc = (loc_glue_callback_table[index].cb_func)(loc_glue_callback_table[index].user, 1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_handle, loc_event, loc_event_payload); 1518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGV("cb_func=%p", loc_glue_callback_table[index].cb_func); 1538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret->loc_event_cb_f_type_result = rc; 1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 1; /* ok */ 1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 1608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam xdr_free (xdr_result, result); 1628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* 1648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Insert additional freeing code here, if needed 1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */ 1668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // LOC_LOGD("***** loc_apicbprog_freeresult\n"); 1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 1; 1698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1738c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION rpc_loc_event_cb_f_type_<version>_svc (MACRO) 1748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1758c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Callback function for Loc API 1778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1788c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 1798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1 for success 1808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0 for failure 1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 1838c2d3d5afc51d3f35150f748f263870367771b6fEd Tambool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_event_cb_f_type_, RPC_LOC_EVENT_CB_F_TYPE_VERSION, _svc) ( 1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_event_cb_f_type_args *argp, 1858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_event_cb_f_type_rets *ret, 1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam struct svc_req *req) 1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return rpc_loc_event_cb_f_type_svc(argp, ret, req); 1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1938c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_apicbprog_<version>_freeresult (MACRO) 1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1958c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 1968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Free up RPC data structure 1978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1988c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 1998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1 for success 2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0 for failure 2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define VERSION_CONCAT(MAJOR,MINOR) MAJOR##MINOR 2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define loc_apicb_prog_VER_freeresult(M,N) \ 2058c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint RPC_CALLBACK_FUNC_VERSION(loc_apicbprog_, VERSION_CONCAT(M,N), _freeresult) \ 2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) \ 2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ \ 2088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return loc_apicbprog_freeresult(transp, xdr_result, result); \ 2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Define all of the possible minors */ 2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0001); 2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0002); 2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0003); 2158c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0004); 2168c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0005); 2178c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0006); 2188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2218c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION rpc_loc_api_cb_null_<version>_svc (MACRO) [Patch for wrong RPCGEN stubs] 2228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2238c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 2248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Null callback function for Loc API 2258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2268c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 2278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1 for success 2288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 2308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define rpc_loc_api_cb_null_VER_svc(M,N) \ 2318c2d3d5afc51d3f35150f748f263870367771b6fEd Tambool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_api_cb_null_, VERSION_CONCAT(M,N), _svc) ( \ 2328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam void *a, int *b, struct svc_req *req) \ 2338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ \ 2348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 1; \ 2358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Define all of the possible minors */ 2388c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0001); 2398c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0002); 2408c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0003); 2418c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0004); 2428c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0005); 2438c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0006); 2448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2458c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic void loc_api_glue_rpc_cb(CLIENT* client, enum rpc_reset_event event) 2468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int i; 2488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) { 2498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (NULL != loc_glue_callback_table[i].rpc_cb) { 2508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].rpc_cb(loc_glue_callback_table[i].user, client, event); 2518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2578c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_api_glue_init 2588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2598c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 2608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam Initiates the RPC client 2618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2628c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 2638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1 for success 2648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 0 for failure 2658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 2678c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_api_glue_init(void) 2688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (loc_api_clnt == NULL) 2708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Initialize data */ 2728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int i; 2738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int pid = getpid(); 2748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) 2758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].cb_id = i | (pid << 16); 2778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].cb_func = NULL; 2788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].handle = -1; 2798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].rpc_cb = NULL; 2808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].user = NULL; 2818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Print msg */ 2848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGV("Trying to create RPC client...\n"); 2858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL); 2868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGV("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt); 2878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (loc_api_clnt == NULL) 2898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("Error: cannot create RPC client.\n"); 2918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 0; 2928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Init RPC callbacks */ 2958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_api_sync_call_init(); 2968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int rc = loc_apicb_app_init(); 2988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (rc >= 0) 2998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("Loc API RPC client initialized.\n"); 3018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam clnt_register_reset_notification_cb(loc_api_clnt, loc_api_glue_rpc_cb); 3028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam else { 3048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("Loc API callback initialization failed.\n"); 3058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 0; 3068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return 1; 3108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 3118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3128c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_client_handle_type loc_open ( 3138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_event_mask_type event_reg_mask, 3148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_event_cb_f_type *event_callback, 3158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_reset_notif_cb_f_type *rpc_cb, 3168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam void* userData 3178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam) 3188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 3198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int try_num = RPC_TRY_NUM; 3208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ENTRY_LOG(); 3218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type); 3228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type ret_val; 3248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_open_args args; 3268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.event_reg_mask = event_reg_mask; 3278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int i, j = LOC_API_CB_MAX_CLIENTS; 3298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) 3308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (loc_glue_callback_table[i].user == userData) 3328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGW("Client already opened service (callback=%p)...\n", 3348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam event_callback); 3358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 3368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } else if (j == LOC_API_CB_MAX_CLIENTS && 3378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].user == NULL) { 3388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam j = i; 3398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (i == LOC_API_CB_MAX_CLIENTS) 3438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam i = j; 3458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (i == LOC_API_CB_MAX_CLIENTS) 3488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("Too many clients opened at once...\n"); 3508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return RPC_LOC_CLIENT_HANDLE_INVALID; 3518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].cb_func = event_callback; 3548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].rpc_cb = rpc_cb; 3558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].user = userData; 3568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.event_callback = loc_glue_callback_table[i].cb_id; 3588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGV("cb_id=%d, func=0x%x", i, (unsigned int) event_callback); 3598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_open_rets rets; 3618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam enum clnt_stat stat = RPC_SUCCESS; 3628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam EXIT_LOG_CALLFLOW(%s, "loc client open"); 3648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /*try more for rpc_loc_open_xx()*/ 3668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam do 3688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 3698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt); 3708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret_val = (rpc_loc_client_handle_type) rets.loc_open_result; 3718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam try_num--; 3728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam }while( (RPC_SUCCESS != stat||0 > ret_val) && 0 != try_num ); 3748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_RESULT(stat, int32); 3768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* save the handle in the table */ 3788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].handle = (rpc_loc_client_handle_type) rets.loc_open_result; 3798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret_val; 3818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 3838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_close 3858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam( 3868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type handle 3878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam) 3888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 3898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ENTRY_LOG(); 3908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_INIT(int32); 3918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int32 ret_val; 3938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_close_args args; 3958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.handle = handle; 3968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_close_rets rets; 3988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam enum clnt_stat stat = RPC_SUCCESS; 3998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam EXIT_LOG_CALLFLOW(%s, "loc client close"); 4018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam stat = RPC_FUNC_VERSION(rpc_loc_close_, RPC_LOC_CLOSE_VERSION)(&args, &rets, loc_api_clnt); 4028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_clear(handle); 4048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_RESULT(stat, int32); 4068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret_val = (int32) rets.loc_close_result; 4078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret_val; 4098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 4108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4118c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_clear(rpc_loc_client_handle_type handle) { 4128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Clean the client's callback function in callback table */ 4138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int i; 4148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) 4158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 4168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (loc_glue_callback_table[i].handle == handle) 4178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 4188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Found the client */ 4198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].cb_func = NULL; 4208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].rpc_cb = NULL; 4218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].handle = -1; 4228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_glue_callback_table[i].user = NULL; 4238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 4248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 4258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 4268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (i == LOC_API_CB_MAX_CLIENTS) 4288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 4298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGW("Handle not found (handle=%d)...\n", (int) handle); 4308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 4318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 4328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4338c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_start_fix 4348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam( 4358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type handle 4368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam) 4378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 4388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ENTRY_LOG(); 4398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_INIT(int32); 4408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int32 ret_val; 4428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_start_fix_args args; 4448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.handle = handle; 4458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_start_fix_rets rets; 4478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam enum clnt_stat stat = RPC_SUCCESS; 4488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam EXIT_LOG_CALLFLOW(%s, "loc start fix"); 4508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, RPC_LOC_START_FIX_VERSION)(&args, &rets, loc_api_clnt); 4518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_RESULT(stat, int32); 4528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret_val = (int32) rets.loc_start_fix_result; 4548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret_val; 4568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 4578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4588c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_stop_fix 4598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam( 4608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type handle 4618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam) 4628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 4638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ENTRY_LOG(); 4648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_INIT(int32); 4658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int32 ret_val; 4678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_stop_fix_args args; 4698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.handle = handle; 4708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_stop_fix_rets rets; 4728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam enum clnt_stat stat = RPC_SUCCESS; 4738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam EXIT_LOG_CALLFLOW(%s, "loc stop fix"); 4758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, RPC_LOC_STOP_FIX_VERSION)(&args, &rets, loc_api_clnt); 4768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_RESULT(stat, int32); 4778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret_val = (int32) rets.loc_stop_fix_result; 4798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret_val; 4818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 4828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4838c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_ioctl 4848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam( 4858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type handle, 4868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_e_type ioctl_type, 4878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_data_u_type* ioctl_data 4888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam) 4898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 4908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ENTRY_LOG(); 4918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_INIT(int32); 4928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int32 ret_val; 4948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 4958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_args args; 4968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.handle = handle; 4978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.ioctl_data = ioctl_data; 4988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.ioctl_type = ioctl_type; 4998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (ioctl_data != NULL) 5008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 5018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Assign ioctl union discriminator */ 5028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ioctl_data->disc = ioctl_type; 5038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* In case the user hasn't filled in other disc fields, 5058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam automatically fill them in here */ 5068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam switch (ioctl_type) 5078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 5088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_API_VERSION: 5098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_FIX_CRITERIA: 5118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_FIX_CRITERIA: 5138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE: 5158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA: 5178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY: 5198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE: 5218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD: 5238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INJECT_UTC_TIME: 5258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INJECT_RTC_VALUE: 5278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INJECT_POSITION: 5298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_QUERY_ENGINE_STATE: 5318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS: 5338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS: 5358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_ENGINE_LOCK: 5378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_ENGINE_LOCK: 5398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_SBAS_CONFIG: 5418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_SBAS_CONFIG: 5438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_NMEA_TYPES: 5458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_NMEA_TYPES: 5478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR: 5498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR: 5508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR: 5518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR: 5528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc = 5538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type; 5548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR: 5568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR: 5578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR: 5588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR: 5598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM: 5618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM: 5638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam case RPC_LOC_IOCTL_DELETE_ASSIST_DATA: 5658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam default: 5678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam break; 5688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } /* switch */ 5698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } /* ioctl_data != NULL */ 5708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_rets rets; 5728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam enum clnt_stat stat = RPC_SUCCESS; 5738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam EXIT_LOG_CALLFLOW(%s, loc_get_ioctl_type_name(ioctl_type)); 5758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, RPC_LOC_IOCTL_VERSION)(&args, &rets, loc_api_clnt); 5768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_RESULT(stat, int32); 5778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret_val = (int32) rets.loc_ioctl_result; 5798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret_val; 5818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 5828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Returns 0 if error */ 5848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_api_null(void) 5858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 5868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_INIT(int32); 5878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int32 rets; 5898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam enum clnt_stat stat = RPC_SUCCESS; 5908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam clnt_unregister_reset_notification_cb(loc_api_clnt); 5928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam stat = RPC_FUNC_VERSION(rpc_loc_api_null_, RPC_LOC_API_NULL_VERSION)(NULL, &rets, loc_api_clnt); 5938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_GLUE_CHECK_RESULT(stat, int32); 5948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return (int32) rets; 5968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 5978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 5988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 5998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6008c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_eng_ioctl 6018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6028c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION 6038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam This function calls loc_ioctl and waits for the callback result before 6048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam returning back to the user. 6058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6068c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES 6078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 6088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6098c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE 6108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam TRUE if successful 6118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FALSE if failed 6128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6138c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS 6148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam N/A 6158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/ 6178c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_ioctl 6188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam( 6198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_client_handle_type handle, 6208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_e_type ioctl_type, 6218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_data_u_type* ioctl_data_ptr, 6228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam uint32 timeout_msec, 6238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam rpc_loc_ioctl_callback_s_type *cb_data_ptr 6248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam) 6258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 6268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam int ret_val = RPC_LOC_API_SUCCESS; 6278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ret_val = loc_api_sync_ioctl(handle, ioctl_type, ioctl_data_ptr, timeout_msec, cb_data_ptr); 6298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("loc_eng_ioctl result: client = %d, ioctl_type = %s, returt %s\n", 6318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam (int32) handle, 6328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_get_ioctl_type_name(ioctl_type), 6338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam loc_get_ioctl_status_name(ret_val) ); 6348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 6358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return ret_val; 6368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 637