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
This commit is contained in:
Michael Bestas 2022-11-09 19:40:09 +02:00
commit e621ebf5e4
No known key found for this signature in database
GPG key ID: CC95044519BE6669
9 changed files with 122 additions and 117 deletions

View file

@ -33,6 +33,7 @@
#include "dp_internal.h"
#include "cds_utils.h"
#include "htt_ppdu_stats.h"
#include <cdp_txrx_ctrl.h>
#endif
#define RESERVE_BYTES (100)
@ -262,16 +263,15 @@ pkt_capture_update_tx_status(
struct mon_rx_status *tx_status,
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 wlan_objmgr_vdev *vdev = context;
htt_ppdu_stats_for_smu_tlv *smu;
struct wlan_objmgr_psoc *psoc;
struct pkt_capture_ppdu_stats_q_node *q_node;
qdf_list_node_t *node;
uint32_t conn_count;
uint8_t vdev_id;
int i;
cdp_config_param_type val;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
@ -279,18 +279,19 @@ pkt_capture_update_tx_status(
return;
}
vdev_id = wlan_vdev_get_id(vdev);
/* Update the connected channel info from policy manager */
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 (!pdev) {
pkt_capture_err("pdev is NULL");
return;
}
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);
if (qdf_unlikely(!vdev_priv))
goto skip_ppdu_stats;

View file

@ -823,6 +823,7 @@ QDF_STATUS pkt_capture_deregister_callbacks(struct wlan_objmgr_vdev *vdev)
&vdev_priv->mon_ctx->mon_event_flag);
set_bit(PKT_CAPTURE_RX_POST_EVENT,
&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);
/*

View file

@ -31,6 +31,7 @@
#include "wlan_mgmt_txrx_utils_api.h"
#include "wlan_utility.h"
#include "cds_ieee80211_common.h"
#include "cdp_txrx_ctrl.h"
enum pkt_capture_tx_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 pkt_capture_mon_pkt *pkt;
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,
QDF_STA_MODE,
WLAN_PKT_CAPTURE_ID);
if (!vdev) {
pkt_capture_err("vdev is NULL");
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
*/

View file

@ -24,104 +24,12 @@
#include "wlan_pkt_capture_mon_thread.h"
#include "cds_ieee80211_common.h"
#include "wlan_mgmt_txrx_utils_api.h"
#include "cdp_txrx_ctrl.h"
#include "cfg_ucfg_api.h"
#include "wlan_mgmt_txrx_utils_api.h"
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 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) {
pkt_capture_err("Frame Rx to HDD failed");
qdf_nbuf_free(msdu);

View file

@ -1,5 +1,6 @@
/*
* 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
* 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) {
mlme_err("vdev[%d]: supplicant disabled roam. clear roam scan mode",
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:

View file

@ -982,7 +982,6 @@ static void __hdd_soc_recovery_shutdown(void)
/* recovery starts via firmware down indication; ensure we got one */
QDF_BUG(cds_is_driver_recovering());
hdd_init_start_completion();
hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
if (!hdd_ctx) {
@ -2097,6 +2096,7 @@ wlan_hdd_pld_uevent(struct device *dev, struct pld_uevent_data *event_data)
cds_set_target_ready(false);
cds_set_recovery_in_progress(true);
hdd_init_start_completion();
/* Notify external threads currently waiting on firmware
* by forcefully completing waiting events with a "reset"

View file

@ -16848,6 +16848,9 @@ static ssize_t wlan_hdd_state_ctrl_param_write(struct file *filp,
}
}
hdd_info("is_driver_loaded %d is_driver_recovering %d",
cds_is_driver_loaded(), cds_is_driver_recovering());
if (!cds_is_driver_loaded() || cds_is_driver_recovering()) {
rc = wait_for_completion_timeout(&wlan_start_comp,
msecs_to_jiffies(HDD_WLAN_START_WAIT_TIME));

View file

@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 2
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 8
#define QWLAN_VERSION_EXTRA ""
#define QWLAN_VERSION_EXTRA "E"
#define QWLAN_VERSION_BUILD 31
#define QWLAN_VERSIONSTR "2.0.8.31"
#define QWLAN_VERSIONSTR "2.0.8.31E"
#endif /* QWLAN_VERSION_H */

View file

@ -617,14 +617,7 @@ void csr_roam_reset_roam_params(struct mac_context *mac_ctx)
static void csr_roam_restore_default_config(struct mac_context *mac_ctx,
uint8_t vdev_id)
{
struct wlan_roam_triggers triggers;
sme_set_roam_config_enable(MAC_HANDLE(mac_ctx), vdev_id, 0);
triggers.vdev_id = vdev_id;
triggers.trigger_bitmap = wlan_mlme_get_roaming_triggers(mac_ctx->psoc);
sme_debug("Reset roam trigger bitmap to 0x%x", triggers.trigger_bitmap);
wlan_cm_rso_set_roam_trigger(mac_ctx->pdev, vdev_id, &triggers);
sme_roam_control_restore_default_config(MAC_HANDLE(mac_ctx),
vdev_id);
}