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

Commit d02469bd authored by Sandeep Singh's avatar Sandeep Singh
Browse files

icnss: Ignore server exit if already in progress



This change is to avoid back to back server exit/arrive call
from qmi framework. It also ensures that server arrive is
processed only after releasing qmi handle after SSR/PDR.

Change-Id: I4a12625d61ac64d00da70cf6fbecce7c6cf75348
Signed-off-by: default avatarSandeep Singh <sandsing@codeaurora.org>
parent 1526c9c6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2799,6 +2799,9 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv)
			continue;
		case ICNSS_PDR:
			seq_puts(s, "PDR TRIGGERED");
			continue;
		case ICNSS_DEL_SERVER:
			seq_puts(s, "DEL SERVER");
		}

		seq_printf(s, "UNKNOWN-%d", i);
+1 −0
Original line number Diff line number Diff line
@@ -157,6 +157,7 @@ enum icnss_driver_state {
	ICNSS_MODE_ON,
	ICNSS_BLOCK_SHUTDOWN,
	ICNSS_PDR,
	ICNSS_DEL_SERVER,
};

struct ce_irq_list {
+16 −0
Original line number Diff line number Diff line
@@ -1265,6 +1265,8 @@ int icnss_clear_server(struct icnss_priv *priv)

	icnss_unregister_fw_service(priv);

	clear_bit(ICNSS_DEL_SERVER, &priv->state);

	ret =  icnss_register_fw_service(priv);
	if (ret < 0) {
		icnss_pr_err("WLFW server registration failed\n");
@@ -1277,8 +1279,15 @@ int icnss_clear_server(struct icnss_priv *priv)
static int wlfw_new_server(struct qmi_handle *qmi,
			   struct qmi_service *service)
{
	struct icnss_priv *priv = container_of(qmi, struct icnss_priv, qmi);
	struct icnss_event_server_arrive_data *event_data;

	if (priv && test_bit(ICNSS_DEL_SERVER, &priv->state)) {
		icnss_pr_info("WLFW server delete in progress, Ignore server arrive: 0x%lx\n",
			      priv->state);
		return 0;
	}

	icnss_pr_dbg("WLFW server arrive: node %u port %u\n",
		     service->node, service->port);

@@ -1300,9 +1309,16 @@ static void wlfw_del_server(struct qmi_handle *qmi,
{
	struct icnss_priv *priv = container_of(qmi, struct icnss_priv, qmi);

	if (priv && test_bit(ICNSS_DEL_SERVER, &priv->state)) {
		icnss_pr_info("WLFW server delete in progress, Ignore server delete:  0x%lx\n",
			      priv->state);
		return;
	}

	icnss_pr_dbg("WLFW server delete\n");

	if (priv) {
		set_bit(ICNSS_DEL_SERVER, &priv->state);
		set_bit(ICNSS_FW_DOWN, &priv->state);
		icnss_ignore_fw_timeout(true);
	}