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

Unverified Commit e621ebf5 authored by Michael Bestas's avatar Michael Bestas
Browse files

Merge tag 'LA.UM.9.14.r1-20700-LAHAINA.QSSI13.0' of...

Merge tag 'LA.UM.9.14.r1-20700-LAHAINA.QSSI13.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0 into android13-5.4-lahaina

"LA.UM.9.14.r1-20700-LAHAINA.QSSI13.0"

* tag 'LA.UM.9.14.r1-20700-LAHAINA.QSSI13.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0:
  Release 2.0.8.31E
  qcacld-3.0: Fix the channel for M2 packet in pkt capture mode
  Release 2.0.8.31D
  qcacld-3.0: Fix peer unmap failure due to invalid roam scan mode value
  qcacld-3.0: Skip reset roam trigger during disconnect
  Release 2.0.8.31C
  qcacld-3.0: Reinitialize mon_register_event before wait_for_completion
  Release 2.0.8.31B
  qcacld-3.0: Fix the channel for M2 and M4 packets
  Release 2.0.8.31A
  qcacld-3.0: Init start completion in fw down instead of reovery shutdown

 Conflicts:
	drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c

Change-Id: Ic9a46e6858da1926a4270abdf5e31c92c4679f0a
parents 775439a3 075f4c5a
Loading
Loading
Loading
Loading
+15 −14
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@
#include "dp_internal.h"
#include "dp_internal.h"
#include "cds_utils.h"
#include "cds_utils.h"
#include "htt_ppdu_stats.h"
#include "htt_ppdu_stats.h"
#include <cdp_txrx_ctrl.h>
#endif
#endif


#define RESERVE_BYTES (100)
#define RESERVE_BYTES (100)
@@ -262,16 +263,15 @@ pkt_capture_update_tx_status(
			struct mon_rx_status *tx_status,
			struct mon_rx_status *tx_status,
			struct pkt_capture_tx_hdr_elem_t *pktcapture_hdr)
			struct pkt_capture_tx_hdr_elem_t *pktcapture_hdr)
{
{
	struct connection_info info[MAX_NUMBER_OF_CONC_CONNECTIONS];
	struct pkt_capture_vdev_priv *vdev_priv;
	struct pkt_capture_vdev_priv *vdev_priv;
	struct wlan_objmgr_vdev *vdev = context;
	struct wlan_objmgr_vdev *vdev = context;
	htt_ppdu_stats_for_smu_tlv *smu;
	htt_ppdu_stats_for_smu_tlv *smu;
	struct wlan_objmgr_psoc *psoc;
	struct wlan_objmgr_psoc *psoc;
	struct pkt_capture_ppdu_stats_q_node *q_node;
	struct pkt_capture_ppdu_stats_q_node *q_node;
	qdf_list_node_t *node;
	qdf_list_node_t *node;
	uint32_t conn_count;
	cdp_config_param_type val;
	uint8_t vdev_id;
	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
	int i;
	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);


	psoc = wlan_vdev_get_psoc(vdev);
	psoc = wlan_vdev_get_psoc(vdev);
	if (!psoc) {
	if (!psoc) {
@@ -279,18 +279,19 @@ pkt_capture_update_tx_status(
		return;
		return;
	}
	}


	vdev_id = wlan_vdev_get_id(vdev);
	if (!pdev) {

		pkt_capture_err("pdev is NULL");
	/* Update the connected channel info from policy manager */
		return;
	conn_count = policy_mgr_get_connection_info(psoc, info);
	for (i = 0; i < conn_count; i++) {
		if (info[i].vdev_id == vdev_id) {
			tx_status->chan_freq = info[0].ch_freq;
			tx_status->chan_num = info[0].channel;
			break;
		}
	}
	}


	if (!cdp_txrx_get_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev),
				     CDP_MONITOR_CHANNEL, &val))
		tx_status->chan_num = val.cdp_pdev_param_monitor_chan;

	if (!cdp_txrx_get_pdev_param(soc, wlan_objmgr_pdev_get_pdev_id(pdev),
				     CDP_MONITOR_FREQUENCY, &val))
		tx_status->chan_freq = val.cdp_pdev_param_mon_freq;

	vdev_priv = pkt_capture_vdev_get_priv(vdev);
	vdev_priv = pkt_capture_vdev_get_priv(vdev);
	if (qdf_unlikely(!vdev_priv))
	if (qdf_unlikely(!vdev_priv))
		goto skip_ppdu_stats;
		goto skip_ppdu_stats;
