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

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

Merge "cnss2: Setup DMS QMI client for WLAN MAC address"

parents 5d916fa1 4813317b
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -8,4 +8,4 @@ cnss2-y += debug.o
cnss2-y += pci.o
cnss2-y += pci.o
cnss2-y += power.o
cnss2-y += power.o
cnss2-y += genl.o
cnss2-y += genl.o
cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o coexistence_service_v01.o ip_multimedia_subsystem_private_service_v01.o
cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o coexistence_service_v01.o ip_multimedia_subsystem_private_service_v01.o device_management_service_v01.o
+3 −0
Original line number Original line Diff line number Diff line
@@ -122,6 +122,9 @@ static int cnss_stats_show_state(struct seq_file *s,
		case CNSS_QMI_DEL_SERVER:
		case CNSS_QMI_DEL_SERVER:
			seq_puts(s, "DEL_SERVER_IN_PROGRESS");
			seq_puts(s, "DEL_SERVER_IN_PROGRESS");
			continue;
			continue;
		case CNSS_QMI_DMS_CONNECTED:
			seq_puts(s, "DMS_CONNECTED");
			continue;
		}
		}


		seq_printf(s, "UNKNOWN-%d", i);
		seq_printf(s, "UNKNOWN-%d", i);
+73 −0
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2020, The Linux Foundation. All rights reserved. */

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

#include "device_management_service_v01.h"

struct qmi_elem_info dms_get_mac_address_req_msg_v01_ei[] = {
	{
		.data_type      = QMI_SIGNED_4_BYTE_ENUM,
		.elem_len       = 1,
		.elem_size      = sizeof(enum dms_device_mac_enum_v01),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x01,
		.offset         = offsetof(struct
					   dms_get_mac_address_req_msg_v01,
					   device),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};

struct qmi_elem_info dms_get_mac_address_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
					   dms_get_mac_address_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
					   dms_get_mac_address_resp_msg_v01,
					   mac_address_valid),
	},
	{
		.data_type      = QMI_DATA_LEN,
		.elem_len       = 1,
		.elem_size      = sizeof(u8),
		.array_type       = NO_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct
					   dms_get_mac_address_resp_msg_v01,
					   mac_address_len),
	},
	{
		.data_type      = QMI_UNSIGNED_1_BYTE,
		.elem_len       = QMI_DMS_MAC_ADDR_MAX_V01,
		.elem_size      = sizeof(u8),
		.array_type       = VAR_LEN_ARRAY,
		.tlv_type       = 0x10,
		.offset         = offsetof(struct
					   dms_get_mac_address_resp_msg_v01,
					   mac_address),
	},
	{
		.data_type      = QMI_EOTI,
		.array_type       = NO_ARRAY,
		.tlv_type       = QMI_COMMON_TLV_TYPE,
	},
};
+39 −0
Original line number Original line Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 */

#ifndef DEVICE_MANAGEMENT_SERVICE_V01_H
#define DEVICE_MANAGEMENT_SERVICE_V01_H

#define DMS_SERVICE_ID_V01 0x02
#define DMS_SERVICE_VERS_V01 0x01

#define QMI_DMS_GET_MAC_ADDRESS_RESP_V01 0x005C
#define QMI_DMS_GET_MAC_ADDRESS_REQ_V01 0x005C
#define QMI_DMS_MAC_ADDR_MAX_V01 8

enum dms_device_mac_enum_v01 {
	DMS_DEVICE_MAC_ENUM_MIN_VAL_V01 = INT_MIN,
	DMS_DEVICE_MAC_WLAN_V01 = 0,
	DMS_DEVICE_MAC_BT_V01 = 1,
	DMS_DEVICE_MAC_ENUM_MAX_VAL_V01 = INT_MAX,
};

struct dms_get_mac_address_req_msg_v01 {
	enum dms_device_mac_enum_v01 device;
};

#define DMS_GET_MAC_ADDRESS_REQ_MSG_V01_MAX_MSG_LEN 7
extern struct qmi_elem_info dms_get_mac_address_req_msg_v01_ei[];

struct dms_get_mac_address_resp_msg_v01 {
	struct qmi_response_type_v01 resp;
	u8 mac_address_valid;
	u32 mac_address_len;
	u8 mac_address[QMI_DMS_MAC_ADDR_MAX_V01];
};

#define DMS_GET_MAC_ADDRESS_RESP_MSG_V01_MAX_MSG_LEN 19
extern struct qmi_elem_info dms_get_mac_address_resp_msg_v01_ei[];

#endif
+53 −1
Original line number Original line Diff line number Diff line
@@ -405,6 +405,40 @@ static void cnss_release_antenna_sharing(struct cnss_plat_data *plat_priv)
		coex_antenna_switch_to_mdm_send_sync_msg(plat_priv);
		coex_antenna_switch_to_mdm_send_sync_msg(plat_priv);
}
}


