Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dafb78b7 authored by ankita.sharma's avatar ankita.sharma Committed by lio.chen
Browse files

[ALPS08936922] Fix mddp: state machine corrupted cause ANR

Change-Id: I6d229b8d850745c6741ee14b8e783c0724afeae0
parent fb50e3e9
Loading
Loading
Loading
Loading
+36 −27
Original line number Diff line number Diff line
@@ -64,9 +64,11 @@ static struct notifier_block mddp_netdev_notifier __read_mostly = {

void mddp_netdev_notifier_init(void)
{
	if (register_netdevice_notifier(&mddp_netdev_notifier) == 0)
	if (!mddp_netdev_notifier_is_init &&
			(register_netdevice_notifier(&mddp_netdev_notifier) == 0)) {
		mddp_netdev_notifier_is_init = 1;
	}
}

void mddp_netdev_notifier_exit(void)
{
@@ -127,31 +129,6 @@ int32_t mddp_on_enable(enum mddp_app_type_e in_type)
	return 0;
}

int32_t mddp_on_disable(enum mddp_app_type_e in_type)
{
	struct mddp_app_t      *app;
	uint32_t                type;
	uint8_t                 idx;

	if (in_type != MDDP_APP_TYPE_ALL)
		return -EINVAL;

	/*
	 * MDDP DISABLE command.
	 */
	for (idx = 0; idx < MDDP_MOD_CNT; idx++) {
		type = mddp_sm_module_list_s[idx];
		app = mddp_get_app_inst(type);
		if (!(app->feature & MDDP_FEATURE_MDDP_WH) || !app->drv_reg)
			continue;
		mddp_sm_wait_pre(app);
		mddp_sm_on_event(app, MDDP_EVT_FUNC_DISABLE);
		mddp_sm_wait(app, MDDP_EVT_FUNC_DISABLE);
	}

	return 0;
}

int32_t mddp_on_activate(enum mddp_app_type_e type,
		uint8_t *ul_dev_name, uint8_t *dl_dev_name)
{
@@ -163,7 +140,7 @@ int32_t mddp_on_activate(enum mddp_app_type_e type,

	// NG. app is not configured!
	app = mddp_get_app_inst(type);
	if (!app->is_config)
	if ((!app->is_config) || (app->state == MDDP_STATE_DISABLED))
		return -EINVAL;

	if (!(app->feature & MDDP_FEATURE_MDDP_WH) || !app->drv_reg)
@@ -224,6 +201,38 @@ int32_t mddp_on_deactivate(enum mddp_app_type_e type)
	return 0;
}

int32_t mddp_on_disable(enum mddp_app_type_e in_type)
{
	struct mddp_app_t      *app;
	uint32_t                type;
	uint8_t                 idx;

	if (in_type != MDDP_APP_TYPE_ALL)
		return -EINVAL;

	/* If MDDP is not deactivated,
	 * Deactivate first to avoid state machine corruption
	 */
	if (mddp_f_dev_is_wan_lan_dev()) {
		int32_t ret = 0;

		ret = mddp_on_deactivate(MDDP_APP_TYPE_WH);
	}

	/*
	 * MDDP DISABLE command.
	 */
	for (idx = 0; idx < MDDP_MOD_CNT; idx++) {
		type = mddp_sm_module_list_s[idx];
		app = mddp_get_app_inst(type);
		mddp_sm_wait_pre(app);
		mddp_sm_on_event(app, MDDP_EVT_FUNC_DISABLE);
		mddp_sm_wait(app, MDDP_EVT_FUNC_DISABLE);
	}

	return 0;
}

int32_t mddp_on_get_offload_stats(
		enum mddp_app_type_e type,
		uint8_t *buf,
+22 −0
Original line number Diff line number Diff line
@@ -295,3 +295,25 @@ void mddp_f_dev_del_wan_dev(char *dev_name)
			__func__, dev_name, i,
			mddp_f_wan_dev_cnt_g);
}

bool mddp_f_dev_is_wan_lan_dev(void)
{
	bool exist = false;
	int i;

	for (i = 0; i < MDDP_MAX_WAN_DEV_NUM; i++) {
		if (mddp_f_wan_dev[i].is_valid == true) {
			exist = true;
			return exist;
		}
	}

	for (i = 0; i < MDDP_MAX_LAN_DEV_NUM; i++) {
		if (mddp_f_lan_dev[i].is_valid == true) {
			exist = true;
			return exist;
		}
	}

	return exist;
}
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ bool mddp_f_dev_add_lan_dev(char *dev_name, int netif_id);
bool mddp_f_dev_add_wan_dev(char *dev_name);
void mddp_f_dev_del_lan_dev(char *dev_name);
void mddp_f_dev_del_wan_dev(char *dev_name);
bool mddp_f_dev_is_wan_lan_dev(void);
struct net_device *mddp_f_is_support_lan_dev(int ifindex);
struct net_device *mddp_f_is_support_wan_dev(int ifindex);