summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/cds/inc/cds_regdomain.h4
-rw-r--r--core/cds/inc/cds_sched.h6
-rw-r--r--core/cds/src/cds_api.c2
-rw-r--r--core/cds/src/cds_concurrency.c5
-rw-r--r--core/cds/src/cds_sched.c2
-rw-r--r--core/dp/htt/htt_t2h.c77
-rw-r--r--core/dp/ol/inc/ol_txrx_osif_api.h6
-rw-r--r--core/dp/txrx/ol_rx.c3
-rw-r--r--core/dp/txrx/ol_rx_defrag.c3
-rw-r--r--core/dp/txrx/ol_tx_send.c21
-rw-r--r--core/dp/txrx/ol_txrx.c86
-rw-r--r--core/dp/txrx/ol_txrx.h25
-rw-r--r--core/dp/txrx/ol_txrx_types.h1
-rw-r--r--core/hdd/inc/wlan_hdd_assoc.h10
-rw-r--r--core/hdd/inc/wlan_hdd_main.h12
-rw-r--r--core/hdd/src/wlan_hdd_assoc.c25
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c9
-rw-r--r--core/hdd/src/wlan_hdd_ext_scan.c6
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c17
-rw-r--r--core/hdd/src/wlan_hdd_ioctl.c5
-rw-r--r--core/hdd/src/wlan_hdd_main.c80
-rw-r--r--core/hdd/src/wlan_hdd_memdump.c14
-rw-r--r--core/hdd/src/wlan_hdd_p2p.c3
-rw-r--r--core/hdd/src/wlan_hdd_power.c7
-rw-r--r--core/mac/inc/qwlan_version.h6
-rw-r--r--core/mac/inc/sir_api.h17
-rw-r--r--core/mac/src/include/sir_params.h4
-rw-r--r--core/mac/src/pe/lim/lim_ft_preauth.c5
-rw-r--r--core/mac/src/pe/lim/lim_p2p.c3
-rw-r--r--core/mac/src/pe/lim/lim_process_sme_req_messages.c8
-rw-r--r--core/mac/src/pe/rrm/rrm_api.c4
-rw-r--r--core/mac/src/sys/legacy/src/utils/src/mac_trace.c4
-rw-r--r--core/sap/src/sap_fsm.c4
-rw-r--r--core/sme/inc/csr_support.h4
-rw-r--r--core/sme/src/common/sme_api.c2
-rw-r--r--core/sme/src/csr/csr_api_roam.c136
-rw-r--r--core/sme/src/csr/csr_api_scan.c18
-rw-r--r--core/sme/src/csr/csr_inside_api.h7
-rw-r--r--core/wma/inc/wma.h17
-rw-r--r--core/wma/inc/wma_api.h12
-rw-r--r--core/wma/inc/wma_types.h2
-rw-r--r--core/wma/src/wma_data.c18
-rw-r--r--core/wma/src/wma_dev_if.c30
-rw-r--r--core/wma/src/wma_main.c13
-rw-r--r--core/wma/src/wma_mgmt.c70
-rw-r--r--core/wma/src/wma_scan_roam.c106
-rw-r--r--core/wma/src/wma_utils.c30
47 files changed, 714 insertions, 235 deletions
diff --git a/core/cds/inc/cds_regdomain.h b/core/cds/inc/cds_regdomain.h
index 664e2ca8ac9c..0e925b2637c5 100644
--- a/core/cds/inc/cds_regdomain.h
+++ b/core/cds/inc/cds_regdomain.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2014-2019 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
@@ -65,7 +65,7 @@
#define MAX_CHANNELS_PER_OPERATING_CLASS 25
#define CDS_MAX_SUPP_OPER_CLASSES 32
#define MIN_TX_PWR_CAP 8
-#define MAX_TX_PWR_CAP 22
+#define MAX_TX_PWR_CAP 30
#define CTRY_DEFAULT 0
#define CTRY_FLAG 0x8000
diff --git a/core/cds/inc/cds_sched.h b/core/cds/inc/cds_sched.h
index 835b5a04c082..eae8de839f91 100644
--- a/core/cds/inc/cds_sched.h
+++ b/core/cds/inc/cds_sched.h
@@ -43,6 +43,7 @@
#include "cds_config.h"
#include "cds_reg_service.h"
#include "qdf_cpuhp.h"
+#include "ol_txrx.h"
#define TX_POST_EVENT 0x001
#define TX_SUSPEND_EVENT 0x002
@@ -90,7 +91,8 @@ typedef void (*cds_ol_rx_thread_cb)(void *context, void *rxpkt, uint16_t staid);
typedef void (*cds_ol_mon_thread_cb)(
void *context, void *monpkt,
uint8_t vdev_id, uint8_t tid,
- uint8_t status, bool pkt_format);
+ struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format);
typedef int (*send_mode_change_event_cb)(void);
@@ -140,7 +142,7 @@ struct cds_ol_mon_pkt {
uint8_t tid;
/* Tx packet status */
- uint8_t status;
+ struct ol_mon_tx_status pkt_tx_status;
/* 0 = 802.3 format , 1 = 802.11 format */
bool pkt_format;
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index c6de500cc785..c8898ebb5aa5 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -1180,7 +1180,7 @@ void *cds_get_context(QDF_MODULE_ID moduleId)
}
if (pModContext == NULL) {
- QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
+ QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
"%s: Module ID %i context is Null", __func__,
moduleId);
}
diff --git a/core/cds/src/cds_concurrency.c b/core/cds/src/cds_concurrency.c
index b3b500b38692..d4e2a8fc6298 100644
--- a/core/cds/src/cds_concurrency.c
+++ b/core/cds/src/cds_concurrency.c
@@ -3036,6 +3036,11 @@ bool cds_is_connection_in_progress(uint8_t *session_id,
}
if (hdd_ctx->connection_in_progress) {
cds_debug("AP/GO: connection is in progress");
+ if (session_id && reason) {
+ *session_id = adapter->sessionId;
+ *reason =
+ eHDD_SAP_CONNECTION_IN_PROGRESS;
+ }
return true;
}
}
diff --git a/core/cds/src/cds_sched.c b/core/cds/src/cds_sched.c
index 5bb7e5bdd6e3..a1f8cf6c4ea4 100644
--- a/core/cds/src/cds_sched.c
+++ b/core/cds/src/cds_sched.c
@@ -1565,7 +1565,7 @@ static void cds_mon_from_queue(p_cds_sched_context pschedcontext)
vdev_id = pkt->vdev_id;
tid = pkt->tid;
pkt->callback(pkt->context, pkt->monpkt, vdev_id,
- tid, pkt->status, pkt->pkt_format);
+ tid, pkt->pkt_tx_status, pkt->pkt_format);
cds_free_ol_mon_pkt(pschedcontext, pkt);
spin_lock_bh(&pschedcontext->ol_mon_queue_lock);
}
diff --git a/core/dp/htt/htt_t2h.c b/core/dp/htt/htt_t2h.c
index ff5c6e281b68..2548ea72ebbf 100644
--- a/core/dp/htt/htt_t2h.c
+++ b/core/dp/htt/htt_t2h.c
@@ -186,6 +186,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
uint16_t seq_num_start, seq_num_end;
enum htt_rx_flush_action action;
+ if (qdf_nbuf_len(htt_t2h_msg) < HTT_RX_FLUSH_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
+
peer_id = HTT_RX_FLUSH_PEER_ID_GET(*msg_word);
tid = HTT_RX_FLUSH_TID_GET(*msg_word);
seq_num_start =
@@ -228,7 +234,13 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
{
uint16_t peer_id;
uint8_t tid;
+ int msg_len = qdf_nbuf_len(htt_t2h_msg);
+ if (msg_len < HTT_RX_FRAG_IND_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
peer_id = HTT_RX_FRAG_IND_PEER_ID_GET(*msg_word);
tid = HTT_RX_FRAG_IND_EXT_TID_GET(*msg_word);
htt_rx_frag_set_last_msdu(pdev, htt_t2h_msg);
@@ -289,6 +301,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
uint16_t peer_id;
uint8_t vdev_id;
+ if (qdf_nbuf_len(htt_t2h_msg) < HTT_RX_PEER_MAP_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
+
peer_id = HTT_RX_PEER_MAP_PEER_ID_GET(*msg_word);
vdev_id = HTT_RX_PEER_MAP_VDEV_ID_GET(*msg_word);
peer_mac_addr = htt_t2h_mac_addr_deswizzle(
@@ -312,6 +330,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
{
uint16_t peer_id;
+ if (qdf_nbuf_len(htt_t2h_msg) < HTT_RX_PEER_UNMAP_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
+
peer_id = HTT_RX_PEER_UNMAP_PEER_ID_GET(*msg_word);
if (peer_id > ol_cfg_max_peer_id(pdev->ctrl_pdev)) {
qdf_print("%s: HTT_T2H_MSG_TYPE_PEER_UNMAP,"
@@ -330,6 +354,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
enum htt_sec_type sec_type;
int is_unicast;
+ if (qdf_nbuf_len(htt_t2h_msg) < HTT_SEC_IND_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
+
peer_id = HTT_SEC_IND_PEER_ID_GET(*msg_word);
sec_type = HTT_SEC_IND_SEC_TYPE_GET(*msg_word);
is_unicast = HTT_SEC_IND_UNICAST_GET(*msg_word);
@@ -417,6 +447,13 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
uint32_t htt_credit_delta_abs;
int32_t htt_credit_delta;
int sign, old_credit;
+ int msg_len = qdf_nbuf_len(htt_t2h_msg);
+
+ if (msg_len < HTT_TX_CREDIT_MSG_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
htt_credit_delta_abs =
HTT_TX_CREDIT_DELTA_ABS_GET(*msg_word);
@@ -544,8 +581,16 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
struct ol_error_info err_info;
struct ol_txrx_vdev_t *vdev;
struct ol_txrx_peer_t *peer;
- uint16_t peer_id =
- HTT_RX_OFLD_PKT_ERR_MIC_ERR_PEER_ID_GET
+ uint16_t peer_id;
+ int msg_len = qdf_nbuf_len(htt_t2h_msg);
+
+ if (msg_len < HTT_RX_OFLD_PKT_ERR_MIC_ERR_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
+
+ peer_id = HTT_RX_OFLD_PKT_ERR_MIC_ERR_PEER_ID_GET
(*(msg_word + 1));
peer = ol_txrx_peer_find_by_id(pdev->txrx_pdev,
@@ -849,6 +894,13 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
uint16_t peer_id;
uint8_t tid, pn_ie_cnt, *pn_ie = NULL;
uint16_t seq_num_start, seq_num_end;
+ int msg_len = qdf_nbuf_len(htt_t2h_msg);
+
+ if (msg_len < HTT_RX_PN_IND_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
/*First dword */
peer_id = HTT_RX_PN_IND_PEER_ID_GET(*msg_word);
@@ -861,6 +913,13 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
seq_num_end = HTT_RX_PN_IND_SEQ_NUM_END_GET(*msg_word);
pn_ie_cnt = HTT_RX_PN_IND_PN_IE_CNT_GET(*msg_word);
+ if (msg_len - HTT_RX_PN_IND_BYTES <
+ pn_ie_cnt * sizeof(uint8_t)) {
+ qdf_print("invalid pn_ie count");
+ WARN_ON(1);
+ break;
+ }
+
msg_word++;
/*Third dword */
if (pn_ie_cnt)
@@ -1138,6 +1197,13 @@ void htt_t2h_msg_handler_fast(void *context, qdf_nbuf_t *cmpl_msdus,
u_int16_t peer_id;
u_int8_t tid, pn_ie_cnt, *pn_ie = NULL;
int seq_num_start, seq_num_end;
+ int msg_len = qdf_nbuf_len(htt_t2h_msg);
+
+ if (msg_len < HTT_RX_PN_IND_BYTES) {
+ qdf_print("invalid nbuff len");
+ WARN_ON(1);
+ break;
+ }
/*First dword */
peer_id = HTT_RX_PN_IND_PEER_ID_GET(*msg_word);
@@ -1152,6 +1218,13 @@ void htt_t2h_msg_handler_fast(void *context, qdf_nbuf_t *cmpl_msdus,
pn_ie_cnt =
HTT_RX_PN_IND_PN_IE_CNT_GET(*msg_word);
+ if (msg_len - HTT_RX_PN_IND_BYTES <
+ pn_ie_cnt * sizeof(uint8_t)) {
+ qdf_print("invalid pn_ie len");
+ WARN_ON(1);
+ break;
+ }
+
msg_word++;
/*Third dword*/
if (pn_ie_cnt)
diff --git a/core/dp/ol/inc/ol_txrx_osif_api.h b/core/dp/ol/inc/ol_txrx_osif_api.h
index d2fe056a63d2..c89c56da105b 100644
--- a/core/dp/ol/inc/ol_txrx_osif_api.h
+++ b/core/dp/ol/inc/ol_txrx_osif_api.h
@@ -83,7 +83,7 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer,
* @mon_buf_list: netbuf list
* @type: data process type
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
@@ -91,7 +91,9 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer,
void ol_txrx_mon_data_process(uint8_t vdev_id,
qdf_nbuf_t mon_buf_list,
enum mon_data_process_type type,
- uint8_t tid, uint8_t status, bool pktformat);
+ uint8_t tid,
+ struct ol_mon_tx_status pkt_tx_status,
+ bool pktformat);
void ol_txrx_flush_rx_frames(struct ol_txrx_peer_t *peer,
bool drop);
diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c
index 17f3696b2ab3..e4310496dd35 100644
--- a/core/dp/txrx/ol_rx.c
+++ b/core/dp/txrx/ol_rx.c
@@ -1476,6 +1476,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev,
uint32_t filled = 0;
uint8_t vdev_id;
bool is_pkt_capture_flow_id = false;
+ struct ol_mon_tx_status pkt_tx_status = {0};
if (tid >= OL_TXRX_NUM_EXT_TIDS) {
ol_txrx_err("%s: invalid tid, %u\n", __FUNCTION__, tid);
@@ -1585,7 +1586,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev,
if (head_mon_msdu)
ol_txrx_mon_data_process(
vdev_id, head_mon_msdu,
- PROCESS_TYPE_DATA_RX, 0, 0,
+ PROCESS_TYPE_DATA_RX, 0, pkt_tx_status,
TXRX_PKT_FORMAT_8023);
if (is_pkt_capture_flow_id) {
diff --git a/core/dp/txrx/ol_rx_defrag.c b/core/dp/txrx/ol_rx_defrag.c
index 4373999b4467..84045eb8ad58 100644
--- a/core/dp/txrx/ol_rx_defrag.c
+++ b/core/dp/txrx/ol_rx_defrag.c
@@ -684,6 +684,7 @@ ol_rx_defrag(ol_txrx_pdev_handle pdev,
struct ieee80211_frame *wh;
uint8_t key[DEFRAG_IEEE80211_KEY_LEN];
htt_pdev_handle htt_pdev = pdev->htt_pdev;
+ struct ol_mon_tx_status pkt_tx_status = {0};
vdev = peer->vdev;
@@ -832,7 +833,7 @@ ol_rx_defrag(ol_txrx_pdev_handle pdev,
if (head_mon_msdu)
ol_txrx_mon_data_process(
vdev->vdev_id, head_mon_msdu,
- PROCESS_TYPE_DATA_RX, 0, 0,
+ PROCESS_TYPE_DATA_RX, 0, pkt_tx_status,
TXRX_PKT_FORMAT_8023);
}
diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c
index da4ab21e38c1..a1c433499fe2 100644
--- a/core/dp/txrx/ol_tx_send.c
+++ b/core/dp/txrx/ol_tx_send.c
@@ -54,6 +54,7 @@
#include <ol_txrx.h>
#include <pktlog_ac_fmt.h>
#include <utils_api.h>
+#include "cds_utils.h"
#ifdef TX_CREDIT_RECLAIM_SUPPORT
@@ -835,6 +836,10 @@ ol_tx_process_mon_tx_completion(
qdf_nbuf_t netbuf;
int nbuf_len;
struct qdf_tso_seg_elem_t *tso_seg = NULL;
+ struct ol_mon_tx_status pkt_tx_status = {0};
+
+ pkt_tx_status.status = status;
+ pkt_tx_status.tx_retry_cnt = payload->tx_retry_cnt;
qdf_assert(tx_desc);
@@ -928,7 +933,7 @@ ol_tx_process_mon_tx_completion(
ol_txrx_mon_data_process(tx_desc->vdev_id,
netbuf, PROCESS_TYPE_DATA_TX_COMPL,
- tid, status, TXRX_PKT_FORMAT_8023);
+ tid, pkt_tx_status, TXRX_PKT_FORMAT_8023);
}
void
@@ -936,7 +941,7 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg)
{
int nbuf_len;
qdf_nbuf_t netbuf;
- uint8_t status;
+ struct ol_mon_tx_status pkt_tx_status = {0};
uint8_t tid = 0;
bool pkt_format;
u_int32_t *msg_word = (u_int32_t *)msg;
@@ -945,6 +950,7 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg)
struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg;
bool is_pkt_during_roam = false;
uint8_t vdev_id;
+ uint32_t freq = 0;
offload_deliver_msg = (struct htt_tx_offload_deliver_ind_hdr_t *)msg;
@@ -974,18 +980,23 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg)
qdf_mem_copy(qdf_nbuf_data(netbuf), txhdr,
sizeof(struct htt_tx_data_hdr_information));
- status = offload_deliver_msg->status;
+ pkt_tx_status.status = offload_deliver_msg->status;
+ pkt_tx_status.tx_retry_cnt = offload_deliver_msg->tx_retry_cnt;
pkt_format = offload_deliver_msg->format;
tid = offload_deliver_msg->tid_num;
/* Is FW sends offload data during roaming */
is_pkt_during_roam = (offload_deliver_msg->reserved_2 ? true : false);
- if (is_pkt_during_roam)
+ if (is_pkt_during_roam) {
vdev_id = HTT_INVALID_VDEV;
+ freq = (uint32_t)offload_deliver_msg->reserved_3;
+
+ ol_htt_mon_note_chan(pdev, cds_freq_to_chan(freq));
+ }
ol_txrx_mon_data_process(
vdev_id,
netbuf, PROCESS_TYPE_DATA_TX,
- tid, status, pkt_format);
+ tid, pkt_tx_status, pkt_format);
}
/**
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 155e3a2e0873..5fdd4219b784 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -115,6 +115,8 @@ enum dpt_set_param_debugfs {
#define OL_TXRX_PEER_DEC_REF_CNT_SILENT(peer) \
qdf_atomic_dec(&peer->ref_cnt)
+#define NORMALIZED_TO_NOISE_FLOOR (-96)
+
ol_txrx_peer_handle
ol_txrx_peer_find_by_local_id_inc_ref(struct ol_txrx_pdev_t *pdev,
uint8_t local_peer_id);
@@ -5471,14 +5473,15 @@ static inline int ol_txrx_drop_nbuf_list(qdf_nbuf_t buf_list)
* @nbuf_list: netbuf list
* @vdev_id: vdev id for which packet is captured
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
*/
static void
ol_txrx_mon_mgmt_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid, struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
uint8_t drop_count;
@@ -5529,6 +5532,7 @@ bool ol_txrx_mon_mgmt_process(struct mon_rx_status *txrx_status,
struct cds_ol_mon_pkt *pkt;
ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX);
p_cds_sched_context sched_ctx = get_cds_sched_ctxt();
+ struct ol_mon_tx_status pkt_tx_status = {0};
if (unlikely(!sched_ctx))
return false;
@@ -5554,7 +5558,7 @@ bool ol_txrx_mon_mgmt_process(struct mon_rx_status *txrx_status,
pkt->monpkt = (void *)nbuf;
pkt->vdev_id = HTT_INVALID_VDEV;
pkt->tid = HTT_INVALID_TID;
- pkt->status = status;
+ pkt->pkt_tx_status = pkt_tx_status;
pkt->pkt_format = TXRX_PKT_FORMAT_80211;
cds_indicate_monpkt(sched_ctx, pkt);
@@ -5856,7 +5860,14 @@ ol_txrx_update_tx_status(struct ol_txrx_pdev_t *pdev,
IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ);
tx_status->chan_flags = channel_flags;
- tx_status->ant_signal_db = mon_hdr->rssi_comb;
+ /* RSSI is filled with TPC which will be normalized
+ * during radiotap updation, so add 96 here
+ */
+ tx_status->ant_signal_db =
+ mon_hdr->rssi_comb - NORMALIZED_TO_NOISE_FLOOR;
+ tx_status->tx_status = mon_hdr->status;
+ tx_status->add_rtap_ext = true;
+ tx_status->tx_retry_cnt = mon_hdr->tx_retry_cnt;
}
/**
@@ -5866,14 +5877,15 @@ ol_txrx_update_tx_status(struct ol_txrx_pdev_t *pdev,
* @nbuf_list: netbuf list
* @vdev_id: vdev id for which packet is captured
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
*/
static void
ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid, struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
qdf_nbuf_t msdu, next_buf;
@@ -5945,6 +5957,8 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
mon_hdr.sgi = cmpl_desc->sgi;
mon_hdr.ldpc = cmpl_desc->ldpc;
mon_hdr.beamformed = cmpl_desc->beamformed;
+ mon_hdr.status = pkt_tx_status.status;
+ mon_hdr.tx_retry_cnt = pkt_tx_status.tx_retry_cnt;
qdf_nbuf_pull_head(
msdu,
@@ -6029,8 +6043,10 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
/*
* Get the channel info and update the rx status
*/
- cds_get_chan_by_session_id(vdev_id, &chan);
- ol_htt_mon_note_chan(pdev, chan);
+ if (vdev_id != HTT_INVALID_VDEV) {
+ cds_get_chan_by_session_id(vdev_id, &chan);
+ ol_htt_mon_note_chan(pdev, chan);
+ }
ol_txrx_update_tx_status(pdev, &tx_status, &mon_hdr);
@@ -6049,6 +6065,7 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
msdu = next_buf;
}
+
return;
free_buf:
@@ -6062,14 +6079,15 @@ free_buf:
* @nbuf_list: netbuf list
* @vdev_id: vdev id for which packet is captured
* @tid: tid number
- * @status: Tx status
+ * @pkt_tx_status: Tx status
* @pktformat: Frame format
*
* Return: none
*/
static void
ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid, struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
qdf_nbuf_t buf_list = (qdf_nbuf_t)nbuf_list;
@@ -6154,10 +6172,16 @@ ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
/*
* Get the channel info and update the rx status
*/
- cds_get_chan_by_session_id(vdev_id, &chan);
- ol_htt_mon_note_chan(pdev, chan);
+ if (vdev_id != HTT_INVALID_VDEV) {
+ cds_get_chan_by_session_id(vdev_id, &chan);
+ ol_htt_mon_note_chan(pdev, chan);
+ }
htt_rx_mon_get_rx_status(pdev->htt_pdev, rx_desc, &rx_status);
+ rx_status.tx_status = pkt_tx_status.status;
+ rx_status.add_rtap_ext = true;
+ rx_status.tx_retry_cnt = pkt_tx_status.tx_retry_cnt;
+
/* clear IEEE80211_RADIOTAP_F_FCS flag*/
rx_status.rtap_flags &= ~(BIT(4));
rx_status.rtap_flags &= ~(BIT(2));
@@ -6194,16 +6218,50 @@ free_buf:
drop_count = ol_txrx_drop_nbuf_list(buf_list);
}
+/**
+ * ol_txrx_pktcapture_status_map() - map Tx status for data packets
+ * with packet capture Tx status
+ * @status: Tx status
+ *
+ * Return: pktcapture_tx_status enum
+ */
+static enum pktcapture_tx_status
+ol_txrx_pktcapture_status_map(uint8_t status)
+{
+ enum pktcapture_tx_status tx_status;
+
+ switch (status) {
+ case htt_tx_status_ok:
+ tx_status = pktcapture_tx_status_ok;
+ break;
+ case htt_tx_status_discard:
+ tx_status = pktcapture_tx_status_discard;
+ break;
+ case htt_tx_status_no_ack:
+ tx_status = pktcapture_tx_status_no_ack;
+ break;
+ default:
+ tx_status = pktcapture_tx_status_discard;
+ break;
+ }
+
+ return tx_status;
+}
+
void ol_txrx_mon_data_process(uint8_t vdev_id,
qdf_nbuf_t mon_buf_list,
enum mon_data_process_type type,
- uint8_t tid, uint8_t status, bool pkt_format)
+ uint8_t tid,
+ struct ol_mon_tx_status pkt_tx_status,
+ bool pkt_format)
{
uint8_t drop_count;
struct cds_ol_mon_pkt *pkt;
ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX);
p_cds_sched_context sched_ctx = get_cds_sched_ctxt();
cds_ol_mon_thread_cb callback = NULL;
+ pkt_tx_status.status =
+ ol_txrx_pktcapture_status_map(pkt_tx_status.status);
if (!pdev) {
ol_txrx_err("pdev is NULL");
@@ -6233,7 +6291,7 @@ void ol_txrx_mon_data_process(uint8_t vdev_id,
pkt->monpkt = (void *)mon_buf_list;
pkt->vdev_id = vdev_id;
pkt->tid = tid;
- pkt->status = status;
+ pkt->pkt_tx_status = pkt_tx_status;
pkt->pkt_format = pkt_format;
cds_indicate_monpkt(sched_ctx, pkt);
return;
diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h
index 8bdd418f587d..a4498059c839 100644
--- a/core/dp/txrx/ol_txrx.h
+++ b/core/dp/txrx/ol_txrx.h
@@ -212,4 +212,29 @@ struct ol_txrx_fw_stats_desc_t
struct ol_txrx_stats_req_internal *ol_txrx_fw_stats_desc_get_req(struct
ol_txrx_pdev_t *pdev, uint8_t desc_id);
+/**
+ * enum pktcapture_tx_status - packet capture tx status
+ * @pktcapture_tx_status_ok: successfully sent + acked
+ * @pktcapture_tx_status_discard: discard - not sent
+ * @pktcapture_tx_status_no_ack: no_ack - sent, but no ack
+ *
+ * This enum has tx status types for packet capture mode
+ */
+enum pktcapture_tx_status {
+ pktcapture_tx_status_ok,
+ pktcapture_tx_status_discard,
+ pktcapture_tx_status_no_ack,
+};
+
+/*
+ * struct ol_mon_tx_status - tx packets info
+ * @status: tx status
+ * @tx_retry_cnt: tx retry count
+ *
+ */
+
+struct ol_mon_tx_status {
+ uint8_t status;
+ uint8_t tx_retry_cnt;
+};
#endif /* _OL_TXRX__H_ */
diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h
index fe230839a151..3203a75ebeb0 100644
--- a/core/dp/txrx/ol_txrx_types.h
+++ b/core/dp/txrx/ol_txrx_types.h
@@ -576,6 +576,7 @@ struct ol_txrx_mon_hdr_elem_t {
bool beamformed;
bool dir; /* rx:0 , tx:1 */
uint8_t status; /* tx status */
+ uint8_t tx_retry_cnt;
};
/*
diff --git a/core/hdd/inc/wlan_hdd_assoc.h b/core/hdd/inc/wlan_hdd_assoc.h
index a5414a537160..bb3b945b76f2 100644
--- a/core/hdd/inc/wlan_hdd_assoc.h
+++ b/core/hdd/inc/wlan_hdd_assoc.h
@@ -269,6 +269,16 @@ tSirRFBand hdd_conn_get_connected_band(hdd_station_ctx_t *pHddStaCtx);
hdd_adapter_t *hdd_get_sta_connection_in_progress(hdd_context_t *hdd_ctx);
/**
+ * hdd_abort_ongoing_sta_connection() - Disconnect the sta for which the
+ * connection is in progress.
+ *
+ * @hdd_ctx: hdd context
+ *
+ * Return: none
+ */
+void hdd_abort_ongoing_sta_connection(hdd_context_t *hdd_ctx);
+
+/**
* hdd_sme_roam_callback() - hdd sme roam callback
* @pContext: pointer to adapter context
* @pRoamInfo: pointer to roam info
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 373bdd16fb17..0312da3f6601 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -363,6 +363,7 @@ enum {
* @eHDD_REASSOC_IN_PROGRESS: reassociation is in progress
* @eHDD_EAPOL_IN_PROGRESS: STA/P2P-CLI is in middle of EAPOL/WPS exchange
* @eHDD_SAP_EAPOL_IN_PROGRESS: SAP/P2P-GO is in middle of EAPOL/WPS exchange
+ * @eHDD_SAP_CONNECTION_IN_PROGRESS: SAP/P2P-GO is in middle of connection.
*/
typedef enum {
eHDD_SCAN_REJECT_DEFAULT = 0,
@@ -370,6 +371,7 @@ typedef enum {
eHDD_REASSOC_IN_PROGRESS,
eHDD_EAPOL_IN_PROGRESS,
eHDD_SAP_EAPOL_IN_PROGRESS,
+ eHDD_SAP_CONNECTION_IN_PROGRESS,
} scan_reject_states;
#define MAX_PROBE_REQ_OUIS 16
@@ -3268,6 +3270,16 @@ int hdd_driver_memdump_init(void);
void hdd_driver_memdump_deinit(void);
/**
+ * hdd_driver_mem_cleanup() - Frees memory allocated for
+ * driver dump
+ *
+ * This function frees driver dump memory.
+ *
+ * Return: None
+ */
+void hdd_driver_mem_cleanup(void);
+
+/**
* wlan_hdd_free_cache_channels() - Free the cache channels list
* @hdd_ctx: Pointer to HDD context
*
diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c
index 6bb9f473aafe..e04e9a0ed1ff 100644
--- a/core/hdd/src/wlan_hdd_assoc.c
+++ b/core/hdd/src/wlan_hdd_assoc.c
@@ -424,6 +424,24 @@ end:
return NULL;
}
+void hdd_abort_ongoing_sta_connection(hdd_context_t *hdd_ctx)
+{
+ hdd_adapter_t *sta_adapter;
+ QDF_STATUS status;
+
+ sta_adapter = hdd_get_sta_connection_in_progress(hdd_ctx);
+ if (sta_adapter) {
+ hdd_debug("Disconnecting STA on vdev: %d",
+ sta_adapter->sessionId);
+ status = wlan_hdd_disconnect(sta_adapter,
+ eCSR_DISCONNECT_REASON_DEAUTH);
+ if (QDF_IS_STATUS_ERROR(status)) {
+ hdd_err("wlan_hdd_disconnect failed, status: %d",
+ status);
+ }
+ }
+}
+
/**
* hdd_remove_beacon_filter() - remove beacon filter
* @adapter: Pointer to the hdd adapter
@@ -1561,6 +1579,13 @@ static void hdd_conn_remove_connect_info(hdd_station_ctx_t *pHddStaCtx)
pHddStaCtx->conn_info.proxyARPService = 0;
qdf_mem_zero(&pHddStaCtx->conn_info.SSID, sizeof(tCsrSSIDInfo));
+
+ /*
+ * Reset the ptk, gtk status flags to avoid using current connection
+ * status in further connections.
+ */
+ pHddStaCtx->conn_info.gtk_installed = false;
+ pHddStaCtx->conn_info.ptk_installed = false;
}
/**
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 4fe13ea02348..9d53066ec6c9 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -6689,7 +6689,7 @@ static int __wlan_hdd_cfg80211_wifi_logger_get_ring_data(struct wiphy *wiphy,
WLAN_LOG_REASON_CODE_UNUSED,
true, false);
if (QDF_STATUS_SUCCESS != status) {
- hdd_err("Failed to trigger bug report");
+ hdd_debug("Failed to trigger bug report");
return -EINVAL;
}
} else {
@@ -16958,6 +16958,13 @@ static int wlan_hdd_cfg80211_connect_start(hdd_adapter_t *pAdapter,
qdf_mem_zero(&hdd_sta_ctx->conn_info.conn_flag,
sizeof(hdd_sta_ctx->conn_info.conn_flag));
+ /*
+ * Reset the ptk, gtk status flags to avoid using old/previous
+ * connection status.
+ */
+ hdd_sta_ctx->conn_info.gtk_installed = false;
+ hdd_sta_ctx->conn_info.ptk_installed = false;
+
if (pRoamProfile) {
hdd_station_ctx_t *pHddStaCtx;
diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c
index 547955c429f7..37d7bfe4e9b1 100644
--- a/core/hdd/src/wlan_hdd_ext_scan.c
+++ b/core/hdd/src/wlan_hdd_ext_scan.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 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
@@ -2460,10 +2460,6 @@ __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy,
if (0 != ret)
return -EINVAL;
- if (!pHddCtx->config->extscan_enabled) {
- hdd_err("extscan not supported");
- return -ENOTSUPP;
- }
if (hdd_nla_parse(tb,
QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX,
data, data_len, wlan_hdd_extscan_config_policy)) {
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index fad7bb785f10..77088b08230b 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -8001,7 +8001,6 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
bool disable_fw_tdls_state = false;
uint8_t ignore_cac = 0;
uint8_t beacon_fixed_len;
- hdd_adapter_t *sta_adapter;
ENTER();
@@ -8035,12 +8034,7 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
* disconnect the STA interface first if connection or key exchange is
* in progress and then start SAP interface.
*/
- sta_adapter = hdd_get_sta_connection_in_progress(pHddCtx);
- if (sta_adapter) {
- hdd_debug("Disconnecting STA with session id: %d",
- sta_adapter->sessionId);
- wlan_hdd_disconnect(sta_adapter, eCSR_DISCONNECT_REASON_DEAUTH);
- }
+ hdd_abort_ongoing_sta_connection(pHddCtx);
/*
* Reject start bss if reassoc in progress on any adapter.
@@ -8717,7 +8711,6 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
hdd_scaninfo_t *pScanInfo = NULL;
- hdd_adapter_t *staAdapter = NULL;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
tSirUpdateIE updateIE;
@@ -8727,6 +8720,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
hdd_adapter_list_node_t *pAdapterNode = NULL;
hdd_adapter_list_node_t *pNext = NULL;
tsap_Config_t *pConfig;
+ hdd_adapter_t *staAdapter;
hdd_info("enter(%s)", netdev_name(dev));
@@ -8774,12 +8768,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
* the STA and complete the SAP operation. STA will reconnect
* after SAP stop is done.
*/
- staAdapter = hdd_get_sta_connection_in_progress(pHddCtx);
- if (staAdapter) {
- hdd_debug("Disconnecting STA with session id: %d",
- staAdapter->sessionId);
- wlan_hdd_disconnect(staAdapter, eCSR_DISCONNECT_REASON_DEAUTH);
- }
+ hdd_abort_ongoing_sta_connection(pHddCtx);
if (pAdapter->device_mode == QDF_SAP_MODE) {
wlan_hdd_del_station(pAdapter);
diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c
index 207d48b91468..3d0418a5ca23 100644
--- a/core/hdd/src/wlan_hdd_ioctl.c
+++ b/core/hdd/src/wlan_hdd_ioctl.c
@@ -1055,6 +1055,11 @@ hdd_sendactionframe(hdd_adapter_t *adapter, const uint8_t *bssid,
struct cfg80211_mgmt_tx_params params;
#endif
+ if (payload_len < sizeof(tSirMacVendorSpecificFrameHdr)) {
+ hdd_warn("Invalid payload length: %d", payload_len);
+ return -EINVAL;
+ }
+
if (QDF_STA_MODE != adapter->device_mode) {
hdd_warn("Unsupported in mode %s(%d)",
hdd_device_mode_to_string(adapter->device_mode),
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 671abd702889..b322a0b128fd 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -530,8 +530,6 @@ static int __hdd_netdev_notifier_call(struct notifier_block *nb,
hdd_err("Timeout occurred while waiting for abortscan");
}
cds_flush_work(&adapter->scan_block_work);
- /* Need to clean up blocked scan request */
- wlan_hdd_cfg80211_scan_block_cb(&adapter->scan_block_work);
hdd_debug("Scan is not Pending from user");
/*
* After NETDEV_GOING_DOWN, kernel calls hdd_stop.Irrespective
@@ -2390,7 +2388,8 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
if (!reinit && !unint) {
ret = pld_power_on(qdf_dev->dev);
if (ret) {
- hdd_err("Failed to Powerup the device: %d", ret);
+ hdd_err("Failed to Powerup the device; errno: %d",
+ ret);
goto release_lock;
}
}
@@ -2403,7 +2402,7 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
(reinit == true) ? HIF_ENABLE_TYPE_REINIT :
HIF_ENABLE_TYPE_PROBE);
if (ret) {
- hdd_err("Failed to open hif: %d", ret);
+ hdd_err("Failed to open hif; errno: %d", ret);
goto power_down;
}
@@ -2416,20 +2415,22 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
status = ol_cds_init(qdf_dev, hif_ctx);
if (status != QDF_STATUS_SUCCESS) {
- hdd_err("No Memory to Create BMI Context :%d", status);
+ hdd_err("No Memory to Create BMI Context; status: %d",
+ status);
ret = qdf_status_to_os_return(status);
goto hif_close;
}
ret = hdd_update_config(hdd_ctx);
if (ret) {
- hdd_err("Failed to update configuration :%d", ret);
+ hdd_err("Failed to update configuration; errno: %d",
+ ret);
goto ol_cds_free;
}
status = cds_open();
if (!QDF_IS_STATUS_SUCCESS(status)) {
- hdd_err("Failed to Open CDS: %d", status);
+ hdd_err("Failed to Open CDS; status: %d", status);
ret = (status == QDF_STATUS_E_NOMEM) ? -ENOMEM : -EINVAL;
goto deinit_config;
}
@@ -2451,8 +2452,8 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
status = cds_pre_enable(hdd_ctx->pcds_context);
if (!QDF_IS_STATUS_SUCCESS(status)) {
- hdd_err("Failed to pre-enable CDS: %d", status);
- ret = (status == QDF_STATUS_E_NOMEM) ? -ENOMEM : -EINVAL;
+ hdd_err("Failed to pre-enable CDS; status: %d", status);
+ ret = qdf_status_to_os_return(status);
goto deregister_cb;
}
@@ -2481,9 +2482,10 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
}
if (reinit) {
- if (hdd_ipa_uc_ssr_reinit(hdd_ctx)) {
- hdd_err("HDD IPA UC reinit failed");
- ret = -EINVAL;
+ ret = hdd_ipa_uc_ssr_reinit(hdd_ctx);
+ if (ret) {
+ hdd_err("HDD IPA UC reinit failed; errno: %d",
+ ret);
goto err_ipa_cleanup;
}
}
@@ -2493,16 +2495,19 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
hdd_info("Wlan transition (OPENED -> ENABLED)");
if (!adapter) {
hdd_err("adapter is Null");
+ ret = -EINVAL;
goto err_ipa_cleanup;
}
if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("in ftm mode, no need to configure cds modules");
+ ret = -EINVAL;
break;
}
- if (hdd_configure_cds(hdd_ctx, adapter)) {
- hdd_err("Failed to Enable cds modules");
+ ret = hdd_configure_cds(hdd_ctx, adapter);
+ if (ret) {
+ hdd_err("Failed to Enable cds modules; errno: %d", ret);
ret = -EINVAL;
goto err_ipa_cleanup;
}
@@ -3679,8 +3684,8 @@ QDF_STATUS hdd_init_station_mode(hdd_adapter_t *adapter)
status = hdd_lro_enable(hdd_ctx, adapter);
if (status)
/* Err code from errno.h */
- hdd_err("LRO is disabled either because of kernel doesnot support or disabled in INI or via vendor commandi. err code %d",
- status);
+ hdd_debug("LRO is disabled either because of kernel doesnot support or disabled in INI or via vendor commandi. err code %d",
+ status);
/* rcpi info initialization */
qdf_mem_zero(&adapter->rcpi, sizeof(adapter->rcpi));
@@ -3739,7 +3744,7 @@ void hdd_cleanup_actionframe(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
&adapter->tx_action_cnf_event,
msecs_to_jiffies(ACTION_FRAME_TX_TIMEOUT));
if (!rc) {
- hdd_err("HDD Wait for Action Confirmation Failed!!");
+ hdd_debug("HDD Wait for Action Confirmation Failed!!");
/*
* Inform tx status as FAILURE to upper layer and free
* cfgState->buf
@@ -3962,6 +3967,9 @@ static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
return;
}
+ qdf_list_destroy(&adapter->blocked_scan_request_q);
+ qdf_mutex_destroy(&adapter->blocked_scan_request_q_lock);
+
wlan_hdd_debugfs_csr_deinit(adapter);
qdf_mutex_destroy(&adapter->arp_offload_info_lock);
hdd_ns_offload_info_lock_destroy(adapter);
@@ -4746,9 +4754,6 @@ QDF_STATUS hdd_close_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
if (QDF_STATUS_SUCCESS == status) {
hdd_bus_bw_compute_timer_stop(hdd_ctx);
- qdf_list_destroy(&adapter->blocked_scan_request_q);
- qdf_mutex_destroy(&adapter->blocked_scan_request_q_lock);
-
/* cleanup adapter */
cds_clear_concurrency_mode(adapter->device_mode);
hdd_cleanup_adapter(hdd_ctx, adapterNode->pAdapter, rtnl_held);
@@ -4973,6 +4978,8 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
return -ENODEV;
}
+ /* Need to clean up blocked scan request */
+ wlan_hdd_cfg80211_scan_block_cb(&adapter->scan_block_work);
scan_info = &adapter->scan_info;
hdd_info("Disabling queues");
wlan_hdd_netif_queue_control(adapter,
@@ -5061,6 +5068,17 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
#endif
/*
+ * During vdev destroy, if any STA is in connecting state the
+ * roam command will be in active queue and thus vdev destroy is
+ * queued in pending queue. In case STA tries to connect to
+ * multiple BSSID and fails to connect, due to auth/assoc
+ * timeouts it may take more than vdev destroy time to get
+ * completed. So before vdev destroy is queued abort any STA
+ * ongoing connection to avoid vdev destroy timeout.
+ */
+ if (test_bit(SME_SESSION_OPENED, &adapter->event_flags))
+ hdd_abort_ongoing_sta_connection(hdd_ctx);
+ /*
* It is possible that the caller of this function does not
* wish to close the session
*/
@@ -5103,6 +5121,18 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
hdd_deregister_tx_flow_control(adapter);
+ /*
+ * During vdev destroy, if any STA is in connecting state the
+ * roam command will be in active queue and thus vdev destroy is
+ * queued in pending queue. In case STA tries to connect to
+ * multiple BSSID and fails to connect, due to auth/assoc
+ * timeouts it may take more than vdev destroy time to get
+ * complete. So before vdev destroy is queued abort any STA
+ * ongoing connection to avoid vdev destroy timeout.
+ */
+ if (test_bit(SME_SESSION_OPENED, &adapter->event_flags))
+ hdd_abort_ongoing_sta_connection(hdd_ctx);
+
mutex_lock(&hdd_ctx->sap_lock);
if (test_bit(SOFTAP_BSS_STARTED, &adapter->event_flags)) {
QDF_STATUS status;
@@ -9354,8 +9384,6 @@ wlan_hdd_add_monitor_check(hdd_context_t *hdd_ctx, hdd_adapter_t **adapter,
hdd_adapter_t *mon_adapter;
uint32_t mode;
- *adapter = NULL;
-
if (!cds_get_pktcap_mode_enable())
return 0;
@@ -9400,8 +9428,13 @@ wlan_hdd_add_monitor_check(hdd_context_t *hdd_ctx, hdd_adapter_t **adapter,
continue;
adapter = hdd_get_adapter(hdd_ctx, mode);
- if (adapter)
+ if (adapter) {
+ wlan_hdd_release_intf_addr(
+ hdd_ctx,
+ adapter->macAddressCurrent.bytes);
+ hdd_stop_adapter(hdd_ctx, adapter, true);
hdd_close_adapter(hdd_ctx, adapter, rtnl_held);
+ }
}
mon_adapter = hdd_open_adapter(hdd_ctx, QDF_MONITOR_MODE, name,
@@ -11297,6 +11330,7 @@ int hdd_wlan_stop_modules(hdd_context_t *hdd_ctx, bool ftm_mode)
}
/* Free the cache channels of the command SET_DISABLE_CHANNEL_LIST */
wlan_hdd_free_cache_channels(hdd_ctx);
+ hdd_driver_mem_cleanup();
/* many adapter resources are not freed by design in SSR case */
if (!is_recover_stop)
diff --git a/core/hdd/src/wlan_hdd_memdump.c b/core/hdd/src/wlan_hdd_memdump.c
index ff048ba6be71..d0a834d7e298 100644
--- a/core/hdd/src/wlan_hdd_memdump.c
+++ b/core/hdd/src/wlan_hdd_memdump.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019 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
@@ -61,15 +61,7 @@ static void *memdump_get_file_data(struct file *file)
return hdd_ctx;
}
-/**
- * hdd_driver_mem_cleanup() - Frees memory allocated for
- * driver dump
- *
- * This function unallocates driver dump memory.
- *
- * Return: None
- */
-static void hdd_driver_mem_cleanup(void)
+void hdd_driver_mem_cleanup(void)
{
hdd_context_t *hdd_ctx;
@@ -307,6 +299,4 @@ int hdd_driver_memdump_init(void)
void hdd_driver_memdump_deinit(void)
{
hdd_driver_memdump_procfs_remove();
-
- hdd_driver_mem_cleanup();
}
diff --git a/core/hdd/src/wlan_hdd_p2p.c b/core/hdd/src/wlan_hdd_p2p.c
index 572a7a41043d..cd147f16a76a 100644
--- a/core/hdd/src/wlan_hdd_p2p.c
+++ b/core/hdd/src/wlan_hdd_p2p.c
@@ -2326,7 +2326,7 @@ static int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
msecs_to_jiffies
(WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX));
if (!rc) {
- hdd_err("wait on offchannel_tx_event timed out");
+ hdd_debug("wait on offchannel_tx_event timed out");
goto err_rem_channel;
}
} else if (offchan) {
@@ -2974,6 +2974,7 @@ struct wireless_dev *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
}
}
+ pAdapter = NULL;
ret = wlan_hdd_add_monitor_check(pHddCtx, &pAdapter, type, name,
true, name_assign_type);
if (ret)
diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c
index 7a7bf9f72ac9..81f52aeb8ebb 100644
--- a/core/hdd/src/wlan_hdd_power.c
+++ b/core/hdd/src/wlan_hdd_power.c
@@ -229,7 +229,7 @@ static int __wlan_hdd_ipv6_changed(struct notifier_block *nb,
ENTER_DEV(ndev);
if ((pAdapter == NULL) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) {
- hdd_err("Adapter context is invalid %pK", pAdapter);
+ hdd_debug("Adapter context is invalid %pK", pAdapter);
return NOTIFY_DONE;
}
@@ -923,7 +923,7 @@ static int __wlan_hdd_ipv4_changed(struct notifier_block *nb,
ENTER_DEV(ndev);
if ((pAdapter == NULL) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) {
- hdd_err("Adapter context is invalid %pK", pAdapter);
+ hdd_debug("Adapter context is invalid %pK", pAdapter);
return NOTIFY_DONE;
}
@@ -1476,6 +1476,7 @@ QDF_STATUS hdd_wlan_shutdown(void)
}
pHddCtx->is_ssr_in_progress = true;
+ cds_set_connection_in_progress(false);
cds_clear_concurrent_session_count();
@@ -2516,7 +2517,7 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
/* Validate adapter sessionId */
if (wlan_hdd_validate_session_id(adapter->sessionId)) {
- hdd_err("invalid session id: %d", adapter->sessionId);
+ hdd_debug("invalid session id: %d", adapter->sessionId);
return -EINVAL;
}
diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h
index 31b7712f6ba9..41f78238e231 100644
--- a/core/mac/inc/qwlan_version.h
+++ b/core/mac/inc/qwlan_version.h
@@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 5
#define QWLAN_VERSION_MINOR 1
#define QWLAN_VERSION_PATCH 1
-#define QWLAN_VERSION_EXTRA "N"
-#define QWLAN_VERSION_BUILD 74
+#define QWLAN_VERSION_EXTRA "M"
+#define QWLAN_VERSION_BUILD 75
-#define QWLAN_VERSIONSTR "5.1.1.74N"
+#define QWLAN_VERSIONSTR "5.1.1.75M"
#endif /* QWLAN_VERSION_H */
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index d9022b6ef82a..803d8af3e63b 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -925,6 +925,11 @@ typedef struct sSirChannelList {
uint8_t channelNumber[SIR_ESE_MAX_MEAS_IE_REQS];
} tSirChannelList, *tpSirChannelList;
+struct sir_channel_list {
+ uint8_t numChannels;
+ uint8_t channelNumber[];
+};
+
typedef struct sSirDFSChannelList {
uint32_t timeStamp[SIR_MAX_24G_5G_CHANNEL_RANGE];
@@ -1058,7 +1063,7 @@ typedef struct sSirSmeScanReq {
uint32_t oui_field_offset;
/* channelList MUST be the last field of this structure */
- tSirChannelList channelList;
+ struct sir_channel_list channelList;
/*-----------------------------
tSirSmeScanReq....
@@ -3648,6 +3653,14 @@ struct mawc_params {
uint8_t mawc_roam_rssi_low_adjust;
};
+/**
+ * struct roam_sync_timeout_timer_info - Info related to roam sync timer
+ * @vdev_id: Vdev id for which host waiting roam sync ind from fw
+ */
+struct roam_sync_timeout_timer_info {
+ uint8_t vdev_id;
+};
+
typedef struct sSirRoamOffloadScanReq {
uint16_t message_type;
uint16_t length;
@@ -4332,7 +4345,7 @@ typedef struct sSirScanOffloadReq {
uint32_t oui_field_len;
uint32_t oui_field_offset;
- tSirChannelList channelList;
+ struct sir_channel_list channelList;
/*-----------------------------
sSirScanOffloadReq....
-----------------------------
diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h
index e6845a39b9a9..6c50f52814e5 100644
--- a/core/mac/src/include/sir_params.h
+++ b/core/mac/src/include/sir_params.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 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
@@ -307,7 +307,7 @@ struct sir_mgmt_msg {
#define SIR_HAL_WOW_ADD_PTRN (SIR_HAL_ITC_MSG_TYPES_BEGIN + 82)
#define SIR_HAL_WOW_DEL_PTRN (SIR_HAL_ITC_MSG_TYPES_BEGIN + 83)
#define SIR_HAL_WOWL_ENTER_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 84)
-#define SIR_HAL_WOWL_ENTER_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 85)
+#define SIR_HAL_WMA_ROAM_SYNC_TIMEOUT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 85)
#define SIR_HAL_WOWL_EXIT_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 86)
#define SIR_HAL_WOWL_EXIT_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 87)
/* / PE <-> HAL statistics messages */
diff --git a/core/mac/src/pe/lim/lim_ft_preauth.c b/core/mac/src/pe/lim/lim_ft_preauth.c
index 24c98a3313b5..250a7353b08a 100644
--- a/core/mac/src/pe/lim/lim_ft_preauth.c
+++ b/core/mac/src/pe/lim/lim_ft_preauth.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019 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
@@ -670,7 +670,8 @@ QDF_STATUS lim_send_preauth_scan_offload(tpAniSirGlobal mac_ctx,
tSirRetStatus rc = eSIR_SUCCESS;
tSirMsgQ msg;
- scan_offload_req = qdf_mem_malloc(sizeof(tSirScanOffloadReq));
+ scan_offload_req = qdf_mem_malloc(sizeof(tSirScanOffloadReq) +
+ sizeof(uint8_t));
if (NULL == scan_offload_req) {
pe_err("Memory allocation failed for pScanOffloadReq");
return QDF_STATUS_E_NOMEM;
diff --git a/core/mac/src/pe/lim/lim_p2p.c b/core/mac/src/pe/lim/lim_p2p.c
index 1cb32030d462..121f18145831 100644
--- a/core/mac/src/pe/lim/lim_p2p.c
+++ b/core/mac/src/pe/lim/lim_p2p.c
@@ -79,7 +79,8 @@ static QDF_STATUS lim_send_hal_req_remain_on_chan_offload(tpAniSirGlobal pMac,
return QDF_STATUS_E_INVAL;
}
- pScanOffloadReq = qdf_mem_malloc(sizeof(tSirScanOffloadReq));
+ pScanOffloadReq = qdf_mem_malloc(sizeof(tSirScanOffloadReq) +
+ sizeof(uint8_t));
if (NULL == pScanOffloadReq) {
pe_err("Memory allocation failed for pScanOffloadReq");
return QDF_STATUS_E_NOMEM;
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index 1aebd0ac2253..27e338bc77bc 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -1215,12 +1215,8 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac,
pe_debug("No IEs in the scan request from supplicant");
}
- /**
- * The tSirScanOffloadReq will reserve the space for first channel,
- * so allocate the memory for (numChannels - 1) and uIEFieldLen
- */
len = sizeof(tSirScanOffloadReq) +
- (pScanReq->channelList.numChannels - 1) +
+ (pScanReq->channelList.numChannels) +
pScanReq->uIEFieldLen + pScanReq->oui_field_len;
pScanOffloadReq = qdf_mem_malloc(len);
@@ -1328,7 +1324,7 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac,
pScanReq->probe_req_ie_bitmap,
PROBE_REQ_BITMAP_LEN * sizeof(uint32_t));
pScanOffloadReq->oui_field_offset = sizeof(tSirScanOffloadReq) +
- (pScanOffloadReq->channelList.numChannels - 1) +
+ (pScanOffloadReq->channelList.numChannels) +
pScanOffloadReq->uIEFieldLen;
if (pScanOffloadReq->num_vendor_oui != 0) {
qdf_mem_copy(
diff --git a/core/mac/src/pe/rrm/rrm_api.c b/core/mac/src/pe/rrm/rrm_api.c
index 73e1314a670f..e67d9bbe74ae 100644
--- a/core/mac/src/pe/rrm/rrm_api.c
+++ b/core/mac/src/pe/rrm/rrm_api.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 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
@@ -43,8 +43,6 @@
#include "rrm_global.h"
#include "rrm_api.h"
-#define MAX_RRM_TX_PWR_CAP 22
-
uint8_t
rrm_get_min_of_max_tx_power(tpAniSirGlobal pMac,
int8_t regMax, int8_t apTxPower)
diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c
index e32b7d5dbaaf..8dcdfa00dfd4 100644
--- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c
+++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019 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
@@ -641,7 +641,7 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg)
#ifdef WLAN_FEATURE_11W
CASE_RETURN_STRING(WMA_EXCLUDE_UNENCRYPTED_IND);
#endif
- CASE_RETURN_STRING(WMA_WOWL_ENTER_RSP);
+ CASE_RETURN_STRING(WMA_ROAM_SYNC_TIMEOUT);
CASE_RETURN_STRING(WMA_WOWL_EXIT_RSP);
CASE_RETURN_STRING(WMA_SET_MAX_TX_POWER_RSP);
CASE_RETURN_STRING(WMA_SET_DTIM_PERIOD);
diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c
index 533df00f431b..4d9e7ed4025c 100644
--- a/core/sap/src/sap_fsm.c
+++ b/core/sap/src/sap_fsm.c
@@ -4913,6 +4913,10 @@ static QDF_STATUS sap_get_channel_list(ptSapContext sap_ctx,
CDS_CHANNEL_STATE(loop_count)))))
continue;
+ if (CDS_CHANNEL_NUM(loop_count) == 12 ||
+ CDS_CHANNEL_NUM(loop_count) == 13)
+ continue;
+
/*
* Skip the channels which are not in ACS config from user
* space
diff --git a/core/sme/inc/csr_support.h b/core/sme/inc/csr_support.h
index 046803fdca3b..91f5ec3727bb 100644
--- a/core/sme/inc/csr_support.h
+++ b/core/sme/inc/csr_support.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2019 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
@@ -200,7 +200,7 @@ typedef struct tagCsrWapiIe {
typedef struct tagRoamingTimerInfo {
tpAniSirGlobal pMac;
- uint8_t sessionId;
+ uint8_t vdev_id;
} tCsrTimerInfo;
#define CSR_IS_11A_BSS(pBssDesc) (eSIR_11A_NW_TYPE == (pBssDesc)->nwType)
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index e51337c319af..12ae3afe075d 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -8043,7 +8043,7 @@ QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId,
if (!CSR_IS_SESSION_VALID(pMac, sessionId) ||
(!csr_is_conn_state_infra(pMac, sessionId) &&
!csr_is_ndi_started(pMac, sessionId))) {
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
+ QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
"%s: Invalid session: %d", __func__, sessionId);
return QDF_STATUS_E_FAILURE;
}
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 4543f281f4dd..debd009b3727 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -312,10 +312,10 @@ static bool csr_roam_is_same_profile_keys(tpAniSirGlobal pMac,
tCsrRoamProfile *pProfile2);
static QDF_STATUS csr_roam_start_roaming_timer(tpAniSirGlobal pMac,
- uint32_t sessionId,
+ uint32_t vdev_id,
uint32_t interval);
static QDF_STATUS csr_roam_stop_roaming_timer(tpAniSirGlobal pMac,
- uint32_t sessionId);
+ uint32_t vdev_id);
static void csr_roam_roaming_timer_handler(void *pv);
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
static void csr_roam_roaming_offload_timer_action(tpAniSirGlobal mac_ctx,
@@ -1307,11 +1307,11 @@ static QDF_STATUS csr_roam_open(tpAniSirGlobal pMac)
for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) {
pSession = CSR_GET_SESSION(pMac, i);
pSession->roamingTimerInfo.pMac = pMac;
- pSession->roamingTimerInfo.sessionId =
+ pSession->roamingTimerInfo.vdev_id =
CSR_SESSION_ID_INVALID;
}
pMac->roam.WaitForKeyTimerInfo.pMac = pMac;
- pMac->roam.WaitForKeyTimerInfo.sessionId =
+ pMac->roam.WaitForKeyTimerInfo.vdev_id =
CSR_SESSION_ID_INVALID;
status = qdf_mc_timer_init(&pMac->roam.hTimerWaitForKey,
QDF_TIMER_TYPE_SW,
@@ -7765,7 +7765,7 @@ static void csr_roam_process_join_res(tpAniSirGlobal mac_ctx,
CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
/* Save session_id in case of timeout */
- mac_ctx->roam.WaitForKeyTimerInfo.sessionId =
+ mac_ctx->roam.WaitForKeyTimerInfo.vdev_id =
(uint8_t) session_id;
/*
* This time should be long enough for the rest
@@ -12954,7 +12954,7 @@ void csr_roam_roaming_timer_handler(void *pv)
{
tCsrTimerInfo *pInfo = (tCsrTimerInfo *) pv;
tpAniSirGlobal pMac = pInfo->pMac;
- uint32_t sessionId = pInfo->sessionId;
+ uint32_t sessionId = pInfo->vdev_id;
tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
if (!pSession) {
@@ -12986,50 +12986,68 @@ void csr_roam_roaming_timer_handler(void *pv)
void csr_roam_roaming_offload_timeout_handler(void *timer_data)
{
tCsrTimerInfo *timer_info = (tCsrTimerInfo *) timer_data;
+ cds_msg_t wma_msg = {0};
+ struct roam_sync_timeout_timer_info *req;
+ QDF_STATUS status;
if (timer_info) {
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
- "LFR3:roaming offload timer expired, session: %d",
- timer_info->sessionId);
+ sme_debug("LFR3:roaming offload timer expired, session: %d",
+ timer_info->vdev_id);
+
} else {
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
- "Invalid Session");
+ sme_err("Invalid Session");
+ return;
+ }
+
+ req = qdf_mem_malloc(sizeof(*req));
+ if (!req)
+ return;
+
+ req->vdev_id = timer_info->vdev_id;
+ wma_msg.type = WMA_ROAM_SYNC_TIMEOUT;
+ wma_msg.bodyptr = req;
+
+ status = cds_mq_post_message(QDF_MODULE_ID_WMA, &wma_msg);
+ if (!QDF_IS_STATUS_SUCCESS(status)) {
+ sme_err("Post roam offload timer fails, session id: %d",
+ timer_info->vdev_id);
+ qdf_mem_free(req);
return;
}
- csr_roam_disconnect(timer_info->pMac, timer_info->sessionId,
- eCSR_DISCONNECT_REASON_UNSPECIFIED);
}
-QDF_STATUS csr_roam_start_roaming_timer(tpAniSirGlobal pMac, uint32_t sessionId,
+QDF_STATUS csr_roam_start_roaming_timer(tpAniSirGlobal pMac,
+ uint32_t vdev_id,
uint32_t interval)
{
QDF_STATUS status;
- tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
+ tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, vdev_id);
if (!pSession) {
- sme_err("session %d not found", sessionId);
+ sme_err("session %d not found", vdev_id);
return QDF_STATUS_E_FAILURE;
}
sme_debug("csrScanStartRoamingTimer");
- pSession->roamingTimerInfo.sessionId = (uint8_t) sessionId;
+ pSession->roamingTimerInfo.vdev_id = (uint8_t) vdev_id;
status = qdf_mc_timer_start(&pSession->hTimerRoaming,
interval / QDF_MC_TIMER_TO_MS_UNIT);
return status;
}
-QDF_STATUS csr_roam_stop_roaming_timer(tpAniSirGlobal pMac, uint32_t sessionId)
+QDF_STATUS csr_roam_stop_roaming_timer(tpAniSirGlobal pMac,
+ uint32_t vdev_id)
{
return qdf_mc_timer_stop
- (&pMac->roam.roamSession[sessionId].hTimerRoaming);
+ (&pMac->roam.roamSession[vdev_id].hTimerRoaming);
}
void csr_roam_wait_for_key_time_out_handler(void *pv)
{
tCsrTimerInfo *pInfo = (tCsrTimerInfo *) pv;
tpAniSirGlobal pMac = pInfo->pMac;
- tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pInfo->sessionId);
+ tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pInfo->vdev_id);
QDF_STATUS status = QDF_STATUS_E_FAILURE;
if (pSession == NULL) {
@@ -13039,21 +13057,21 @@ void csr_roam_wait_for_key_time_out_handler(void *pv)
sme_debug("WaitForKey timer expired in state: %s sub-state: %s",
mac_trace_get_neighbour_roam_state(pMac->roam.
- neighborRoamInfo[pInfo->sessionId].
+ neighborRoamInfo[pInfo->vdev_id].
neighborRoamState),
mac_trace_getcsr_roam_sub_state(pMac->roam.
- curSubState[pInfo->sessionId]));
+ curSubState[pInfo->vdev_id]));
spin_lock(&pMac->roam.roam_state_lock);
- if (CSR_IS_WAIT_FOR_KEY(pMac, pInfo->sessionId)) {
+ if (CSR_IS_WAIT_FOR_KEY(pMac, pInfo->vdev_id)) {
/* Change the substate so command queue is unblocked. */
- if (CSR_ROAM_SESSION_MAX > pInfo->sessionId)
- pMac->roam.curSubState[pInfo->sessionId] =
+ if (CSR_ROAM_SESSION_MAX > pInfo->vdev_id)
+ pMac->roam.curSubState[pInfo->vdev_id] =
eCSR_ROAM_SUBSTATE_NONE;
spin_unlock(&pMac->roam.roam_state_lock);
if (csr_neighbor_roam_is_handoff_in_progress(pMac,
- pInfo->sessionId)) {
+ pInfo->vdev_id)) {
/*
* Enable heartbeat timer when hand-off is in progress
* and Key Wait timer expired.
@@ -13065,13 +13083,13 @@ void csr_roam_wait_for_key_time_out_handler(void *pv)
}
sme_debug("SME pre-auth state timeout");
- if (csr_is_conn_state_connected_infra(pMac, pInfo->sessionId)) {
+ if (csr_is_conn_state_connected_infra(pMac, pInfo->vdev_id)) {
csr_roam_link_up(pMac,
pSession->connectedProfile.bssid);
sme_process_pending_queue(pMac);
status = sme_acquire_global_lock(&pMac->sme);
if (QDF_IS_STATUS_SUCCESS(status)) {
- csr_roam_disconnect(pMac, pInfo->sessionId,
+ csr_roam_disconnect(pMac, pInfo->vdev_id,
eCSR_DISCONNECT_REASON_UNSPECIFIED);
sme_release_global_lock(&pMac->sme);
}
@@ -13095,16 +13113,17 @@ void csr_roam_wait_for_key_time_out_handler(void *pv)
* Return: None
*/
void csr_roam_roaming_offload_timer_action(tpAniSirGlobal mac_ctx,
- uint32_t interval, uint8_t session_id,
+ uint32_t interval, uint8_t vdev_id,
uint8_t action)
{
- tCsrRoamSession *csr_session = CSR_GET_SESSION(mac_ctx, session_id);
+ tCsrRoamSession *csr_session = CSR_GET_SESSION(mac_ctx, vdev_id);
+ QDF_TIMER_STATE tstate;
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
- ("LFR3: timer action %d, session %d, intvl %d"),
- action, session_id, interval);
+ ("LFR3: timer action %d, vdev_id %d, intvl %d"),
+ action, vdev_id, interval);
if (mac_ctx) {
- csr_session = CSR_GET_SESSION(mac_ctx, session_id);
+ csr_session = CSR_GET_SESSION(mac_ctx, vdev_id);
} else {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
("LFR3: Invalid MAC Context"));
@@ -13112,13 +13131,25 @@ void csr_roam_roaming_offload_timer_action(tpAniSirGlobal mac_ctx,
}
if (!csr_session) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
- ("LFR3: session %d not found"), session_id);
+ ("LFR3: session %d not found"), vdev_id);
return;
}
- csr_session->roamingTimerInfo.sessionId = (uint8_t) session_id;
- if (action == ROAMING_OFFLOAD_TIMER_START)
- qdf_mc_timer_start(&csr_session->roaming_offload_timer,
- interval / QDF_MC_TIMER_TO_MS_UNIT);
+ csr_session->roamingTimerInfo.vdev_id = (uint8_t) vdev_id;
+
+ tstate =
+ qdf_mc_timer_get_current_state(&csr_session->roaming_offload_timer);
+
+ if (action == ROAMING_OFFLOAD_TIMER_START) {
+ /*
+ * If timer is already running then re-start timer in order to
+ * process new ROAM_START with fresh timer.
+ */
+ if (tstate == QDF_TIMER_STATE_RUNNING)
+ qdf_mc_timer_stop(&csr_session->roaming_offload_timer);
+ qdf_mc_timer_start(&csr_session->roaming_offload_timer,
+ interval / QDF_MC_TIMER_TO_MS_UNIT);
+ }
+
if (action == ROAMING_OFFLOAD_TIMER_STOP)
qdf_mc_timer_stop(&csr_session->roaming_offload_timer);
@@ -13131,17 +13162,17 @@ static QDF_STATUS csr_roam_start_wait_for_key_timer(tpAniSirGlobal pMac,
QDF_STATUS status;
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
&pMac->roam.neighborRoamInfo[pMac->roam.WaitForKeyTimerInfo.
- sessionId];
+ vdev_id];
if (csr_neighbor_roam_is_handoff_in_progress(pMac,
pMac->roam.WaitForKeyTimerInfo.
- sessionId)) {
+ vdev_id)) {
/* Disable heartbeat timer when hand-off is in progress */
sme_debug("disabling HB timer in state: %s sub-state: %s",
mac_trace_get_neighbour_roam_state(
pNeighborRoamInfo->neighborRoamState),
mac_trace_getcsr_roam_sub_state(
pMac->roam.curSubState[pMac->roam.
- WaitForKeyTimerInfo.sessionId]));
+ WaitForKeyTimerInfo.vdev_id]));
cfg_set_int(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, 0);
}
sme_debug("csrScanStartWaitForKeyTimer");
@@ -13155,7 +13186,7 @@ QDF_STATUS csr_roam_stop_wait_for_key_timer(tpAniSirGlobal pMac)
{
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
&pMac->roam.neighborRoamInfo[pMac->roam.WaitForKeyTimerInfo.
- sessionId];
+ vdev_id];
sme_debug("WaitForKey timer stopped in state: %s sub-state: %s",
mac_trace_get_neighbour_roam_state(pNeighborRoamInfo->
@@ -13163,10 +13194,9 @@ QDF_STATUS csr_roam_stop_wait_for_key_timer(tpAniSirGlobal pMac)
mac_trace_getcsr_roam_sub_state(pMac->roam.
curSubState[pMac->roam.
WaitForKeyTimerInfo.
- sessionId]));
+ vdev_id]));
if (csr_neighbor_roam_is_handoff_in_progress(pMac,
- pMac->roam.WaitForKeyTimerInfo.
- sessionId)) {
+ pMac->roam.WaitForKeyTimerInfo.vdev_id)) {
/*
* Enable heartbeat timer when hand-off is in progress
* and Key Wait timer got stopped for some reason
@@ -20736,6 +20766,12 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
return QDF_STATUS_E_FAILURE;
}
+ if (!csr_is_conn_state_connected(mac_ctx, session_id) &&
+ command == ROAM_SCAN_OFFLOAD_UPDATE_CFG) {
+ sme_debug("Session not in connected state, RSO not sent");
+ return QDF_STATUS_E_FAILURE;
+ }
+
if ((command == ROAM_SCAN_OFFLOAD_START) &&
(session->pCurRoamProfile &&
session->pCurRoamProfile->driver_disabled_roaming)) {
@@ -22823,9 +22859,11 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx,
session->disable_hi_rssi = false;
}
- csr_roam_offload_scan(mac_ctx, session_id,
- ROAM_SCAN_OFFLOAD_UPDATE_CFG,
- REASON_CONNECT);
+ if (roam_synch_data->authStatus ==
+ CSR_ROAM_AUTH_STATUS_AUTHENTICATED)
+ csr_roam_offload_scan(mac_ctx, session_id,
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_CONNECT);
csr_roam_call_callback(mac_ctx, session_id, NULL, 0,
eCSR_ROAM_SYNCH_COMPLETE,
eCSR_ROAM_RESULT_SUCCESS);
@@ -22937,7 +22975,7 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx,
session_id);
ps_global_info->remain_in_power_active_till_dhcp = true;
- mac_ctx->roam.WaitForKeyTimerInfo.sessionId = session_id;
+ mac_ctx->roam.WaitForKeyTimerInfo.vdev_id = session_id;
if (!QDF_IS_STATUS_SUCCESS(csr_roam_start_wait_for_key_timer(
mac_ctx, CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD))
) {
diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c
index 04b6ba509142..949134f96488 100644
--- a/core/sme/src/csr/csr_api_scan.c
+++ b/core/sme/src/csr/csr_api_scan.c
@@ -5877,10 +5877,8 @@ static void csr_populate_ie_whitelist_attrs(tSirSmeScanReq *msg,
qdf_mem_copy(msg->probe_req_ie_bitmap, scan_req->probe_req_ie_bitmap,
PROBE_REQ_BITMAP_LEN * sizeof(uint32_t));
msg->oui_field_len = scan_req->num_vendor_oui * sizeof(*scan_req->voui);
- msg->oui_field_offset = (sizeof(tSirSmeScanReq) -
- sizeof(msg->channelList.channelNumber) +
- (sizeof(msg->channelList.channelNumber) *
- scan_req->ChannelInfo.numOfChannels)) +
+ msg->oui_field_offset = (sizeof(tSirSmeScanReq) +
+ (scan_req->ChannelInfo.numOfChannels)) +
scan_req->uIEFieldLen;
if (scan_req->num_vendor_oui != 0)
@@ -5901,10 +5899,8 @@ static QDF_STATUS csr_send_mb_scan_req(tpAniSirGlobal pMac, uint16_t sessionId,
uint32_t i;
struct qdf_mac_addr selfmac;
- msgLen = (uint16_t) (sizeof(tSirSmeScanReq) -
- sizeof(pMsg->channelList.channelNumber) +
- (sizeof(pMsg->channelList.channelNumber) *
- pScanReq->ChannelInfo.numOfChannels)) +
+ msgLen = (uint16_t) (sizeof(tSirSmeScanReq) +
+ (pScanReq->ChannelInfo.numOfChannels)) +
(pScanReq->uIEFieldLen) +
pScanReq->num_vendor_oui * sizeof(*pScanReq->voui);
@@ -6058,10 +6054,8 @@ static QDF_STATUS csr_send_mb_scan_req(tpAniSirGlobal pMac, uint16_t sessionId,
}
pMsg->uIEFieldLen = (uint16_t) pScanReq->uIEFieldLen;
- pMsg->uIEFieldOffset = (uint16_t) (sizeof(tSirSmeScanReq) -
- sizeof(pMsg->channelList.channelNumber) +
- (sizeof(pMsg->channelList.channelNumber) *
- pScanReq->ChannelInfo.numOfChannels));
+ pMsg->uIEFieldOffset = (uint16_t) (sizeof(tSirSmeScanReq) +
+ (pMsg->channelList.numChannels));
if (pScanReq->uIEFieldLen != 0) {
qdf_mem_copy((uint8_t *) pMsg + pMsg->uIEFieldOffset,
pScanReq->pIEField, pScanReq->uIEFieldLen);
diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h
index 6eb54de3cbe3..e417673842ae 100644
--- a/core/sme/src/csr/csr_inside_api.h
+++ b/core/sme/src/csr/csr_inside_api.h
@@ -85,10 +85,11 @@
#define CSR_ACTIVE_SCAN_LIST_CMD_TIMEOUT (1000*30)
/* ***************************************************************************
- * The MAX BSSID Count should be lower than the command timeout value and it
- * can be of a fraction of 1/3 to 1/2 of the total command timeout value.
+ * The MAX BSSID Count should be lower than the command timeout value.
+ * As in some case auth timeout can take upto 5 sec (in case of SAE auth) try
+ * (command timeout/5000 - 1) candidates.
* ***************************************************************************/
-#define CSR_MAX_BSSID_COUNT (SME_ACTIVE_LIST_CMD_TIMEOUT_VALUE/3000) - 2
+#define CSR_MAX_BSSID_COUNT (SME_ACTIVE_LIST_CMD_TIMEOUT_VALUE/5000) - 1
#define CSR_CUSTOM_CONC_GO_BI 100
extern uint8_t csr_wpa_oui[][CSR_WPA_OUI_SIZE];
bool csr_is_supported_channel(tpAniSirGlobal pMac, uint8_t channelId);
diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h
index 611beb7711ab..5728194c58d6 100644
--- a/core/wma/inc/wma.h
+++ b/core/wma/inc/wma.h
@@ -1545,7 +1545,7 @@ typedef struct {
void *wmi_handle;
void *htc_handle;
void *cds_context;
- void *mac_context;
+ tAniSirGlobal *mac_context;
qdf_event_t wma_ready_event;
qdf_event_t wma_resume_event;
qdf_event_t target_suspend;
@@ -2423,6 +2423,9 @@ int wmi_desc_pool_init(tp_wma_handle wma_handle, uint32_t pool_size);
void wmi_desc_pool_deinit(tp_wma_handle wma_handle);
struct wmi_desc_t *wmi_desc_get(tp_wma_handle wma_handle);
void wmi_desc_put(tp_wma_handle wma_handle, struct wmi_desc_t *wmi_desc);
+int wma_process_mon_mgmt_tx(qdf_nbuf_t nbuf, uint32_t nbuf_len,
+ struct wmi_mgmt_params *mgmt_param,
+ uint16_t chanfreq);
int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params,
uint32_t len);
int wma_mgmt_tx_bundle_completion_handler(void *handle,
@@ -2652,6 +2655,18 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
tSirRoamOffloadScanReq *roam_req);
/**
+ * wma_handle_roam_sync_timeout() - Update roaming status at wma layer
+ * @wma_handle: wma handle
+ * @info: Info for roaming start timer
+ *
+ * This function gets called in case of roaming offload timer get expired
+ *
+ * Return: None
+ */
+void wma_handle_roam_sync_timeout(tp_wma_handle wma_handle,
+ struct roam_sync_timeout_timer_info *info);
+
+/**
* wma_register_phy_err_event_handler() - register phy error event handler
* @wma_handle: wma handle
*
diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h
index e80ce4703217..de42a3b3bbe4 100644
--- a/core/wma/inc/wma_api.h
+++ b/core/wma/inc/wma_api.h
@@ -32,6 +32,7 @@
#include "cds_concurrency.h"
#include "cds_utils.h"
#include "wma_sar_public_structs.h"
+#include "ol_txrx.h"
typedef void *WMA_HANDLE;
@@ -621,4 +622,15 @@ QDF_STATUS wma_send_dhcp_ind(uint16_t type, uint8_t device_mode,
QDF_STATUS wma_update_thermal_mitigation_to_fw(uint8_t thermal_level);
#endif
+/**
+ * wma_mgmt_pktcapture_status_map() - map Tx status for MGMT packets
+ * with packet capture Tx status
+ * @status: Tx status
+ * @is_data_pkt: Tx status for data packets
+ *
+ * Return: pktcapture_tx_status enum
+ */
+enum pktcapture_tx_status
+wma_mgmt_pktcapture_status_map(uint8_t status);
+
#endif
diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h
index 19ed6203154e..147ac452aa96 100644
--- a/core/wma/inc/wma_types.h
+++ b/core/wma/inc/wma_types.h
@@ -220,7 +220,7 @@
#define WMA_WOW_ADD_PTRN SIR_HAL_WOW_ADD_PTRN
#define WMA_WOW_DEL_PTRN SIR_HAL_WOW_DEL_PTRN
#define WMA_WOWL_ENTER_REQ SIR_HAL_WOWL_ENTER_REQ
-#define WMA_WOWL_ENTER_RSP SIR_HAL_WOWL_ENTER_RSP
+#define WMA_ROAM_SYNC_TIMEOUT SIR_HAL_WMA_ROAM_SYNC_TIMEOUT
#define WMA_WOWL_EXIT_REQ SIR_HAL_WOWL_EXIT_REQ
#define WMA_WOWL_EXIT_RSP SIR_HAL_WOWL_EXIT_RSP
/* / PE <-> HAL statistics messages */
diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c
index 3d61436f7787..f5580bb7bc23 100644
--- a/core/wma/src/wma_data.c
+++ b/core/wma/src/wma_data.c
@@ -828,8 +828,7 @@ static void wma_data_tx_ack_work_handler(void *ack_work)
/* Call the Ack Cb registered by UMAC */
if (ack_cb)
- ack_cb((tpAniSirGlobal) (wma_handle->mac_context),
- work->status ? 0 : 1);
+ ack_cb(wma_handle->mac_context, work->status ? 0 : 1);
else
WMA_LOGE("Data Tx Ack Cb is NULL");
@@ -1390,8 +1389,7 @@ static void wma_mgmt_tx_ack_work_handler(void *ack_work)
work->sub_type, work->status);
/* Call the Ack Cb registered by UMAC */
- ack_cb((tpAniSirGlobal) (wma_handle->mac_context),
- work->status ? 0 : 1);
+ ack_cb(wma_handle->mac_context, work->status ? 0 : 1);
end:
qdf_mem_free(work);
wma_handle->mgmt_ack_work_ctx = NULL;
@@ -2654,6 +2652,8 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
ol_pdev_handle ctrl_pdev;
bool is_5g = false;
+ ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+
if (NULL == wma_handle) {
WMA_LOGE("wma_handle is NULL");
cds_packet_free((void *)tx_frame);
@@ -3045,6 +3045,16 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
wmi_desc->nbuf = tx_frame;
wmi_desc->tx_cmpl_cb = tx_frm_download_comp_cb;
wmi_desc->ota_post_proc_cb = tx_frm_ota_comp_cb;
+
+ if (pdev && cds_get_pktcap_mode_enable() &&
+ (ol_cfg_pktcapture_mode(pdev->ctrl_pdev) &
+ PKT_CAPTURE_MODE_MGMT_ONLY) &&
+ pdev->mon_cb) {
+ chanfreq = wma_handle->interfaces[vdev_id].mhz;
+ wma_process_mon_mgmt_tx(tx_frame,
+ qdf_nbuf_len(tx_frame),
+ &mgmt_param, chanfreq);
+ }
status = wmi_mgmt_unified_cmd_send(
wma_handle->wmi_handle,
&mgmt_param);
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index 21fe8e3ea403..2c6d0e91c380 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -553,6 +553,29 @@ wma_ol_txrx_vdev_detach(tp_wma_handle wma_handle,
iface->is_vdev_valid = false;
}
+/*
+ * wma_handle_monitor_mode_vdev_detach() - Stop and down monitor mode vdev
+ * @wma_handle: wma handle
+ * @vdev_id: used to get wma interface txrx node
+ *
+ * Monitor mode is unconneted mode, so do explicit vdev stop and down
+ *
+ * Return: None
+ */
+static void wma_handle_monitor_mode_vdev_detach(tp_wma_handle wma,
+ uint8_t vdev_id)
+{
+ if (wma_send_vdev_stop_to_fw(wma, vdev_id)) {
+ WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
+ wma_remove_vdev_req(wma, vdev_id,
+ WMA_TARGET_REQ_TYPE_VDEV_STOP);
+ }
+
+ if (wma_send_vdev_down_to_fw(wma, vdev_id) != QDF_STATUS_SUCCESS)
+ WMA_LOGE("Failed to send vdev down cmd: vdev %d", vdev_id);
+}
+
+
static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
struct del_sta_self_params *del_sta_self_req_param,
uint8_t generate_rsp)
@@ -562,6 +585,9 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
struct wma_target_req *msg = NULL;
+ if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
+ wma_handle_monitor_mode_vdev_detach(wma_handle, vdev_id);
+
status = wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
WMA_LOGE("Unable to remove an interface");
@@ -1897,6 +1923,10 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
return -EINVAL;
}
+ /* Ignore stop_response in Monitor mode */
+ if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
+ return QDF_STATUS_SUCCESS;
+
iface = &wma->interfaces[resp_event->vdev_id];
/* vdev in stopped state, no more waiting for key */
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index d7f0ecb62148..fba86214196d 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -2364,8 +2364,8 @@ static int wma_rx_service_available_event(void *handle, uint8_t *cmd_param_info,
wma_handle->wmi_service_ext_offset = ev->wmi_service_segment_offset;
qdf_mem_copy(wma_handle->wmi_service_ext_bitmap,
- &ev->wmi_service_segment_bitmap[0],
- WMI_SERVICE_EXT_BM_SIZE32 * sizeof(A_UINT32));
+ &ev->wmi_service_segment_bitmap[0],
+ WMI_SERVICE_SEGMENT_BM_SIZE32 * sizeof(A_UINT32));
return 0;
}
@@ -7793,6 +7793,11 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg)
(tSirRoamOffloadScanReq *) msg->bodyptr);
break;
+ case WMA_ROAM_SYNC_TIMEOUT:
+ wma_handle_roam_sync_timeout(wma_handle, msg->bodyptr);
+ qdf_mem_free(msg->bodyptr);
+ break;
+
case WMA_RATE_UPDATE_IND:
wma_process_rate_update_indicate(wma_handle,
(tSirRateUpdateInd *) msg->bodyptr);
@@ -8394,7 +8399,7 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg)
qdf_mem_free(msg->bodyptr);
break;
default:
- WMA_LOGE("Unhandled WMA message of type %d", msg->type);
+ WMA_LOGD("Unhandled WMA message of type %d", msg->type);
if (msg->bodyptr)
qdf_mem_free(msg->bodyptr);
}
@@ -8414,7 +8419,7 @@ void wma_log_completion_timeout(void *data)
{
tp_wma_handle wma_handle;
- WMA_LOGE("%s: Timeout occured for log completion command", __func__);
+ WMA_LOGD("%s: Timeout occurred for log completion command", __func__);
wma_handle = (tp_wma_handle) data;
if (!wma_handle)
diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c
index 2c5d519623e7..0307894ac535 100644
--- a/core/wma/src/wma_mgmt.c
+++ b/core/wma/src/wma_mgmt.c
@@ -2777,6 +2777,7 @@ static const char *wma_get_status_str(uint32_t status)
#define RATE_LIMIT 16
#define RESERVE_BYTES 100
+#define NORMALIZED_TO_NOISE_FLOOR (-96)
/**
* wma_process_mon_mgmt_tx_data(): process management tx packets
@@ -2875,12 +2876,10 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr,
txrx_status.chan_freq = hdr->chan_freq;
/* hdr->rate is in Kbps, convert into Mbps */
txrx_status.rate = (hdr->rate_kbps / 1000);
- txrx_status.ant_signal_db = hdr->rssi;
- /* RSSI -128 is invalid rssi for TX, add 96 here,
- * will be normalized during radiotap updation
+ /* RSSI is filled with TPC which will be normalized
+ * during radiotap updation, so add 96 here
*/
- if (txrx_status.ant_signal_db == -128)
- txrx_status.ant_signal_db += 96;
+ txrx_status.ant_signal_db = hdr->rssi - NORMALIZED_TO_NOISE_FLOOR;
txrx_status.nr_ant = 1;
txrx_status.rtap_flags |=
@@ -2893,6 +2892,9 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr,
IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ);
txrx_status.chan_flags = channel_flags;
txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02);
+ txrx_status.tx_status = status;
+ txrx_status.add_rtap_ext = true;
+ txrx_status.tx_retry_cnt = hdr->tx_retry_cnt;
wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf);
wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
@@ -2941,7 +2943,60 @@ static int wma_process_mon_mgmt_tx_completion(tp_wma_handle wma_handle,
qdf_mem_copy(qdf_nbuf_data(wbuf), qdf_nbuf_data(nbuf), nbuf_len);
- if (!wma_process_mon_mgmt_tx_data(mgmt_hdr, wbuf, status))
+ if (!wma_process_mon_mgmt_tx_data(
+ mgmt_hdr, wbuf,
+ wma_mgmt_pktcapture_status_map(status)))
+ qdf_nbuf_free(wbuf);
+
+ return 0;
+}
+
+/**
+ * wma_process_mon_mgmt_tx() - process tx mgmt packets for mon interface
+ * without waiting for tx completion
+ * @nbuf: netbuf
+ * @nbuf_len: nbuf length
+ *
+ * Return: 0 for success or error code
+ */
+int wma_process_mon_mgmt_tx(qdf_nbuf_t nbuf, uint32_t nbuf_len,
+ struct wmi_mgmt_params *mgmt_param,
+ uint16_t chanfreq)
+{
+ qdf_nbuf_t wbuf;
+ wmi_mgmt_hdr mgmt_hdr = {0};
+
+ wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4),
+ RESERVE_BYTES, 4, false);
+
+ if (!wbuf) {
+ WMA_LOGE("%s: Failed to allocate wbuf for mgmt len(%u)",
+ __func__, nbuf_len);
+ return -ENOMEM;
+ }
+
+ qdf_nbuf_put_tail(wbuf, nbuf_len);
+
+ qdf_mem_copy(qdf_nbuf_data(wbuf), qdf_nbuf_data(nbuf), nbuf_len);
+
+ mgmt_hdr.chan_freq = chanfreq;
+ /* Filling Tpc in rssi field.
+ * As Tpc is not available, filling with default value of tpc
+ */
+ mgmt_hdr.rssi = 0;
+ /* Assigning the local timestamp as TSF timestamp is not available*/
+ mgmt_hdr.tsf_l32 = (uint32_t)jiffies;
+
+ if (mgmt_param->tx_param.preamble_type == (1 << WMI_RATE_PREAMBLE_CCK))
+ mgmt_hdr.rate_kbps = 1000; /* Rate is 1 Mbps for CCK */
+ else
+ mgmt_hdr.rate_kbps = 6000; /* Rate is 6 Mbps for OFDM */
+
+ /* The mgmt tx packet is send to mon interface before tx completion.
+ * we do not have status for this packet, using magic number(0xFF)
+ * as status for mgmt tx packet
+ */
+ if (!wma_process_mon_mgmt_tx_data(&mgmt_hdr, wbuf, 0xFF))
qdf_nbuf_free(wbuf);
return 0;
@@ -3751,6 +3806,7 @@ wma_process_mon_mgmt_rx_data(wmi_mgmt_rx_hdr *hdr,
IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ);
txrx_status.chan_flags = channel_flags;
txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02);
+ txrx_status.add_rtap_ext = true;
wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf);
wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
@@ -3947,7 +4003,7 @@ wma_mgmt_offload_data_event_handler(void *handle, uint8_t *data,
qdf_nbuf_set_protocol(wbuf, ETH_P_CONTROL);
qdf_mem_copy(qdf_nbuf_data(wbuf), param_tlvs->bufp, hdr->buf_len);
- status = hdr->tx_status;
+ status = wma_mgmt_pktcapture_status_map(hdr->tx_status);
if (!wma_process_mon_mgmt_tx_data(hdr, wbuf, status))
qdf_nbuf_free(wbuf);
diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c
index 9d3909950965..e99baba16613 100644
--- a/core/wma/src/wma_scan_roam.c
+++ b/core/wma/src/wma_scan_roam.c
@@ -888,7 +888,7 @@ static void wma_roam_scan_fill_fils_params(tp_wma_handle wma_handle,
struct roam_fils_params *dst_fils_params, *src_fils_params;
if (!params || !roam_req || !roam_req->is_fils_connection) {
- WMA_LOGE("wma_roam_scan_fill_fils_params- NULL");
+ WMA_LOGD("wma_roam_scan_fill_fils_params- NULL");
return;
}
@@ -2806,8 +2806,8 @@ static int wma_fill_roam_synch_buffer(tp_wma_handle wma,
roam_synch_ind_ptr->rssi, roam_synch_ind_ptr->isBeacon);
if (!QDF_IS_STATUS_SUCCESS(
- wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
- roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) {
+ wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr,
+ NULL, SIR_ROAMING_DEREGISTER_STA))) {
WMA_LOGE("LFR3: CSR Roam synch cb failed");
wma_free_roam_synch_frame_ind(iface);
return status;
@@ -3235,8 +3235,7 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
goto cleanup_label;
}
qdf_mem_zero(bss_desc_ptr, sizeof(tSirBssDescription) + ie_len);
- if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(
- (tpAniSirGlobal)wma->mac_context,
+ if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(wma->mac_context,
roam_synch_ind_ptr, bss_desc_ptr,
SIR_ROAM_SYNCH_PROPAGATION))) {
WMA_LOGE("LFR3: PE roam synch cb failed");
@@ -3245,8 +3244,8 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
}
wma_roam_update_vdev(wma, roam_synch_ind_ptr);
- wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
- roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);
+ wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr,
+ bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);
wma_process_roam_synch_complete(wma, synch_event->vdev_id);
/* update freq and channel width */
@@ -3270,22 +3269,23 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
wma->interfaces[synch_event->vdev_id].chan_width,
&wma->interfaces[synch_event->vdev_id].chanmode);
- wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
- roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE);
+ wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr,
+ bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE);
wma->interfaces[synch_event->vdev_id].roam_synch_delay =
qdf_get_system_timestamp() - roam_synch_received;
WMA_LOGD("LFR3: roam_synch_delay:%d",
wma->interfaces[synch_event->vdev_id].roam_synch_delay);
- wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
- roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF);
+ wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr,
+ bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF);
status = 0;
cleanup_label:
if (status != 0) {
if (roam_synch_ind_ptr)
- wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
- roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT);
+ wma->csr_roam_synch_cb(wma->mac_context,
+ roam_synch_ind_ptr, NULL,
+ SIR_ROAMING_ABORT);
roam_req = qdf_mem_malloc(sizeof(tSirRoamOffloadScanReq));
if (roam_req && synch_event) {
roam_req->Command = ROAM_SCAN_OFFLOAD_STOP;
@@ -6951,6 +6951,54 @@ static void wma_handle_btm_disassoc_imminent_msg(tp_wma_handle wma_handle,
(void *)del_sta_ctx, 0);
}
+/*
+ * wma_invalid_roam_reason_handler() - Handle Invalid roam notification
+ * @wma: wma handle
+ * @vdev_id: vdev id
+ * @op_code: Operation to be done by the callback
+ *
+ * This function calls pe and csr callbacks with proper op_code
+ *
+ * Return: None
+ */
+static void wma_invalid_roam_reason_handler(tp_wma_handle wma_handle,
+ uint32_t vdev_id,
+ uint32_t notif)
+{
+ roam_offload_synch_ind *roam_synch_data = NULL;
+ enum sir_roam_op_code op_code;
+
+ if (notif == WMI_ROAM_NOTIF_ROAM_START) {
+ wma_handle->interfaces[vdev_id].roaming_in_progress = true;
+ op_code = SIR_ROAMING_START;
+ } else if (notif == WMI_ROAM_NOTIF_ROAM_ABORT) {
+ wma_handle->interfaces[vdev_id].roaming_in_progress = false;
+ op_code = SIR_ROAMING_ABORT;
+ } else {
+ WMA_LOGE(FL("Invalid notif %d"), notif);
+ return;
+ }
+
+ roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
+ if (!roam_synch_data)
+ return;
+
+ roam_synch_data->roamedVdevId = vdev_id;
+ wma_handle->pe_roam_synch_cb(wma_handle->mac_context, roam_synch_data,
+ NULL, op_code);
+ wma_handle->csr_roam_synch_cb(wma_handle->mac_context, roam_synch_data,
+ NULL, op_code);
+
+ qdf_mem_free(roam_synch_data);
+}
+
+void wma_handle_roam_sync_timeout(tp_wma_handle wma_handle,
+ struct roam_sync_timeout_timer_info *info)
+{
+ wma_invalid_roam_reason_handler(wma_handle, info->vdev_id,
+ WMI_ROAM_NOTIF_ROAM_ABORT);
+}
+
/**
* wma_roam_event_callback() - roam event callback
* @handle: wma handle
@@ -6968,7 +7016,6 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
WMI_ROAM_EVENTID_param_tlvs *param_buf;
wmi_roam_event_fixed_param *wmi_event;
struct sSirSmeRoamOffloadSynchInd *roam_synch_data;
- enum sir_roam_op_code op_code = {0};
param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf;
if (!param_buf) {
@@ -7040,29 +7087,8 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
break;
#endif
case WMI_ROAM_REASON_INVALID:
- roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data));
- if (NULL == roam_synch_data) {
- WMA_LOGE("Memory unavailable for roam synch data");
- return -ENOMEM;
- }
- if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START) {
- op_code = SIR_ROAMING_START;
- wma_handle->interfaces[wmi_event->vdev_id].
- roaming_in_progress = true;
- }
- if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT) {
- op_code = SIR_ROAMING_ABORT;
- wma_handle->interfaces[wmi_event->vdev_id].
- roaming_in_progress = false;
- }
- roam_synch_data->roamedVdevId = wmi_event->vdev_id;
- wma_handle->pe_roam_synch_cb(
- (tpAniSirGlobal)wma_handle->mac_context,
- roam_synch_data, NULL, op_code);
- wma_handle->csr_roam_synch_cb(
- (tpAniSirGlobal)wma_handle->mac_context,
- roam_synch_data, NULL, op_code);
- qdf_mem_free(roam_synch_data);
+ wma_invalid_roam_reason_handler(wma_handle, wmi_event->vdev_id,
+ wmi_event->notif);
break;
case WMI_ROAM_REASON_RSO_STATUS:
wma_rso_cmd_status_event_handler(wmi_event);
@@ -7074,9 +7100,9 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
return -ENOMEM;
}
roam_synch_data->roamedVdevId = wmi_event->vdev_id;
- wma_handle->csr_roam_synch_cb(
- (tpAniSirGlobal)wma_handle->mac_context,
- roam_synch_data, NULL, SIR_ROAMING_INVOKE_FAIL);
+ wma_handle->csr_roam_synch_cb(wma_handle->mac_context,
+ roam_synch_data, NULL,
+ SIR_ROAMING_INVOKE_FAIL);
qdf_mem_free(roam_synch_data);
break;
default:
diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c
index 6e254d1cb79f..af9459c262e0 100644
--- a/core/wma/src/wma_utils.c
+++ b/core/wma/src/wma_utils.c
@@ -6577,3 +6577,33 @@ QDF_STATUS wma_get_roam_scan_stats(WMA_HANDLE handle,
return QDF_STATUS_SUCCESS;
}
+/**
+ * wma_mgmt_pktcapture_status_map() - map Tx status for MGMT packets
+ * with packet capture Tx status
+ * @status: Tx status
+ *
+ * Return: pktcapture_tx_status enum
+ */
+enum pktcapture_tx_status
+wma_mgmt_pktcapture_status_map(uint8_t status)
+{
+ enum pktcapture_tx_status tx_status;
+
+ switch (status) {
+ case WMI_MGMT_TX_COMP_TYPE_COMPLETE_OK:
+ tx_status = pktcapture_tx_status_ok;
+ break;
+ case WMI_MGMT_TX_COMP_TYPE_DISCARD:
+ tx_status = pktcapture_tx_status_discard;
+ break;
+ case WMI_MGMT_TX_COMP_TYPE_COMPLETE_NO_ACK:
+ tx_status = pktcapture_tx_status_no_ack;
+ break;
+ default:
+ tx_status = pktcapture_tx_status_discard;
+ break;
+ }
+
+ return tx_status;
+}
+