#define CNSS_DMS_QMI_CONNECTION_WAIT_MS 50
#define CNSS_DMS_QMI_CONNECTION_WAIT_RETRY 200
static int cnss_setup_dms_mac(struct cnss_plat_data *plat_priv)
{
	u32 i;
	int ret = 0;

	/* DTSI property use-nv-mac is used to force DMS MAC address for WLAN.
	 * Thus assert on failure to get MAC from DMS even after retries
	 */
	if (plat_priv->use_nv_mac) {
		for (i = 0; i < CNSS_DMS_QMI_CONNECTION_WAIT_RETRY; i++) {
			if (plat_priv->dms.mac_valid)
				break;

			ret = cnss_qmi_get_dms_mac(plat_priv);
			if (ret == 0)
				break;
			msleep(CNSS_DMS_QMI_CONNECTION_WAIT_MS);
		}
		if (!plat_priv->dms.mac_valid) {
			cnss_pr_err("Unable to get MAC from DMS\n");
			CNSS_ASSERT(0);
			return -EINVAL;
		}
	}
	if (plat_priv->dms.mac_valid)
		ret =
		cnss_wlfw_wlan_mac_req_send_sync(plat_priv, plat_priv->dms.mac,
						 ARRAY_SIZE(plat_priv->dms.mac));

	return ret;
}

static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
{
{
	int ret = 0;
	int ret = 0;
@@ -432,6 +466,7 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
		ret = cnss_wlfw_wlan_mode_send_sync(plat_priv,
		ret = cnss_wlfw_wlan_mode_send_sync(plat_priv,
						    CNSS_CALIBRATION);
						    CNSS_CALIBRATION);
	} else {
	} else {
		ret = cnss_setup_dms_mac(plat_priv);
		ret = cnss_bus_call_driver_probe(plat_priv);
		ret = cnss_bus_call_driver_probe(plat_priv);
	}
	}


@@ -493,6 +528,10 @@ static char *cnss_driver_event_to_str(enum cnss_driver_event_type type)
		return "QDSS_TRACE_SAVE";
		return "QDSS_TRACE_SAVE";
	case CNSS_DRIVER_EVENT_QDSS_TRACE_FREE:
	case CNSS_DRIVER_EVENT_QDSS_TRACE_FREE:
		return "QDSS_TRACE_FREE";
		return "QDSS_TRACE_FREE";
	case CNSS_DRIVER_EVENT_DMS_SERVER_ARRIVE:
		return "DMS_SERVER_ARRIVE";
	case CNSS_DRIVER_EVENT_DMS_SERVER_EXIT:
		return "DMS_SERVER_EXIT";
	case CNSS_DRIVER_EVENT_MAX:
	case CNSS_DRIVER_EVENT_MAX:
		return "EVENT_MAX";
		return "EVENT_MAX";
	}
	}
@@ -1638,6 +1677,12 @@ static void cnss_driver_event_work(struct work_struct *work)
		case CNSS_DRIVER_EVENT_QDSS_TRACE_FREE:
		case CNSS_DRIVER_EVENT_QDSS_TRACE_FREE:
			ret = cnss_qdss_trace_free_hdlr(plat_priv);
			ret = cnss_qdss_trace_free_hdlr(plat_priv);
			break;
			break;
		case CNSS_DRIVER_EVENT_DMS_SERVER_ARRIVE:
			ret = cnss_dms_server_arrive(plat_priv, event->data);
			break;
		case CNSS_DRIVER_EVENT_DMS_SERVER_EXIT:
			ret = cnss_dms_server_exit(plat_priv);
			break;
		default:
		default:
			cnss_pr_err("Invalid driver event type: %d",
			cnss_pr_err("Invalid driver event type: %d",
				    event->type);
				    event->type);
@@ -2773,10 +2818,14 @@ static int cnss_probe(struct platform_device *plat_dev)
	if (ret)
	if (ret)
		goto deinit_event_work;
		goto deinit_event_work;


	ret = cnss_debugfs_create(plat_priv);
	ret = cnss_dms_init(plat_priv);
	if (ret)
	if (ret)
		goto deinit_qmi;
		goto deinit_qmi;


	ret = cnss_debugfs_create(plat_priv);
	if (ret)
		goto deinit_dms;

	ret = cnss_misc_init(plat_priv);
	ret = cnss_misc_init(plat_priv);
	if (ret)
	if (ret)
		goto destroy_debugfs;
		goto destroy_debugfs;
@@ -2794,6 +2843,8 @@ static int cnss_probe(struct platform_device *plat_dev)


destroy_debugfs:
destroy_debugfs:
	cnss_debugfs_destroy(plat_priv);
	cnss_debugfs_destroy(plat_priv);
deinit_dms:
	cnss_dms_deinit(plat_priv);
deinit_qmi:
deinit_qmi:
	cnss_qmi_deinit(plat_priv);
	cnss_qmi_deinit(plat_priv);
deinit_event_work:
deinit_event_work:
@@ -2829,6 +2880,7 @@ static int cnss_remove(struct platform_device *plat_dev)
	cnss_misc_deinit(plat_priv);
	cnss_misc_deinit(plat_priv);
	cnss_debugfs_destroy(plat_priv);
	cnss_debugfs_destroy(plat_priv);
	cnss_qmi_deinit(plat_priv);
	cnss_qmi_deinit(plat_priv);
	cnss_dms_deinit(plat_priv);
	cnss_event_work_deinit(plat_priv);
	cnss_event_work_deinit(plat_priv);
	cnss_remove_sysfs(plat_priv);
	cnss_remove_sysfs(plat_priv);
	cnss_unregister_bus_scale(plat_priv);
	cnss_unregister_bus_scale(plat_priv);
Loading