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

Commit 5e57ef09 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge 528e81a1 on remote branch

Change-Id: Ie138ab4d5ab09471db5ca183b7092741f7a28d6f
parents 14596b7e 528e81a1
Loading
Loading
Loading
Loading
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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
@@ -1217,4 +1218,86 @@ cdp_dump_rx_flow_tag_stats(ol_txrx_soc_handle soc, uint8_t pdev_id,
								flow_info);
}
#endif /* WLAN_SUPPORT_RX_FLOW_TAG */

#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
/**
 * cdp_set_delta_tsf() - wrapper function to set delta_tsf
 * @soc: SOC TXRX handle
 * @vdev_id: vdev id
 * @delta_tsf: difference between TSF clock and qtimer
 *
 * Return: None
 */
static inline void cdp_set_delta_tsf(ol_txrx_soc_handle soc, uint8_t vdev_id,
				     uint32_t delta_tsf)
{
	if (!soc || !soc->ops) {
		dp_cdp_err("Invalid instance");
		QDF_BUG(0);
		return;
	}

	if (!soc->ops->ctrl_ops ||
	    !soc->ops->ctrl_ops->txrx_set_delta_tsf)
		return;

	soc->ops->ctrl_ops->txrx_set_delta_tsf(soc, vdev_id, delta_tsf);
}

/**
 * cdp_set_tsf_ul_delay_report() - Enable or disable reporting uplink delay
 * @soc: SOC TXRX handle
 * @vdev_id: vdev id
 * @enable: true to enable and false to disable
 *
 * Return: QDF_STATUS
 */
static inline QDF_STATUS cdp_set_tsf_ul_delay_report(ol_txrx_soc_handle soc,
						     uint8_t vdev_id,
						     bool enable)
{
	if (!soc || !soc->ops) {
		dp_cdp_err("Invalid SOC instance");
		QDF_BUG(0);
		return QDF_STATUS_E_FAILURE;
	}

	if (!soc->ops->ctrl_ops ||
	    !soc->ops->ctrl_ops->txrx_set_tsf_ul_delay_report)
		return QDF_STATUS_E_FAILURE;

	return soc->ops->ctrl_ops->txrx_set_tsf_ul_delay_report(soc, vdev_id,
								enable);
}

/**
 * cdp_get_uplink_delay() - Get uplink delay value
 * @soc: SOC TXRX handle
 * @vdev_id: vdev id
 * @val: pointer to save uplink delay value
 *
 * Return: QDF_STATUS
 */
static inline QDF_STATUS cdp_get_uplink_delay(ol_txrx_soc_handle soc,
					      uint32_t vdev_id, uint32_t *val)
{
	if (!soc || !soc->ops) {
		dp_cdp_err("Invalid SOC instance");
		QDF_BUG(0);
		return QDF_STATUS_E_FAILURE;
	}

	if (!val) {
		dp_cdp_err("Invalid params val");
		return QDF_STATUS_E_FAILURE;
	}

	if (!soc->ops->ctrl_ops ||
	    !soc->ops->ctrl_ops->txrx_get_uplink_delay)
		return QDF_STATUS_E_FAILURE;

	return soc->ops->ctrl_ops->txrx_get_uplink_delay(soc, vdev_id, val);
}
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */

#endif /* _CDP_TXRX_CTRL_H_ */
+12 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
 *
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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
@@ -794,6 +794,17 @@ struct cdp_ctrl_ops {
						int8_t vdev_id);

#endif

#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
	void (*txrx_set_delta_tsf)(struct cdp_soc_t *soc, uint8_t vdev_id,
				   uint32_t delta_tsf);
	QDF_STATUS (*txrx_set_tsf_ul_delay_report)(struct cdp_soc_t *soc,
						   uint8_t vdev_id,
						   bool enable);
	QDF_STATUS (*txrx_get_uplink_delay)(struct cdp_soc_t *soc,
					    uint8_t vdev_id,
					    uint32_t *val);
#endif
};

struct cdp_me_ops {
+3 −2
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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
@@ -4584,7 +4585,7 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
				(u_int8_t *) (msg_word+1),
				&mac_addr_deswizzle_buf[0]);
			QDF_TRACE(QDF_MODULE_ID_TXRX,
				QDF_TRACE_LEVEL_INFO,
				QDF_TRACE_LEVEL_DEBUG,
				"HTT_T2H_MSG_TYPE_PEER_MAP msg for peer id %d vdev id %d n",
				peer_id, vdev_id);

@@ -4792,7 +4793,7 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
			HTT_RX_PEER_MAP_V2_TID_VALID_HI_PRI_GET(*(msg_word + 5));

			QDF_TRACE(QDF_MODULE_ID_TXRX,
				  QDF_TRACE_LEVEL_INFO,
				  QDF_TRACE_LEVEL_DEBUG,
				  "HTT_T2H_MSG_TYPE_PEER_MAP msg for peer id %d vdev id %d n",
				  peer_id, vdev_id);

