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, &params);
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, &params);
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, &params);
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, &params);
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