+1 −0
Original line number Original line Diff line number Diff line
@@ -823,6 +823,7 @@ QDF_STATUS pkt_capture_deregister_callbacks(struct wlan_objmgr_vdev *vdev)
		  &vdev_priv->mon_ctx->mon_event_flag);
		  &vdev_priv->mon_ctx->mon_event_flag);
	set_bit(PKT_CAPTURE_RX_POST_EVENT,
	set_bit(PKT_CAPTURE_RX_POST_EVENT,
		&vdev_priv->mon_ctx->mon_event_flag);
		&vdev_priv->mon_ctx->mon_event_flag);
	reinit_completion(&vdev_priv->mon_ctx->mon_register_event);
	wake_up_interruptible(&vdev_priv->mon_ctx->mon_wait_queue);
	wake_up_interruptible(&vdev_priv->mon_ctx->mon_wait_queue);


	/*
	/*
+95 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@
#include "wlan_mgmt_txrx_utils_api.h"
#include "wlan_mgmt_txrx_utils_api.h"
#include "wlan_utility.h"
#include "wlan_utility.h"
#include "cds_ieee80211_common.h"
#include "cds_ieee80211_common.h"
#include "cdp_txrx_ctrl.h"


enum pkt_capture_tx_status
enum pkt_capture_tx_status
pkt_capture_mgmt_status_map(uint8_t status)
pkt_capture_mgmt_status_map(uint8_t status)
@@ -133,15 +134,109 @@ pkt_capture_mgmtpkt_process(struct wlan_objmgr_psoc *psoc,
	struct wlan_objmgr_vdev *vdev;
	struct wlan_objmgr_vdev *vdev;
	struct pkt_capture_mon_pkt *pkt;
	struct pkt_capture_mon_pkt *pkt;
	uint32_t headroom;
	uint32_t headroom;
	uint8_t type, sub_type;
	struct ieee80211_frame *wh;
	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
	struct wlan_objmgr_pdev *pdev;
	cdp_config_param_type val;
	tSirMacAuthFrameBody *auth;
	struct pkt_capture_vdev_priv *vdev_priv;


	vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc,
	vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc,
							QDF_STA_MODE,
							QDF_STA_MODE,
							WLAN_PKT_CAPTURE_ID);
							WLAN_PKT_CAPTURE_ID);

	if (!vdev) {
	if (!vdev) {
		pkt_capture_err("vdev is NULL");
		pkt_capture_err("vdev is NULL");
		return QDF_STATUS_E_FAILURE;
		return QDF_STATUS_E_FAILURE;
	}
	}


	vdev_priv = pkt_capture_vdev_get_priv(vdev);
	if (!vdev_priv) {
		pkt_capture_err("packet capture vdev priv is NULL");
		return QDF_STATUS_E_FAILURE;
	}

	pdev = wlan_vdev_get_pdev(vdev);
	if (!pdev) {
		pkt_capture_err("pdev is NULL");
		return QDF_STATUS_E_FAILURE;
	}

	wh = (struct ieee80211_frame *)(qdf_nbuf_data(nbuf));
	type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
	sub_type = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;

	/*
	 *  Update channel only if successful AUTH Resp is received.
	 *  This is done so that EAPOL M1 data frame have correct
	 *  channel
	 */
	if ((type == IEEE80211_FC0_TYPE_MGT) &&
	    (sub_type == MGMT_SUBTYPE_AUTH)) {
		uint8_t chan = wlan_freq_to_chan(txrx_status->chan_freq);

		auth = (tSirMacAuthFrameBody *)(qdf_nbuf_data(nbuf) +
			sizeof(tSirMacMgmtHdr));

		if (auth->authTransactionSeqNumber == SIR_MAC_AUTH_FRAME_2 ||
		    auth->authTransactionSeqNumber == SIR_MAC_AUTH_FRAME_4) {
			if (auth->authStatusCode == STATUS_SUCCESS) {
				val.cdp_pdev_param_monitor_chan = chan;
				cdp_txrx_set_pdev_param(
					soc, wlan_objmgr_pdev_get_pdev_id(pdev),
					CDP_MONITOR_CHANNEL, val);

				val.cdp_pdev_param_mon_freq =
							txrx_status->chan_freq;
				cdp_txrx_set_pdev_param(
					soc, wlan_objmgr_pdev_get_pdev_id(pdev),
					CDP_MONITOR_FREQUENCY, val);
			}
		}
	}

	/*
	 *  Update channel to last connected channel in case of assoc/reassoc
	 *  response failure and save current chan in case of success
	 */
	if ((type == IEEE80211_FC0_TYPE_MGT) &&
	    ((sub_type == MGMT_SUBTYPE_ASSOC_RESP) ||
	    (sub_type == MGMT_SUBTYPE_REASSOC_RESP))) {
		if (qdf_nbuf_len(nbuf) < (sizeof(tSirMacMgmtHdr) +
		   SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET)) {
			pkt_capture_err("Packet length is less than expected");
			qdf_nbuf_free(nbuf);
			return QDF_STATUS_E_FAILURE;
		}

		status = (uint16_t)(*(qdf_nbuf_data(nbuf) +
			 sizeof(tSirMacMgmtHdr) +
			 SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET));

		if (status == STATUS_SUCCESS) {
			vdev_priv->last_freq = vdev_priv->curr_freq;
			vdev_priv->curr_freq = txrx_status->chan_freq;
		} else {
			uint8_t chan_num;

			chan_num = wlan_reg_freq_to_chan(pdev,
							 vdev_priv->last_freq);

			val.cdp_pdev_param_monitor_chan = chan_num;
			cdp_txrx_set_pdev_param(
				soc, wlan_objmgr_pdev_get_pdev_id(pdev),
				CDP_MONITOR_CHANNEL, val);

			val.cdp_pdev_param_mon_freq = vdev_priv->last_freq;
			cdp_txrx_set_pdev_param(
				soc, wlan_objmgr_pdev_get_pdev_id(pdev),
				CDP_MONITOR_FREQUENCY, val);

			vdev_priv->curr_freq = vdev_priv->last_freq;
		}
	}

	/*
	/*
	 * Calculate the headroom and adjust head to prepare radiotap header
	 * Calculate the headroom and adjust head to prepare radiotap header
	 */
	 */
