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

Commit 69e66a0e authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "icnss2: Send WPSS restart level to FW through QMI"

parents 5f4eec37 93498d01
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ CONFIG_SLIMBUS_MSM_NGD=m
CONFIG_QCOM_KGSL=y
CONFIG_QCOM_KGSL_CONTEXT_DEBUG=y
CONFIG_QCOM_QFPROM=y
CONFIG_ICNSS2_RESTART_LEVEL_NOTIF=y
CONFIG_ARM_QCOM_CPUFREQ_HW=y
CONFIG_NETFILTER_XT_TARGET_TEE=y
CONFIG_NETFILTER_XT_TARGET_NOTRACK=y
+69 −0
Original line number Diff line number Diff line
@@ -1765,6 +1765,26 @@ struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[] = {
					   dev_mem_info),
		.ei_array      = wlfw_dev_mem_info_s_v01_ei,
	},
	{
		.data_type      = QMI_OPT_FLAG,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x1D,
		.offset         = offsetof(struct
					   wlfw_cap_resp_msg_v01,
					   foundry_name_valid),
	},
	{
		.data_type      = QMI_STRING,
		.elem_len       = QMI_WLFW_MAX_STR_LEN_V01 + 1,
		.elem_size      = sizeof(char),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x1D,
		.offset         = offsetof(struct
					   wlfw_cap_resp_msg_v01,
					   foundry_name),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
@@ -5477,5 +5497,54 @@ struct qmi_elem_info wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei[] = {
};
EXPORT_SYMBOL(wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei);

struct qmi_elem_info wlfw_subsys_restart_level_req_msg_v01_ei[] = {
	{
		.data_type      = QMI_OPT_FLAG,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct
					   wlfw_subsys_restart_level_req_msg_v01,
					   restart_level_type_valid),
	},
	{
		.data_type      = QMI_UNSIGNED_1_BYTE,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct
					   wlfw_subsys_restart_level_req_msg_v01,
					   restart_level_type),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};
EXPORT_SYMBOL(wlfw_subsys_restart_level_req_msg_v01_ei);