+5 −0
Original line number Diff line number Diff line
@@ -11475,6 +11475,11 @@ static struct cdp_ctrl_ops dp_ops_ctrl = {
	.txrx_update_peer_pkt_capture_params =
		 dp_peer_update_pkt_capture_params,
#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */
#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
	.txrx_set_delta_tsf = dp_set_delta_tsf,
	.txrx_set_tsf_ul_delay_report = dp_set_tsf_ul_delay_report,
	.txrx_get_uplink_delay = dp_get_uplink_delay,
#endif
};

static struct cdp_me_ops dp_ops_me = {
+134 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. 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
@@ -4399,6 +4400,138 @@ void dp_tx_update_connectivity_stats(struct dp_soc *soc,
}
#endif

#ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
void dp_set_delta_tsf(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
		      uint32_t delta_tsf)
{
	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
						     DP_MOD_ID_CDP);

	if (!vdev) {
		dp_err_rl("vdev %d does not exist", vdev_id);
		return;
	}

	vdev->delta_tsf = delta_tsf;
	dp_debug("vdev id %u delta_tsf %u", vdev_id, delta_tsf);

	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
}

QDF_STATUS dp_set_tsf_ul_delay_report(struct cdp_soc_t *soc_hdl,
				      uint8_t vdev_id, bool enable)
{
	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
						     DP_MOD_ID_CDP);

	if (!vdev) {
		dp_err_rl("vdev %d does not exist", vdev_id);
		return QDF_STATUS_E_FAILURE;
	}

	qdf_atomic_set(&vdev->ul_delay_report, enable);

	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);

	return QDF_STATUS_SUCCESS;
}

QDF_STATUS dp_get_uplink_delay(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
			       uint32_t *val)
{
	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
	struct dp_vdev *vdev;
	uint32_t delay_accum;
	uint32_t pkts_accum;

	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
	if (!vdev) {
		dp_err_rl("vdev %d does not exist", vdev_id);
		return QDF_STATUS_E_FAILURE;
	}

	if (!qdf_atomic_read(&vdev->ul_delay_report)) {
		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
		return QDF_STATUS_E_FAILURE;
	}

	/* Average uplink delay based on current accumulated values */
	delay_accum = qdf_atomic_read(&vdev->ul_delay_accum);
	pkts_accum = qdf_atomic_read(&vdev->ul_pkts_accum);

	*val = delay_accum / pkts_accum;
	dp_debug("uplink_delay %u delay_accum %u pkts_accum %u", *val,
		 delay_accum, pkts_accum);

	/* Reset accumulated values to 0 */
	qdf_atomic_set(&vdev->ul_delay_accum, 0);
	qdf_atomic_set(&vdev->ul_pkts_accum, 0);

	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);

	return QDF_STATUS_SUCCESS;
}

static void dp_tx_update_uplink_delay(struct dp_soc *soc, struct dp_vdev *vdev,
				      struct hal_tx_completion_status *ts)
{
	uint32_t buffer_ts;
	uint32_t delta_tsf;
	uint32_t ul_delay;

	/* Tx_rate_stats_info_valid is 0 and tsf is invalid then */
	if (!ts->valid)
		return;

	if (qdf_unlikely(!vdev)) {
		dp_info_rl("vdev is null or delete in progrss");
		return;
	}

	if (!qdf_atomic_read(&vdev->ul_delay_report))
		return;

	delta_tsf = vdev->delta_tsf;

	/* buffer_timestamp is in units of 1024 us and is [31:13] of
	 * WBM_RELEASE_RING_4. After left shift 10 bits, it's
	 * valid up to 29 bits.
	 */
	buffer_ts = ts->buffer_timestamp << 10;

	ul_delay = ts->tsf - buffer_ts - delta_tsf;
	ul_delay &= 0x1FFFFFFF; /* mask 29 BITS */
	if (ul_delay > 0x1000000) {
		dp_info_rl("----------------------\n"
			   "Tx completion status:\n"
			   "----------------------\n"
			   "release_src = %d\n"
			   "ppdu_id = 0x%x\n"
			   "release_reason = %d\n"
			   "tsf = %u (0x%x)\n"
			   "buffer_timestamp = %u (0x%x)\n"
			   "delta_tsf = %u (0x%x)\n",
			   ts->release_src, ts->ppdu_id, ts->status,
			   ts->tsf, ts->tsf, ts->buffer_timestamp,
			   ts->buffer_timestamp, delta_tsf, delta_tsf);
		return;
	}

	ul_delay /= 1000; /* in unit of ms */

	qdf_atomic_add(ul_delay, &vdev->ul_delay_accum);
	qdf_atomic_inc(&vdev->ul_pkts_accum);
}
#else /* !WLAN_FEATURE_TSF_UPLINK_DELAY */
static inline
void dp_tx_update_uplink_delay(struct dp_soc *soc, struct dp_vdev *vdev,
			       struct hal_tx_completion_status *ts)
{
}
#endif /* WLAN_FEATURE_TSF_UPLINK_DELAY */

/**
 * dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
 * @soc: DP soc handle
@@ -4479,6 +4612,7 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc,
	vdev = peer->vdev;

	dp_tx_update_connectivity_stats(soc, vdev, tx_desc, ts->status);
	dp_tx_update_uplink_delay(soc, vdev, ts);

	/* Update per-packet stats for mesh mode */
	if (qdf_unlikely(vdev->mesh_vdev) &&
Loading