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

Commit 659d5f3f authored by Yuanyuan Liu's avatar Yuanyuan Liu
Browse files

cnss2: Add support for coexistence QMI service



Add support for connecting/communicating with coexistence QMI
service, which is used for antenna sharing.

CRs-Fixed: 2401427
Change-Id: I71dc44a288c06df424a38d7a091d46e866109055
Signed-off-by: default avatarYuanyuan Liu <yuanliu@codeaurora.org>
parent a1683833
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -7,4 +7,4 @@ cnss2-y += bus.o
cnss2-y += debug.o
cnss2-y += pci.o
cnss2-y += power.o
cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o
cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o coexistence_service_v01.o
+95 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2019, The Linux Foundation. All rights reserved. */

#include <linux/soc/qcom/qmi.h>

#include "coexistence_service_v01.h"

struct qmi_elem_info coex_antenna_switch_to_wlan_req_msg_v01_ei[] = {
	{
		.data_type      = QMI_UNSIGNED_8_BYTE,
		.elem_len       = 1,
		.elem_size      = sizeof(u64),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x01,
		.offset         = offsetof(struct
				coex_antenna_switch_to_wlan_req_msg_v01,
				antenna),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};

struct qmi_elem_info coex_antenna_switch_to_wlan_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
				coex_antenna_switch_to_wlan_resp_msg_v01,
				resp),
		.ei_array      = qmi_response_type_v01_ei,
	},
	{
		.data_type      = QMI_OPT_FLAG,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct
				coex_antenna_switch_to_wlan_resp_msg_v01,
				grant_valid),
	},
	{
		.data_type      = QMI_UNSIGNED_8_BYTE,
		.elem_len       = 1,
		.elem_size      = sizeof(u64),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct
				coex_antenna_switch_to_wlan_resp_msg_v01,
				grant),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};

struct qmi_elem_info coex_antenna_switch_to_mdm_req_msg_v01_ei[] = {
	{
		.data_type      = QMI_UNSIGNED_8_BYTE,
		.elem_len       = 1,
		.elem_size      = sizeof(u64),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x01,
		.offset         = offsetof(struct
				coex_antenna_switch_to_mdm_req_msg_v01,
				antenna),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};

struct qmi_elem_info coex_antenna_switch_to_mdm_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
				coex_antenna_switch_to_mdm_resp_msg_v01,
				resp),
		.ei_array      = qmi_response_type_v01_ei,
	},
};
+52 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2019, The Linux Foundation. All rights reserved. */

#ifndef COEXISTENCE_SERVICE_V01_H
#define COEXISTENCE_SERVICE_V01_H

#define COEX_SERVICE_ID_V01 0x22
#define COEX_SERVICE_VERS_V01 0x01

#define COEX_SERVICE_MAX_MSG_LEN 8204

#define QMI_COEX_SWITCH_ANTENNA_TO_WLAN_RESP_V01 0x0042
#define QMI_COEX_SWITCH_ANTENNA_TO_WLAN_REQ_V01 0x0042
#define QMI_COEX_SWITCH_ANTENNA_TO_MDM_RESP_V01 0x0042
#define QMI_COEX_SWITCH_ANTENNA_TO_MDM_REQ_V01 0x0042

#define COEX_ANTENNA_BAND_2GHZ_CHAIN0_V01 ((u64)0x0000000000000001ULL)
#define COEX_ANTENNA_BAND_2GHZ_CHAIN1_V01 ((u64)0x0000000000000002ULL)
#define COEX_ANTENNA_BAND_5GHZ_CHAIN0_V01 ((u64)0x0000000000000004ULL)
#define COEX_ANTENNA_BAND_5GHZ_CHAIN1_V01 ((u64)0x0000000000000008ULL)

struct coex_antenna_switch_to_wlan_req_msg_v01 {
	u64 antenna;
};

#define COEX_ANTENNA_SWITCH_TO_WLAN_REQ_MSG_V01_MAX_MSG_LEN 11
extern struct qmi_elem_info coex_antenna_switch_to_wlan_req_msg_v01_ei[];

struct coex_antenna_switch_to_wlan_resp_msg_v01 {
	struct qmi_response_type_v01 resp;
	u8 grant_valid;
	u64 grant;
};

#define COEX_ANTENNA_SWITCH_TO_WLAN_RESP_MSG_V01_MAX_MSG_LEN 18
extern struct qmi_elem_info coex_antenna_switch_to_wlan_resp_msg_v01_ei[];

struct coex_antenna_switch_to_mdm_req_msg_v01 {
	u64 antenna;
};

#define COEX_ANTENNA_SWITCH_TO_MDM_REQ_MSG_V01_MAX_MSG_LEN 11
extern struct qmi_elem_info coex_antenna_switch_to_mdm_req_msg_v01_ei[];

struct coex_antenna_switch_to_mdm_resp_msg_v01 {
	struct qmi_response_type_v01 resp;
};

#define COEX_ANTENNA_SWITCH_TO_MDM_RESP_MSG_V01_MAX_MSG_LEN 7
extern struct qmi_elem_info coex_antenna_switch_to_mdm_resp_msg_v01_ei[];

#endif
+3 −0
Original line number Diff line number Diff line
@@ -91,6 +91,9 @@ static int cnss_stats_show_state(struct seq_file *s,
		case CNSS_DRIVER_DEBUG:
			seq_puts(s, "DRIVER_DEBUG");
			continue;
		case CNSS_COEX_CONNECTED:
			seq_puts(s, "COEX_CONNECTED");
			continue;
		}

		seq_printf(s, "UNKNOWN-%d", i);
+2 −0
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ enum cnss_driver_state {
	CNSS_FW_BOOT_RECOVERY,
	CNSS_DEV_ERR_NOTIFY,
	CNSS_DRIVER_DEBUG,
	CNSS_COEX_CONNECTED,
};

struct cnss_recovery_data {
@@ -281,6 +282,7 @@ struct cnss_plat_data {
	struct cnss_control_params ctrl_params;
	u64 antenna;
	u64 grant;
	struct qmi_handle coex_qmi;
};

struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev);
Loading