diff --git a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c index b67f30909bcc..6cebfe5481b9 100644 --- a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c +++ b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c @@ -33,6 +33,7 @@ #include "dp_internal.h" #include "cds_utils.h" #include "htt_ppdu_stats.h" +#include #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; diff --git a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 5d1e3ee2b7d8..72b08322e3fc 100644 --- a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -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); /* diff --git a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index 1e3aea3a5a38..d185bb943250 100644 --- a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c index be99be8ee939..9529c510cef7 100644 --- a/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c +++ b/drivers/staging/qcacld-3.0/components/pkt_capture/core/src/wlan_pkt_capture_mon_thread.c @@ -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); diff --git a/drivers/staging/qcacld-3.0/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c b/drivers/staging/qcacld-3.0/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c index 0629bee47550..d1618afbcce8 100644 --- a/drivers/staging/qcacld-3.0/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c +++ b/drivers/staging/qcacld-3.0/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c @@ -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: diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_driver_ops.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_driver_ops.c index 7f782feffdb9..3fac407753c1 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_driver_ops.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_driver_ops.c @@ -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" diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c index 3ccb2ecd2bde..ada7bcae71a4 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c @@ -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)); diff --git a/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h b/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h index c10903319e19..2ceb79ce812d 100644 --- a/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h +++ b/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c index adc6fd867f98..1a3e40532eb0 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c +++ b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c @@ -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); }