+0 −92
Original line number Original line Diff line number Diff line
@@ -24,104 +24,12 @@
#include "wlan_pkt_capture_mon_thread.h"
#include "wlan_pkt_capture_mon_thread.h"
#include "cds_ieee80211_common.h"
#include "cds_ieee80211_common.h"
#include "wlan_mgmt_txrx_utils_api.h"
#include "wlan_mgmt_txrx_utils_api.h"
#include "cdp_txrx_ctrl.h"
#include "cfg_ucfg_api.h"
#include "cfg_ucfg_api.h"
#include "wlan_mgmt_txrx_utils_api.h"
#include "wlan_mgmt_txrx_utils_api.h"


void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu,
void pkt_capture_mon(struct pkt_capture_cb_context *cb_ctx, qdf_nbuf_t msdu,
		     struct wlan_objmgr_vdev *vdev, uint16_t ch_freq)
		     struct wlan_objmgr_vdev *vdev, uint16_t ch_freq)
{
{
	struct radiotap_header *rthdr;
	uint8_t rtlen, type, sub_type;
	struct ieee80211_frame *wh;
	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
	cdp_config_param_type val;
	uint16_t status;
	tSirMacAuthFrameBody *auth;
	struct pkt_capture_vdev_priv *vdev_priv;

	rthdr = (struct radiotap_header *)qdf_nbuf_data(msdu);
	rtlen = rthdr->it_len;
	wh = (struct ieee80211_frame *)(qdf_nbuf_data(msdu) + rtlen);
	type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
	sub_type = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;

	vdev_priv = pkt_capture_vdev_get_priv(vdev);
	if (!vdev_priv) {
		pkt_capture_err("packet capture vdev priv is NULL");
		return;
	}

	/*
	 *  Update channel only if successful AUTH Resp is received.
	 *  This is done so that EAPOL M1 data frame have correct
	 *  channel
	 */
	if ((type == IEEE80211_FC0_TYPE_MGT) &&
	    (sub_type == MGMT_SUBTYPE_AUTH)) {
		uint8_t chan = wlan_freq_to_chan(ch_freq);

		auth = (tSirMacAuthFrameBody *)(qdf_nbuf_data(msdu) + rtlen +
			sizeof(tSirMacMgmtHdr));

		if (auth->authTransactionSeqNumber == SIR_MAC_AUTH_FRAME_2 ||
		    auth->authTransactionSeqNumber == SIR_MAC_AUTH_FRAME_4) {
			if (auth->authStatusCode == STATUS_SUCCESS) {
				val.cdp_pdev_param_monitor_chan = chan;
				cdp_txrx_set_pdev_param(
					soc, wlan_objmgr_pdev_get_pdev_id(pdev),
					CDP_MONITOR_CHANNEL, val);

				val.cdp_pdev_param_mon_freq = ch_freq;
				cdp_txrx_set_pdev_param(
					soc, wlan_objmgr_pdev_get_pdev_id(pdev),
					CDP_MONITOR_FREQUENCY, val);
			}
		}
	}

	/*
	 *  Update channel to last connected channel in case of assoc/reassoc
	 *  response failure and save current chan in case of success
	 */
	if ((type == IEEE80211_FC0_TYPE_MGT) &&
	    ((sub_type == MGMT_SUBTYPE_ASSOC_RESP) ||
	    (sub_type == MGMT_SUBTYPE_REASSOC_RESP))) {
		if (qdf_nbuf_len(msdu) < (rtlen + sizeof(tSirMacMgmtHdr) +
		   SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET)) {
			pkt_capture_err("Packet length is less than expected");
			qdf_nbuf_free(msdu);
			return;
		}

		status = (uint16_t)(*(qdf_nbuf_data(msdu) + rtlen +
			 sizeof(tSirMacMgmtHdr) +
			 SIR_MAC_ASSOC_RSP_STATUS_CODE_OFFSET));

		if (status == STATUS_SUCCESS) {
			vdev_priv->last_freq = vdev_priv->curr_freq;
			vdev_priv->curr_freq = ch_freq;
		} else {
			uint8_t chan_num;

			chan_num = wlan_reg_freq_to_chan(pdev,
							 vdev_priv->last_freq);

			val.cdp_pdev_param_monitor_chan = chan_num;
			cdp_txrx_set_pdev_param(
				soc, wlan_objmgr_pdev_get_pdev_id(pdev),
				CDP_MONITOR_CHANNEL, val);

			val.cdp_pdev_param_mon_freq = vdev_priv->last_freq;
			cdp_txrx_set_pdev_param(
				soc, wlan_objmgr_pdev_get_pdev_id(pdev),
				CDP_MONITOR_FREQUENCY, val);

			vdev_priv->curr_freq = vdev_priv->last_freq;
		}
	}

	if (cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu) != QDF_STATUS_SUCCESS) {
	if (cb_ctx->mon_cb(cb_ctx->mon_ctx, msdu) != QDF_STATUS_SUCCESS) {
		pkt_capture_err("Frame Rx to HDD failed");
		pkt_capture_err("Frame Rx to HDD failed");
		qdf_nbuf_free(msdu);
		qdf_nbuf_free(msdu);
+5 −1
Original line number Original line Diff line number Diff line
/*
/*
 * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2021 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
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * any purpose with or without fee is hereby granted, provided that the
@@ -960,7 +961,10 @@ cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
		if (sup_disabled_roam) {
		if (sup_disabled_roam) {
			mlme_err("vdev[%d]: supplicant disabled roam. clear roam scan mode",
			mlme_err("vdev[%d]: supplicant disabled roam. clear roam scan mode",
				 vdev_id);
				 vdev_id);
			cm_roam_switch_to_rso_stop(pdev, vdev_id, reason);
			status = cm_roam_stop_req(psoc, vdev_id,
						  REASON_DISCONNECTED);
			if (QDF_IS_STATUS_ERROR(status))
				mlme_err("ROAM: Unable to clear roam scan mode");
		}
		}


	case WLAN_ROAM_INIT:
	case WLAN_ROAM_INIT:
Loading