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

Commit a48f5b3c authored by Shwetha G K's avatar Shwetha G K Committed by Madan Koyyalamudi
Browse files

qcacmn: Extract additional info to cfr metadata

Extract agc gain information, CFO & rx_start_ts from
rx status and cfr peer capture event to CFR host metadata

Change-Id: Id896554f1da6920bd3eeced1298b07857d41a68b
parent c183eeac
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -48,6 +48,10 @@
 */
#define CORRELATE_TX_EV_MODULE_ID 1

#define get_u16_lsb(value) (uint16_t)(value)
#define get_u16_msb(value) (uint16_t)(((uint32_t)value) >> 16)
#define get_gain_db(value) ((value) & 0xFF)

/**
 * target_if_cfr_init_pdev() - Inits cfr pdev and registers necessary handlers.
 * @psoc: pointer to psoc object
+79 −29
Original line number Diff line number Diff line
/*
 * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -337,7 +337,7 @@ static void dump_mu_rx_info(void *mu_rx_user_info,
static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie)
{
	uint8_t user_id, chain_id;
	struct cfr_metadata_version_3 *meta = &header->u.meta_v3;
	struct cfr_metadata_version_5 *meta = &header->u.meta_v5;
	uint8_t *usermac = NULL;

	cfr_debug("<METADATA><%u>\n"
@@ -345,6 +345,7 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie)
		  "vendorid = 0x%x\n"
		  "cfr_metadata_version = %d\n"
		  "cfr_data_version = %d\n"
		  "cfr_metadata_len = %d\n"
		  "chip_type = %d\n"
		  "platform_type = %d\n"
		  "status = %d\n"
@@ -367,6 +368,7 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie)
		header->vendorid,
		header->cfr_metadata_version,
		header->cfr_data_version,
		header->cfr_metadata_len,
		header->chip_type,
		header->pltform_type,
		meta->status,
@@ -407,6 +409,18 @@ static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie)
			  chain_id,
			  meta->chain_phase[chain_id]);
	}

	if (header->cfr_metadata_version == CFR_META_VERSION_5) {
		cfr_debug("rtt_cfo_measurement = %d\n",
			  meta->rtt_cfo_measurement);
		cfr_debug("rx_start_ts = %u\n", meta->rx_start_ts);

		for (chain_id = 0; chain_id < HOST_MAX_CHAINS; chain_id++) {
			cfr_debug("agc_gain[%d] = %d\n",
				  chain_id,
				  meta->agc_gain[chain_id]);
		}
	}
}

/**
@@ -704,9 +718,10 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
	int i, status = 0;
	QDF_STATUS retval = 0;
	struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL;
	struct cfr_metadata_version_3 *meta = NULL;
	struct cfr_metadata_version_5 *meta = NULL;
	uint8_t srng_id = 0;
	struct wlan_lmac_if_rx_ops *rx_ops;
	uint32_t target_type;

	if (qdf_unlikely(!pdev)) {
		cfr_err("pdev is null\n");
@@ -745,6 +760,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
		cfr_err("rx_ops is NULL");
		goto relref;
	}
	target_type = target_if_cfr_get_target_type(psoc);
	cfr_rx_ops = &rx_ops->cfr_rx_ops;
	buf_addr_extn = cfr_info->rtt_che_buffer_pointer_high8 & 0xF;
	buf_addr = (cfr_info->rtt_che_buffer_pointer_low32 |
@@ -805,15 +821,20 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
	lut->tx_address2 = cfr_info->rtt_che_buffer_pointer_high8;
	lut->txrx_tstamp = qdf_ktime_to_ms(qdf_ktime_get());
	header = &lut->header;
	meta = &header->u.meta_v3;
	meta = &header->u.meta_v5;

	header->start_magic_num        = 0xDEADBEAF;
	header->vendorid               = 0x8cfdf0;
	if (target_type == TARGET_TYPE_QCN9000 ||
	    target_type == TARGET_TYPE_QCA6018)
		header->cfr_metadata_version   = CFR_META_VERSION_5;
	else
		header->cfr_metadata_version   = CFR_META_VERSION_3;

	header->cfr_data_version       = CFR_DATA_VERSION_1;
	header->chip_type              = pcfr->chip_type;
	header->pltform_type           = CFR_PLATFORM_TYPE_ARM;
	header->Reserved               = 0;
	header->cfr_metadata_len       = sizeof(struct cfr_metadata_version_5);

	meta->status       = 1;
	meta->phy_mode = ch_phymode;
@@ -826,6 +847,18 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
	meta->is_mu_ppdu = (cdp_rx_ppdu->u.ppdu_type == CDP_RX_TYPE_SU) ? 0 : 1;
	meta->num_mu_users = (meta->is_mu_ppdu) ? (cdp_rx_ppdu->num_users) : 0;

	meta->rtt_cfo_measurement = cfr_info->rtt_cfo_measurement;
	meta->rx_start_ts = cfr_info->rx_start_ts;

	meta->agc_gain[0] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info0));
	meta->agc_gain[1] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info0));
	meta->agc_gain[2] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info1));
	meta->agc_gain[3] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info1));
	meta->agc_gain[4] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info2));
	meta->agc_gain[5] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info2));
	meta->agc_gain[6] = get_gain_db(get_u16_lsb(cfr_info->agc_gain_info3));
	meta->agc_gain[7] = get_gain_db(get_u16_msb(cfr_info->agc_gain_info3));

	if (meta->num_mu_users > pcfr->max_mu_users)
		meta->num_mu_users = pcfr->max_mu_users;

@@ -923,7 +956,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev,
	uint8_t capture_type = CFR_TYPE_METHOD_AUTO;
	uint8_t *peer_macaddr = NULL;
	struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = NULL;
	struct cfr_metadata_version_3 *meta = NULL;
	struct cfr_metadata_version_5 *meta = NULL;
	struct wlan_lmac_if_rx_ops *rx_ops;

	if ((!pdev) || (!payload)) {
@@ -1004,7 +1037,7 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev,

	header = &lut->header;
	header->chip_type = pcfr->chip_type;
	meta = &header->u.meta_v3;
	meta = &header->u.meta_v5;
	meta->channel_bw = dma_hdr.upload_pkt_bw;
	meta->num_rx_chain = NUM_CHAINS_FW_TO_HOST(dma_hdr.num_chains);
	meta->length = length;
@@ -1166,8 +1199,13 @@ static void enh_prepare_cfr_header_txstatus(wmi_cfr_peer_tx_event_param
{
	header->start_magic_num        = 0xDEADBEAF;
	header->vendorid               = 0x8cfdf0;
	header->cfr_metadata_version   = CFR_META_VERSION_3;
	header->cfr_data_version       = CFR_DATA_VERSION_1;
	if (target_type == TARGET_TYPE_QCN9000 ||
	    target_type == TARGET_TYPE_QCA6018 ||
	    target_type == TARGET_TYPE_QCA5018)
		header->cfr_metadata_version   = CFR_META_VERSION_5;
	else
		header->cfr_metadata_version   = CFR_META_VERSION_3;

	if (target_type == TARGET_TYPE_QCN9000)
		header->chip_type      = CFR_CAPTURE_RADIO_PINE;
@@ -1177,11 +1215,13 @@ static void enh_prepare_cfr_header_txstatus(wmi_cfr_peer_tx_event_param
		header->chip_type      = CFR_CAPTURE_RADIO_CYP;

	header->pltform_type           = CFR_PLATFORM_TYPE_ARM;
	header->Reserved               = 0;
	header->u.meta_v3.status       = 0; /* failure */
	header->u.meta_v3.length       = 0;
	header->cfr_metadata_len       = sizeof(struct cfr_metadata_version_5);
	header->u.meta_v5.status       = 0; /* failure */
	header->u.meta_v5.length       = 0;
	header->u.meta_v5.rtt_cfo_measurement = tx_evt_param->cfo_measurement;
	header->u.meta_v5.rx_start_ts = tx_evt_param->rx_start_ts;

	qdf_mem_copy(&header->u.meta_v3.peer_addr.su_peer_addr[0],
	qdf_mem_copy(&header->u.meta_v5.peer_addr.su_peer_addr[0],
		     &tx_evt_param->peer_mac_addr.bytes[0], QDF_MAC_ADDR_SIZE);
}

