CMcKMod.cpp revision 4e9e8c9c0169b40318386436d762c3d73cf4c328
14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @addtogroup MCD_MCDIMPL_DAEMON_KERNEL 24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{ 34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file 44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * MobiCore Driver Kernel Module Interface. 64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 --> 84e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without 104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions 114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met: 124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright 134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer. 144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright 154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer in the 164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * documentation and/or other materials provided with the distribution. 174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote 184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * products derived from this software without specific prior 194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * written permission. 204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <cstdlib> 344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <sys/mman.h> 364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <sys/ioctl.h> 374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <errno.h> 384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <inttypes.h> 394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <cstring> 404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "McTypes.h" 424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "mc_drv_module_api.h" 434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "mcVersionHelper.h" 444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CMcKMod.h" 464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define LOG_TAG "McDaemon" 484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "log.h" 494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin ParkMC_CHECK_VERSION(MCDRVMODULEAPI,0,1); 524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park// TODO: rename this to mapWsm 544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::mmap( 564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t len, 574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t *pHandle, 584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t *pVirtAddr, 594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t *pPhysAddr, 604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park bool *pMciReuse 614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("mmap(): len=%d, mci_reuse=%x", len, *pMciReuse); 664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // TODO: add type parameter to distinguish between non-freeing TCI, MCI and others 754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t virtAddr = ::mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, 764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park fdKMod, *pMciReuse ? MC_DRV_KMOD_MMAP_MCI 774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park : MC_DRV_KMOD_MMAP_WSM); 784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (MAP_FAILED == virtAddr) 794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("mmap() failed with errno: %d", errno); 814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_MAPPING_FAILED; 824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // mapping response data is in the buffer 864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park struct mc_mmap_resp *pMmapResp = (struct mc_mmap_resp *) virtAddr; 874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pMciReuse = pMmapResp->is_reused; 894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("mmap(): virtAddr=%p, handle=%d, phys_addr=%p, is_reused=%s", 914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park virtAddr, pMmapResp->handle, (addr_t) (pMmapResp->phys_addr), 924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park pMmapResp->is_reused ? "true" : "false"); 934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pVirtAddr) 954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pVirtAddr = virtAddr; 974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pHandle) 1004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pHandle = pMmapResp->handle; 1024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pPhysAddr) 1054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pPhysAddr = (addr_t) (pMmapResp->phys_addr); 1074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // clean memory 1104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park memset(pMmapResp, 0, sizeof(*pMmapResp)); 1114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 1134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 1154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 1164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 1194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::mapPersistent( 1204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t len, 1214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t *pHandle, 1224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t *pVirtAddr, 1234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t *pPhysAddr 1244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 1254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 1264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 1274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("mapPersistent(): len=%d", len); 1294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 1314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 1334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 1344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 1354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t virtAddr = ::mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, 1384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park fdKMod, MC_DRV_KMOD_MMAP_PERSISTENTWSM); 1394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (MAP_FAILED == virtAddr) 1414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("mmap() failed with errno: %d", errno); 1434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_MAPPING_FAILED; 1444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 1454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // mapping response data is in the buffer 1484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park struct mc_mmap_resp *pMmapResp = (struct mc_mmap_resp *) virtAddr; 1494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("mapPersistent(): virtAddr=%p, handle=%d, phys_addr=%p, is_reused=%s", 1514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park virtAddr, pMmapResp->handle, 1524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park (addr_t) (pMmapResp->phys_addr), 1534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park pMmapResp->is_reused ? "true" : "false"); 1544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pVirtAddr) 1564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pVirtAddr = virtAddr; 1584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pHandle) 1614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pHandle = pMmapResp->handle; 1634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pPhysAddr) 1664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pPhysAddr = (addr_t) (pMmapResp->phys_addr); 1684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // clean memory 1714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park memset(pMmapResp, 0, sizeof(*pMmapResp)); 1724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 1744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 1764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 1774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 1804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::read( 1814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t buffer, 1824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t len 1834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 1844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 1854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 1874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 1894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 1914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 1924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 1934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 1944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ::read(fdKMod, buffer, len); 1964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if(-1 == ret) 1974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 1984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("read() failed with errno: %d", errno); 1994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 2004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 2024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 2044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkbool CMcKMod::waitSSIQ( 2094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t *pCnt 2104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 2114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = true; 2124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 2144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t cnt; 2164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = read(&cnt, sizeof(cnt)); 2174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (sizeof(cnt) != ret) 2184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = false; 2204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 2214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pCnt) 2234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pCnt = cnt; 2254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 2264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 2284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 2304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::fcInit( 2354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t mciBuffer, 2364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t nqOffset, 2374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t nqLength, 2384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t mcpOffset, 2394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t mcpLength 2404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 2414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 2424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 2444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 2464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 2484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 2494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 2504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // Init MC with NQ and MCP buffer addresses 2524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park union mc_ioctl_init_params fcInitParams = { 2534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // C++ does not support C99 designated initializers 2544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .in = */{ 2554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .base = */(uint32_t) mciBuffer, 2564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .nq_offset = */nqOffset, 2574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .nq_length = */nqLength, 2584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .mcp_offset = */mcpOffset, 2594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .mcp_length = */mcpLength } }; 2604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_FC_INIT, &fcInitParams); 2614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (ret != 0) 2624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_FC_INIT failed with ret = %d and errno = %d", ret, errno); 2644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 2654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 2664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 2684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 2704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::fcInfo( 2754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t extInfoId, 2764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t *pState, 2774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t *pExtInfo 2784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 2794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 2804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 2824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 2844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 2864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 2874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 2884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 2894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // Init MC with NQ and MCP buffer addresses 2914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park union mc_ioctl_info_params fcInfoParams = { 2924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // C++ does not support C99 designated initializers 2934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .in = */{ 2944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .ext_info_id = */extInfoId } }; 2954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_FC_INFO, &fcInfoParams); 2964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (ret != 0) 2974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 2984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_FC_INFO failed with ret = %d and errno = %d", ret, errno); 2994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 3004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pState) 3034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pState = fcInfoParams.out.state; 3054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pExtInfo) 3084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pExtInfo = fcInfoParams.out.ext_info; 3104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 3134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 3154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 3164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 3194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::fcYield( 3204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 3214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 3224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 3234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 3254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 3274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 3294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 3304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 3314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_FC_YIELD, NULL); 3344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (ret != 0) 3354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_FC_YIELD failed with ret = %d and errno = %d", ret, errno); 3374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 3384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 3414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 3434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 3444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 3474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::fcNSIQ( 3484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 3494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 3504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 3514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 3534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 3554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 3574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 3584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 3594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_FC_NSIQ, NULL); 3624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (ret != 0) 3634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_FC_NSIQ failed with ret = %d and errno = %d", ret, errno); 3654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 3664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 3694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 3714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 3724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 3754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::free( 3764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t handle 3774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 3784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 3794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 3814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("free(): handle=%d", handle); 3834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 3854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 3874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 3884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 3894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 3904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park union mc_ioctl_free_params freeParams = { 3924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // C++ does not support c99 designated initializers 3934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .in = */{ 3944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .handle = */(uint32_t) handle } }; 3954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_FREE, &freeParams); 3974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (0 != ret) 3984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 3994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_FREE failed with ret = %d and errno = %d", ret, errno); 4004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 4014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 4044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 4064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 4074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 4104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::registerWsmL2( 4114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t buffer, 4124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t len, 4134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t pid, 4144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t *pHandle, 4154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t *pPhysWsmL2 4164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 4174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 4184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 4204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("registerWsmL2(): buffer=%p, len=%d, pid=%d", buffer, len, pid); 4224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 4244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 4264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 4274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 4284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park union mc_ioctl_app_reg_wsm_l2_params params = { 4314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // C++ does not support C99 designated initializers 4324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .in = */{ 4334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .buffer = */(uint32_t) buffer, 4344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .len = */len, 4354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .pid = */pid } }; 4364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_APP_REGISTER_WSM_L2, ¶ms); 4384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (0 != ret) 4394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_APP_REGISTER_WSM_L2 failed with ret = %d and errno = %d", ret, errno); 4414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 4424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("WSM L2 phys=%x, handle=%d", params.out.phys_wsm_l2_table, 4454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park params.out.handle); 4464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pHandle) 4484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pHandle = params.out.handle; 4504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (NULL != pPhysWsmL2) 4534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *pPhysWsmL2 = (addr_t) params.out.phys_wsm_l2_table; 4554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 4584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 4604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 4614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 4644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::unregisterWsmL2( 4654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t handle 4664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 4674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 4684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 4704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("unregisterWsmL2(): handle=%d", handle); 4724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 4744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4754e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 4764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ERROR_KMOD_NOT_OPEN; 4774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 4784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4794e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park struct mc_ioctl_app_unreg_wsm_l2_params params = { 4814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // C++ does not support c99 designated initializers 4824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .in = */{ 4834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /* .handle = */handle } }; 4844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_APP_UNREGISTER_WSM_L2, ¶ms); 4864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (0 != ret) 4874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 4884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_APP_UNREGISTER_WSM_L2 failed with ret = %d and errno = %d", ret, errno); 4894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 4904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 4914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 4934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 4954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 4964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4974e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 4984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::fcExecute( 4994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park addr_t startAddr, 5004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park uint32_t areaLength 5014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 5024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ret = 0; 5034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park union mc_ioctl_fc_execute_params params = { 5044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /*.in =*/ { 5054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /*.phys_start_addr = */ (uint32_t)startAddr, 5064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /*.length = */ areaLength 5074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 5084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park }; 5094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 5104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 5114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 5124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 5134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 5144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 5154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 5164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_FC_EXECUTE, ¶ms); 5184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (ret != 0) 5194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 5204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_FC_EXECUTE failed with ret = %d and errno = %d", ret, errno); 5214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 5224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 5234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while(0); 5254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 5274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 5284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 5294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkbool CMcKMod::checkKmodVersionOk( 5304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park void 5314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park) { 5324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park bool ret = false; 5334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park do 5354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 5364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!isOpen()) 5374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 5384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("no connection to kmod"); 5394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 5404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 5414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park struct mc_ioctl_get_version_params params; 5434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park int ioret = ioctl(fdKMod, MC_DRV_KMOD_IOCTL_GET_VERSION, ¶ms); 5454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (0 != ioret) 5464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park { 5474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("IOCTL_GET_VERSION failed with ret = %d and errno = %d", ret, errno); 5484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 5494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 5504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park // Run-time check. 5524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park char* errmsg; 5534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park if (!checkVersionOkMCDRVMODULEAPI(params.out.kernel_module_version, &errmsg)) { 5544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_E("%s", errmsg); 5554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park break; 5564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } 5574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park LOG_I("%s", errmsg); 5584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ret = true; 5604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park } while (0); 5624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park return ret; 5644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 5654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */ 567