struct qmi_elem_info wlfw_subsys_restart_level_resp_msg_v01_ei[] = {
	{
		.data_type      = QMI_STRUCT,
		.elem_len       = 1,
		.elem_size      = sizeof(struct qmi_response_type_v01),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x02,
		.offset         = offsetof(struct
					   wlfw_subsys_restart_level_resp_msg_v01,
					   resp),
		.ei_array      = qmi_response_type_v01_ei,
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};
EXPORT_SYMBOL(wlfw_subsys_restart_level_resp_msg_v01_ei);

MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("WLAN FW QMI service");
+21 −2
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@
#define WLFW_SERVICE_ID_V01 0x45
#define WLFW_SERVICE_VERS_V01 0x01

#define QMI_WLFW_SUBSYS_RESTART_LEVEL_RESP_V01 0x0055
#define QMI_WLFW_SUBSYS_RESTART_LEVEL_REQ_V01 0x0055
#define QMI_WLFW_POWER_SAVE_RESP_V01 0x0050
#define QMI_WLFW_CAP_REQ_V01 0x0024
#define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026
@@ -529,8 +531,11 @@ struct wlfw_cap_resp_msg_v01 {
	enum wlfw_rd_card_chain_cap_v01 rd_card_chain_cap;
	u8 dev_mem_info_valid;
	struct wlfw_dev_mem_info_s_v01 dev_mem_info[QMI_WLFW_MAX_DEV_MEM_NUM_V01];
	u8 foundry_name_valid;
	char foundry_name[QMI_WLFW_MAX_STR_LEN_V01 + 1];
};
#define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 320

#define WLFW_CAP_RESP_MSG_V01_MAX_MSG_LEN 339
extern struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[];

struct wlfw_bdf_download_req_msg_v01 {
@@ -805,7 +810,6 @@ struct wlfw_host_cap_req_msg_v01 {
	u8 wlan_enable_delay_valid;
	u32 wlan_enable_delay;
};

#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 396
extern struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[];

@@ -1218,4 +1222,19 @@ struct wlfw_m3_dump_upload_segments_req_ind_msg_v01 {
#define WLFW_M3_DUMP_UPLOAD_SEGMENTS_REQ_IND_MSG_V01_MAX_MSG_LEN 387
extern struct qmi_elem_info wlfw_m3_dump_upload_segments_req_ind_msg_v01_ei[];

struct wlfw_subsys_restart_level_req_msg_v01 {
	u8 restart_level_type_valid;
	u8 restart_level_type;
};

#define WLFW_SUBSYS_RESTART_LEVEL_REQ_MSG_V01_MAX_MSG_LEN 4
extern struct qmi_elem_info wlfw_subsys_restart_level_req_msg_v01_ei[];

struct wlfw_subsys_restart_level_resp_msg_v01 {
	struct qmi_response_type_v01 resp;
};

#define WLFW_SUBSYS_RESTART_LEVEL_RESP_MSG_V01_MAX_MSG_LEN 7
extern struct qmi_elem_info wlfw_subsys_restart_level_resp_msg_v01_ei[];

#endif
+9 −0
Original line number Diff line number Diff line
@@ -28,6 +28,15 @@ config ICNSS2_QMI
	  and configurations. It also send WLAN on/off control message to FW
	  over QMI channel.

config ICNSS2_RESTART_LEVEL_NOTIF
	bool "Enable Restart level change notification"
	depends on ICNSS2
	help
	  Say 'Y' here to enable ICNSS2_RESTART_LEVEL_NOTIF support.
	  This will be needed to register notifier and get notification for
	  restart_level change of WLAN Sub system. On receiving notification
	  ICNSS2 enable/disable M3 SSR. This is only enabled for QGKI config.

config CNSS_QCA6750
	bool "Enable ICNSS QCA6750 chipset specific changes"
	depends on ICNSS2
+58 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@
#include <soc/qcom/ramdump.h>
#include <linux/soc/qcom/smem.h>
#include <linux/soc/qcom/smem_state.h>
#include <trace/events/trace_msm_ssr_event.h>
#include "main.h"
#include "qmi.h"
#include "debug.h"
@@ -187,6 +188,8 @@ char *icnss_driver_event_to_str(enum icnss_driver_event_type type)
		return "M3_DUMP_UPLOAD";
	case ICNSS_DRIVER_EVENT_QDSS_TRACE_REQ_DATA:
		return "QDSS_TRACE_REQ_DATA";
	case ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL:
		return "SUBSYS_RESTART_LEVEL";
	case ICNSS_DRIVER_EVENT_MAX:
		return "EVENT_MAX";
	}
@@ -1085,6 +1088,25 @@ static int icnss_qdss_trace_req_data_hdlr(struct icnss_priv *priv,
	return ret;
}

static int icnss_subsys_restart_level_type(struct icnss_priv *priv,
					   void *data)
{
	int ret = 0;
	struct icnss_subsys_restart_level_data *event_data = data;

	if (!priv)
		return -ENODEV;

	if (!data)
		return -EINVAL;

	ret = wlfw_subsys_restart_level_msg(priv, event_data->restart_level);

	kfree(data);

	return ret;
}

static int icnss_event_soc_wake_request(struct icnss_priv *priv, void *data)
{
	int ret = 0;
@@ -1517,6 +1539,9 @@ static void icnss_driver_event_work(struct work_struct *work)
			ret = icnss_qdss_trace_req_data_hdlr(priv,
							     event->data);
			break;
		case ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL:
			ret = icnss_subsys_restart_level_type(priv, event->data);
			break;
		default:
			icnss_pr_err("Invalid Event type: %d", event->type);
			kfree(event);
@@ -3907,6 +3932,33 @@ static inline bool icnss_use_nv_mac(struct icnss_priv *priv)
				     "use-nv-mac");
}

#ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF
static void pil_restart_level_notifier(void *ignore,
				       int restart_level,
				       const char *fw)
{
	struct icnss_subsys_restart_level_data *restart_level_data;

	icnss_pr_err("PIL Notifier, restart_level: %d, FW:%s",
		     restart_level, fw);

	restart_level_data = kzalloc(sizeof(*restart_level_data), GFP_ATOMIC);

	if (!restart_level_data)
		return;

	if (!strcmp(fw, "wpss")) {
		if (restart_level == RESET_SUBSYS_COUPLED)
			restart_level_data->restart_level = ICNSS_ENABLE_M3_SSR;
		else
			restart_level_data->restart_level = ICNSS_DISABLE_M3_SSR;

		icnss_driver_event_post(penv, ICNSS_DRIVER_EVENT_SUBSYS_RESTART_LEVEL,
					0, restart_level_data);
	}
}
#endif

static int icnss_probe(struct platform_device *pdev)
{
	int ret = 0;
@@ -4023,6 +4075,9 @@ static int icnss_probe(struct platform_device *pdev)
		icnss_pr_dbg("NV MAC feature is %s\n",
			     priv->use_nv_mac ? "Mandatory":"Not Mandatory");
		INIT_WORK(&wpss_loader, icnss_wpss_load);
#ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF
		register_trace_pil_restart_level(pil_restart_level_notifier, NULL);
#endif
	}

	INIT_LIST_HEAD(&priv->icnss_tcdev_list);
@@ -4054,6 +4109,9 @@ static int icnss_remove(struct platform_device *pdev)
		icnss_dms_deinit(priv);
		icnss_genl_exit();
		icnss_runtime_pm_deinit(priv);
#ifdef CONFIG_ICNSS2_RESTART_LEVEL_NOTIF
		unregister_trace_pil_restart_level(pil_restart_level_notifier, NULL);
#endif
	}

	device_init_wakeup(&priv->pdev->dev, false);
Loading