621 lines
18 KiB
C
621 lines
18 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2016 MediaTek Inc.
|
|
*/
|
|
|
|
#ifdef CONFIG_MTK_SIM_LOCK_POWER_ON_WRITE_PROTECT
|
|
/* #include <mt-plat/env.h> Fix me, header file not found */
|
|
#endif
|
|
#include <linux/platform_device.h>
|
|
#include <linux/device.h>
|
|
#include <linux/module.h>
|
|
#include <linux/interrupt.h>
|
|
#ifdef CONFIG_OF
|
|
#include <linux/of.h>
|
|
#include <linux/of_fdt.h>
|
|
#include <linux/of_irq.h>
|
|
#include <linux/of_address.h>
|
|
#endif
|
|
|
|
#include "ccci_auxadc.h"
|
|
#include "ccci_fsm_internal.h"
|
|
#include "ccci_platform.h"
|
|
#include "modem_sys.h"
|
|
#include "md_sys1_platform.h"
|
|
|
|
signed int __weak battery_get_bat_voltage(void)
|
|
{
|
|
pr_debug("[ccci/dummy] %s is not supported!\n", __func__);
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CCCI_KMODULE_ENABLE
|
|
int switch_sim_mode(int id, char *buf, unsigned int len)
|
|
{
|
|
pr_debug("[ccci/dummy] %s is not supported!\n", __func__);
|
|
return 0;
|
|
}
|
|
|
|
unsigned int get_sim_switch_type(void)
|
|
{
|
|
pr_debug("[ccci/dummy] %s is not supported!\n", __func__);
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
static int fsm_md_data_ioctl(int md_id, unsigned int cmd, unsigned long arg)
|
|
{
|
|
int ret = 0, retry = 0;
|
|
int data = 0;
|
|
char buffer[64] = {0};
|
|
unsigned int sim_slot_cfg[4] = {0};
|
|
char ap_platform[5] = {0};
|
|
int md_gen = 0;
|
|
struct device_node *node = NULL;
|
|
struct ccci_per_md *per_md_data = ccci_get_per_md_data(md_id);
|
|
struct ccci_per_md *other_per_md_data
|
|
= ccci_get_per_md_data(GET_OTHER_MD_ID(md_id));
|
|
|
|
node = of_find_compatible_node(NULL, NULL,
|
|
"mediatek,mddriver");
|
|
of_property_read_u32(node,
|
|
"mediatek,md_generation", &md_gen);
|
|
|
|
switch (cmd) {
|
|
case CCCI_IOC_GET_MD_PROTOCOL_TYPE:
|
|
|
|
|
|
#if (MD_GENERATION < 6292)
|
|
if (copy_to_user((void __user *)arg, "DHL", sizeof("DHL"))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_MD_PROTOCOL_TYPE: copy_from_user fail\n");
|
|
return -EFAULT;
|
|
}
|
|
#else
|
|
/*fix me :The buffer is not used in and can be deleted*/
|
|
ret = snprintf(buffer, sizeof(buffer), "%d", MD_GENERATION);
|
|
if (ret < 0 || ret >= sizeof(buffer)) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"%s-%d:snprintf fail,ret = %d\n", __func__, __LINE__, ret);
|
|
ret = -EFAULT;
|
|
}
|
|
ret = 0;
|
|
// snprintf(buffer, sizeof(buffer), "%d",md_gen);
|
|
|
|
snprintf((void *)ap_platform, sizeof(ap_platform), "%d", md_gen);
|
|
if (copy_to_user((void __user *)arg,
|
|
ap_platform, sizeof(ap_platform))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_MD_PROTOCOL_TYPE: copy_from_user fail\n");
|
|
return -EFAULT;
|
|
}
|
|
#endif
|
|
break;
|
|
case CCCI_IOC_SEND_BATTERY_INFO:
|
|
data = (int)battery_get_bat_voltage();
|
|
CCCI_NORMAL_LOG(md_id, FSM, "get bat voltage %d\n", data);
|
|
ret = ccci_port_send_msg_to_md(md_id, CCCI_SYSTEM_TX,
|
|
MD_GET_BATTERY_INFO, data, 1);
|
|
break;
|
|
case CCCI_IOC_GET_EXT_MD_POST_FIX:
|
|
if (copy_to_user((void __user *)arg,
|
|
per_md_data->img_post_fix, IMG_POSTFIX_LEN)) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_EXT_MD_POST_FIX: copy_to_user fail\n");
|
|
ret = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
case CCCI_IOC_DL_TRAFFIC_CONTROL:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int)))
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_DL_TRAFFIC_CONTROL: copy_from_user fail\n");
|
|
if (data == 1)
|
|
;/* turn off downlink queue */
|
|
else if (data == 0)
|
|
;/* turn on donwlink queue */
|
|
else
|
|
;
|
|
ret = 0;
|
|
break;
|
|
#ifdef CONFIG_MTK_SIM_LOCK_POWER_ON_WRITE_PROTECT
|
|
#ifdef ENABLE_SIM_LOCK_RANDOM
|
|
case CCCI_IOC_SIM_LOCK_RANDOM_PATTERN: /* Fix me */
|
|
if (copy_from_user(&val, (void __user *)arg,
|
|
sizeof(unsigned int)))
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_SIM_LOCK_RANDOM_PATTERN: copy_from_user fail\n");
|
|
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"get SIM lock random pattern %x\n", data);
|
|
|
|
ret = snprintf(buffer, sizeof(buffer), "%x", data);
|
|
if (ret < 0 || ret >= sizeof(buffer)) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"%s-%d:snprintf fail,ret = %d\n", __func__, __LINE__, ret);
|
|
ret = -EFAULT;
|
|
break;
|
|
}
|
|
ret = 0;
|
|
set_env("sml_sync", buffer);
|
|
break;
|
|
#endif
|
|
#endif
|
|
case CCCI_IOC_SET_MD_BOOT_MODE:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_SET_MD_BOOT_MODE: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"set MD boot mode to %d\n", data);
|
|
per_md_data->md_boot_mode = data;
|
|
if (other_per_md_data)
|
|
other_per_md_data->md_boot_mode = data;
|
|
}
|
|
break;
|
|
case CCCI_IOC_GET_MD_BOOT_MODE:
|
|
ret = put_user((unsigned int)per_md_data->md_boot_mode,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_GET_MD_INFO:
|
|
ret = put_user(
|
|
(unsigned int)per_md_data->img_info[IMG_MD].img_info.version,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_SET_BOOT_DATA:
|
|
if (copy_from_user(&per_md_data->md_boot_data,
|
|
(void __user *)arg,
|
|
sizeof(per_md_data->md_boot_data))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_SET_BOOT_DATA: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
if (per_md_data->md_boot_data[MD_CFG_DUMP_FLAG]
|
|
!= MD_DBG_DUMP_INVALID
|
|
&&
|
|
(per_md_data->md_boot_data[MD_CFG_DUMP_FLAG]
|
|
& 1 << MD_DBG_DUMP_PORT)) {
|
|
/*port traffic use 0x6000_000x
|
|
* as port dump flag
|
|
*/
|
|
ccci_port_set_traffic_flag(md_id,
|
|
per_md_data->md_boot_data[MD_CFG_DUMP_FLAG]);
|
|
per_md_data->md_boot_data[MD_CFG_DUMP_FLAG]
|
|
= MD_DBG_DUMP_INVALID;
|
|
}
|
|
ret = ccci_md_set_boot_data(md_id,
|
|
per_md_data->md_boot_data,
|
|
ARRAY_SIZE(per_md_data->md_boot_data));
|
|
if (ret < 0) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"ccci_set_md_boot_data return fail %d\n",
|
|
ret);
|
|
ret = -EFAULT;
|
|
}
|
|
}
|
|
break;
|
|
case CCCI_IOC_SIM_SWITCH:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_SIM_SWITCH: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
switch_sim_mode(md_id, (char *)&data, sizeof(data));
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_SIM_SWITCH(%x): %d\n", data, ret);
|
|
}
|
|
break;
|
|
case CCCI_IOC_SIM_SWITCH_TYPE:
|
|
data = get_sim_switch_type();
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_SIM_SWITCH_TYPE: 0x%x\n", data);
|
|
ret = put_user(data, (unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_GET_SIM_TYPE:
|
|
if (per_md_data->sim_type == 0xEEEEEEEE)
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"md has not send sim type yet(0x%x)",
|
|
per_md_data->sim_type);
|
|
else
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"md has send sim type(0x%x)",
|
|
per_md_data->sim_type);
|
|
ret = put_user(per_md_data->sim_type,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_ENABLE_GET_SIM_TYPE:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_ENABLE_GET_SIM_TYPE: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_ENABLE_GET_SIM_TYPE: 0x%x\n", data);
|
|
ret = ccci_port_send_msg_to_md(md_id,
|
|
CCCI_SYSTEM_TX, MD_SIM_TYPE, data, 1);
|
|
}
|
|
break;
|
|
case CCCI_IOC_RELOAD_MD_TYPE:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_RELOAD_MD_TYPE: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
ret = set_soc_md_rt_rat_by_idx(md_id, (unsigned int)data);
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_RELOAD_MD_TYPE: %d ret:%d\n", data, ret);
|
|
}
|
|
break;
|
|
case CCCI_IOC_SET_MD_IMG_EXIST:
|
|
if (copy_from_user(&per_md_data->md_img_exist,
|
|
(void __user *)arg,
|
|
sizeof(per_md_data->md_img_exist))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_SET_MD_IMG_EXIST: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
}
|
|
per_md_data->md_img_type_is_set = 1;
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_SET_MD_IMG_EXIST: set done!\n");
|
|
break;
|
|
case CCCI_IOC_GET_MD_IMG_EXIST:
|
|
data = get_md_img_type(md_id);
|
|
if (data) {
|
|
memset(&per_md_data->md_img_exist, 0,
|
|
sizeof(per_md_data->md_img_exist));
|
|
per_md_data->md_img_exist[0] = data;
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"LK md_type: %d, image num:1\n", data);
|
|
} else {
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_MD_IMG_EXIST: waiting set\n");
|
|
while (per_md_data->md_img_type_is_set == 0)
|
|
msleep(200);
|
|
}
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_MD_IMG_EXIST: waiting set done!\n");
|
|
if (copy_to_user((void __user *)arg,
|
|
&per_md_data->md_img_exist,
|
|
sizeof(per_md_data->md_img_exist))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_MD_IMG_EXIST: copy_to_user fail!\n");
|
|
ret = -EFAULT;
|
|
}
|
|
break;
|
|
case CCCI_IOC_GET_MD_TYPE:
|
|
data = get_md_img_type(md_id);
|
|
if (!data)
|
|
data = 3; //MT6580 using this
|
|
else {
|
|
retry = 6000;
|
|
do {
|
|
data = get_soc_md_rt_rat_idx(md_id);
|
|
if (data)
|
|
break;
|
|
msleep(50);
|
|
retry--;
|
|
} while (retry);
|
|
}
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_MD_TYPE: %d!\n", data);
|
|
ret = put_user((unsigned int)data,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_STORE_MD_TYPE:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"CCCI_IOC_STORE_MD_TYPE: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
break;
|
|
}
|
|
per_md_data->config.load_type_saving = data;
|
|
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"storing md type(%d) in kernel space!\n",
|
|
per_md_data->config.load_type_saving);
|
|
if (per_md_data->config.load_type_saving >= 1
|
|
&& per_md_data->config.load_type_saving
|
|
<= MAX_IMG_NUM) {
|
|
if (per_md_data->config.load_type_saving
|
|
!= per_md_data->config.load_type)
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"Maybe Wrong: md type storing not equal with current setting!(%d %d)\n",
|
|
per_md_data->config.load_type_saving,
|
|
per_md_data->config.load_type);
|
|
} else {
|
|
CCCI_BOOTUP_LOG(md_id, FSM,
|
|
"store md type fail: invalid md type(0x%x)\n",
|
|
per_md_data->config.load_type_saving);
|
|
ret = -EFAULT;
|
|
}
|
|
if (ret == 0)
|
|
fsm_monitor_send_message(md_id,
|
|
CCCI_MD_MSG_STORE_NVRAM_MD_TYPE, 0);
|
|
break;
|
|
case CCCI_IOC_GET_MD_TYPE_SAVING:
|
|
ret = put_user(per_md_data->config.load_type_saving,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_SEND_ICUSB_NOTIFY:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_SEND_ICUSB_NOTIFY: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
ret = ccci_port_send_msg_to_md(md_id,
|
|
CCCI_SYSTEM_TX, MD_ICUSB_NOTIFY, data, 1);
|
|
}
|
|
break;
|
|
case CCCI_IOC_UPDATE_SIM_SLOT_CFG:
|
|
if (copy_from_user(&sim_slot_cfg, (void __user *)arg,
|
|
sizeof(sim_slot_cfg))) {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_UPDATE_SIM_SLOT_CFG: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
int need_update;
|
|
|
|
data = get_sim_switch_type();
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_UPDATE_SIM_SLOT_CFG get s0:%d s1:%d s2:%d s3:%d\n",
|
|
sim_slot_cfg[0], sim_slot_cfg[1],
|
|
sim_slot_cfg[2], sim_slot_cfg[3]);
|
|
need_update = sim_slot_cfg[0];
|
|
per_md_data->sim_setting.sim_mode = sim_slot_cfg[1];
|
|
per_md_data->sim_setting.slot1_mode = sim_slot_cfg[2];
|
|
per_md_data->sim_setting.slot2_mode = sim_slot_cfg[3];
|
|
data = (((unsigned int)data << 16)
|
|
| per_md_data->sim_setting.sim_mode);
|
|
switch_sim_mode(md_id, (char *)&data, sizeof(data));
|
|
fsm_monitor_send_message(md_id,
|
|
CCCI_MD_MSG_CFG_UPDATE, need_update);
|
|
ret = 0;
|
|
}
|
|
break;
|
|
case CCCI_IOC_STORE_SIM_MODE:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_STORE_SIM_MODE: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
break;
|
|
}
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"store sim mode(%x) in kernel space!\n", data);
|
|
if (per_md_data->sim_setting.sim_mode != data) {
|
|
per_md_data->sim_setting.sim_mode = data;
|
|
fsm_monitor_send_message(md_id,
|
|
CCCI_MD_MSG_CFG_UPDATE, 1);
|
|
} else {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"same sim mode as last time(0x%x)\n", data);
|
|
}
|
|
break;
|
|
case CCCI_IOC_GET_SIM_MODE:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"get sim mode ioctl called by %s\n", current->comm);
|
|
ret = put_user(per_md_data->sim_setting.sim_mode,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_GET_CFG_SETTING:
|
|
if (copy_to_user((void __user *)arg,
|
|
&per_md_data->sim_setting,
|
|
sizeof(struct ccci_sim_setting))) {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"CCCI_IOC_GET_CFG_SETTING: copy_to_user fail\n");
|
|
ret = -EFAULT;
|
|
}
|
|
break;
|
|
case CCCI_IOC_GET_AT_CH_NUM:
|
|
{
|
|
unsigned int at_ch_num = 4; /*default value*/
|
|
struct ccci_runtime_feature *rt_feature = NULL;
|
|
|
|
rt_feature = ccci_md_get_rt_feature_by_id(md_id,
|
|
AT_CHANNEL_NUM, 1);
|
|
if (rt_feature)
|
|
ret = ccci_md_parse_rt_feature(md_id,
|
|
rt_feature, &at_ch_num, sizeof(at_ch_num));
|
|
else
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"get AT_CHANNEL_NUM fail\n");
|
|
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"get at_ch_num = %u\n", at_ch_num);
|
|
ret = put_user(at_ch_num,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
ret = -ENOTTY;
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
long ccci_fsm_ioctl(int md_id, unsigned int cmd, unsigned long arg)
|
|
{
|
|
struct ccci_fsm_ctl *ctl = fsm_get_entity_by_md_id(md_id);
|
|
int ret = 0;
|
|
enum MD_STATE_FOR_USER state_for_user;
|
|
unsigned int data;
|
|
char *VALID_USER = "ccci_mdinit";
|
|
|
|
if (!ctl)
|
|
return -EINVAL;
|
|
|
|
switch (cmd) {
|
|
case CCCI_IOC_GET_MD_STATE:
|
|
state_for_user = ccci_fsm_get_md_state_for_user(md_id);
|
|
ret = put_user((unsigned int)state_for_user,
|
|
(unsigned int __user *)arg);
|
|
|
|
break;
|
|
case CCCI_IOC_GET_OTHER_MD_STATE:
|
|
state_for_user =
|
|
ccci_fsm_get_md_state_for_user(GET_OTHER_MD_ID(md_id));
|
|
ret = put_user((unsigned int)state_for_user,
|
|
(unsigned int __user *)arg);
|
|
break;
|
|
case CCCI_IOC_MD_RESET:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD reset ioctl called by %s\n", current->comm);
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_RESET_REQUEST, 0);
|
|
fsm_monitor_send_message(GET_OTHER_MD_ID(ctl->md_id),
|
|
CCCI_MD_MSG_RESET_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_RESET_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_FORCE_MD_ASSERT:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD force assert ioctl called by %s\n", current->comm);
|
|
ret = ccci_md_force_assert(md_id,
|
|
MD_FORCE_ASSERT_BY_USER_TRIGGER, NULL, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_F_ASSERT_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_SEND_STOP_MD_REQUEST:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD stop request ioctl called by %s\n", current->comm);
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_FORCE_STOP_REQUEST, 0);
|
|
fsm_monitor_send_message(GET_OTHER_MD_ID(ctl->md_id),
|
|
CCCI_MD_MSG_FORCE_STOP_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_STOP_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_SEND_START_MD_REQUEST:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD start request ioctl called by %s\n", current->comm);
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_FORCE_START_REQUEST, 0);
|
|
fsm_monitor_send_message(GET_OTHER_MD_ID(ctl->md_id),
|
|
CCCI_MD_MSG_FORCE_START_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_START_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_DO_START_MD:
|
|
/* add check whether the user call md start ioctl is valid */
|
|
if (strncmp(current->comm,
|
|
VALID_USER, strlen(VALID_USER)) == 0) {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD start ioctl called by %s\n", current->comm);
|
|
ret = fsm_append_command(ctl, CCCI_COMMAND_START, 0);
|
|
} else {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"drop invalid user:%s call MD start ioctl\n",
|
|
current->comm);
|
|
}
|
|
break;
|
|
case CCCI_IOC_DO_STOP_MD:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"CCCI_IOC_DO_STOP_MD: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
} else {
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD stop ioctl called by %s %d\n",
|
|
current->comm, data);
|
|
ret = fsm_append_command(ctl, CCCI_COMMAND_STOP,
|
|
(data ? MD_FLIGHT_MODE_ENTER
|
|
: MD_FLIGHT_MODE_NONE)
|
|
== MD_FLIGHT_MODE_ENTER ?
|
|
FSM_CMD_FLAG_FLIGHT_MODE : 0);
|
|
}
|
|
break;
|
|
case CCCI_IOC_ENTER_DEEP_FLIGHT:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD enter flight mode ioctl called by %s\n", current->comm);
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_FLIGHT_STOP_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_ENTER_FLIGHT_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_LEAVE_DEEP_FLIGHT:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD leave flight mode ioctl called by %s\n", current->comm);
|
|
__pm_wakeup_event(ctl->wakelock, jiffies_to_msecs(10 * HZ));
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_FLIGHT_START_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_LEAVE_FLIGHT_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_ENTER_DEEP_FLIGHT_ENHANCED:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD enter flight mode enhanced ioctl called by %s\n",
|
|
current->comm);
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_FLIGHT_STOP_REQUEST, 0);
|
|
fsm_monitor_send_message(GET_OTHER_MD_ID(ctl->md_id),
|
|
CCCI_MD_MSG_FLIGHT_STOP_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_ENTER_FLIGHT_E_REQUEST,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_LEAVE_DEEP_FLIGHT_ENHANCED:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD leave flight mode enhanced ioctl called by %s\n",
|
|
current->comm);
|
|
__pm_wakeup_event(ctl->wakelock, jiffies_to_msecs(10 * HZ));
|
|
ret = fsm_monitor_send_message(ctl->md_id,
|
|
CCCI_MD_MSG_FLIGHT_START_REQUEST, 0);
|
|
fsm_monitor_send_message(GET_OTHER_MD_ID(ctl->md_id),
|
|
CCCI_MD_MSG_FLIGHT_START_REQUEST, 0);
|
|
inject_md_status_event(md_id, MD_STA_EV_LEAVE_FLIGHT_E_REQUEST,
|
|
current->comm);
|
|
break;
|
|
/* RILD nodify ccci power off md */
|
|
case CCCI_IOC_RILD_POWER_OFF_MD:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD will power off ioctl called by %s\n",
|
|
current->comm);
|
|
inject_md_status_event(md_id, MD_STA_EV_RILD_POWEROFF_START,
|
|
current->comm);
|
|
break;
|
|
case CCCI_IOC_SET_EFUN:
|
|
if (copy_from_user(&data, (void __user *)arg,
|
|
sizeof(unsigned int))) {
|
|
CCCI_ERROR_LOG(md_id, FSM,
|
|
"set efun fail: copy_from_user fail\n");
|
|
ret = -EFAULT;
|
|
break;
|
|
}
|
|
CCCI_NORMAL_LOG(md_id, FSM, "EFUN set to %d\n", data);
|
|
if (data == 0)
|
|
ccci_md_soft_stop(md_id, data);
|
|
else if (data != 0)
|
|
ccci_md_soft_start(md_id, data);
|
|
break;
|
|
case CCCI_IOC_MDLOG_DUMP_DONE:
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"MD logger dump done ioctl called by %s\n", current->comm);
|
|
ctl->ee_ctl.mdlog_dump_done = 1;
|
|
break;
|
|
case CCCI_IOC_RESET_MD1_MD3_PCCIF:
|
|
ccci_md_reset_pccif(md_id);
|
|
break;
|
|
case CCCI_IOC_GET_MD_EX_TYPE:
|
|
ret = put_user((unsigned int)ctl->ee_ctl.ex_type,
|
|
(unsigned int __user *)arg);
|
|
CCCI_NORMAL_LOG(md_id, FSM,
|
|
"get modem exception type=%d ret=%d\n",
|
|
ctl->ee_ctl.ex_type, ret);
|
|
break;
|
|
default:
|
|
ret = fsm_md_data_ioctl(md_id, cmd, arg);
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|