@@ -1364,8 +1404,14 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen)
	header = &lut->header;
	header->start_magic_num        = 0xDEADBEAF;
	header->vendorid               = 0x8cfdf0;
	header->cfr_metadata_version   = CFR_META_VERSION_3;
	header->cfr_data_version       = CFR_DATA_VERSION_1;
	header->cfr_metadata_len       = sizeof(struct cfr_metadata_version_5);
	if (target_type == TARGET_TYPE_QCN9000 ||
	    target_type == TARGET_TYPE_QCA6018 ||
	    target_type == TARGET_TYPE_QCA5018)
		header->cfr_metadata_version   = CFR_META_VERSION_5;
	else
		header->cfr_metadata_version   = CFR_META_VERSION_3;

	if (target_type == TARGET_TYPE_QCN9000)
		header->chip_type      = CFR_CAPTURE_RADIO_PINE;
@@ -1375,37 +1421,41 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen)
		header->chip_type      = CFR_CAPTURE_RADIO_CYP;

	header->pltform_type           = CFR_PLATFORM_TYPE_ARM;
	header->Reserved               = 0;
	header->u.meta_v3.status       = (tx_evt_param.status &
	header->u.meta_v5.status       = (tx_evt_param.status &
					  PEER_CFR_CAPTURE_EVT_STATUS_MASK) ?
					  1 : 0;
	header->u.meta_v3.capture_bw   = tx_evt_param.bandwidth;
	header->u.meta_v5.capture_bw   = tx_evt_param.bandwidth;

	bss_chan = wlan_vdev_mlme_get_bss_chan(vdev);
	header->u.meta_v3.phy_mode     = bss_chan->ch_phymode;
	header->u.meta_v5.phy_mode     = bss_chan->ch_phymode;

	header->u.meta_v3.prim20_chan  = tx_evt_param.primary_20mhz_chan;
	header->u.meta_v3.center_freq1 = tx_evt_param.band_center_freq1;
	header->u.meta_v3.center_freq2 = tx_evt_param.band_center_freq2;
	header->u.meta_v5.prim20_chan  = tx_evt_param.primary_20mhz_chan;
	header->u.meta_v5.center_freq1 = tx_evt_param.band_center_freq1;
	header->u.meta_v5.center_freq2 = tx_evt_param.band_center_freq2;

	/* Currently CFR data is captured on ACK of a Qos NULL frame.
	 * For 20 MHz, ACK is Legacy and for 40/80/160, ACK is DUP Legacy.
	 */
	header->u.meta_v3.capture_mode = tx_evt_param.bandwidth ?
	header->u.meta_v5.capture_mode = tx_evt_param.bandwidth ?
		CFR_DUP_LEGACY_ACK : CFR_LEGACY_ACK;
	header->u.meta_v3.capture_type = tx_evt_param.capture_method;
	header->u.meta_v3.num_rx_chain = wlan_vdev_mlme_get_rxchainmask(vdev);
	header->u.meta_v3.sts_count    = tx_evt_param.spatial_streams;
	header->u.meta_v3.timestamp    = tx_evt_param.timestamp_us;
	header->u.meta_v5.capture_type = tx_evt_param.capture_method;
	header->u.meta_v5.num_rx_chain = wlan_vdev_mlme_get_rxchainmask(vdev);
	header->u.meta_v5.sts_count    = tx_evt_param.spatial_streams;
	header->u.meta_v5.timestamp    = tx_evt_param.timestamp_us;

	qdf_mem_copy(&header->u.meta_v3.peer_addr.su_peer_addr[0],
	qdf_mem_copy(&header->u.meta_v5.peer_addr.su_peer_addr[0],
		     &tx_evt_param.peer_mac_addr.bytes[0], QDF_MAC_ADDR_SIZE);
	qdf_mem_copy(&header->u.meta_v3.chain_rssi[0],
	qdf_mem_copy(&header->u.meta_v5.chain_rssi[0],
		     &tx_evt_param.chain_rssi[0],
		     HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_rssi[0]));
	qdf_mem_copy(&header->u.meta_v3.chain_phase[0],
	qdf_mem_copy(&header->u.meta_v5.chain_phase[0],
		     &tx_evt_param.chain_phase[0],
		     HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_phase[0]));
	qdf_mem_copy(&header->u.meta_v5.agc_gain[0],
		     &tx_evt_param.agc_gain[0],
		     HOST_MAX_CHAINS * sizeof(tx_evt_param.agc_gain[0]));
	header->u.meta_v5.rtt_cfo_measurement = tx_evt_param.cfo_measurement;
	header->u.meta_v5.rx_start_ts = tx_evt_param.rx_start_ts;

	status = correlate_and_relay_enh(pdev, cookie, lut,
					 CORRELATE_TX_EV_MODULE_ID);