Snap for 4733232 from f95e4bd59474b14b76ef1b1fc9c3531791e40054 to nyc-iot-release
Change-Id: I6bd9db2e29bdb258688e5117de85fa5783f69f19
diff --git a/drivers/platform/msm/avtimer.c b/drivers/platform/msm/avtimer.c
index a2ef12f..36864e1 100644
--- a/drivers/platform/msm/avtimer.c
+++ b/drivers/platform/msm/avtimer.c
@@ -313,6 +313,43 @@
}
EXPORT_SYMBOL(avcs_core_query_timer);
+/* This function will return the offset between system clock & avtimer clock
+ which can then be used to map timestamps coming from avtimer in system time
+ context. Also adsp state doesn't needed to be checked in this function as it
+ would be made sure in caller context */
+
+int avcs_core_query_timer_offset(int64_t *av_offset)
+{
+ uint32_t avtimer_msw = 0, avtimer_lsw = 0;
+ uint32_t res = 0;
+ uint64_t avtimer_tick_temp, sys_time = 0;
+ struct timespec ts = {0};
+
+ mutex_lock(&avtimer.avtimer_lock);
+ if ((avtimer.p_avtimer_lsw == NULL)||(avtimer.p_avtimer_msw == NULL))
+ {
+ mutex_unlock(&avtimer.avtimer_lock);
+ return -EINVAL;
+ }
+
+ avtimer_lsw = ioread32(avtimer.p_avtimer_lsw);
+ avtimer_msw = ioread32(avtimer.p_avtimer_msw);
+
+ ktime_get_ts(&ts);
+ mutex_unlock(&avtimer.avtimer_lock);
+
+ sys_time = ts.tv_sec * 1000000LL + div64_u64(ts.tv_nsec, 1000);
+ avtimer_tick_temp = (uint64_t)((uint64_t)avtimer_msw << 32) | avtimer_lsw;
+
+ res = do_div(avtimer_tick_temp, avtimer.clk_div);
+ *av_offset = sys_time - avtimer_tick_temp;
+ pr_debug_ratelimited("%s:Avtimer: sys_time: %llu, avtime %llu offset %lld\n",
+ __func__,
+ sys_time, avtimer_tick_temp, *av_offset);
+ return 0;
+}
+EXPORT_SYMBOL(avcs_core_query_timer_offset);
+
static int avtimer_open(struct inode *inode, struct file *file)
{
return avcs_core_disable_power_collapse(1);
diff --git a/drivers/staging/qcacld-2.0/Android.mk b/drivers/staging/qcacld-2.0/Android.mk
index d0655d7..9ad22f0 100644
--- a/drivers/staging/qcacld-2.0/Android.mk
+++ b/drivers/staging/qcacld-2.0/Android.mk
@@ -128,15 +128,24 @@
LOCAL_MODULE_KBUILD_NAME := wlan.ko
LOCAL_MODULE_TAGS := debug
LOCAL_MODULE_DEBUG_ENABLE := true
+ifeq ($(PRODUCT_VENDOR_MOVE_ENABLED), true)
+LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/lib/modules/$(WLAN_CHIPSET)
+else
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib/modules/$(WLAN_CHIPSET)
+endif # PRODUCT_VENDOR_MOVE_ENABLED
include $(DLKM_DIR)/AndroidKernelModule.mk
###########################################################
#Create symbolic link
+ifeq ($(PRODUCT_VENDOR_MOVE_ENABLED), true)
+$(shell mkdir -p $(TARGET_OUT_VENDOR)/lib/modules; \
+ ln -sf /$(TARGET_COPY_OUT_VENDOR)/lib/modules/$(WLAN_CHIPSET)/$(WLAN_CHIPSET)_wlan.ko \
+ $(TARGET_OUT_VENDOR)/lib/modules/wlan.ko)
+else
$(shell mkdir -p $(TARGET_OUT)/lib/modules; \
- ln -sf /system/lib/modules/$(WLAN_CHIPSET)/$(WLAN_CHIPSET)_wlan.ko \
- $(TARGET_OUT)/lib/modules/wlan.ko)
-
+ ln -sf /system/lib/modules/$(WLAN_CHIPSET)/$(WLAN_CHIPSET)_wlan.ko \
+ $(TARGET_OUT)/lib/modules/wlan.ko)
+endif # PRODUCT_VENDOR_MOVE_ENABLED
endif # DLKM check
endif # supported target check
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.c
index 40fadc4..3e91ceb 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2014-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -389,9 +389,17 @@
return status;
}
+void htt_htc_detach(struct htt_pdev_t *pdev)
+{
+ htc_disconnect_service(pdev->htc_endpoint);
+ return;
+}
+
+
void
htt_detach(htt_pdev_handle pdev)
{
+ htt_htc_detach(pdev);
htt_rx_detach(pdev);
htt_tx_detach(pdev);
htt_htc_pkt_pool_free(pdev);
@@ -453,7 +461,8 @@
* TODO:Conditional disabling will be removed once firmware
* with reduced tx completion is pushed into release builds.
*/
- if (!pdev->cfg.default_tx_comp_req) {
+ if ((!pdev->cfg.default_tx_comp_req) ||
+ ol_cfg_is_ptp_enabled(pdev->ctrl_pdev)) {
connect.ConnectionFlags |= HTC_CONNECT_FLAGS_DISABLE_CREDIT_FLOW_CTRL;
}
#else
@@ -527,12 +536,12 @@
indent+4, " ",
pdev->rx_ring.size,
pdev->rx_ring.fill_level);
- adf_os_print("%*sat %p (%#x paddr)\n", indent+8, " ",
+ adf_os_print("%*sat %pK (%#x paddr)\n", indent+8, " ",
pdev->rx_ring.buf.paddrs_ring,
pdev->rx_ring.base_paddr);
- adf_os_print("%*snetbuf ring @ %p\n", indent+8, " ",
+ adf_os_print("%*snetbuf ring @ %pK\n", indent+8, " ",
pdev->rx_ring.buf.netbufs_ring);
- adf_os_print("%*sFW_IDX shadow register: vaddr = %p, paddr = %#x\n",
+ adf_os_print("%*sFW_IDX shadow register: vaddr = %pK, paddr = %#x\n",
indent+8, " ",
pdev->rx_ring.alloc_idx.vaddr,
pdev->rx_ring.alloc_idx.paddr);
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.h
index c608cf5..59c5864 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -4068,6 +4068,7 @@
HTT_T2H_MSG_TYPE_FLOW_POOL_MAP = 0x18,
HTT_T2H_MSG_TYPE_FLOW_POOL_UNMAP = 0x19,
HTT_T2H_MSG_TYPE_SRING_SETUP_DONE = 0x1a,
+ HTT_T2H_MSG_TYPE_MONITOR_MAC_HEADER_IND = 0x20,
HTT_T2H_MSG_TYPE_TEST,
/* keep this last */
@@ -4487,7 +4488,8 @@
{
A_UINT32 /* word 0 */
fw_rx_desc_bytes: 16,
- reserved0: 16;
+ noise_floor_chain0: 8,
+ noise_floor_chain1: 8;
} POSTPACK;
#define HTT_RX_IND_HDR_SUFFIX_BYTES (sizeof(struct htt_rx_ind_hdr_suffix_t))
@@ -4593,7 +4595,7 @@
* |--------------------------------------------------------------------------|
* | service | HT-SIG / VHT-SIG-A2 |
* |==========================================================================|
- * | reserved | FW rx desc bytes |
+ * | chain1 NF | chain0 NF | FW rx desc bytes |
* |--------------------------------------------------------------------------|
* | MSDU Rx | MSDU Rx | MSDU Rx | MSDU Rx |
* | desc B3 | desc B2 | desc B1 | desc B0 |
@@ -4896,6 +4898,12 @@
* Bits 15:0
* Purpose: Indicate how many bytes in the Rx indication are used for
* FW Rx descriptors
+ * - chain0 noise floor
+ * Bits 23:16
+ * Purpose: Indicate chain0 noise floor to host
+ * - chain1 noise floor
+ * Bits 31:24
+ * Purpose: Indicate chain1 noise floor to host
*
* Payload fields:
* - MPDU_COUNT
@@ -4974,6 +4982,11 @@
#define HTT_RX_IND_FW_RX_DESC_BYTES_M 0xffff
#define HTT_RX_IND_FW_RX_DESC_BYTES_S 0
+#define HTT_RX_IND_NOISE_FLOOR_CHAIN0_M 0x00ff0000
+#define HTT_RX_IND_NOISE_FLOOR_CHAIN0_S 16
+#define HTT_RX_IND_NOISE_FLOOR_CHAIN1_M 0xff000000
+#define HTT_RX_IND_NOISE_FLOOR_CHAIN1_S 24
+
/* payload fields */
#define HTT_RX_IND_MPDU_COUNT_M 0xff
#define HTT_RX_IND_MPDU_COUNT_S 0
@@ -5022,6 +5035,11 @@
#define HTT_RX_IND_FW_RX_DESC_BYTES_GET(word) \
(((word) & HTT_RX_IND_FW_RX_DESC_BYTES_M) >> HTT_RX_IND_FW_RX_DESC_BYTES_S)
+#define HTT_RX_IND_NOISE_FLOOR_CHAIN0_GET(word) \
+ (((word) & HTT_RX_IND_NOISE_FLOOR_CHAIN0_M) >> HTT_RX_IND_NOISE_FLOOR_CHAIN0_S)
+#define HTT_RX_IND_NOISE_FLOOR_CHAIN1_GET(word) \
+ (((word) & HTT_RX_IND_NOISE_FLOOR_CHAIN1_M) >> HTT_RX_IND_NOISE_FLOOR_CHAIN1_S)
+
#define HTT_RX_IND_FLUSH_SEQ_NUM_START_SET(word, value) \
do { \
@@ -6220,15 +6238,19 @@
* The following diagram shows the format of the TX completion indication sent
* from the target to the host
*
- * |31 25| 24|23 16| 15 |14 11|10 8|7 0|
+ * |31 27|26|25|24|23 16| 15 |14 11|10 8|7 0|
* |-------------------------------------------------------------|
- * header: | reserved |append| num | t_i| tid |status| msg_type |
+ * header: | reserved |a2|a1|a0| num | t_i| tid |status | msg_type |
* |-------------------------------------------------------------|
* payload: | MSDU1 ID | MSDU0 ID |
* |-------------------------------------------------------------|
* : MSDU3 ID : MSDU2 ID :
* |-------------------------------------------------------------|
* | struct htt_tx_compl_ind_append_retries |
+ * |-------------------------------------------------------------|
+ * | struct htt_tx_compl_ind_append_txtstamp |
+ * |-------------------------------------------------------------|
+ * | struct htt_tx_compl_ind_append_txpower |
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
* The following field definitions describe the format of the TX completion
@@ -6255,10 +6277,21 @@
* Bits 23:16
* Purpose: the number of payload in this indication
* Value: 1 to 255
- * - append
+ * - a0 - append0
* Bits 24:24
* Purpose: append the struct htt_tx_compl_ind_append_retries which contains
- * the number of tx retries for one MSDU at the end of this message
+ * the number of tx retries for one MSDU after MSDU ID.
+ * Value: 0 indicates no appending; 1 indicates appending
+ * - a1 - append1
+ * Bits 25:25
+ * Purpose: append the struct htt_tx_compl_ind_append_txtstamp which contains
+ * the timestamp info for each TX msdu id in payload after append0.
+ * Value: 0 indicates no appending; 1 indicates appending
+ * - a2 - append2
+ * Bits 26:26
+ * Purpose: append the struct htt_tx_compl_ind_append_txpower which contains
+ * one or more tx power of each MSDUs after append1.
+ * The start of tx power(s) must be 4-bytes-word aligned.
* Value: 0 indicates no appending; 1 indicates appending
* Payload fields:
* - hmsdu_id
@@ -6277,6 +6310,10 @@
#define HTT_TX_COMPL_IND_NUM_M 0x00ff0000
#define HTT_TX_COMPL_IND_APPEND_S 24
#define HTT_TX_COMPL_IND_APPEND_M 0x01000000
+#define HTT_TX_COMPL_IND_APPEND1_S 25
+#define HTT_TX_COMPL_IND_APPEND1_M 0x02000000
+#define HTT_TX_COMPL_IND_APPEND2_S 26
+#define HTT_TX_COMPL_IND_APPEND2_M 0x04000000
#define HTT_TX_COMPL_IND_STATUS_SET(_info, _val) \
do { \
@@ -6314,6 +6351,23 @@
} while (0)
#define HTT_TX_COMPL_IND_APPEND_GET(_info) \
(((_info) & HTT_TX_COMPL_IND_APPEND_M) >> HTT_TX_COMPL_IND_APPEND_S)
+#define HTT_TX_COMPL_IND_APPEND1_SET(_info, _val) \
+ do { \
+ HTT_CHECK_SET_VAL(HTT_TX_COMPL_IND_APPEND1, _val); \
+ ((_info) |= ((_val) << HTT_TX_COMPL_IND_APPEND1_S)); \
+ } while (0)
+#define HTT_TX_COMPL_IND_APPEND1_GET(_info) \
+ (((_info) & HTT_TX_COMPL_IND_APPEND1_M) >> HTT_TX_COMPL_IND_APPEND1_S)
+#define HTT_TX_COMPL_IND_APPEND2_SET(_info, _val) \
+ do { \
+ HTT_CHECK_SET_VAL(HTT_TX_COMPL_IND_APPEND2, _val); \
+ ((_info) |= ((_val) << HTT_TX_COMPL_IND_APPEND2_S)); \
+ } while (0)
+#define HTT_TX_COMPL_IND_APPEND2_GET(_info) \
+ (((_info) & HTT_TX_COMPL_IND_APPEND2_M) >> HTT_TX_COMPL_IND_APPEND2_S)
+
+#define HTT_TX_COMPL_HEAD_SZ 4
+#define HTT_TX_COMPL_BYTES_PER_MSDU_ID 2
#define HTT_TX_COMPL_CTXT_SZ sizeof(A_UINT16)
#define HTT_TX_COMPL_CTXT_NUM(_bytes) ((_bytes) >> 1)
@@ -6332,6 +6386,10 @@
*/
#define HTT_TX_COMPL_IND_STAT_PEER_DEL 4
+#if defined(CONFIG_HL_SUPPORT)
+/* The FAIL_NOTIFY status is used for regular frms in HL cases */
+#define HTT_TX_COMPL_IND_STAT_FAIL_NOTIFY 5
+#endif
#define HTT_TX_COMPL_IND_APPEND_SET_MORE_RETRY(f) ((f) |= 0x1)
#define HTT_TX_COMPL_IND_APPEND_CLR_MORE_RETRY(f) ((f) &= (~0x1))
@@ -6348,6 +6406,14 @@
0: this is the last append_retries struct */
} POSTPACK;
+PREPACK struct htt_tx_compl_ind_append_txtstamp {
+ A_UINT32 timestamp[1/*or more*/];
+} POSTPACK;
+
+PREPACK struct htt_tx_compl_ind_append_txpower {
+ A_UINT16 tx_power[1/*or more*/];
+} POSTPACK;
+
/**
* @brief target -> host rate-control update indication message
*
@@ -8123,4 +8189,76 @@
((_var) |= ((_val) << HTT_SRING_SETUP_DONE_STATUS_S)); \
} while (0)
+/**
+ * @brief target -> host monitor mac header indication message
+ *
+ * @details
+ * The following diagram shows the format of the monitor mac header message
+ * sent from the target to the host, while enable rx filter promiscuous.
+ *
+ * |31 24|23 16|15 8|7 0|
+ * |-------------------------------------------------------------|
+ * | peer_id | reserved0 | msg_type |
+ * |-------------------------------------------------------------|
+ * | reserved1 | num_mpdu |
+ * |-------------------------------------------------------------|
+ * | struct hw_rx_desc |
+ * | (see wal_rx_desc.h) |
+ * |-------------------------------------------------------------|
+ * | struct ieee80211_frame_addr4 |
+ * | (see ieee80211_defs.h) |
+ * | ...... |
+ * |-------------------------------------------------------------|
+ *
+ * Header fields:
+ * - msg_type
+ * Bits 7:0
+ * Purpose: Identifies this is a monitor mac header indication
+ * message.
+ * Value: 0x20
+ * - reserved0
+ * Bits 15:8
+ * Purpose:
+ * value:
+ * - peer_id
+ * Bits 31:16
+ * Purpose: Software peer id given by host during association,
+ in this case it should be set to invalid(0xFF)
+ * Value:
+ * - num_mpdu
+ * Bits 15:0
+ * Purpose: numbers of mpdu mac header (struct ieee80211_frame_addr4) per rx ppdu
+ * the maximum num_mpdu is limited to 32.
+ * Value:
+ * - reserved1
+ * Bits 31:16
+ * Purpose:
+ * value:
+ */
+#define HTT_T2H_MONITOR_MAC_HEADER_IND_HDR_SIZE 8
+
+#define HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_M 0xFFFF0000
+#define HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_S 16
+
+#define HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_M 0x0000FFFF
+#define HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_S 0
+
+#define HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_SET(word, value) \
+ do { \
+ HTT_CHECK_SET_VAL(HTT_T2H_MONITOR_MAC_HEADER_PEER_ID, value); \
+ (word) |= (value) << HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_S; \
+ } while (0)
+#define HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_GET(word) \
+ (((word) & HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_M) >> \
+ HTT_T2H_MONITOR_MAC_HEADER_PEER_ID_S)
+
+#define HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_SET(word, value) \
+ do { \
+ HTT_CHECK_SET_VAL(HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU, value); \
+ (word) |= (value) << HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_S; \
+ } while (0)
+#define HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_GET(word) \
+ (((word) & HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_M) >> \
+ HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_S)
+
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_h2t.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_h2t.c
index 541dec2a..073d45f 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_h2t.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_h2t.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -132,9 +132,21 @@
u_int32_t *msg_word;
u_int32_t msg_size;
u_int32_t max_tx_group;
+ int tx_credit_availablity = A_EINVAL;
+
+ if ((pdev->cfg.is_high_latency) &&
+ (!pdev->cfg.default_tx_comp_req)) {
+ tx_credit_availablity = ol_tx_target_credit_dec(pdev->txrx_pdev, 1);
+ if(tx_credit_availablity == A_ERROR) {
+ return A_ERROR; /* failure */
+ }
+ }
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt) {
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
return A_ERROR; /* failure */
}
@@ -158,6 +170,9 @@
HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, TRUE);
if (!msg) {
htt_htc_pkt_free(pdev, pkt);
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
return A_ERROR; /* failure */
}
@@ -206,10 +221,6 @@
#else
HTCSendPkt(pdev->htc_pdev, &pkt->htc_pkt);
#endif
- if ((pdev->cfg.is_high_latency) &&
- (!pdev->cfg.default_tx_comp_req)) {
- ol_tx_target_credit_update(pdev->txrx_pdev, -1);
- }
return A_OK;
}
@@ -405,9 +416,20 @@
struct htt_htc_pkt *pkt;
adf_nbuf_t msg;
u_int32_t *msg_word;
+ int tx_credit_availablity = A_EINVAL;
+
+ if (!pdev->cfg.default_tx_comp_req) {
+ tx_credit_availablity = ol_tx_target_credit_dec(pdev->txrx_pdev, 1);
+ if(tx_credit_availablity == A_ERROR) {
+ return A_ERROR; /* failure */
+ }
+ }
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt) {
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
return A_ERROR; /* failure */
}
@@ -422,6 +444,9 @@
HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, TRUE);
if (!msg) {
htt_htc_pkt_free(pdev, pkt);
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
return A_ERROR; /* failure */
}
/*
@@ -532,9 +557,6 @@
#else
HTCSendPkt(pdev->htc_pdev, &pkt->htc_pkt);
#endif
- if (!pdev->cfg.default_tx_comp_req) {
- ol_tx_target_credit_update(pdev->txrx_pdev, -1);
- }
return A_OK;
}
@@ -551,10 +573,22 @@
adf_nbuf_t msg;
u_int32_t *msg_word;
uint16_t htc_tag = 1;
+ int tx_credit_availablity = A_EINVAL;
+
+ if ((pdev->cfg.is_high_latency) &&
+ (!pdev->cfg.default_tx_comp_req)) {
+ tx_credit_availablity = ol_tx_target_credit_dec(pdev->txrx_pdev, 1);
+ if(tx_credit_availablity == A_ERROR) {
+ return A_ERROR; /* failure */
+ }
+ }
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt) {
- return -1; /* failure */
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
+ return A_ERROR; /* failure */
}
if (stats_type_upload_mask >= 1 << HTT_DBG_NUM_STATS ||
@@ -564,7 +598,10 @@
adf_os_print("%#x %#x stats not supported\n",
stats_type_upload_mask, stats_type_reset_mask);
htt_htc_pkt_free(pdev, pkt);
- return -1; /* failure */
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
+ return A_ERROR; /* failure */
}
if (stats_type_reset_mask)
@@ -581,7 +618,10 @@
HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, FALSE);
if (!msg) {
htt_htc_pkt_free(pdev, pkt);
- return -1; /* failure */
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
+ return A_ERROR; /* failure */
}
/* set the length of the message */
adf_nbuf_put_tail(msg, HTT_H2T_STATS_REQ_MSG_SZ);
@@ -630,10 +670,6 @@
#else
HTCSendPkt(pdev->htc_pdev, &pkt->htc_pkt);
#endif
- if ((pdev->cfg.is_high_latency) &&
- (!pdev->cfg.default_tx_comp_req)) {
- ol_tx_target_credit_update(pdev->txrx_pdev, -1);
- }
return 0;
}
@@ -643,9 +679,21 @@
struct htt_htc_pkt *pkt;
adf_nbuf_t msg;
u_int32_t *msg_word;
+ int tx_credit_availablity = A_EINVAL;
+
+ if ((pdev->cfg.is_high_latency) &&
+ (!pdev->cfg.default_tx_comp_req)) {
+ tx_credit_availablity = ol_tx_target_credit_dec(pdev->txrx_pdev, 1);
+ if(tx_credit_availablity == A_ERROR) {
+ return A_ERROR; /* failure */
+ }
+ }
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt) {
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
return A_NO_MEMORY;
}
@@ -691,10 +739,6 @@
#else
HTCSendPkt(pdev->htc_pdev, &pkt->htc_pkt);
#endif
- if ((pdev->cfg.is_high_latency) &&
- (!pdev->cfg.default_tx_comp_req)) {
- ol_tx_target_credit_update(pdev->txrx_pdev, -1);
- }
return A_OK;
}
@@ -706,10 +750,22 @@
struct htt_htc_pkt *pkt;
adf_nbuf_t msg;
u_int32_t *msg_word;
+ int tx_credit_availablity = A_EINVAL;
+
+ if ((pdev->cfg.is_high_latency) &&
+ (!pdev->cfg.default_tx_comp_req)) {
+ tx_credit_availablity = ol_tx_target_credit_dec(pdev->txrx_pdev, 1);
+ if(tx_credit_availablity == A_ERROR) {
+ return A_ERROR; /* failure */
+ }
+ }
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt) {
- return -1; /* failure */
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
+ return A_ERROR; /* failure */
}
/* show that this is not a tx frame download (not required, but helpful) */
@@ -723,7 +779,10 @@
HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, FALSE);
if (!msg) {
htt_htc_pkt_free(pdev, pkt);
- return -1; /* failure */
+ if (tx_credit_availablity == A_OK) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ }
+ return A_ERROR; /* failure */
}
/* set the length of the message */
adf_nbuf_put_tail(msg, HTT_AGGR_CFG_MSG_SZ);
@@ -761,10 +820,6 @@
#else
HTCSendPkt(pdev->htc_pdev, &pkt->htc_pkt);
#endif
- if ((pdev->cfg.is_high_latency) &&
- (!pdev->cfg.default_tx_comp_req)) {
- ol_tx_target_credit_update(pdev->txrx_pdev, -1);
- }
return 0;
}
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_internal.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_internal.h
index 2bff7e4..667bf4f 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_internal.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_internal.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016, 2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -51,6 +51,21 @@
#include <rx_desc.h>
#include <wal_rx_desc.h> /* struct rx_attention, etc */
+/*
+ * Define the HW descriptor information used by host,
+ * which is copied by FW into HTT msg.
+ */
+struct htt_hw_rx_desc_base {
+ struct rx_attention attention;
+ struct rx_frag_info frag_info;
+ struct rx_mpdu_start mpdu_start;
+ struct rx_msdu_start msdu_start;
+ struct rx_msdu_end msdu_end;
+ struct rx_mpdu_end mpdu_end;
+ struct rx_ppdu_start ppdu_start;
+ struct rx_ppdu_end ppdu_end;
+};
+
struct htt_host_fw_desc_base {
union {
struct fw_rx_desc_base val;
@@ -341,9 +356,9 @@
#endif
#ifdef ATH_11AC_TXCOMPACT
- #define HTT_TX_SCHED htt_tx_sched
+#define HTT_TX_SCHED htt_tx_sched
#else
- #define HTT_TX_SCHED(pdev) /* no-op */
+#define HTT_TX_SCHED(pdev) /* no-op */
#endif
int
@@ -361,6 +376,16 @@
int
htt_htc_attach(struct htt_pdev_t *pdev);
+/**
+ * htt_htc_detach() - Detach htc service from htt
+ * @pdev: htt pdev handle
+ *
+ *
+ * Return: None
+ */
+void
+htt_htc_detach(struct htt_pdev_t *pdev);
+
void
htt_t2h_msg_handler(void *context, HTC_PACKET *pkt);
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c
index 6dc8dc5..53c82ad 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -312,6 +312,13 @@
}
fail:
+ /*
+ * Make sure alloc index write is reflected correctly before FW polls
+ * remote ring write index as compiler can reorder the instructions
+ * based on optimizations.
+ */
+
+ adf_os_mb();
*(pdev->rx_ring.alloc_idx.vaddr) = idx;
return;
}
@@ -1284,6 +1291,13 @@
}
int
+htt_rx_offload_msdu_cnt_ll(
+ htt_pdev_handle pdev)
+{
+ return htt_rx_ring_elems(pdev);
+}
+
+int
htt_rx_offload_msdu_pop_ll(
htt_pdev_handle pdev,
adf_nbuf_t offload_deliver_msg,
@@ -1744,6 +1758,270 @@
return 1;
}
+
+/**
+ * get_ht_vht_info() - get ht/vht information
+ * @rx_desc: pointer to htt_host_rx_desc_base.
+ * @rx_status: pointer to mon_rx_status.
+ *
+ * This function retrieve MCS/VHT info by parsing preamble,
+ * vht_sig_a1 and vht_sig_a2, which follows ieee80211 spec.
+ * Since high latency path doesn't config PPDU/MPDU start/end,
+ * it only uses the info which htt_rx_ppdu_desc_t has.
+ *
+ * Return: None.
+ */
+static void get_ht_vht_info_hl(struct htt_rx_ppdu_desc_t *rx_desc,
+ struct mon_rx_status *rx_status)
+{
+ uint8_t preamble_type =
+ (uint8_t)rx_desc->preamble_type;
+
+ switch (preamble_type) {
+ case 8:
+ case 9:
+ rx_status->mcs_info.valid = 1;
+ rx_status->vht_info.valid = 0;
+ rx_status->mcs_info.mcs = rx_desc->vht_sig_a1 & 0x7f;
+ rx_status->nr_ant = rx_status->mcs_info.mcs >> 3;
+ rx_status->mcs_info.bw = (rx_desc->vht_sig_a1 >> 7) & 0x1;
+ rx_status->mcs_info.smoothing = rx_desc->vht_sig_a2 & 0x1;
+ rx_status->mcs_info.not_sounding =
+ (rx_desc->vht_sig_a2 >> 1) & 0x1;
+ rx_status->mcs_info.aggregation =
+ (rx_desc->vht_sig_a2 >> 3) & 0x1;
+ rx_status->mcs_info.stbc = (rx_desc->vht_sig_a2 >> 4) & 0x3;
+ rx_status->mcs_info.fec = (rx_desc->vht_sig_a2 >> 6) & 0x1;
+ rx_status->mcs_info.sgi = (rx_desc->vht_sig_a2 >> 7) & 0x1;
+ rx_status->mcs_info.ness = (rx_desc->vht_sig_a2 >> 8) & 0x3;
+ break;
+ case 0x0c: /* VHT w/o TxBF */
+ case 0x0d: /* VHT w/ TxBF */
+ rx_status->vht_info.valid = 1;
+ rx_status->mcs_info.valid = 0;
+ rx_status->vht_info.bw = rx_desc->vht_sig_a1 & 0x3;
+ rx_status->vht_info.stbc = (rx_desc->vht_sig_a1 >> 3) & 0x1;
+ /* Currently only handle SU case */
+ rx_status->vht_info.gid = (rx_desc->vht_sig_a1 >> 4) & 0x3f;
+ rx_status->vht_info.nss = (rx_desc->vht_sig_a1 >> 10) & 0x7;
+ rx_status->nr_ant = (rx_desc->vht_sig_a1 >> 10) & 0x7;
+ rx_status->vht_info.paid = (rx_desc->vht_sig_a1 >> 13) & 0x1ff;
+ rx_status->vht_info.txps_forbidden =
+ (rx_desc->vht_sig_a1 >> 22) & 0x1;
+ rx_status->vht_info.sgi = rx_desc->vht_sig_a2 & 0x1;
+ rx_status->vht_info.sgi_disambiguation =
+ (rx_desc->vht_sig_a2 >> 1) & 0x1;
+ rx_status->vht_info.coding = (rx_desc->vht_sig_a2 >> 2) & 0x1;
+ rx_status->vht_info.ldpc_extra_symbol =
+ (rx_desc->vht_sig_a2 >> 3) & 0x1;
+ rx_status->vht_info.mcs = (rx_desc->vht_sig_a2
+ >> 4) & 0xf;
+ rx_status->vht_info.beamformed = (rx_desc->vht_sig_a2
+ >> 8) & 0x1;
+ break;
+ default:
+ rx_status->mcs_info.valid = 0;
+ rx_status->vht_info.valid = 0;
+ rx_status->nr_ant = 1;
+ break;
+ }
+}
+
+/**
+ * htt_get_radiotap_rx_status_hl() - Update information about the
+ * rx status, which is used later for radiotap update.
+ * @rx_desc: Pointer to struct htt_rx_ppdu_desc_t
+ * @rx_status: Return variable updated with rx_status
+ *
+ * Return: None
+ */
+void htt_get_radiotap_rx_status_hl(struct htt_rx_ppdu_desc_t *rx_desc,
+ struct mon_rx_status *rx_status)
+{
+ uint16_t channel_flags = 0;
+
+ rx_status->tsft = (u_int64_t)rx_desc->tsf32;
+ /* IEEE80211_RADIOTAP_F_FCS */
+ rx_status->flags |= 0x10;
+ rx_status->rate = get_rate(rx_desc->legacy_rate_sel,
+ rx_desc->legacy_rate);
+ channel_flags |= rx_desc->legacy_rate_sel ?
+ IEEE80211_CHAN_CCK : IEEE80211_CHAN_OFDM;
+ if (rx_status->chan)
+ channel_flags |=
+ (vos_chan_to_band(vos_freq_to_chan(rx_status->chan))
+ == VOS_BAND_2GHZ ?
+ IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ);
+ rx_status->chan_flags = channel_flags;
+ rx_status->ant_signal_db = rx_desc->rssi_cmb;
+ get_ht_vht_info_hl(rx_desc, rx_status);
+}
+
+/**
+ * htt_rx_mon_amsdu_pop_hl() - pop amsdu in HL monitor mode
+ * @pdev: Pointer to struct htt_pdev_handle
+ * @rx_ind_msg: htt rx indication message
+ * @head_msdu: head msdu
+ * @tail_msdu: tail msdu
+ *
+ * Return: 0 - success, others - failure
+ */
+int
+htt_rx_mon_amsdu_pop_hl(
+ htt_pdev_handle pdev,
+ adf_nbuf_t rx_ind_msg,
+ adf_nbuf_t *head_msdu,
+ adf_nbuf_t *tail_msdu)
+{
+ struct htt_rx_ppdu_desc_t *rx_ppdu_desc;
+ void *rx_desc, *rx_mpdu_desc;
+ struct mon_rx_status rx_status = {0};
+ int rtap_len = 0;
+ uint16_t center_freq;
+ uint16_t chan1;
+ uint16_t chan2;
+ uint8_t phymode;
+ a_bool_t ret;
+
+ pdev->rx_desc_size_hl =
+ (adf_nbuf_data(rx_ind_msg))
+ [HTT_ENDIAN_BYTE_IDX_SWAP(
+ HTT_RX_IND_HL_RX_DESC_LEN_OFFSET)];
+
+ adf_nbuf_pull_head(rx_ind_msg,
+ sizeof(struct hl_htt_rx_ind_base));
+
+ *head_msdu = *tail_msdu = rx_ind_msg;
+
+ rx_desc = htt_rx_msdu_desc_retrieve(pdev, *head_msdu);
+ rx_ppdu_desc = (struct htt_rx_ppdu_desc_t *)((uint8_t *)(rx_desc) -
+ HTT_RX_IND_HL_BYTES + HTT_RX_IND_HDR_PREFIX_BYTES);
+
+ rx_mpdu_desc =
+ htt_rx_mpdu_desc_list_next(pdev, rx_ind_msg);
+ ret = htt_rx_msdu_center_freq(pdev, NULL, rx_mpdu_desc,
+ ¢er_freq, &chan1, &chan2, &phymode);
+
+ if (ret == A_TRUE)
+ rx_status.chan = center_freq;
+ else
+ rx_status.chan = 0;
+
+ htt_get_radiotap_rx_status_hl(rx_ppdu_desc, &rx_status);
+ /*
+ * set headroom size to 0 to append to tail of skb. For HL path,
+ * rx desc size is variable and will be used later in ol_rx_deliver
+ * function to reset adf_nbuf to payload. So, to avoid overwriting
+ * the rx desc, radiotap header is added to the tail of adf_nbuf
+ * at first and move to head before indicating to OS.
+ */
+ rtap_len = adf_nbuf_update_radiotap(&rx_status, *head_msdu, 0);
+
+ adf_nbuf_set_next(*tail_msdu, NULL);
+ return 0;
+}
+
+int
+htt_rx_mac_header_mon_process(
+ htt_pdev_handle pdev,
+ adf_nbuf_t rx_ind_msg,
+ adf_nbuf_t *head_msdu,
+ adf_nbuf_t *tail_msdu)
+{
+ struct htt_hw_rx_desc_base *hw_desc;
+ struct ieee80211_frame_addr4 *mac_array;
+ uint8_t rtap_buf[sizeof(struct ieee80211_radiotap_header) + 100] = {0};
+ uint16_t rtap_len;
+ uint32_t *msg_word;
+ uint8_t *rx_ind_data;
+ adf_nbuf_t msdu = NULL;
+
+ /* num of mac header in rx_ind_msg */
+ int num_elems;
+ int elem;
+ uint32_t tsf;
+ uint32_t rssi_comb;
+
+ rx_ind_data = adf_nbuf_data(rx_ind_msg);
+ msg_word = (uint32_t *)rx_ind_data;
+ msg_word++;
+ num_elems = HTT_T2H_MONITOR_MAC_HEADER_NUM_MPDU_GET(*msg_word);
+
+ /* what's the num_elem max value? */
+ if (num_elems <= 0)
+ return 0;
+
+ /* get htt_hw_rx_desc_base_rx_desc pointer */
+ hw_desc = (struct htt_hw_rx_desc_base *)
+ (rx_ind_data + HTT_T2H_MONITOR_MAC_HEADER_IND_HDR_SIZE);
+
+ rssi_comb = hw_desc->ppdu_start.rssi_comb;
+ tsf = hw_desc->ppdu_end.tsf_timestamp;
+
+ /* construct one radiotap header */
+ rtap_len = adf_nbuf_construct_radiotap(
+ rtap_buf,
+ tsf,
+ rssi_comb);
+
+ /* get ieee80211_frame_addr4 array pointer*/
+ mac_array = (struct ieee80211_frame_addr4 *)
+ (rx_ind_data + HTT_T2H_MONITOR_MAC_HEADER_IND_HDR_SIZE +
+ sizeof(struct htt_hw_rx_desc_base));
+
+ for (elem = 0; elem < num_elems; elem++) {
+ uint8_t *dest = NULL;
+ /*
+ * copy each mac header +
+ * radiotap header into single msdu buff
+ */
+ msdu = adf_nbuf_alloc(
+ pdev->osdev,
+ rtap_len + sizeof(struct ieee80211_frame_addr4),
+ 0, 4, TRUE);
+ if (!msdu)
+ return A_NO_MEMORY;
+
+ dest = adf_nbuf_put_tail(msdu, rtap_len);
+ if (!dest) {
+ adf_os_print("%s: No buffer to save radiotap len %d\n",
+ __func__, rtap_len);
+ return A_NO_MEMORY;
+ }
+ adf_os_mem_copy(dest, rtap_buf, rtap_len);
+
+ dest = adf_nbuf_put_tail(msdu,
+ sizeof(struct ieee80211_frame_addr4));
+ if (!dest) {
+ adf_os_print("%s: No buffer for mac header %u\n",
+ __func__,
+ (unsigned int)
+ sizeof(struct ieee80211_frame_addr4));
+ return A_NO_MEMORY;
+ }
+ adf_os_mem_copy(dest, &mac_array[elem],
+ sizeof(struct ieee80211_frame_addr4));
+
+ adf_nbuf_set_next(msdu, NULL);
+ if (*head_msdu == NULL) {
+ *head_msdu = msdu;
+ *tail_msdu = msdu;
+ } else {
+ adf_nbuf_set_next(*tail_msdu, msdu);
+ *tail_msdu = msdu;
+ }
+ }
+
+ return 0;
+}
+
+int
+htt_rx_offload_msdu_cnt_hl(
+ htt_pdev_handle pdev)
+{
+ return 1;
+}
+
/* Return values: 1 - success, 0 - failure */
int
htt_rx_offload_msdu_pop_hl(
@@ -1857,10 +2135,6 @@
HTT_RX_CHECK_MSDU_COUNT(msdu_count);
peer_id = HTT_RX_IN_ORD_PADDR_IND_PEER_ID_GET(
*(u_int32_t *)rx_ind_data);
- peer = ol_txrx_peer_find_by_id(pdev->txrx_pdev, peer_id);
- if (!peer)
- adf_os_print("%s: invalid peer id %d and msdu count %d\n", __func__,
- peer_id, msdu_count);
msg_word = (u_int32_t *)(rx_ind_data + HTT_RX_IN_ORD_PADDR_IND_HDR_BYTES);
if (offload_ind) {
@@ -1870,6 +2144,11 @@
return 0;
}
+ peer = ol_txrx_peer_find_by_id(pdev->txrx_pdev, peer_id);
+ if (!peer)
+ adf_os_print(KERN_DEBUG "%s: invalid peer id %d and msdu count %d\n",
+ __func__, peer_id, msdu_count);
+
(*head_msdu) = msdu =
htt_rx_in_order_netbuf_pop(pdev,
HTT_RX_IN_ORD_PADDR_IND_PADDR_GET(*msg_word));
@@ -1903,7 +2182,7 @@
adf_nbuf_pull_head(msdu, HTT_RX_STD_DESC_RESERVATION);
adf_dp_trace_set_track(msdu, ADF_RX);
- ADF_NBUF_CB_RX_PACKET_TRACE(msdu) = NBUF_TX_PKT_DATA_TRACK;
+ NBUF_SET_PACKET_TRACK(msdu, NBUF_TX_PKT_DATA_TRACK);
ol_rx_log_packet(pdev, peer_id, msdu);
DPTRACE(adf_dp_trace(msdu,
ADF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD,
@@ -2406,6 +2685,10 @@
adf_nbuf_t *tail_msdu);
int
+(*htt_rx_offload_msdu_cnt)(
+ htt_pdev_handle pdev);
+
+int
(*htt_rx_offload_msdu_pop)(
htt_pdev_handle pdev,
adf_nbuf_t offload_deliver_msg,
@@ -2913,7 +3196,7 @@
htt_list_add_tail(&pdev->rx_ring.hash_table[i]->listhead,
&hash_element->listnode);
- RX_HASH_LOG(adf_os_print("rx hash: %s: paddr 0x%x netbuf %p bucket %d\n",
+ RX_HASH_LOG(adf_os_print("rx hash: %s: paddr 0x%x netbuf %pK bucket %d\n",
__FUNCTION__, paddr, netbuf,(int)i));
HTT_RX_HASH_COUNT_INCR(pdev->rx_ring.hash_table[i]);
@@ -2970,7 +3253,7 @@
}
}
- RX_HASH_LOG(adf_os_print("rx hash: %s: paddr 0x%x, netbuf %p, bucket %d\n",
+ RX_HASH_LOG(adf_os_print("rx hash: %s: paddr 0x%x, netbuf %pK, bucket %d\n",
__FUNCTION__, paddr, netbuf,(int)i));
HTT_RX_HASH_COUNT_PRINT(pdev->rx_ring.hash_table[i]);
@@ -3108,7 +3391,7 @@
hash_entry =
(struct htt_rx_hash_entry *)((char *)list_iter -
pdev->rx_ring.listnode_offset);
- adf_os_print("hash_table[%d]: netbuf %p paddr 0x%x\n",
+ adf_os_print("hash_table[%d]: netbuf %pK paddr 0x%x\n",
i, hash_entry->netbuf, hash_entry->paddr);
}
}
@@ -3233,6 +3516,7 @@
if (VOS_MONITOR_MODE == vos_get_conparam())
htt_rx_amsdu_pop = htt_rx_mon_amsdu_rx_in_order_pop_ll;
+ htt_rx_offload_msdu_cnt = htt_rx_offload_msdu_cnt_ll;
htt_rx_offload_msdu_pop = htt_rx_offload_msdu_pop_ll;
htt_rx_mpdu_desc_retry = htt_rx_mpdu_desc_retry_ll;
htt_rx_mpdu_desc_seq_num = htt_rx_mpdu_desc_seq_num_ll;
@@ -3256,7 +3540,10 @@
/* host can force ring base address if it wish to do so */
pdev->rx_ring.base_paddr = 0;
htt_rx_amsdu_pop = htt_rx_amsdu_pop_hl;
+ if (VOS_MONITOR_MODE == vos_get_conparam())
+ htt_rx_amsdu_pop = htt_rx_mon_amsdu_pop_hl;
htt_rx_frag_pop = htt_rx_frag_pop_hl;
+ htt_rx_offload_msdu_cnt = htt_rx_offload_msdu_cnt_hl;
htt_rx_offload_msdu_pop = htt_rx_offload_msdu_pop_hl;
htt_rx_mpdu_desc_list_next = htt_rx_mpdu_desc_list_next_hl;
htt_rx_mpdu_desc_retry = htt_rx_mpdu_desc_retry_hl;
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_t2h.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_t2h.c
index b736a97..78c7c4e 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_t2h.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_t2h.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -90,6 +90,8 @@
#if defined(CONFIG_HL_SUPPORT)
#define HTT_RX_FRAG_SET_LAST_MSDU(pdev, msg) /* no-op */
+#define HTT_FAIL_NOTIFY_BREAK_CHECK(status) \
+ ((status) == htt_tx_status_fail_notify)
#else
static void HTT_RX_FRAG_SET_LAST_MSDU(
struct htt_pdev_t *pdev, adf_nbuf_t msg)
@@ -135,8 +137,12 @@
rx_desc->msdu_end.last_msdu = 1;
adf_nbuf_map(pdev->osdev, msdu, ADF_OS_DMA_FROM_DEVICE);
}
+
+#define HTT_FAIL_NOTIFY_BREAK_CHECK(status) 0
#endif /* CONFIG_HL_SUPPORT */
+#define MAX_TARGET_TX_CREDIT 204800
+
/* Target to host Msg/event handler for low priority messages*/
void
htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
@@ -172,7 +178,7 @@
{
u_int16_t peer_id;
u_int8_t tid;
- int seq_num_start, seq_num_end;
+ u_int16_t seq_num_start, seq_num_end;
enum htt_rx_flush_action action;
peer_id = HTT_RX_FLUSH_PEER_ID_GET(*msg_word);
@@ -192,7 +198,7 @@
}
case HTT_T2H_MSG_TYPE_RX_OFFLOAD_DELIVER_IND:
{
- int msdu_cnt;
+ u_int16_t msdu_cnt;
msdu_cnt = HTT_RX_OFFLOAD_DELIVER_IND_MSDU_CNT_GET(*msg_word);
ol_rx_offload_deliver_ind_handler(
pdev->txrx_pdev,
@@ -297,6 +303,14 @@
peer_mac_addr = htt_t2h_mac_addr_deswizzle(
(u_int8_t *) (msg_word+1), &mac_addr_deswizzle_buf[0]);
+ if (peer_id > ol_cfg_max_peer_id(pdev->ctrl_pdev)) {
+ adf_os_print("%s: HTT_T2H_MSG_TYPE_PEER_MAP,"
+ "invalid peer_id, %u\n",
+ __FUNCTION__,
+ peer_id);
+ break;
+ }
+
ol_rx_peer_map_handler(
pdev->txrx_pdev, peer_id, vdev_id, peer_mac_addr, 1/*can tx*/);
break;
@@ -306,6 +320,14 @@
u_int16_t peer_id;
peer_id = HTT_RX_PEER_UNMAP_PEER_ID_GET(*msg_word);
+ if (peer_id > ol_cfg_max_peer_id(pdev->ctrl_pdev)) {
+ adf_os_print("%s: HTT_T2H_MSG_TYPE_PEER_UNMAP,"
+ "invalid peer_id, %u\n",
+ __FUNCTION__,
+ peer_id);
+ break;
+ }
+
ol_rx_peer_unmap_handler(pdev->txrx_pdev, peer_id);
break;
}
@@ -394,12 +416,23 @@
{
u_int32_t htt_credit_delta_abs;
int32_t htt_credit_delta;
- int sign;
+ int sign, old_credit;
htt_credit_delta_abs = HTT_TX_CREDIT_DELTA_ABS_GET(*msg_word);
sign = HTT_TX_CREDIT_SIGN_BIT_GET(*msg_word) ? -1 : 1;
htt_credit_delta = sign * htt_credit_delta_abs;
+ old_credit = adf_os_atomic_read(&pdev->htt_tx_credit.target_delta);
+ if (((old_credit + htt_credit_delta) > MAX_TARGET_TX_CREDIT) ||
+ ((old_credit + htt_credit_delta) < -MAX_TARGET_TX_CREDIT)) {
+ adf_os_print("%s: invalid credit update,old_credit=%d,"
+ "htt_credit_delta=%d\n",
+ __FUNCTION__,
+ old_credit,
+ htt_credit_delta);
+ break;
+ }
+
if (pdev->cfg.is_high_latency &&
!pdev->cfg.default_tx_comp_req) {
HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
@@ -495,12 +528,14 @@
break;
}
}
+ break;
}
case HTT_T2H_MSG_TYPE_RATE_REPORT:
{
u_int16_t peer_cnt = HTT_PEER_RATE_REPORT_MSG_PEER_COUNT_GET(*msg_word);
u_int16_t i;
struct rate_report_t *report, *each;
+ int max_peers;
/* Param sanity check */
if (peer_cnt == 0) {
@@ -508,6 +543,13 @@
break;
}
+ max_peers = ol_cfg_max_peer_id(pdev->ctrl_pdev) + 1;
+ if (peer_cnt > max_peers) {
+ adf_os_print("RATE REPORT msg peer_cnt is larger than %d\n",
+ max_peers);
+ break;
+ }
+
/* At least one peer and no limit apply to peer_cnt here */
report = adf_os_mem_alloc(NULL,
sizeof(struct rate_report_t) * peer_cnt);
@@ -614,9 +656,14 @@
* TODO: remove copy after stopping reuse skb on HIF layer
* because SDIO HIF may reuse skb before upper layer release it
*/
- ol_rx_indication_handler(
- pdev->txrx_pdev, htt_t2h_msg, peer_id, tid,
- num_mpdu_ranges);
+ if (VOS_MONITOR_MODE == vos_get_conparam())
+ ol_rx_mon_indication_handler(
+ pdev->txrx_pdev, htt_t2h_msg, peer_id, tid,
+ num_mpdu_ranges);
+ else
+ ol_rx_indication_handler(
+ pdev->txrx_pdev, htt_t2h_msg, peer_id, tid,
+ num_mpdu_ranges);
return;
} else {
@@ -628,12 +675,29 @@
}
case HTT_T2H_MSG_TYPE_TX_COMPL_IND:
{
+ int old_credit;
int num_msdus;
enum htt_tx_status status;
+ int msg_len = adf_nbuf_len(htt_t2h_msg);
/* status - no enum translation needed */
status = HTT_TX_COMPL_IND_STATUS_GET(*msg_word);
num_msdus = HTT_TX_COMPL_IND_NUM_GET(*msg_word);
+
+ /*
+ * each desc id will occupy 2 bytes.
+ * the 4 is for htt msg header
+ */
+ if ((num_msdus * HTT_TX_COMPL_BYTES_PER_MSDU_ID +
+ HTT_TX_COMPL_HEAD_SZ) > msg_len) {
+ adf_os_print("%s: num_msdus(%d) is invalid,"
+ "adf_nbuf_len = %d\n",
+ __FUNCTION__,
+ num_msdus,
+ msg_len);
+ break;
+ }
+
if (num_msdus & 0x1) {
struct htt_tx_compl_ind_base *compl = (void *)msg_word;
@@ -650,24 +714,53 @@
}
}
+ /* Indicate failure status to user space */
+ ol_tx_failure_indication(pdev->txrx_pdev,
+ HTT_TX_COMPL_IND_TID_GET(*msg_word),
+ num_msdus, status);
+
if (pdev->cfg.is_high_latency) {
- if (!pdev->cfg.default_tx_comp_req) {
- int credit_delta;
- HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
- adf_os_atomic_add(num_msdus,
- &pdev->htt_tx_credit.target_delta);
- credit_delta = htt_tx_credit_update(pdev);
- HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
- if (credit_delta) {
- ol_tx_target_credit_update(pdev->txrx_pdev,
- credit_delta);
- }
+ /*
+ * For regular frms in HL case, frms have already been
+ * freed and tx credit has been updated. FW indicates
+ * special message for failure MSDUs with status type
+ * htt_tx_status_fail_notify. Once such message was
+ * received, just break here.
+ */
+ if (ol_cfg_tx_free_at_download(pdev->ctrl_pdev) &&
+ HTT_FAIL_NOTIFY_BREAK_CHECK(status)) {
+ adf_os_print("HTT TX COMPL for failed data frm.\n");
+ break;
+ }
+
+ old_credit = adf_os_atomic_read(&pdev->htt_tx_credit.target_delta);
+ if (((old_credit + num_msdus) > MAX_TARGET_TX_CREDIT) ||
+ ((old_credit + num_msdus) < -MAX_TARGET_TX_CREDIT)) {
+ adf_os_print("%s: invalid credit update,old_credit=%d,"
+ "num_msdus=%d\n",
+ __FUNCTION__,
+ old_credit,
+ num_msdus);
} else {
- ol_tx_target_credit_update(pdev->txrx_pdev, num_msdus);
+ if (!pdev->cfg.default_tx_comp_req) {
+ int credit_delta;
+ HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
+ adf_os_atomic_add(num_msdus,
+ &pdev->htt_tx_credit.target_delta);
+ credit_delta = htt_tx_credit_update(pdev);
+ HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
+ if (credit_delta) {
+ ol_tx_target_credit_update(pdev->txrx_pdev,
+ credit_delta);
+ }
+ } else {
+ ol_tx_target_credit_update(pdev->txrx_pdev,
+ num_msdus);
+ }
}
}
ol_tx_completion_handler(
- pdev->txrx_pdev, num_msdus, status, msg_word + 1);
+ pdev->txrx_pdev, num_msdus, status, msg_word);
HTT_TX_SCHED(pdev);
break;
}
@@ -675,7 +768,7 @@
{
u_int16_t peer_id;
u_int8_t tid, pn_ie_cnt, *pn_ie=NULL;
- int seq_num_start, seq_num_end;
+ u_int16_t seq_num_start, seq_num_end;
/*First dword */
peer_id = HTT_RX_PN_IND_PEER_ID_GET(*msg_word);
@@ -702,8 +795,23 @@
case HTT_T2H_MSG_TYPE_TX_INSPECT_IND:
{
int num_msdus;
+ int msg_len = adf_nbuf_len(htt_t2h_msg);
num_msdus = HTT_TX_COMPL_IND_NUM_GET(*msg_word);
+ /*
+ * each desc id will occupy 2 bytes.
+ * the 4 is for htt msg header
+ */
+ if ((num_msdus * HTT_TX_COMPL_BYTES_PER_MSDU_ID +
+ HTT_TX_COMPL_HEAD_SZ) > msg_len) {
+ adf_os_print("%s: num_msdus(%d) is invalid,"
+ "adf_nbuf_len = %d,inspect\n",
+ __FUNCTION__,
+ num_msdus,
+ msg_len);
+ break;
+ }
+
if (num_msdus & 0x1) {
struct htt_tx_compl_ind_base *compl = (void *)msg_word;
@@ -756,6 +864,11 @@
peer_id, tid, offload_ind);
break;
}
+ case HTT_T2H_MSG_TYPE_MONITOR_MAC_HEADER_IND:
+ {
+ ol_rx_mon_mac_header_handler(pdev->txrx_pdev, htt_t2h_msg);
+ break;
+ }
default:
htt_t2h_lp_msg_handler(context, htt_t2h_msg);
@@ -929,6 +1042,49 @@
}
/**
+ * htt_rx_ind_noise_floor_chain() - Return the nosie floor for a chain
+ * provided in a rx indication message.
+ * @pdev: the HTT instance the rx data was received on
+ * @rx_ind_msg: the netbuf containing the rx indication message
+ * @chain: the index of the chain (0-1) for DSRC
+ *
+ * Return the noise floor for a chain from an rx indication message.
+ *
+ * Return: noise floor, or HTT_NOISE_FLOOR_INVALID
+ */
+int8_t
+htt_rx_ind_noise_floor_chain(htt_pdev_handle pdev, adf_nbuf_t rx_ind_msg,
+ int8_t chain)
+{
+ int8_t noise_floor;
+ u_int32_t *msg_word;
+
+ /* only chain0/1 used with 11p DSRC */
+ if (chain < 0 || chain > 1) {
+ return HTT_NOISE_FLOOR_INVALID;
+ }
+
+ msg_word = (u_int32_t *)
+ (adf_nbuf_data(rx_ind_msg) +
+ HTT_RX_IND_FW_RX_PPDU_DESC_BYTE_OFFSET);
+
+ /* check if the RX_IND message contains valid rx PPDU start info */
+ if (!HTT_RX_IND_START_VALID_GET(*msg_word)) {
+ return HTT_NOISE_FLOOR_INVALID;
+ }
+
+ msg_word = (u_int32_t *)
+ (adf_nbuf_data(rx_ind_msg) + HTT_RX_IND_HDR_SUFFIX_BYTE_OFFSET);
+
+ if (chain == 0)
+ noise_floor = HTT_RX_IND_NOISE_FLOOR_CHAIN0_GET(*msg_word);
+ else if (chain == 1)
+ noise_floor = HTT_RX_IND_NOISE_FLOOR_CHAIN1_GET(*msg_word);
+
+ return noise_floor;
+}
+
+/**
* htt_rx_ind_legacy_rate() - Return the data rate
* @pdev: the HTT instance the rx data was received on
* @rx_ind_msg: the netbuf containing the rx indication message
@@ -1077,8 +1233,8 @@
htt_rx_frag_ind_flush_seq_num_range(
htt_pdev_handle pdev,
adf_nbuf_t rx_frag_ind_msg,
- int *seq_num_start,
- int *seq_num_end)
+ u_int16_t *seq_num_start,
+ u_int16_t *seq_num_end)
{
u_int32_t *msg_word;
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_tx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_tx.c
index 35ad99a..d70f10f 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_tx.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_tx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -734,7 +734,7 @@
htt_tx_desc = (struct htt_tx_msdu_desc_t *) tx_desc;
/* only works for little-endian */
- adf_os_print("HTT tx desc (@ %p):\n", htt_tx_desc);
+ adf_os_print("HTT tx desc (@ %pK):\n", htt_tx_desc);
adf_os_print(" msg type = %d\n", htt_tx_desc->msg_type);
adf_os_print(" pkt subtype = %d\n", htt_tx_desc->pkt_subtype);
adf_os_print(" pkt type = %d\n", htt_tx_desc->pkt_type);
@@ -881,12 +881,6 @@
}
}
- if (tx_buffer_count_pwr2 < 0) {
- adf_os_print("%s: Failed to round down Tx buffer count %d",
- __func__, tx_buffer_count_pwr2);
- goto free_tx_comp_base;
- }
-
pdev->ipa_uc_tx_rsc.alloc_tx_buf_cnt = tx_buffer_count_pwr2;
return 0;
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_types.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_types.h
index 50dd6fe..94e5a8b 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_types.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_types.h
@@ -376,7 +376,6 @@
/* callback function for packetdump */
tp_rx_pkt_dump_cb rx_pkt_dump_cb;
-
};
#endif /* _HTT_TYPES__H_ */
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index 32125d4..0f77c98 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -501,7 +501,7 @@
peer = ol_txrx_find_peer_by_addr(pdev_ctx, peer_addr, &peer_id);
if (!peer) {
- if (SIR_MAC_MGMT_ASSOC_REQ != subtype) {
+ if (IEEE80211_FC0_SUBTYPE_ASSOC_REQ != subtype) {
TLSHIM_LOGE(FL("Received mgmt frame: %0x from unknow peer: %pM"),
subtype, peer_addr);
should_drop = TRUE;
@@ -510,7 +510,7 @@
}
switch (subtype) {
- case SIR_MAC_MGMT_ASSOC_REQ:
+ case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
if (peer->last_assoc_rcvd) {
if (adf_os_gettimestamp() - peer->last_assoc_rcvd <
TLSHIM_MGMT_FRAME_DETECT_DOS_TIMER) {
@@ -520,7 +520,7 @@
}
peer->last_assoc_rcvd = adf_os_gettimestamp();
break;
- case SIR_MAC_MGMT_DISASSOC:
+ case IEEE80211_FC0_SUBTYPE_DISASSOC:
if (peer->last_disassoc_rcvd) {
if (adf_os_gettimestamp() -
peer->last_disassoc_rcvd <
@@ -531,7 +531,7 @@
}
peer->last_disassoc_rcvd = adf_os_gettimestamp();
break;
- case SIR_MAC_MGMT_DEAUTH:
+ case IEEE80211_FC0_SUBTYPE_DEAUTH:
if (peer->last_deauth_rcvd) {
if (adf_os_gettimestamp() -
peer->last_deauth_rcvd <
@@ -596,9 +596,11 @@
return 0;
}
- if (hdr->buf_len < sizeof(struct ieee80211_frame)) {
+ if (hdr->buf_len < sizeof(struct ieee80211_frame) ||
+ (!saved_beacon && hdr->buf_len > data_len)) {
adf_os_spin_unlock_bh(&tl_shim->mgmt_lock);
- TLSHIM_LOGE("Invalid rx mgmt packet");
+ TLSHIM_LOGE("Invalid rx mgmt packet, saved_beacon %d, data_len %u, hdr->buf_len %u",
+ saved_beacon, data_len, hdr->buf_len);
return 0;
}
@@ -640,6 +642,17 @@
rx_pkt->pkt_meta.mpdu_data_len = hdr->buf_len -
rx_pkt->pkt_meta.mpdu_hdr_len;
+ /*
+ * If the mpdu_data_len is greater than Max (2k), drop the frame
+ */
+ if (rx_pkt->pkt_meta.mpdu_data_len > WMA_MAX_MGMT_MPDU_LEN) {
+ adf_os_spin_unlock_bh(&tl_shim->mgmt_lock);
+ TLSHIM_LOGE("Data Len %d greater than max, dropping frame",
+ rx_pkt->pkt_meta.mpdu_data_len);
+ vos_mem_free(rx_pkt);
+ return 0;
+ }
+
/*
* saved_beacon means this beacon is a duplicate of one
* sent earlier. roamCandidateInd flag is used to indicate to
@@ -1173,6 +1186,29 @@
}
}
+/*
+ * TLSHIM virtual monitor mode RX callback,
+ * registered for OL data indication.
+ */
+
+static void tl_shim_vir_mon_rx(adf_nbuf_t rx_buf_list)
+{
+ struct txrx_tl_shim_ctx *tl_shim;
+ void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL);
+
+ tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
+
+ if (!tl_shim) {
+ TLSHIM_LOGE("%s: Failed to get TLSHIM context", __func__);
+ return;
+ }
+
+ if (tl_shim->rx_monitor_cb)
+ tl_shim->rx_monitor_cb(vos_ctx, rx_buf_list, 0);
+ else
+ TLSHIM_LOGE("%s: tl_shim->rx_monitor_cb is NULL", __func__);
+}
+
/*************************/
/* TL APIs */
/*************************/
@@ -1236,12 +1272,18 @@
{
struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL,
vos_ctx);
+ struct ol_txrx_pdev_t *pdev = vos_get_context(VOS_MODULE_ID_TXRX,
+ vos_ctx);
struct ol_txrx_peer_t *peer;
if (!tl_shim) {
TLSHIM_LOGE("tl_shim is NULL");
return NULL;
}
+ if (!pdev) {
+ TLSHIM_LOGE("pdev is NULL");
+ return NULL;
+ }
if (sta_id >= WLAN_MAX_STA_COUNT) {
TLSHIM_LOGE("Invalid sta id for data tx");
@@ -1253,9 +1295,7 @@
return NULL;
}
- peer = ol_txrx_peer_find_by_local_id(
- ((pVosContextType) vos_ctx)->pdev_txrx_ctx,
- sta_id);
+ peer = ol_txrx_peer_find_by_local_id(pdev, sta_id);
if (!peer) {
TLSHIM_LOGW("Invalid peer");
return NULL;
@@ -1265,6 +1305,32 @@
}
/**
+ * tlshim_selfpeer_vdev() - get the vdev of self peer
+ * @vos_ctx: vos context
+ *
+ * Return: on success return vdev, NULL when self peer is invalid/NULL
+ */
+void *tlshim_selfpeer_vdev(void *vos_ctx)
+{
+ struct ol_txrx_pdev_t *pdev = vos_get_context(VOS_MODULE_ID_TXRX,
+ vos_ctx);
+ struct ol_txrx_peer_t *peer;
+
+ if (!pdev) {
+ TLSHIM_LOGE("Txrx pdev is NULL");
+ return NULL;
+ }
+
+ peer = pdev->self_peer;
+ if (!peer) {
+ TLSHIM_LOGW("Invalid peer");
+ return NULL;
+ } else {
+ return peer->vdev;
+ }
+}
+
+/**
* WLANTL_SendSTA_DataFrame() - transmit frame from upper layers
* @vos_ctx: pointer to vos context
* @vdev: vdev
@@ -1805,6 +1871,30 @@
return VOS_STATUS_SUCCESS;
}
+void tl_shim_flush_cache_rx_queue(void)
+{
+ void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL);
+ struct txrx_tl_shim_ctx *tl_shim;
+ u_int8_t sta_id;
+
+ if (!vos_ctx) {
+ TLSHIM_LOGE("%s, Global VOS context is Null\n", __func__);
+ return;
+ }
+
+ tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
+ if (!tl_shim) {
+ TLSHIM_LOGE("%s, tl_shim is NULL\n", __func__);
+ return;
+ }
+
+ TLSHIM_LOGD("%s: called to flush cache rx queue.\n", __func__);
+ for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++)
+ tl_shim_flush_rx_frames(vos_ctx, tl_shim, sta_id, 1);
+
+ return;
+}
+
/*
* Register a station for data service. This API gives flexibility
* to register different callbacks for different client though it is
@@ -1872,6 +1962,57 @@
return VOS_STATUS_SUCCESS;
}
+VOS_STATUS tl_register_vir_mon_cb(void *vos_ctx,
+ WLANTL_STARxCBType rxcb)
+{
+ struct txrx_tl_shim_ctx *tl_shim;
+ ol_txrx_pdev_handle pdev;
+
+ tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
+ if (!tl_shim) {
+ TLSHIM_LOGE("tl_shim is NULL");
+ return VOS_STATUS_E_FAULT;
+ }
+
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, vos_ctx);
+ if (!pdev) {
+ TLSHIM_LOGE("%s: Failed to find pdev", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
+
+ tl_shim->rx_monitor_cb = rxcb;
+
+ /* register TLSHIM RX montior callback to OL */
+ ol_txrx_osif_pdev_mon_register_cbk(pdev, tl_shim_vir_mon_rx);
+
+ return VOS_STATUS_SUCCESS;
+}
+
+VOS_STATUS tl_deregister_vir_mon_cb(void *vos_ctx)
+{
+ struct txrx_tl_shim_ctx *tl_shim;
+ ol_txrx_pdev_handle pdev;
+
+ tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
+ if (!tl_shim) {
+ TLSHIM_LOGE("tl_shim is NULL");
+ return VOS_STATUS_E_FAULT;
+ }
+
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, vos_ctx);
+ if (!pdev) {
+ TLSHIM_LOGE("%s: Failed to find pdev", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
+
+ tl_shim->rx_monitor_cb = NULL;
+
+ /* register TLSHIM RX montior callback to OL */
+ ol_txrx_osif_pdev_mon_register_cbk(pdev, NULL);
+
+ return VOS_STATUS_SUCCESS;
+}
+
VOS_STATUS WLANTL_Stop(void *vos_ctx)
{
/* Nothing to do really */
@@ -1962,6 +2103,7 @@
VOS_STATUS WLANTL_Open(void *vos_ctx, WLANTL_ConfigInfoType *tl_cfg)
{
struct txrx_tl_shim_ctx *tl_shim;
+ ol_txrx_pdev_handle txrx_pdev;
VOS_STATUS status;
u_int8_t i;
int max_vdev;
@@ -1972,7 +2114,7 @@
if (status != VOS_STATUS_SUCCESS)
return status;
- ((pVosContextType) vos_ctx)->pdev_txrx_ctx =
+ txrx_pdev = ((pVosContextType) vos_ctx)->pdev_txrx_ctx =
wdi_in_pdev_attach(
((pVosContextType) vos_ctx)->cfg_ctx,
((pVosContextType) vos_ctx)->htc_ctx,
@@ -1983,6 +2125,8 @@
return VOS_STATUS_E_NOMEM;
}
+ ol_tx_failure_cb_set(txrx_pdev, wma_tx_failure_cb);
+
adf_os_spinlock_init(&tl_shim->bufq_lock);
adf_os_spinlock_init(&tl_shim->mgmt_lock);
@@ -2078,6 +2222,42 @@
return VOS_STATUS_SUCCESS;
}
+#ifdef QCA_SUPPORT_TXRX_LOCAL_PEER_ID
+/**
+ * tl_shim_get_sta_id_by_addr() - get peer local id given the MAC address.
+ * @vos_context: pointer to vos context
+ * @mac_addr: pointer to mac address
+ *
+ * Return: local id of the peer given the MAC address.
+ */
+uint16_t tl_shim_get_sta_id_by_addr(void *vos_context, uint8_t *mac_addr)
+{
+ struct ol_txrx_peer_t *peer;
+ ol_txrx_pdev_handle pdev;
+ uint8_t peer_id;
+
+ if (vos_context == NULL || mac_addr == NULL) {
+ TLSHIM_LOGE("Invalid argument %pK, %pK", vos_context, mac_addr);
+ return 0;
+ }
+
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, vos_context);
+ if (!pdev) {
+ TLSHIM_LOGE("PDEV [%pM] not found", mac_addr);
+ return 0;
+ }
+
+ peer = ol_txrx_find_peer_by_addr(pdev, mac_addr, &peer_id);
+
+ if (!peer) {
+ TLSHIM_LOGW("PEER [%pM] not found", mac_addr);
+ return 0;
+ }
+
+ return peer->local_id;
+}
+#endif
+
/*
* Function to get vdev(tl_context) given the MAC address.
*/
@@ -2088,7 +2268,7 @@
uint8_t peer_id;
if (vos_context == NULL || mac_addr == NULL) {
- TLSHIM_LOGE("Invalid argument %p, %p", vos_context, mac_addr);
+ TLSHIM_LOGE("Invalid argument %pK, %pK", vos_context, mac_addr);
return NULL;
}
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.h
index 6a93553..57ef2e8 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2014,2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014,2016-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -112,6 +112,7 @@
ipa_uc_fw_op_cb fw_op_cb;
void *usr_ctxt;
#endif /* IPA_UC_OFFLOAD */
+ WLANTL_STARxCBType rx_monitor_cb;
};
/*
@@ -165,4 +166,55 @@
ol_tx_pdev_reset_bundle_require(pdev);
}
+
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+static inline
+void tlshim_set_driver_del_ack_enable(uint8_t vdev_id, unsigned long rx_packets,
+ uint32_t time_in_ms, uint32_t high_th, uint32_t low_th)
+{
+ ol_tx_vdev_set_driver_del_ack_enable(vdev_id, rx_packets,
+ time_in_ms, high_th, low_th);
+}
+
+static inline void tlshim_driver_del_ack_disable(void)
+{
+ void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL);
+ void *pdev;
+
+ if (!vos_ctx)
+ return;
+
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, vos_ctx);
+ if (!pdev)
+ return;
+
+ ol_tx_pdev_reset_driver_del_ack(pdev);
+}
+#else
+static inline
+void tlshim_set_driver_del_ack_enable(uint8_t vdev_id, unsigned long rx_packets,
+ uint32_t time_in_ms, uint32_t high_th, uint32_t low_th)
+{
+}
+
+static inline void tlshim_driver_del_ack_disable(void)
+{
+}
+#endif
+
+static inline void *tlshim_get_rxmon_cbk(void)
+{
+ void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL);
+ struct txrx_tl_shim_ctx *tlshim;
+
+ if (!vos_ctx)
+ return NULL;
+
+ tlshim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
+ if (tlshim)
+ return (void *)tlshim->rx_monitor_cb;
+
+ return NULL;
+}
+
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_cfg.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_cfg.c
index 84466ce..0b07f2c 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_cfg.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_cfg.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014,2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014,2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -27,11 +27,31 @@
#include <ol_cfg.h>
#include <ol_if_athvar.h>
+#include <vos_types.h>
+#include <vos_getBin.h>
unsigned int vow_config = 0;
module_param(vow_config, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(vow_config, "Do VoW Configuration");
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+/**
+ * ol_cfg_update_del_ack_params() - update delayed ack params
+ *
+ * @cfg_ctx: cfg context
+ * @cfg_param: parameters
+ *
+ * Return: none
+ */
+void ol_cfg_update_del_ack_params(struct txrx_pdev_cfg_t *cfg_ctx,
+ struct txrx_pdev_cfg_param_t cfg_param)
+{
+ cfg_ctx->del_ack_enable = cfg_param.del_ack_enable;
+ cfg_ctx->del_ack_timer_value = cfg_param.del_ack_timer_value;
+ cfg_ctx->del_ack_pkt_count = cfg_param.del_ack_pkt_count;
+}
+#endif
+
#ifdef QCA_SUPPORT_TXRX_HL_BUNDLE
/**
* ol_cfg_update_bundle_params() - update tx bundle params
@@ -94,7 +114,10 @@
cfg_ctx->max_peer_id = 511;
cfg_ctx->max_vdev = CFG_TGT_NUM_VDEV;
cfg_ctx->pn_rx_fwd_check = 1;
- cfg_ctx->frame_type = wlan_frm_fmt_802_3;
+ if (VOS_MONITOR_MODE == vos_get_conparam())
+ cfg_ctx->frame_type = wlan_frm_fmt_raw;
+ else
+ cfg_ctx->frame_type = wlan_frm_fmt_802_3;
cfg_ctx->max_thruput_mbps = 800;
cfg_ctx->max_nbuf_frags = 1;
cfg_ctx->vow_config = vow_config;
@@ -106,6 +129,9 @@
cfg_ctx->dutycycle_level[3] = THROTTLE_DUTY_CYCLE_LEVEL3;
cfg_ctx->rx_fwd_disabled = 0;
cfg_ctx->is_packet_log_enabled = 0;
+#ifdef WLAN_FEATURE_TSF_PLUS
+ cfg_ctx->is_ptp_rx_opt_enabled = 0;
+#endif
cfg_ctx->is_full_reorder_offload = cfg_param.is_full_reorder_offload;
#ifdef IPA_UC_OFFLOAD
cfg_ctx->ipa_uc_rsc.uc_offload_enabled = cfg_param.is_uc_offload_enabled;
@@ -116,6 +142,8 @@
#endif /* IPA_UC_OFFLOAD */
ol_cfg_update_bundle_params(cfg_ctx, cfg_param);
+ ol_cfg_update_del_ack_params(cfg_ctx, cfg_param);
+ ol_cfg_update_ptp_params(cfg_ctx, cfg_param);
for (i = 0; i < OL_TX_NUM_WMM_AC; i++) {
cfg_ctx->ac_specs[i].wrr_skip_weight =
@@ -133,6 +161,47 @@
return (ol_pdev_handle) cfg_ctx;
}
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+/**
+ * ol_cfg_get_del_ack_timer_value() - get delayed ack timer value
+ * @pdev: pdev handle
+ *
+ * Return: timer value
+ */
+int ol_cfg_get_del_ack_timer_value(ol_pdev_handle pdev)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ return cfg->del_ack_timer_value;
+}
+
+/**
+ * ol_cfg_get_del_ack_enable_value() - get delayed ack enable value
+ * @pdev: pdev handle
+ *
+ * Return: enable/disable
+ */
+int ol_cfg_get_del_ack_enable_value(ol_pdev_handle pdev)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ return cfg->del_ack_enable;
+}
+
+/**
+ * ol_cfg_get_del_ack_count_value() - get delayed ack count value
+ * @pdev: pdev handle
+ *
+ * Return: count value
+ */
+int ol_cfg_get_del_ack_count_value(ol_pdev_handle pdev)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ return cfg->del_ack_pkt_count;
+}
+#endif
+
#ifdef QCA_SUPPORT_TXRX_HL_BUNDLE
/**
* ol_cfg_get_bundle_timer_value() - get bundle timer value
@@ -211,6 +280,46 @@
return cfg->is_packet_log_enabled;
}
+#ifdef WLAN_FEATURE_TSF_PLUS
+void ol_set_cfg_ptp_rx_opt_enabled(ol_pdev_handle pdev, u_int8_t val)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ cfg->is_ptp_rx_opt_enabled = val;
+}
+
+u_int8_t ol_cfg_is_ptp_rx_opt_enabled(ol_pdev_handle pdev)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ return cfg->is_ptp_rx_opt_enabled;
+}
+/**
+ * ol_cfg_is_ptp_enabled() - check if ptp feature is enabled
+ * @pdev: cfg handle to PDEV
+ *
+ * Return: is_ptp_enabled
+ */
+a_bool_t ol_cfg_is_ptp_enabled(ol_pdev_handle pdev)
+{
+ struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev;
+
+ return cfg->is_ptp_enabled;
+}
+/**
+ * ol_cfg_update_ptp_params() - update ptp params
+ * @cfg_ctx: cfg context
+ * @cfg_param: parameters
+ *
+ * Return: none
+ */
+void ol_cfg_update_ptp_params(struct txrx_pdev_cfg_t *cfg_ctx,
+ struct txrx_pdev_cfg_param_t cfg_param)
+{
+ cfg_ctx->is_ptp_enabled = cfg_param.is_ptp_enabled;
+}
+#endif
+
int ol_cfg_rx_fwd_disabled(ol_pdev_handle pdev)
{
#if defined(ATHR_WIN_NWF)
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h
index 30e8d1d..e0e5151 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014,2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -131,6 +131,9 @@
u_int64_t *pn,
u_int8_t key_id);
+#ifdef HL_RX_AGGREGATION_HOLE_DETCTION
+void ol_rx_aggregation_hole(uint32_t hole_info);
+#endif
enum ol_rx_notify_type {
OL_RX_NOTIFY_IPV4_IGMP,
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c
index 87a680a..a44a4b0 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -38,6 +38,7 @@
#include <ol_htt_rx_api.h> /* htt_rx_peer_id, etc. */
/* internal API header files */
+#include <ol_txrx.h> /* ol_txrx_peer_unref_delete */
#include <ol_txrx_types.h> /* ol_txrx_vdev_t, etc. */
#include <ol_txrx_peer_find.h> /* ol_txrx_peer_find_by_id */
#include <ol_rx_reorder.h> /* ol_rx_reorder_store, etc. */
@@ -103,7 +104,7 @@
while (head_msdu) {
next = adf_nbuf_next(head_msdu);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "freeing %p\n", head_msdu);
+ "freeing %pK\n", head_msdu);
adf_nbuf_free(head_msdu);
head_msdu = next;
}
@@ -225,6 +226,118 @@
#define OL_RX_MPDU_RSSI_UPDATE(peer, rx_mpdu_desc) /* no-op */
#endif /* QCA_SUPPORT_PEER_DATA_RX_RSSI */
+/**
+ * ol_rx_mon_indication_handler() - htt rx indication message handler
+ * for HL monitor mode.
+ * @pdev: pointer to struct ol_txrx_pdev_handle
+ * @rx_ind_msg: htt rx indication message
+ * @peer_id: peer id
+ * @tid: tid
+ * @num_mpdu_ranges: number of mpdu ranges
+ *
+ * This function pops amsdu from rx indication message and directly
+ * deliver to upper layer.
+ */
+void
+ol_rx_mon_indication_handler(
+ ol_txrx_pdev_handle pdev,
+ adf_nbuf_t rx_ind_msg,
+ u_int16_t peer_id,
+ u_int8_t tid,
+ int num_mpdu_ranges)
+{
+ int mpdu_range;
+ struct ol_txrx_peer_t *peer;
+ htt_pdev_handle htt_pdev;
+ struct ol_txrx_vdev_t *vdev = NULL;
+
+ htt_pdev = pdev->htt_pdev;
+
+ adf_os_spin_lock_bh(&pdev->peer_ref_mutex);
+ peer = pdev->self_peer;
+ if (peer) {
+ adf_os_atomic_inc(&peer->ref_cnt);
+ vdev = peer->vdev;
+ }
+ adf_os_spin_unlock_bh(&pdev->peer_ref_mutex);
+
+ for (mpdu_range = 0; mpdu_range < num_mpdu_ranges; mpdu_range++) {
+ enum htt_rx_status status;
+ int i, num_mpdus;
+ adf_nbuf_t head_msdu, tail_msdu;
+
+ htt_rx_ind_mpdu_range_info(
+ pdev->htt_pdev,
+ rx_ind_msg,
+ mpdu_range,
+ &status,
+ &num_mpdus);
+
+ TXRX_STATS_ADD(pdev, priv.rx.normal.mpdus, num_mpdus);
+
+ for (i = 0; i < num_mpdus; i++) {
+ htt_rx_amsdu_pop(
+ htt_pdev, rx_ind_msg, &head_msdu, &tail_msdu);
+ if (peer && vdev) {
+ peer->rx_opt_proc(vdev, peer, tid, head_msdu);
+ } else {
+ while (1) {
+ adf_nbuf_t next;
+ next = adf_nbuf_next(head_msdu);
+ htt_rx_desc_frame_free(
+ htt_pdev,
+ head_msdu);
+ if (head_msdu == tail_msdu)
+ break;
+ head_msdu = next;
+ }
+ }
+ }
+ }
+
+ if (peer)
+ ol_txrx_peer_unref_delete(peer);
+}
+
+/*
+ * ol_rx_mon_mac_header_handler() - htt rx mac header msg handler
+ * @pdev: pointer to struct ol_txrx_pdev_handle
+ * @rx_ind_msg: htt rx indication message
+ */
+void
+ol_rx_mon_mac_header_handler(
+ ol_txrx_pdev_handle pdev,
+ adf_nbuf_t rx_ind_msg)
+{
+ adf_nbuf_t head_msdu = NULL;
+ adf_nbuf_t tail_msdu = NULL;
+ adf_nbuf_t next;
+ htt_pdev_handle htt_pdev;
+
+ htt_pdev = pdev->htt_pdev;
+
+ /* only if the rx callback is ready */
+ if (NULL == pdev->osif_rx_mon_cb)
+ return;
+
+ htt_rx_mac_header_mon_process(htt_pdev,
+ rx_ind_msg,
+ &head_msdu,
+ &tail_msdu);
+
+ if (head_msdu) {
+ if (pdev->osif_rx_mon_cb) {
+ pdev->osif_rx_mon_cb(head_msdu);
+ } else {
+ while (head_msdu) {
+ next = adf_nbuf_next(head_msdu);
+ adf_nbuf_free(head_msdu);
+ head_msdu = next;
+ }
+ }
+ }
+}
+
void
ol_rx_indication_handler(
ol_txrx_pdev_handle pdev,
@@ -267,6 +380,9 @@
for (i = 0; i < 4; i++)
peer->last_pkt_rssi[i] = htt_rx_ind_rssi_dbm_chain(
pdev->htt_pdev, rx_ind_msg, i);
+ for (i = 0; i < 4; i++)
+ peer->last_pkt_noise_floor[i] = htt_rx_ind_noise_floor_chain(
+ pdev->htt_pdev, rx_ind_msg, i);
htt_rx_ind_timestamp(pdev->htt_pdev, rx_ind_msg,
&peer->last_pkt_timestamp_microsec,
&peer->last_pkt_timestamp_submicrosec);
@@ -577,7 +693,7 @@
return;
}
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "sec spec for peer %p (%02x:%02x:%02x:%02x:%02x:%02x): "
+ "sec spec for peer %pK (%02x:%02x:%02x:%02x:%02x:%02x): "
"%s key of type %d\n",
peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1], peer->mac_addr.raw[2],
@@ -738,7 +854,7 @@
ol_rx_offload_deliver_ind_handler(
ol_txrx_pdev_handle pdev,
adf_nbuf_t msg,
- int msdu_cnt)
+ u_int16_t msdu_cnt)
{
int vdev_id, peer_id, tid;
adf_nbuf_t head_buf, tail_buf, buf;
@@ -747,6 +863,17 @@
u_int8_t fw_desc;
htt_pdev_handle htt_pdev = pdev->htt_pdev;
+ if (msdu_cnt > htt_rx_offload_msdu_cnt(htt_pdev)) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: invalid msdu_cnt=%u\n",
+ __func__,
+ msdu_cnt);
+ if (pdev->cfg.is_high_latency)
+ htt_rx_desc_frame_free(htt_pdev, msg);
+
+ return;
+ }
+
while (msdu_cnt) {
if (!htt_rx_offload_msdu_pop(
htt_pdev, msg, &vdev_id, &peer_id,
@@ -911,6 +1038,71 @@
return FILTER_STATUS_REJECT;
}
+#ifdef WLAN_FEATURE_TSF_PLUS
+static inline void ol_rx_timestamp(ol_pdev_handle pdev,
+ void *rx_desc, adf_nbuf_t msdu)
+{
+ struct htt_rx_ppdu_desc_t *rx_ppdu_desc;
+
+ if (!ol_cfg_is_ptp_rx_opt_enabled(pdev))
+ return;
+
+ if (!rx_desc || !msdu)
+ return;
+
+ rx_ppdu_desc = (struct htt_rx_ppdu_desc_t *)((uint8_t *)(rx_desc) -
+ HTT_RX_IND_HL_BYTES + HTT_RX_IND_HDR_PREFIX_BYTES);
+ msdu->tstamp = ns_to_ktime((u_int64_t)rx_ppdu_desc->tsf32 *
+ NSEC_PER_USEC);
+}
+#else
+static inline void ol_rx_timestamp(ol_pdev_handle pdev,
+ void *rx_desc, adf_nbuf_t msdu)
+{
+}
+#endif
+
+/**
+ * ol_convert_ieee80211_to_8023() - handle data header transition.
+ * @msdu - Received packet.
+ *
+ * This function try to convert the IEEE80211 data frame to 802.3 frame.
+ * When DSRC OCB interface works in RAW mode, driver received data frame
+ * started with IEEE802.11 header, before this packet is delivered to
+ * network stack, it is needed to do transition. But for QCOM specific
+ * frame, this function do nothing change.
+ */
+static A_STATUS ol_convert_ieee80211_to_8023(adf_nbuf_t msdu)
+{
+ int hdr_size;
+ uint16_t epd_hdr_type;
+ struct ether_header eth_hdr;
+ struct ieee80211_frame *wh;
+
+ wh = (struct ieee80211_frame *)adf_nbuf_data(msdu);
+ if (!IEEE80211_IS_DATA(wh))
+ return A_ERROR;
+
+ hdr_size = ol_txrx_ieee80211_hdrsize(wh);
+ if (adf_nbuf_len(msdu) < (hdr_size + sizeof(epd_hdr_type)))
+ return A_ERROR;
+
+ epd_hdr_type = *(uint16_t *)(adf_nbuf_data(msdu) + hdr_size);
+ if (epd_hdr_type == adf_os_htons(ETHERTYPE_WSMP))
+ return A_ENOTSUP;
+
+ adf_os_mem_zero(ð_hdr, sizeof(struct ether_header));
+ adf_os_mem_copy(eth_hdr.ether_dhost, wh->i_addr1, IEEE80211_ADDR_LEN);
+ adf_os_mem_copy(eth_hdr.ether_shost, wh->i_addr2, IEEE80211_ADDR_LEN);
+ eth_hdr.ether_type = epd_hdr_type;
+
+ adf_nbuf_pull_head(msdu, hdr_size + sizeof(epd_hdr_type));
+ adf_nbuf_push_head(msdu, sizeof(eth_hdr));
+ adf_os_mem_copy(adf_nbuf_data(msdu), ð_hdr, sizeof(eth_hdr));
+
+ return A_OK;
+}
+
void
ol_rx_deliver(
struct ol_txrx_vdev_t *vdev,
@@ -954,7 +1146,7 @@
if (OL_RX_DECAP(vdev, peer, msdu, &info) != A_OK) {
discard = 1;
TXRX_PRINT(TXRX_PRINT_LEVEL_WARN,
- "decap error %p from peer %p "
+ "decap error %pK from peer %pK "
"(%02x:%02x:%02x:%02x:%02x:%02x) len %d\n",
msdu, peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1],
@@ -999,13 +1191,31 @@
int i;
struct ol_txrx_ocb_chan_info *chan_info = 0;
int packet_freq = peer->last_pkt_center_freq;
+ bool need_rx_stats_hdr = false;
+
for (i = 0; i < vdev->ocb_channel_count; i++) {
if (vdev->ocb_channel_info[i].chan_freq == packet_freq) {
chan_info = &vdev->ocb_channel_info[i];
break;
}
}
- if (!chan_info || !chan_info->disable_rx_stats_hdr) {
+
+ if (NULL != chan_info)
+ need_rx_stats_hdr = !chan_info->disable_rx_stats_hdr;
+
+ if (vdev->ocb_config_flags & OCB_CONFIG_FLAG_80211_FRAME_MODE) {
+ /*
+ * When DSRC OCB interface works in raw mode,
+ * and received packets started with 802.11 data header,
+ * it is required to driver convert the header to
+ * 802.3 header, except specific WSMP data frame.
+ */
+ A_STATUS status = ol_convert_ieee80211_to_8023(msdu);
+ if (A_SUCCESS(status))
+ need_rx_stats_hdr = false;
+ }
+
+ if (need_rx_stats_hdr) {
struct ether_header eth_header = { {0} };
struct ocb_rx_stats_hdr_t rx_header = {0};
@@ -1019,6 +1229,9 @@
rx_header.rssi_cmb = peer->last_pkt_rssi_cmb;
adf_os_mem_copy(rx_header.rssi, peer->last_pkt_rssi,
sizeof(rx_header.rssi));
+ adf_os_mem_copy(rx_header.noise_floor,
+ peer->last_pkt_noise_floor,
+ sizeof(rx_header.noise_floor));
if (peer->last_pkt_legacy_rate_sel == 0) {
switch (peer->last_pkt_legacy_rate) {
case 0x8:
@@ -1077,6 +1290,8 @@
OL_RX_ERR_STATISTICS_1(pdev, vdev, peer, rx_desc, OL_RX_ERR_NONE);
TXRX_STATS_MSDU_INCR(vdev->pdev, rx.delivered, msdu);
+ ol_rx_timestamp(pdev->ctrl_pdev, rx_desc, msdu);
+
OL_TXRX_LIST_APPEND(deliver_list_head, deliver_list_tail, msdu);
}
msdu = next;
@@ -1118,7 +1333,7 @@
msdu_list = adf_nbuf_next(msdu_list);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "discard rx %p from partly-deleted peer %p "
+ "discard rx %pK from partly-deleted peer %pK "
"(%02x:%02x:%02x:%02x:%02x:%02x)\n",
msdu, peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1],
@@ -1137,6 +1352,8 @@
/* invalid sequence number */
peer->tids_last_seq[tid] = IEEE80211_SEQ_MAX;
+ /* invalid reorder index number */
+ peer->tids_next_rel_idx[tid] = INVALID_REORDER_INDEX;
}
/*
* Set security defaults: no PN check, no security.
@@ -1372,6 +1589,7 @@
peer = ol_txrx_peer_find_by_id(htt_pdev->txrx_pdev, peer_id);
if (peer && peer->vdev) {
adf_dp_trace_set_track(head_buf, ADF_RX);
+ NBUF_SET_PACKET_TRACK(head_buf, NBUF_TX_PKT_DATA_TRACK);
adf_dp_trace_log_pkt(peer->vdev->vdev_id,
head_buf, ADF_RX);
DPTRACE(adf_dp_trace(head_buf,
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
index 358d6d6..a51eb75 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -192,12 +192,20 @@
u_int8_t tid)
{
u_int16_t seq_num;
- int seq_num_start, seq_num_end;
+ u_int16_t seq_num_start, seq_num_end;
struct ol_txrx_peer_t *peer;
htt_pdev_handle htt_pdev;
adf_nbuf_t head_msdu, tail_msdu;
void *rx_mpdu_desc;
+ if (tid >= OL_TXRX_NUM_EXT_TIDS) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: invalid tid, %u\n",
+ __FUNCTION__,
+ tid);
+ return;
+ }
+
htt_pdev = pdev->htt_pdev;
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
@@ -245,7 +253,7 @@
htt_pdev_handle htt_pdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
- int seq_num)
+ u_int16_t seq_num)
{
struct ol_rx_reorder_array_elem_t *rx_reorder_array_elem;
int seq;
@@ -1047,6 +1055,7 @@
adf_nbuf_set_next(rx_nbuf, NULL);
while (msdu) {
htt_rx_msdu_desc_free(htt_pdev, msdu);
+ adf_net_buf_debug_release_skb(msdu);
tmp = adf_nbuf_next(msdu);
adf_nbuf_set_next(msdu, NULL);
OL_RX_FRAG_PULL_HDR(htt_pdev, msdu, hdrsize);
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h
index 737c299..7750f24 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -165,7 +165,7 @@
htt_pdev_handle htt_pdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
- int seq_num);
+ u_int16_t seq_num);
static inline void
xor_block(
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
index ead13c7..70555dc 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c
@@ -154,7 +154,7 @@
* We could store the frame and try again later,
* but the simplest solution is to discard the frames.
*/
- adf_nbuf_free(msdu);
+ adf_nbuf_tx_free(msdu, ADF_NBUF_PKT_ERROR);
}
}
@@ -231,6 +231,7 @@
if (!do_not_fwd) {
if (htt_rx_msdu_discard(pdev->htt_pdev, rx_desc)) {
htt_rx_msdu_desc_free(pdev->htt_pdev, msdu);
+ adf_net_buf_debug_release_skb(msdu);
ol_rx_fwd_to_tx(tx_vdev, msdu);
msdu = NULL; /* already handled this MSDU */
tx_vdev->fwd_tx_packets++;
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_pn.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_pn.c
index aae18f8..b3f4106 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_pn.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_pn.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2015, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2015-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -190,7 +190,7 @@
}
TXRX_PRINT(log_level,
- "PN check failed - TID %d, peer %p "
+ "PN check failed - TID %d, peer %pK "
"(%02x:%02x:%02x:%02x:%02x:%02x) %s\n"
" old PN (u64 x2)= 0x%08llx %08llx (LSBs = %lld)\n"
" new PN (u64 x2)= 0x%08llx %08llx (LSBs = %lld)\n"
@@ -365,7 +365,7 @@
" count idx peer tid uni num LSBs\n");
do {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- " %6lld %4d %p %2d %d %4d %8d\n",
+ " %6lld %4d %pK %2d %d %4d %8d\n",
cnt, i,
pdev->rx_pn_trace.data[i].peer,
pdev->rx_pn_trace.data[i].tid,
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
index e1ffff0..c7bffde 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -473,6 +473,61 @@
*idx_end = tmp_idx;
}
+#ifdef HL_RX_AGGREGATION_HOLE_DETCTION
+
+/**
+ * ol_rx_reorder_detect_hole - ol rx reorder detect hole
+ * @peer: ol_txrx_peer_t
+ * @tid: tid
+ * @idx_start: idx_start
+ *
+ * Return: void
+ */
+static void ol_rx_reorder_detect_hole(struct ol_txrx_peer_t *peer,
+ uint32_t tid,
+ uint32_t idx_start)
+{
+ uint32_t win_sz_mask, next_rel_idx, hole_size;
+
+ if (peer->tids_next_rel_idx[tid] == INVALID_REORDER_INDEX)
+ return;
+
+ win_sz_mask = peer->tids_rx_reorder[tid].win_sz_mask;
+ /* Return directly if block-ack not enable */
+ if (win_sz_mask == 0)
+ return;
+
+ idx_start &= win_sz_mask;
+ next_rel_idx = peer->tids_next_rel_idx[tid] & win_sz_mask;
+
+ if (idx_start != next_rel_idx) {
+ hole_size = ((int)idx_start - (int)next_rel_idx) & win_sz_mask;
+
+ ol_rx_aggregation_hole(hole_size);
+ }
+
+ return;
+}
+
+#else
+
+/**
+ * ol_rx_reorder_detect_hole - ol rx reorder detect hole
+ * @peer: ol_txrx_peer_t
+ * @tid: tid
+ * @idx_start: idx_start
+ *
+ * Return: void
+ */
+static void ol_rx_reorder_detect_hole(struct ol_txrx_peer_t *peer,
+ uint32_t tid,
+ uint32_t idx_start)
+{
+ /* no-op */
+}
+
+#endif
+
void
ol_rx_reorder_peer_cleanup(
struct ol_txrx_vdev_t *vdev, struct ol_txrx_peer_t *peer)
@@ -545,7 +600,7 @@
if (peer == NULL) {
return;
}
- peer->tids_next_rel_idx[tid] = 0xffff; /* invalid value */
+ peer->tids_next_rel_idx[tid] = INVALID_REORDER_INDEX; /* invalid value */
rx_reorder = &peer->tids_rx_reorder[tid];
/* check that there really was a block ack agreement */
@@ -583,6 +638,14 @@
struct ol_rx_reorder_array_elem_t *rx_reorder_array_elem;
htt_pdev_handle htt_pdev = pdev->htt_pdev;
+ if (tid >= OL_TXRX_NUM_EXT_TIDS) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: invalid tid, %u\n",
+ __FUNCTION__,
+ tid);
+ return;
+ }
+
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
if (peer) {
vdev = peer->vdev;
@@ -607,6 +670,10 @@
return;
}
}
+
+ if (action == htt_rx_flush_release)
+ ol_rx_reorder_detect_hole(peer, tid, idx_start);
+
ol_rx_reorder_flush(
vdev, peer, tid, idx_start, idx_end, action);
/*
@@ -622,8 +689,8 @@
ol_txrx_pdev_handle pdev,
u_int16_t peer_id,
u_int8_t tid,
- int seq_num_start,
- int seq_num_end,
+ u_int16_t seq_num_start,
+ u_int16_t seq_num_end,
u_int8_t pn_ie_cnt,
u_int8_t *pn_ie)
{
@@ -635,7 +702,8 @@
adf_nbuf_t head_msdu = NULL;
adf_nbuf_t tail_msdu = NULL;
htt_pdev_handle htt_pdev = pdev->htt_pdev;
- int seq_num, i=0;
+ u_int16_t seq_num;
+ int i=0;
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
@@ -693,7 +761,7 @@
log_level = TXRX_PRINT_LEVEL_INFO2;
}
TXRX_PRINT(log_level,
- "Tgt PN check failed - TID %d, peer %p "
+ "Tgt PN check failed - TID %d, peer %pK "
"(%02x:%02x:%02x:%02x:%02x:%02x)\n"
" PN (u64 x2)= 0x%08llx %08llx (LSBs = %lld)\n"
" new seq num = %d\n",
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.c
index 8903039..b8169c0 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -53,6 +53,344 @@
#include <ol_txrx_encap.h> /* OL_TX_ENCAP, etc */
#include "vos_lock.h"
+#ifdef WLAN_FEATURE_DSRC
+#include "ol_tx.h"
+#include "wlan_hdd_main.h"
+#include "wlan_hdd_ocb.h"
+#include "adf_os_lock.h"
+#include "adf_os_util.h"
+#include "queue.h"
+
+/**
+ * struct ol_tx_stats_ring_item - the item of a packet tx stats in the ring
+ * @list: list for all tx stats item in the ring
+ * @stats: a packet tx stats including fields from host and FW respectively
+ * @msdu_id: msdu ID used to match stats fields respectively from host and FW
+ * into a complete tx stats item
+ * @reserved: reserved to align to 4 bytes
+ */
+struct ol_tx_stats_ring_item {
+ TAILQ_ENTRY(ol_tx_stats_ring_item) list;
+ struct ol_tx_per_pkt_stats stats;
+ uint16_t msdu_id;
+ uint8_t reserved[2];
+};
+
+/**
+ * struct ol_tx_stats_ring_head - the ring head of all tx stats
+ * @mutex: mutex to access it exclusively
+ * @free_list: list of free tx stats ring items
+ * @host_list: list of tx stats items only containing tx stats fields from host
+ * @comp_list: list of tx stats items containing complete tx stats fields
+ * from host and FW, items in this list can be dequeued to user
+ * @num_free: number of free tx stats items
+ * @num_host_stat: number of tx stats items only containing tx stats fields
+ * from host
+ * @num_comp_stat: number of tx stats items containing complete tx stats fields
+ */
+struct ol_tx_stats_ring_head {
+ adf_os_spinlock_t mutex;
+ TAILQ_HEAD(free_list, ol_tx_stats_ring_item) free_list;
+ TAILQ_HEAD(host_list, ol_tx_stats_ring_item) host_list;
+ TAILQ_HEAD(comp_list, ol_tx_stats_ring_item) comp_list;
+ uint8_t num_free;
+ uint8_t num_host_stat;
+ uint8_t num_comp_stat;
+};
+
+#define TX_STATS_RING_SZ 32
+#define INVALID_TX_MSDU_ID (-1)
+
+static struct ol_tx_stats_ring_head *tx_stats_ring_head;
+static struct ol_tx_stats_ring_item *tx_stats_ring;
+static bool __ol_per_pkt_tx_stats_enabled = false;
+
+static int ol_tx_stats_ring_init(void)
+{
+ struct ol_tx_stats_ring_head *head;
+ struct ol_tx_stats_ring_item *ring;
+ int i;
+
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1, "%s()\n", __func__);
+ head = vos_mem_malloc(sizeof(*head));
+ if (!head)
+ return -ENOMEM;
+ ring = vos_mem_malloc(sizeof(*ring) * TX_STATS_RING_SZ);
+ if (!ring) {
+ vos_mem_free(head);
+ return -ENOMEM;
+ }
+ tx_stats_ring_head = head;
+ tx_stats_ring = ring;
+
+ vos_mem_zero(head, sizeof(*head));
+ vos_mem_zero(ring, sizeof(*ring) * TX_STATS_RING_SZ);
+
+ TAILQ_INIT(&head->free_list);
+ TAILQ_INIT(&head->host_list);
+ TAILQ_INIT(&head->comp_list);
+
+ for (i = 0; i < TX_STATS_RING_SZ; i++) {
+ ring[i].msdu_id = INVALID_TX_MSDU_ID;
+ TAILQ_INSERT_HEAD(&head->free_list, &ring[i], list);
+ }
+ head->num_free = TX_STATS_RING_SZ;
+
+ adf_os_spinlock_init(&head->mutex);
+
+ return 0;
+}
+
+static void ol_tx_stats_ring_deinit(void)
+{
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1, "%s()\n", __func__);
+ if (tx_stats_ring_head) {
+ vos_mem_free(tx_stats_ring_head);
+ tx_stats_ring_head = NULL;
+ }
+ if (tx_stats_ring) {
+ vos_mem_free(tx_stats_ring);
+ tx_stats_ring = NULL;
+ }
+}
+
+void ol_per_pkt_tx_stats_enable(bool enable)
+{
+ int ret = 0;
+
+ if (!vos_is_ocb_tx_per_pkt_stats_enabled())
+ return;
+
+ if (__ol_per_pkt_tx_stats_enabled == enable)
+ return;
+
+ if (enable)
+ ret = ol_tx_stats_ring_init();
+ else
+ ol_tx_stats_ring_deinit();
+
+ if (!ret)
+ __ol_per_pkt_tx_stats_enabled = enable;
+ else
+ __ol_per_pkt_tx_stats_enabled = false;
+
+ adf_os_mb();
+}
+
+bool ol_per_pkt_tx_stats_enabled(void)
+{
+ return __ol_per_pkt_tx_stats_enabled;
+}
+
+static inline int __free_list_empty(void)
+{
+ return TAILQ_EMPTY(&tx_stats_ring_head->free_list);
+}
+
+static inline int __host_list_empty(void)
+{
+ return TAILQ_EMPTY(&tx_stats_ring_head->host_list);
+}
+
+static inline int __comp_list_empty(void)
+{
+ return TAILQ_EMPTY(&tx_stats_ring_head->comp_list);
+}
+
+static inline struct ol_tx_stats_ring_item *__get_ring_item(void)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+ struct ol_tx_stats_ring_item *item = NULL;
+
+ if (!__free_list_empty()) {
+ item = TAILQ_FIRST(&h->free_list);
+ TAILQ_REMOVE(&h->free_list, item, list);
+ h->num_free--;
+ } else if (!__comp_list_empty()) {
+ /* Discard the oldest one. */
+ item = TAILQ_LAST(&h->comp_list, comp_list);
+ TAILQ_REMOVE(&h->comp_list, item, list);
+ h->num_comp_stat--;
+ } else if (!__host_list_empty()) {
+ item = TAILQ_LAST(&h->host_list, host_list);
+ TAILQ_REMOVE(&h->host_list, item, list);
+ h->num_host_stat--;
+ }
+
+ return item;
+}
+
+static inline struct ol_tx_stats_ring_item *
+__get_ring_item_host(uint32_t msdu_id)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+ struct ol_tx_stats_ring_item *item = NULL;
+ struct ol_tx_stats_ring_item *temp = NULL;
+
+ if (__host_list_empty())
+ goto exit;
+
+ TAILQ_FOREACH_REVERSE(temp, &h->host_list, host_list, list) {
+ if (temp && (temp->msdu_id == msdu_id)) {
+ item = temp;
+ TAILQ_REMOVE(&h->host_list, item, list);
+ h->num_host_stat--;
+ goto exit;
+ }
+ }
+
+exit:
+ return item;
+}
+
+static inline struct ol_tx_stats_ring_item *__get_ring_item_comp(void)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+ struct ol_tx_stats_ring_item *item = NULL;
+
+ if (__comp_list_empty())
+ goto exit;
+
+ item = TAILQ_LAST(&h->comp_list, comp_list);
+ TAILQ_REMOVE(&h->comp_list, item, list);
+ h->num_comp_stat--;
+
+exit:
+ return item;
+}
+
+static inline void __put_ring_item_host(struct ol_tx_stats_ring_item *item)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+
+ TAILQ_INSERT_HEAD(&h->host_list, item, list);
+ h->num_host_stat++;
+}
+
+static inline void __put_ring_item_comp(struct ol_tx_stats_ring_item *item)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+
+ TAILQ_INSERT_HEAD(&h->comp_list, item, list);
+ h->num_comp_stat++;
+}
+
+static inline void __free_ring_item(struct ol_tx_stats_ring_item *item)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+
+ TAILQ_INSERT_HEAD(&h->free_list, item, list);
+ h->num_free++;
+}
+
+/**
+ * ol_tx_stats_ring_enque_host() - enqueue the tx stats fields of a packet
+ * collected from tx path of host driver
+ * @msdu_id: ol_tx_desc_id
+ * @chan_freq: channel freqency
+ * @bandwidth: channel bandwith like 10 or 20MHz
+ * @mac_address: mac address used
+ * @datarate: data rate used
+ *
+ * This interface is for caller from TXRX layer in interrupt context.
+ */
+void ol_tx_stats_ring_enque_host(uint32_t msdu_id, uint32_t chan_freq,
+ uint32_t bandwidth, uint8_t *mac_address,
+ uint8_t datarate)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+ struct ol_tx_stats_ring_item *item;
+ static uint32_t seq_no = 0;
+
+ if (!h)
+ return;
+
+ adf_os_spin_lock(&h->mutex);
+
+ item = __get_ring_item();
+ if (!item)
+ goto exit;
+
+ item->msdu_id = msdu_id;
+ item->stats.seq_no = seq_no++;
+ item->stats.chan_freq = chan_freq;
+ item->stats.bandwidth = bandwidth;
+ vos_mem_copy(item->stats.mac_address, mac_address, 6);
+ item->stats.datarate = datarate;
+
+ __put_ring_item_host(item);
+
+exit:
+ adf_os_spin_unlock(&h->mutex);
+}
+
+/**
+ * ol_tx_stats_ring_enque_comp() - enqueue the tx power of a packet from FW
+ * to form a complete tx stats item, which can be delivered to user
+ * @msdu_id: ol_tx_desc_id
+ * @tx_power: tx power used from FW
+ *
+ * This interface is for caller from WMA layer context.
+ */
+void ol_tx_stats_ring_enque_comp(uint32_t msdu_id, uint32_t tx_power)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+ struct ol_tx_stats_ring_item *item;
+
+ if (!h)
+ return;
+
+ adf_os_spin_lock(&h->mutex);
+
+ item = __get_ring_item_host(msdu_id);
+ if (!item)
+ goto exit;
+
+ item->stats.tx_power = (uint8_t)tx_power;
+ __put_ring_item_comp(item);
+
+exit:
+ adf_os_spin_unlock(&h->mutex);
+}
+
+/**
+ * ol_tx_stats_ring_deque() - dequeue a complete tx stats item to user
+ * @stats: tx per packet stats
+ *
+ * This interface is for caller from user space process context.
+ *
+ * Return: 1 if get a tx stats, 0 for no stats got
+ */
+int ol_tx_stats_ring_deque(struct ol_tx_per_pkt_stats *stats)
+{
+ struct ol_tx_stats_ring_head *h = tx_stats_ring_head;
+ struct ol_tx_stats_ring_item *item;
+ int ret = 0;
+
+ if (!h)
+ return ret;
+
+ adf_os_spin_lock(&h->mutex);
+
+ item = __get_ring_item_comp();
+ if (!item)
+ goto exit;
+
+ __free_ring_item(item);
+
+ vos_mem_copy(stats, &item->stats, sizeof(*stats));
+ item->msdu_id = INVALID_TX_MSDU_ID;
+ ret = 1;
+
+exit:
+ adf_os_spin_unlock(&h->mutex);
+ return ret;
+}
+#endif /* WLAN_FEATURE_DSRC */
+
+adf_nbuf_t
+ol_tx_hl_vdev_queue_tcp_ack_send_all(struct ol_txrx_vdev_t *vdev);
+
#define ol_tx_prepare_ll(tx_desc, vdev, msdu, msdu_info) \
do { \
struct ol_txrx_pdev_t *pdev = vdev->pdev; \
@@ -102,8 +440,10 @@
msdu_info.htt.info.ext_tid = adf_nbuf_get_tid(msdu);
msdu_info.peer = NULL;
- adf_nbuf_map_single(adf_ctx, msdu,
+ if (!adf_nbuf_is_ipa_nbuf(msdu)) {
+ adf_nbuf_map_single(adf_ctx, msdu,
ADF_OS_DMA_TO_DEVICE);
+ }
ol_tx_prepare_ll(tx_desc, vdev, msdu, &msdu_info);
/*
@@ -208,7 +548,7 @@
*/
if (tx_msdu) {
adf_nbuf_unmap(vdev->pdev->osdev, tx_msdu, ADF_OS_DMA_TO_DEVICE);
- adf_nbuf_tx_free(tx_msdu, 1 /* error */);
+ adf_nbuf_tx_free(tx_msdu, ADF_NBUF_PKT_ERROR);
}
}
}
@@ -395,7 +735,7 @@
*/
if (tx_msdu) {
adf_nbuf_unmap(pdev->osdev, tx_msdu, ADF_OS_DMA_TO_DEVICE);
- adf_nbuf_tx_free(tx_msdu, 1 /* error */);
+ adf_nbuf_tx_free(tx_msdu, ADF_NBUF_PKT_ERROR);
}
}
/*check if there are more msdus to transmit*/
@@ -598,11 +938,28 @@
* equivalent parameter in def_ctrl_hdr will be copied to tx_ctrl.
*/
static void merge_ocb_tx_ctrl_hdr(struct ocb_tx_ctrl_hdr_t *tx_ctrl,
- struct ocb_tx_ctrl_hdr_t *def_ctrl_hdr)
+ struct ocb_tx_ctrl_hdr_t *def_ctrl_hdr,
+ uint32_t ocb_channel_count)
{
- if (!tx_ctrl || !def_ctrl_hdr)
+ int i;
+ struct ocb_tx_ctrl_hdr_t *temp;
+
+ if (!tx_ctrl || !def_ctrl_hdr || !ocb_channel_count)
return;
+ /*
+ * Find default TX ctrl parameters based on channel frequence.
+ * Up to two different channels are supported. Default TX ctrl
+ * parameters are configured from ocb set configure command.
+ */
+ temp = def_ctrl_hdr;
+ for (i = 0; i < ocb_channel_count; i++, temp++) {
+ if (temp->channel_freq == tx_ctrl->channel_freq) {
+ def_ctrl_hdr = temp;
+ break;
+ }
+ }
+
if (!tx_ctrl->channel_freq && def_ctrl_hdr->channel_freq)
tx_ctrl->channel_freq = def_ctrl_hdr->channel_freq;
if (!tx_ctrl->valid_pwr && def_ctrl_hdr->valid_pwr) {
@@ -632,6 +989,192 @@
}
}
+#ifdef WLAN_FEATURE_DSRC
+/**
+ * dsrc_update_broadcast_frame_sa() - update source address of DSRC broadcast
+ * frame
+ * @vdev: virtual device handle corresponding to wlanocb0.
+ * @tx_ctrl: default TX control header.
+ * @msdu: MAC service data unit.
+ *
+ * For each channel of DSRC has its MAC address, which may be different from
+ * the MAC address of interface wlanocb0, so we need to update the source MAC
+ * address per channel.
+ */
+static void dsrc_update_broadcast_frame_sa(ol_txrx_vdev_handle vdev,
+ struct ocb_tx_ctrl_hdr_t *tx_ctrl,
+ adf_nbuf_t msdu)
+{
+ int i;
+ uint8_t *da;
+ uint8_t *sa;
+ struct ieee80211_frame *wh;
+ struct ether_header *eh;
+ struct ol_txrx_ocb_chan_info *chan_info;
+
+ chan_info = &vdev->ocb_channel_info[0];
+ for (i = 0; i < vdev->ocb_channel_count; i++) {
+ if (tx_ctrl->channel_freq ==
+ vdev->ocb_channel_info[i].chan_freq) {
+ chan_info = &vdev->ocb_channel_info[i];
+ break;
+ }
+ }
+
+ if (tx_ctrl->valid_eth_mode) {
+ eh = (struct ether_header *)adf_nbuf_data(msdu);
+ da = eh->ether_dhost;
+ sa = eh->ether_shost;
+ } else {
+ wh = (struct ieee80211_frame *)adf_nbuf_data(msdu);
+ da = wh->i_addr1;
+ sa = wh->i_addr2;
+ }
+
+ if (vos_is_macaddr_broadcast((v_MACADDR_t *)da)) {
+ vos_mem_copy(sa, chan_info->mac_address,
+ sizeof(chan_info->mac_address));
+ }
+}
+
+/* If the vdev is in OCB mode, collect per packet tx stats. */
+static inline void
+ol_collect_per_pkt_tx_stats(ol_txrx_vdev_handle vdev,
+ struct ocb_tx_ctrl_hdr_t *tx_ctrl, uint32_t msdu_id)
+{
+ struct ol_txrx_ocb_chan_info *chan_info;
+ int i;
+
+ if (!ol_per_pkt_tx_stats_enabled())
+ return;
+
+ chan_info = &vdev->ocb_channel_info[0];
+ for (i = 0; i < vdev->ocb_channel_count; i++) {
+ if (tx_ctrl->channel_freq ==
+ vdev->ocb_channel_info[i].chan_freq) {
+ chan_info = &vdev->ocb_channel_info[i];
+ break;
+ }
+ }
+
+ ol_tx_stats_ring_enque_host(msdu_id, tx_ctrl->channel_freq,
+ chan_info->bandwidth, chan_info->mac_address,
+ tx_ctrl->datarate);
+}
+
+static inline bool
+ol_tx_select_sch_for_ip_pkt(ol_txrx_vdev_handle vdev,
+ struct ocb_tx_ctrl_hdr_t *tx_ctrl)
+{
+ struct ol_txrx_ocb_chan_info *chan_info = vdev->ocb_channel_info;
+ int i;
+
+ for (i = 0; i < vdev->ocb_channel_count; i++) {
+ if (chan_info[i].chan_freq != DOT11P_CONTROL_CHANNEL) {
+ tx_ctrl->channel_freq = chan_info[i].chan_freq;
+ return true;
+ }
+ }
+
+ return false;
+}
+#else
+static void dsrc_update_broadcast_frame_sa(ol_txrx_vdev_handle vdev,
+ struct ocb_tx_ctrl_hdr_t *tx_ctrl,
+ adf_nbuf_t msdu)
+{
+}
+
+static inline void
+ol_collect_per_pkt_tx_stats(ol_txrx_vdev_handle vdev,
+ struct ocb_tx_ctrl_hdr_t *tx_ctrl, uint32_t msdu_id)
+{
+}
+
+static inline bool
+ol_tx_select_sch_for_ip_pkt(ol_txrx_vdev_handle vdev,
+ struct ocb_tx_ctrl_hdr_t *tx_ctrl)
+{
+ return false;
+}
+#endif /* WLAN_FEATURE_DSRC */
+
+static void
+ol_tx_drop_list_add(adf_nbuf_t *list, adf_nbuf_t msdu, adf_nbuf_t *tail)
+{
+ adf_nbuf_set_next(msdu, NULL);
+ if (!*list)
+ *list = msdu;
+ else
+ adf_nbuf_set_next(*tail, msdu);
+
+ *tail = msdu;
+}
+
+/**
+ * ol_build_ieee80211_header() - Build IEEE80211 DATA header from 802.3
+ * @msdu: the msdu buffer to be transmitted.
+ *
+ * This function is used to convert MSDU packet from 802.3 Header to
+ * IEEE802.11 Header + EPD Header. Only used in 802.11p DSRC OCB RAW mode.
+ * EPD header is 2 bytes, indicates the ether_type, larger than 0x600.
+ * OCB configuration Command has already indicated current working mode.
+ */
+static A_STATUS ol_build_ieee80211_header(adf_nbuf_t msdu)
+{
+ int need_hdr_len;
+ uint16_t epd_hdr_type;
+ static uint16_t seq_num = 0;
+ struct ether_header *eth_hdr_p;
+ struct ieee80211_qosframe hdr;
+
+ eth_hdr_p = (struct ether_header *)adf_nbuf_data(msdu);
+ epd_hdr_type = eth_hdr_p->ether_type;
+
+ adf_os_mem_zero(&hdr, sizeof(struct ieee80211_qosframe));
+ hdr.i_fc[0] |= IEEE80211_FC0_VERSION_0 |
+ IEEE80211_FC0_TYPE_DATA |
+ IEEE80211_FC0_SUBTYPE_QOS;
+ adf_os_mem_copy(hdr.i_addr1, eth_hdr_p->ether_dhost,
+ IEEE80211_ADDR_LEN);
+ adf_os_mem_copy(hdr.i_addr2, eth_hdr_p->ether_shost,
+ IEEE80211_ADDR_LEN);
+ adf_os_mem_set(hdr.i_addr3, 0xff, IEEE80211_ADDR_LEN);
+
+ *(uint16_t *)hdr.i_seq = htole16(seq_num << IEEE80211_SEQ_SEQ_SHIFT);
+ seq_num++;
+
+ hdr.i_qos[0] |= adf_nbuf_get_tid(msdu);
+ if (IEEE80211_IS_MULTICAST(hdr.i_addr1))
+ hdr.i_qos[0] |= 1 << IEEE80211_QOS_ACKPOLICY_S;
+
+ need_hdr_len = sizeof(hdr) + sizeof(epd_hdr_type) -
+ ETHER_HDR_LEN - adf_nbuf_headroom(msdu);
+
+ /*
+ * So we need to modify the skb buffer header and hence need
+ * a copy of that. For OCB data packets from network stack,
+ * it is impossible happened here, in case of headroom is not
+ * enough.
+ */
+ if (need_hdr_len > 0 || adf_nbuf_is_cloned(msdu)) {
+ need_hdr_len += adf_nbuf_headroom(msdu);
+ if (adf_nbuf_expand(msdu, need_hdr_len, 0) == NULL) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: buf expand fail\n", __func__);
+ return A_ERROR;
+ }
+ }
+
+ adf_nbuf_pull_head(msdu, ETHER_HDR_LEN);
+ adf_os_mem_copy(adf_nbuf_push_head(msdu, sizeof(epd_hdr_type)),
+ &epd_hdr_type, sizeof(epd_hdr_type));
+ adf_os_mem_copy(adf_nbuf_push_head(msdu, sizeof(hdr)),
+ &hdr, sizeof(hdr));
+
+ return A_OK;
+}
+
static inline adf_nbuf_t
ol_tx_hl_base(
ol_txrx_vdev_handle vdev,
@@ -641,10 +1184,14 @@
{
struct ol_txrx_pdev_t *pdev = vdev->pdev;
adf_nbuf_t msdu = msdu_list;
+ adf_nbuf_t msdu_drop_list = NULL;
+ adf_nbuf_t drop_tail = NULL;
struct ol_txrx_msdu_info_t tx_msdu_info;
struct ocb_tx_ctrl_hdr_t tx_ctrl;
htt_pdev_handle htt_pdev = pdev->htt_pdev;
+ uint8_t rtap[MAX_RADIOTAP_LEN] = {0};
+ uint8_t rtap_len = 0;
tx_msdu_info.peer = NULL;
/*
@@ -659,7 +1206,7 @@
struct ol_tx_desc_t *tx_desc = NULL;
adf_os_mem_zero(&tx_ctrl, sizeof(tx_ctrl));
-
+ tx_msdu_info.peer = NULL;
/*
* The netbuf will get stored into a (peer-TID) tx queue list
* inside the ol_tx_classify_store function or else dropped,
@@ -667,6 +1214,25 @@
*/
next = adf_nbuf_next(msdu);
+ /*
+ * copy radiotap header out first.
+ */
+ if (VOS_MONITOR_MODE == vos_get_conparam()) {
+ struct ieee80211_radiotap_header *rthdr;
+ rthdr = (struct ieee80211_radiotap_header *)(adf_nbuf_data(msdu));
+ rtap_len = rthdr->it_len;
+ if (rtap_len > MAX_RADIOTAP_LEN) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "radiotap length exceeds %d, drop it!\n",
+ MAX_RADIOTAP_LEN);
+ ol_tx_drop_list_add(&msdu_drop_list, msdu, &drop_tail);
+ msdu = next;
+ continue;
+ }
+ adf_os_mem_copy(rtap, rthdr, rtap_len);
+ adf_nbuf_pull_head(msdu, rtap_len);
+ }
+
#if defined(CONFIG_TX_DESC_HI_PRIO_RESERVE)
if (adf_os_atomic_read(&pdev->tx_queue.rsrc_cnt) >
TXRX_HL_TX_DESC_HI_PRIO_RESERVED) {
@@ -685,9 +1251,16 @@
* tx descs for the remaining MSDUs.
*/
TXRX_STATS_MSDU_LIST_INCR(pdev, tx.dropped.host_reject, msdu);
- return msdu; /* the list of unaccepted MSDUs */
+ if (!msdu_drop_list)
+ msdu_drop_list = msdu;
+ else
+ adf_nbuf_set_next(drop_tail, msdu);
+ return msdu_drop_list; /* the list of unaccepted MSDUs */
}
+ tx_desc->rtap_len = rtap_len;
+ adf_os_mem_copy(tx_desc->rtap, rtap, rtap_len);
+
// OL_TXRX_PROT_AN_LOG(pdev->prot_an_tx_sent, msdu);
if (tx_spec != ol_tx_spec_std) {
@@ -722,14 +1295,54 @@
if (!parse_ocb_tx_header(msdu, &tx_ctrl, &tx_ctrl_header_found)) {
/* There was an error parsing the header. Skip this packet. */
- goto MSDU_LOOP_BOTTOM;
+ ol_tx_drop_list_add(&msdu_drop_list, msdu, &drop_tail);
+ goto free_tx_desc;
}
- /* If the TX control header was not found, just use the defaults */
- if (!tx_ctrl_header_found && vdev->ocb_def_tx_param)
- vos_mem_copy(&tx_ctrl, vdev->ocb_def_tx_param, sizeof(tx_ctrl));
- /* If the TX control header was found, merge the defaults into it */
- else if (tx_ctrl_header_found && vdev->ocb_def_tx_param)
- merge_ocb_tx_ctrl_hdr(&tx_ctrl, vdev->ocb_def_tx_param);
+ /*
+ * For dsrc tx frame, the TX control header MUST be provided by
+ * dsrc app, merge the saved defaults into it.
+ * The non-dsrc(like IPv6 frames etc.) tx frame has no tx_ctrl_hdr,
+ * and we distingush dsrc and non-dsrc tx frame only by whether
+ * tx_ctrl_hdr is found in the frame.
+ * So, if there has no tx_ctrl_hdr from dsrc app, then there will
+ * has no tx_ctrl_hdr added to send down to FW.
+ */
+ if (tx_ctrl_header_found && vdev->ocb_def_tx_param)
+ merge_ocb_tx_ctrl_hdr(&tx_ctrl, vdev->ocb_def_tx_param,
+ vdev->ocb_channel_count);
+
+ /*
+ * Check OCB Broadcast frame Source address.
+ * Per OCB channel, it includes a default MAC address
+ * for broadcast DSRC frame in this channel.
+ */
+ if (tx_ctrl_header_found) {
+ dsrc_update_broadcast_frame_sa(vdev, &tx_ctrl, msdu);
+
+ /* only collect dsrc tx packet stats.*/
+ ol_collect_per_pkt_tx_stats(vdev, &tx_ctrl, tx_desc->id);
+ } else {
+ /*
+ * TX ctrl header is filled by specific operation.
+ * Packets from network stack have no ctrl header.
+ * Only convert the packet from network stack.
+ */
+ if (vdev->ocb_config_flags & OCB_CONFIG_FLAG_80211_FRAME_MODE) {
+ A_STATUS status = ol_build_ieee80211_header(msdu);
+ if (A_FAILED(status))
+ goto free_tx_desc;
+ }
+
+ /*
+ * IEEE 1609.4-2016 5.3.4 mandates that IP datagrams can
+ * transmit only on SCH (Service Channel) and can't goes on CCH.
+ * If SCH not exists, then drop the IP datagram.
+ */
+ if (!ol_tx_select_sch_for_ip_pkt(vdev, &tx_ctrl)) {
+ ol_tx_drop_list_add(&msdu_drop_list, msdu, &drop_tail);
+ goto free_tx_desc;
+ }
+ }
}
txq = ol_tx_classify(vdev, tx_desc, msdu, &tx_msdu_info);
@@ -743,7 +1356,8 @@
/* remove the peer reference added above */
ol_txrx_peer_unref_delete(tx_msdu_info.peer);
}
- goto MSDU_LOOP_BOTTOM;
+ msdu = next;
+ continue;
}
if(tx_msdu_info.peer) {
@@ -796,20 +1410,35 @@
*/
htt_tx_desc_display(tx_desc->htt_tx_desc);
+ /* push radiotap as extra frag */
+ if (VOS_MONITOR_MODE == vos_get_conparam()) {
+ adf_nbuf_frag_push_head(
+ msdu,
+ tx_desc->rtap_len,
+ (uint8_t *)tx_desc->rtap, /* virtual addr */
+ 0, 0 /* phys addr MSBs - n/a */);
+ adf_nbuf_set_frag_is_wordstream(msdu, 1, 1);
+ }
+
ol_tx_enqueue(pdev, txq, tx_desc, &tx_msdu_info);
if (tx_msdu_info.peer) {
OL_TX_PEER_STATS_UPDATE(tx_msdu_info.peer, msdu);
/* remove the peer reference added above */
ol_txrx_peer_unref_delete(tx_msdu_info.peer);
}
-MSDU_LOOP_BOTTOM:
+ msdu = next;
+ continue;
+
+free_tx_desc:
+ adf_os_atomic_inc(&pdev->tx_queue.rsrc_cnt);
+ ol_tx_desc_free(pdev, tx_desc);
msdu = next;
}
if (call_sched == true)
ol_tx_sched(pdev);
- return NULL; /* all MSDUs were accepted */
+ return msdu_drop_list; /* all MSDUs were accepted */
}
/**
@@ -837,6 +1466,470 @@
return vdev;
}
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+
+/**
+ * ol_tx_pdev_reset_driver_del_ack() - reset driver delayed ack enabled flag
+ * @pdev_handle: pdev handle
+ *
+ * Return: none
+ */
+void
+ol_tx_pdev_reset_driver_del_ack(void *pdev_handle)
+{
+ struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)pdev_handle;
+ struct ol_txrx_vdev_t *vdev;
+
+ TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
+ vdev->driver_del_ack_enabled = false;
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
+ "vdev_id %d driver_del_ack_enabled %d\n",
+ vdev->vdev_id, vdev->driver_del_ack_enabled);
+ }
+}
+
+/**
+ * ol_tx_vdev_set_driver_del_ack_enable() - set driver delayed ack enabled flag
+ * @vdev_id: vdev id
+ * @rx_packets: number of rx packets
+ * @time_in_ms: time in ms
+ * @high_th: high threashold
+ * @low_th: low threashold
+ *
+ * Return: none
+ */
+void
+ol_tx_vdev_set_driver_del_ack_enable(uint8_t vdev_id, unsigned long rx_packets,
+ uint32_t time_in_ms, uint32_t high_th, uint32_t low_th)
+{
+ struct ol_txrx_vdev_t *vdev = ol_txrx_get_vdev_from_vdev_id(vdev_id);
+ bool old_driver_del_ack_enabled;
+
+ if ((!vdev) || (low_th > high_th))
+ return;
+
+ old_driver_del_ack_enabled = vdev->driver_del_ack_enabled;
+ if (rx_packets > high_th)
+ vdev->driver_del_ack_enabled = true;
+ else if (rx_packets < low_th)
+ vdev->driver_del_ack_enabled = false;
+
+ if (old_driver_del_ack_enabled != vdev->driver_del_ack_enabled) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
+ "vdev_id %d driver_del_ack_enabled %d rx_packets %ld"
+ " time_in_ms %d high_th %d low_th %d\n",
+ vdev->vdev_id, vdev->driver_del_ack_enabled,
+ rx_packets, time_in_ms, high_th, low_th);
+ }
+}
+
+/**
+ * ol_tx_hl_send_all_tcp_ack() - send all queued tcp ack packets
+ * @vdev: vdev handle
+ *
+ * Return: none
+ */
+void ol_tx_hl_send_all_tcp_ack(struct ol_txrx_vdev_t *vdev)
+{
+ int i = 0;
+ struct tcp_stream_node *tcp_node_list = NULL;
+ struct tcp_stream_node *temp = NULL;
+
+ for (i = 0; i < OL_TX_HL_DEL_ACK_HASH_SIZE; i++) {
+ tcp_node_list = NULL;
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.node[i].hash_node_lock);
+ if (vdev->tcp_ack_hash.node[i].no_of_entries)
+ tcp_node_list = vdev->tcp_ack_hash.node[i].head;
+
+ vdev->tcp_ack_hash.node[i].no_of_entries = 0;
+ vdev->tcp_ack_hash.node[i].head = NULL;
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.node[i].hash_node_lock);
+
+ /* Send all packets */
+ while (tcp_node_list) {
+ int tx_comp_req = vdev->pdev->cfg.default_tx_comp_req;
+ adf_nbuf_t msdu_list = NULL;
+
+ temp = tcp_node_list;
+ tcp_node_list = temp->next;
+
+ msdu_list = ol_tx_hl_base(vdev, ol_tx_spec_std,
+ temp->head, tx_comp_req, false);
+ if (msdu_list)
+ adf_nbuf_tx_free(msdu_list, 1/*error*/);
+ ol_txrx_vdev_free_tcp_node(vdev, temp);
+ }
+ }
+ ol_tx_sched(vdev->pdev);
+}
+
+/**
+ * tcp_del_ack_tasklet() - tasklet function to send ack packets
+ * @data: vdev handle
+ *
+ * Return: none
+ */
+void tcp_del_ack_tasklet(unsigned long data)
+{
+ struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)data;
+
+ ol_tx_hl_send_all_tcp_ack(vdev);
+}
+
+/**
+ * ol_tx_get_stream_id() - get stream_id from packet info
+ * @info: packet info
+ *
+ * Return: stream_id
+ */
+uint16_t ol_tx_get_stream_id(struct packet_info *info)
+{
+ return ((info->dst_port + info->dst_ip + info->src_port + info->src_ip)
+ & (OL_TX_HL_DEL_ACK_HASH_SIZE - 1));
+}
+
+/**
+ * ol_tx_get_packet_info() - update packet info for passed msdu
+ * @msdu: packet
+ * @info: packet info
+ *
+ * Return: none
+ */
+void ol_tx_get_packet_info(adf_nbuf_t msdu, struct packet_info *info)
+{
+ uint16_t ether_type;
+ uint8_t protocol;
+ uint8_t flag, header_len;
+ uint32_t seg_len;
+ uint8_t *skb_data;
+ uint32_t skb_len;
+
+ info->type = NO_TCP_PKT;
+
+ adf_nbuf_peek_header(msdu, &skb_data, &skb_len);
+ if (skb_len < ADF_NBUF_TRAC_TCP_FLAGS_OFFSET)
+ return;
+
+ ether_type = (v_U16_t)(*(v_U16_t *)
+ (skb_data + ADF_NBUF_TRAC_ETH_TYPE_OFFSET));
+ protocol = (v_U16_t)(*(v_U16_t *)
+ (skb_data + ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET));
+
+ if ((ADF_NBUF_TRAC_IPV4_ETH_TYPE == VOS_SWAP_U16(ether_type)) &&
+ (protocol == ADF_NBUF_TRAC_TCP_TYPE)) {
+ header_len = ((v_U8_t)(*(v_U8_t *)
+ (skb_data + ADF_NBUF_TRAC_TCP_HEADER_LEN_OFFSET))) >> 2;
+ seg_len = skb_len - header_len - 34;
+ flag = (v_U8_t)(*(v_U8_t *)
+ (skb_data + ADF_NBUF_TRAC_TCP_FLAGS_OFFSET));
+
+ info->src_ip = VOS_SWAP_U32((v_U32_t)(*(v_U32_t *)
+ (skb_data + ADF_NBUF_TRAC_IPV4_SRC_ADDR_OFFSET)));
+ info->dst_ip = VOS_SWAP_U32((v_U32_t)(*(v_U32_t *)
+ (skb_data + ADF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET)));
+ info->src_port = VOS_SWAP_U16((v_U16_t)(*(v_U16_t *)
+ (skb_data + ADF_NBUF_TRAC_TCP_SPORT_OFFSET)));
+ info->dst_port = VOS_SWAP_U16((v_U16_t)(*(v_U16_t *)
+ (skb_data + ADF_NBUF_TRAC_TCP_DPORT_OFFSET)));
+ info->stream_id = ol_tx_get_stream_id(info);
+
+ if ((flag == ADF_NBUF_TRAC_TCP_ACK_MASK) && (seg_len == 0)) {
+ info->type = TCP_PKT_ACK;
+ info->ack_number = (v_U32_t)(*(v_U32_t *)
+ (skb_data + ADF_NBUF_TRAC_TCP_ACK_OFFSET));
+ info->ack_number = VOS_SWAP_U32(info->ack_number);
+ } else {
+ info->type = TCP_PKT_NO_ACK;
+ }
+ }
+
+}
+
+/**
+ * ol_tx_hl_find_and_send_tcp_stream() - find and send tcp stream for passed
+ * stream info
+ * @vdev: vdev handle
+ * @info: packet info
+ *
+ * Return: none
+ */
+void ol_tx_hl_find_and_send_tcp_stream(struct ol_txrx_vdev_t *vdev,
+ struct packet_info *info)
+{
+ uint8_t no_of_entries;
+ struct tcp_stream_node *node_to_be_remove = NULL;
+
+ /* remove tcp node from hash */
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.node[info->stream_id].hash_node_lock);
+
+ no_of_entries = vdev->tcp_ack_hash.node[info->stream_id].no_of_entries;
+ if (no_of_entries > 1) {
+ /* collision case */
+ struct tcp_stream_node *head =
+ vdev->tcp_ack_hash.node[info->stream_id].head;
+ struct tcp_stream_node *temp;
+
+ if ((head->dst_ip == info->dst_ip) &&
+ (head->src_ip == info->src_ip) &&
+ (head->src_port == info->src_port) &&
+ (head->dst_port == info->dst_port)) {
+ node_to_be_remove = head;
+ vdev->tcp_ack_hash.node[info->stream_id].head = head->next;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries--;
+ } else {
+ temp = head;
+ while (temp->next) {
+ if ((temp->next->dst_ip == info->dst_ip) &&
+ (temp->next->src_ip == info->src_ip) &&
+ (temp->next->src_port == info->src_port) &&
+ (temp->next->dst_port == info->dst_port)) {
+ node_to_be_remove = temp->next;
+ temp->next = temp->next->next;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries--;
+ break;
+ }
+ temp = temp->next;
+ }
+ }
+ } else if (no_of_entries == 1) {
+ /* Only one tcp_node */
+ node_to_be_remove =
+ vdev->tcp_ack_hash.node[info->stream_id].head;
+ vdev->tcp_ack_hash.node[info->stream_id].head = NULL;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries = 0;
+ }
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.node[info->stream_id].hash_node_lock);
+
+ /* send packets */
+ if (node_to_be_remove) {
+ int tx_comp_req = vdev->pdev->cfg.default_tx_comp_req;
+ adf_nbuf_t msdu_list = NULL;
+
+ msdu_list = ol_tx_hl_base(vdev, ol_tx_spec_std,
+ node_to_be_remove->head, tx_comp_req, true);
+ if (msdu_list)
+ adf_nbuf_tx_free(msdu_list, 1/*error*/);
+ ol_txrx_vdev_free_tcp_node(vdev, node_to_be_remove);
+ }
+}
+
+static struct tcp_stream_node *
+ol_tx_hl_replace_tcp_ack(struct ol_txrx_vdev_t *vdev, adf_nbuf_t msdu,
+ struct packet_info *info, uint8_t *is_found,
+ uint8_t *start_timer)
+{
+ struct tcp_stream_node *node_to_be_remove = NULL;
+ struct tcp_stream_node *head =
+ vdev->tcp_ack_hash.node[info->stream_id].head;
+ struct tcp_stream_node *temp;
+
+ if ((head->dst_ip == info->dst_ip) &&
+ (head->src_ip == info->src_ip) &&
+ (head->src_port == info->src_port) &&
+ (head->dst_port == info->dst_port)) {
+
+ *is_found = 1;
+ if ((head->ack_number < info->ack_number) &&
+ (head->no_of_ack_replaced <
+ ol_cfg_get_del_ack_count_value(vdev->pdev->ctrl_pdev))) {
+ /* replace ack packet */
+ adf_nbuf_tx_free(head->head, 1);
+ head->head = msdu;
+ head->ack_number = info->ack_number;
+ head->no_of_ack_replaced++;
+ *start_timer = 1;
+ if (head->no_of_ack_replaced ==
+ ol_cfg_get_del_ack_count_value(vdev->pdev->ctrl_pdev)) {
+ node_to_be_remove = head;
+ vdev->tcp_ack_hash.node[info->stream_id].head = head->next;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries--;
+ }
+ } else {
+ /* append and send packets */
+ head->head->next = msdu;
+ node_to_be_remove = head;
+ vdev->tcp_ack_hash.node[info->stream_id].head = head->next;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries--;
+ }
+ } else {
+ temp = head;
+ while (temp->next) {
+ if ((temp->next->dst_ip == info->dst_ip) &&
+ (temp->next->src_ip == info->src_ip) &&
+ (temp->next->src_port == info->src_port) &&
+ (temp->next->dst_port == info->dst_port)) {
+
+ *is_found = 1;
+ if ((temp->next->ack_number <
+ info->ack_number) &&
+ (temp->next->no_of_ack_replaced <
+ ol_cfg_get_del_ack_count_value(vdev->pdev->ctrl_pdev))) {
+ /* replace ack packet */
+ adf_nbuf_tx_free(temp->next->head, 1);
+ temp->next->head = msdu;
+ temp->next->ack_number = info->ack_number;
+ temp->next->no_of_ack_replaced++;
+ *start_timer = 1;
+ if (temp->next->no_of_ack_replaced ==
+ ol_cfg_get_del_ack_count_value(vdev->pdev->ctrl_pdev)) {
+ node_to_be_remove = temp->next;
+ temp->next = temp->next->next;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries--;
+ }
+ } else {
+ /* append and send packets */
+ temp->next->head->next = msdu;
+ node_to_be_remove = temp->next;
+ temp->next = temp->next->next;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries--;
+ }
+ break;
+ }
+ temp = temp->next;
+ }
+ }
+ return node_to_be_remove;
+}
+
+/**
+ * ol_tx_hl_find_and_replace_tcp_ack() - find and replace tcp ack packet for
+ * passed packet info
+ * @vdev: vdev handle
+ * @msdu: packet
+ * @info: packet info
+ *
+ * Return: none
+ */
+void ol_tx_hl_find_and_replace_tcp_ack(struct ol_txrx_vdev_t *vdev,
+ adf_nbuf_t msdu,
+ struct packet_info *info)
+{
+ uint8_t no_of_entries;
+ struct tcp_stream_node *node_to_be_remove = NULL;
+ uint8_t is_found = 0, start_timer = 0;
+
+ /* replace ack if required or send packets */
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.node[info->stream_id].hash_node_lock);
+
+ no_of_entries = vdev->tcp_ack_hash.node[info->stream_id].no_of_entries;
+ if (no_of_entries > 0) {
+ node_to_be_remove = ol_tx_hl_replace_tcp_ack(vdev, msdu, info,
+ &is_found, &start_timer);
+ }
+
+ if (no_of_entries == 0 || is_found == 0) {
+ /* Alloc new tcp node */
+ struct tcp_stream_node *new_node;
+
+ new_node = ol_txrx_vdev_alloc_tcp_node(vdev);
+ if (!new_node) {
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.node[info->stream_id].hash_node_lock);
+ TXRX_PRINT(TXRX_PRINT_LEVEL_FATAL_ERR, "Malloc failed");
+ return;
+ }
+ new_node->stream_id = info->stream_id;
+ new_node->dst_ip = info->dst_ip;
+ new_node->src_ip = info->src_ip;
+ new_node->dst_port = info->dst_port;
+ new_node->src_port = info->src_port;
+ new_node->ack_number = info->ack_number;
+ new_node->head = msdu;
+ new_node->next = NULL;
+ new_node->no_of_ack_replaced = 0;
+
+ start_timer = 1;
+ /* insert new_node */
+ if (!vdev->tcp_ack_hash.node[info->stream_id].head) {
+ vdev->tcp_ack_hash.node[info->stream_id].head = new_node;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries = 1;
+ } else {
+ struct tcp_stream_node *temp =
+ vdev->tcp_ack_hash.node[info->stream_id].head;
+ while (temp->next) {
+ temp = temp->next;
+ }
+ temp->next = new_node;
+ vdev->tcp_ack_hash.node[info->stream_id].no_of_entries++;
+ }
+ }
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.node[info->stream_id].hash_node_lock);
+
+ /* start timer */
+ if (start_timer &&
+ (!adf_os_atomic_read(&vdev->tcp_ack_hash.is_timer_running))) {
+ adf_os_hrtimer_start(&vdev->tcp_ack_hash.timer,
+ (ol_cfg_get_del_ack_timer_value(vdev->pdev->ctrl_pdev)*1000000));
+ adf_os_atomic_set(&vdev->tcp_ack_hash.is_timer_running, 1);
+ }
+
+ /* send packets */
+ if (node_to_be_remove) {
+ int tx_comp_req = vdev->pdev->cfg.default_tx_comp_req;
+ adf_nbuf_t msdu_list = NULL;
+
+ msdu_list = ol_tx_hl_base(vdev, ol_tx_spec_std,
+ node_to_be_remove->head, tx_comp_req, true);
+ if (msdu_list)
+ adf_nbuf_tx_free(msdu_list, 1/*error*/);
+ ol_txrx_vdev_free_tcp_node(vdev, node_to_be_remove);
+ }
+}
+
+/**
+ * ol_tx_hl_vdev_tcp_del_ack_timer() - delayed ack timer function
+ * @timer: timer handle
+ *
+ * Return: enum
+ */
+adf_os_enum_hrtimer_t
+ol_tx_hl_vdev_tcp_del_ack_timer(adf_os_hrtimer_t *timer)
+{
+ struct ol_txrx_vdev_t *vdev = container_of(timer, struct ol_txrx_vdev_t,
+ tcp_ack_hash.timer);
+
+ adf_os_enum_hrtimer_t ret = ADF_OS_HRTIMER_NORESTART;
+ adf_os_sched_bh(vdev->pdev->osdev, &vdev->tcp_ack_hash.tcp_del_ack_tq);
+ adf_os_atomic_set(&vdev->tcp_ack_hash.is_timer_running, 0);
+ return ret;
+}
+
+/**
+ * ol_tx_hl_del_ack_queue_flush_all() - drop all queued packets
+ * @vdev: vdev handle
+ *
+ * Return: none
+ */
+void ol_tx_hl_del_ack_queue_flush_all(struct ol_txrx_vdev_t *vdev)
+{
+ int i = 0;
+ struct tcp_stream_node *tcp_node_list = NULL;
+ struct tcp_stream_node *temp = NULL;
+
+ adf_os_hrtimer_cancel(&vdev->tcp_ack_hash.timer);
+ for (i = 0; i < OL_TX_HL_DEL_ACK_HASH_SIZE; i++) {
+ tcp_node_list = NULL;
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.node[i].hash_node_lock);
+
+ if (vdev->tcp_ack_hash.node[i].no_of_entries)
+ tcp_node_list = vdev->tcp_ack_hash.node[i].head;
+
+ vdev->tcp_ack_hash.node[i].no_of_entries = 0;
+ vdev->tcp_ack_hash.node[i].head = NULL;
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.node[i].hash_node_lock);
+
+ /* free all packets */
+ while (tcp_node_list) {
+ temp = tcp_node_list;
+ tcp_node_list = temp->next;
+
+ adf_nbuf_tx_free(temp->head, 1/*error*/);
+ ol_txrx_vdev_free_tcp_node(vdev, temp);
+ }
+ }
+ ol_txrx_vdev_deinit_tcp_del_ack(vdev);
+}
+#endif
+
#ifdef QCA_SUPPORT_TXRX_HL_BUNDLE
/**
* ol_tx_pdev_reset_bundle_require() - reset bundle require flag
@@ -1025,6 +2118,48 @@
*
* Return: NULL for success/drop msdu list
*/
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+adf_nbuf_t
+ol_tx_hl_queue(struct ol_txrx_vdev_t *vdev, adf_nbuf_t msdu_list)
+{
+ struct ol_txrx_pdev_t *pdev = vdev->pdev;
+ int tx_comp_req = pdev->cfg.default_tx_comp_req;
+ struct packet_info pkt_info;
+
+ /* TCP ACK packet*/
+ if (ol_cfg_get_del_ack_enable_value(vdev->pdev->ctrl_pdev) &&
+ vdev->driver_del_ack_enabled) {
+
+ ol_tx_get_packet_info(msdu_list, &pkt_info);
+ if (pkt_info.type == TCP_PKT_ACK) {
+ ol_tx_hl_find_and_replace_tcp_ack(vdev, msdu_list, &pkt_info);
+ return NULL;
+ }
+ } else {
+ if (adf_os_atomic_read(&vdev->tcp_ack_hash.tcp_node_in_use_count))
+ ol_tx_hl_send_all_tcp_ack(vdev);
+ }
+
+ if (vdev->bundling_reqired == true &&
+ (ol_cfg_get_bundle_size(vdev->pdev->ctrl_pdev) > 1)) {
+ ol_tx_hl_vdev_queue_append(vdev, msdu_list);
+ if (pdev->total_bundle_queue_length >=
+ ol_cfg_get_bundle_size(vdev->pdev->ctrl_pdev)) {
+ return ol_tx_hl_pdev_queue_send_all(pdev);
+ }
+ } else {
+ if (vdev->bundle_queue.txq.depth != 0) {
+ ol_tx_hl_vdev_queue_append(vdev, msdu_list);
+ return ol_tx_hl_vdev_queue_send_all(vdev, true);
+ } else {
+ return ol_tx_hl_base(vdev, ol_tx_spec_std, msdu_list,
+ tx_comp_req, true);
+ }
+ }
+
+ return NULL; /* all msdus were accepted */
+}
+#else
adf_nbuf_t
ol_tx_hl_queue(struct ol_txrx_vdev_t* vdev, adf_nbuf_t msdu_list)
{
@@ -1050,17 +2185,57 @@
return NULL; /* all msdus were accepted */
}
+#endif
#endif
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
adf_nbuf_t
ol_tx_hl(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list)
{
- struct ol_txrx_pdev_t *pdev = vdev->pdev;
- int tx_comp_req = pdev->cfg.default_tx_comp_req;
+ struct ol_txrx_pdev_t *pdev = vdev->pdev;
+ int tx_comp_req = pdev->cfg.default_tx_comp_req;
+ struct packet_info pkt_info;
+ adf_nbuf_t temp;
- return ol_tx_hl_base(vdev, ol_tx_spec_std, msdu_list, tx_comp_req, true);
+ /* check Enable through ini */
+ if (!ol_cfg_get_del_ack_enable_value(vdev->pdev->ctrl_pdev)
+ || (!vdev->driver_del_ack_enabled)) {
+
+ if (adf_os_atomic_read(&vdev->tcp_ack_hash.tcp_node_in_use_count))
+ ol_tx_hl_send_all_tcp_ack(vdev);
+
+ return ol_tx_hl_base(vdev, ol_tx_spec_std, msdu_list,
+ tx_comp_req, true);
+ }
+
+ ol_tx_get_packet_info(msdu_list, &pkt_info);
+
+ if (pkt_info.type == TCP_PKT_NO_ACK) {
+ ol_tx_hl_find_and_send_tcp_stream(vdev, &pkt_info);
+ temp = ol_tx_hl_base(vdev, ol_tx_spec_std, msdu_list,
+ tx_comp_req, true);
+ return temp;
+ } else if (pkt_info.type == TCP_PKT_ACK) {
+ ol_tx_hl_find_and_replace_tcp_ack(vdev, msdu_list, &pkt_info);
+ return NULL;
+ } else {
+ temp = ol_tx_hl_base(vdev, ol_tx_spec_std, msdu_list,
+ tx_comp_req, true);
+ return temp;
+ }
}
+#else
+adf_nbuf_t
+ol_tx_hl(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list)
+{
+ struct ol_txrx_pdev_t *pdev = vdev->pdev;
+ int tx_comp_req = pdev->cfg.default_tx_comp_req;
+
+ return ol_tx_hl_base(vdev, ol_tx_spec_std, msdu_list,
+ tx_comp_req, true);
+}
+#endif
adf_nbuf_t
ol_tx_non_std_hl(
@@ -1284,3 +2459,35 @@
return NULL;
}
+
+#ifdef MAC_NOTIFICATION_FEATURE
+/**
+ * ol_tx_failure_cb_set() - add TX failure callback
+ * @pdev: PDEV TXRX handle
+ * @tx_failure_cb: TX failure callback
+ */
+void
+ol_tx_failure_cb_set(struct ol_txrx_pdev_t *pdev,
+ void (*tx_failure_cb)(void *ctx,
+ unsigned int num_msdu,
+ unsigned char tid,
+ unsigned int status))
+{
+ pdev->tx_failure_cb = tx_failure_cb;
+}
+
+/**
+ * ol_tx_failure_indication() - indicate TX failure to user layer
+ * @pdev: Pdev TXRX handle
+ * @tid: TID
+ * @msdu_num: number of MSDUs with the same failure status
+ * @status: failure status
+ */
+void
+ol_tx_failure_indication(struct ol_txrx_pdev_t *pdev, uint8_t tid,
+ uint32_t msdu_num, uint32_t status)
+{
+ if (pdev->tx_failure_cb && (status != htt_tx_status_ok))
+ pdev->tx_failure_cb(pdev, msdu_num, tid, status);
+}
+#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.h
index 4b0280c..986efea 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014,2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014,2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -37,16 +37,98 @@
#include <ol_txrx_api.h> /* ol_txrx_vdev_handle */
#include <ol_txrx_types.h> /* ol_tx_desc_t, ol_txrx_msdu_info_t */
+/**
+ * struct ol_tx_per_pkt_stats - tx stats info of each packet sent out
+ * @seq_no: sequential number
+ * @chan_freq: channel freqency that this packet used
+ * @bandwidth: channel bandwidth
+ * @datarate: data rate
+ * @tx_power: tx power
+ * @mac_address: source MAC address that this packet used
+ */
+struct ol_tx_per_pkt_stats {
+ uint32_t seq_no;
+ uint32_t chan_freq;
+ uint32_t bandwidth;
+ uint8_t datarate;
+ uint8_t tx_power;
+ uint8_t mac_address[6];
+};
+
+#ifdef WLAN_FEATURE_DSRC
+void
+ol_per_pkt_tx_stats_enable(bool enable);
+
+bool
+ol_per_pkt_tx_stats_enabled(void);
+
+void
+ol_tx_stats_ring_enque_host(uint32_t msdu_id, uint32_t chan_freq,
+ uint32_t bandwidth, uint8_t *mac_address,
+ uint8_t datarate);
+
+void
+ol_tx_stats_ring_enque_comp(uint32_t msdu_id, uint32_t tx_power);
+
+int
+ol_tx_stats_ring_deque(struct ol_tx_per_pkt_stats *stats);
+#else
+static inline void
+ol_per_pkt_tx_stats_enable(bool enable)
+{
+}
+
+static inline bool
+ol_per_pkt_tx_stats_enabled(void)
+{
+ return false;
+}
+
+static inline void
+ol_tx_stats_ring_enque_host(uint32_t msdu_id, uint32_t chan_freq,
+ uint32_t bandwidth, uint8_t *mac_address,
+ uint8_t datarate)
+{
+}
+
+static inline void
+ol_tx_stats_ring_enque_comp(uint32_t msdu_id, uint32_t tx_power)
+{
+}
+
+static inline int
+ol_tx_stats_ring_deque(struct ol_tx_per_pkt_stats *stats)
+{
+ return 0;
+}
+#endif /* WLAN_FEATURE_DSRC */
+
adf_nbuf_t
ol_tx_ll(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list);
adf_nbuf_t
ol_tx_ll_queue(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list);
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+adf_os_enum_hrtimer_t
+ol_tx_hl_vdev_tcp_del_ack_timer(adf_os_hrtimer_t *timer);
+
+void tcp_del_ack_tasklet(unsigned long data);
+
+void ol_tx_hl_del_ack_queue_flush_all(struct ol_txrx_vdev_t *vdev);
+#else
+static inline
+void ol_tx_hl_del_ack_queue_flush_all(struct ol_txrx_vdev_t *vdev)
+{
+ return;
+}
+#endif
+
#ifdef QCA_SUPPORT_TXRX_HL_BUNDLE
void
ol_tx_hl_vdev_bundle_timer(void *vdev);
+
void
ol_tx_hl_queue_flush_all(struct ol_txrx_vdev_t* vdev);
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_classify.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_classify.c
index a67082d..bb769c8 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_classify.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_classify.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -366,7 +366,7 @@
peer = ol_txrx_assoc_peer_find(vdev);
if (!peer) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
- "Error: STA %p (%02x:%02x:%02x:%02x:%02x:%02x) "
+ "Error: STA %pK (%02x:%02x:%02x:%02x:%02x:%02x) "
"trying to send bcast DA tx data frame "
"w/o association\n",
vdev,
@@ -376,7 +376,7 @@
return NULL; /* error */
} else if ((peer->security[OL_TXRX_PEER_SECURITY_MULTICAST].sec_type
!= htt_sec_type_wapi) &&
- (A_STATUS_OK == adf_nbuf_is_dhcp_pkt(tx_nbuf))) {
+ adf_nbuf_is_dhcp_pkt(tx_nbuf)) {
/* DHCP frame to go with voice priority */
txq = &peer->txqs[TX_DHCP_TID];
tx_msdu_info->htt.info.ext_tid = TX_DHCP_TID;
@@ -400,7 +400,7 @@
peer = ol_txrx_peer_find_hash_find(pdev, vdev->mac_addr.raw, 0, 1);
if (!peer) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
- "Error: vdev %p (%02x:%02x:%02x:%02x:%02x:%02x) "
+ "Error: vdev %pK (%02x:%02x:%02x:%02x:%02x:%02x) "
"trying to send bcast/mcast, but no self-peer found\n",
vdev,
vdev->mac_addr.raw[0], vdev->mac_addr.raw[1],
@@ -489,7 +489,7 @@
* to send it to.
*/
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "Error: vdev %p (%02x:%02x:%02x:%02x:%02x:%02x) "
+ "Error: vdev %pK (%02x:%02x:%02x:%02x:%02x:%02x) "
"trying to send unicast tx data frame to an unknown peer\n",
vdev,
vdev->mac_addr.raw[0], vdev->mac_addr.raw[1],
@@ -503,7 +503,7 @@
tid = OL_TX_NON_QOS_TID;
} else if ((peer->security[OL_TXRX_PEER_SECURITY_UNICAST].sec_type
!= htt_sec_type_wapi) &&
- (A_STATUS_OK == adf_nbuf_is_dhcp_pkt(tx_nbuf))) {
+ adf_nbuf_is_dhcp_pkt(tx_nbuf)) {
/* DHCP frame to go with voice priority */
tid = TX_DHCP_TID;
}
@@ -532,7 +532,7 @@
if (tx_msdu_info->htt.info.peer_id == HTT_INVALID_PEER_ID) {
if (peer) {
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "%s: remove the peer for invalid peer_id %p\n",
+ "%s: remove the peer for invalid peer_id %pK\n",
__func__, peer);
/* remove the peer reference added above */
ol_txrx_peer_unref_delete(peer);
@@ -556,7 +556,7 @@
tx_msdu_info->peer != NULL) {
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s: remove the peer reference %p\n", __func__, peer);
+ "%s: remove the peer reference %pK\n", __func__, peer);
/* remove the peer reference added above */
ol_txrx_peer_unref_delete(tx_msdu_info->peer);
/* Making peer NULL in case if multicast non STA mode */
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.c
index 793ef8b..1689ac3 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -72,7 +72,7 @@
#endif
) {
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "%s Potential tx_desc corruption pkt_type:0x%x pdev:0x%p",
+ "%s Potential tx_desc corruption pkt_type:0x%x pdev:0x%pK",
__func__, tx_desc->pkt_type, pdev);
#ifdef QCA_COMPUTE_TX_DELAY
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "%s Timestamp:0x%x\n",
@@ -111,6 +111,30 @@
return tx_desc;
}
+#ifdef WLAN_FEATURE_DSRC
+static inline void
+__ol_tx_desc_free(struct ol_txrx_pdev_t *pdev, struct ol_tx_desc_t *tx_desc)
+{
+ ((union ol_tx_desc_list_elem_t *)tx_desc)->next = NULL;
+ if (pdev->tx_desc.freelist) {
+ pdev->tx_desc.last->next =
+ (union ol_tx_desc_list_elem_t *)tx_desc;
+ } else {
+ pdev->tx_desc.freelist =
+ (union ol_tx_desc_list_elem_t *)tx_desc;
+ }
+ pdev->tx_desc.last = (union ol_tx_desc_list_elem_t *)tx_desc;
+}
+#else
+static inline void
+__ol_tx_desc_free(struct ol_txrx_pdev_t *pdev, struct ol_tx_desc_t *tx_desc)
+{
+ ((union ol_tx_desc_list_elem_t *)tx_desc)->next =
+ pdev->tx_desc.freelist;
+ pdev->tx_desc.freelist = (union ol_tx_desc_list_elem_t *)tx_desc;
+}
+#endif /* WLAN_FEATURE_DSRC */
+
void
ol_tx_desc_free(struct ol_txrx_pdev_t *pdev, struct ol_tx_desc_t *tx_desc)
{
@@ -121,9 +145,8 @@
tx_desc->entry_timestamp_ticks = 0xffffffff;
#endif
#endif
- ((union ol_tx_desc_list_elem_t *)tx_desc)->next =
- pdev->tx_desc.freelist;
- pdev->tx_desc.freelist = (union ol_tx_desc_list_elem_t *) tx_desc;
+
+ __ol_tx_desc_free(pdev, tx_desc);
pdev->tx_desc.num_free++;
#if defined(CONFIG_PER_VDEV_TX_DESC_POOL)
@@ -141,7 +164,7 @@
adf_os_atomic_dec(&tx_desc->vdev->tx_desc_count);
} else {
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO2,
- "%s warning: the vdev is referred by tx_desc (%p) "
+ "%s warning: the vdev is referred by tx_desc (%pK) "
"has been detached.\n",
__func__, tx_desc);
}
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.h
index 4725946..7a6f055 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_desc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -119,6 +119,9 @@
{
struct ol_tx_desc_t *tx_desc;
+ if (tx_desc_id >= pdev->tx_desc.pool_size)
+ return NULL;
+
tx_desc = ol_tx_desc_find(pdev, tx_desc_id);
if (tx_desc->pkt_type == ol_tx_frm_freed) {
@@ -133,7 +136,18 @@
static inline struct ol_tx_desc_t *
ol_tx_desc_find_check(struct ol_txrx_pdev_t *pdev, u_int16_t tx_desc_id)
{
- return ol_tx_desc_find(pdev, tx_desc_id);
+ struct ol_tx_desc_t *tx_desc;
+
+ if (tx_desc_id >= pdev->tx_desc.pool_size)
+ return NULL;
+
+ tx_desc = ol_tx_desc_find(pdev, tx_desc_id);
+
+ /* check against invalid tx_desc_id */
+ if (ol_cfg_is_high_latency(pdev->ctrl_pdev) && !tx_desc->vdev)
+ return NULL;
+
+ return tx_desc;
}
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_queue.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
index b54fa26..571295f 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_queue.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -110,6 +110,9 @@
/* flush bundling queue */
ol_tx_hl_queue_flush_all(vdev);
+ /* flush del_ack queue */
+ ol_tx_hl_del_ack_queue_flush_all(vdev);
+
/* flush VDEV TX queues */
for (i = 0; i < OL_TX_VDEV_NUM_QUEUES; i++) {
txq = &vdev->txqs[i];
@@ -154,7 +157,7 @@
}
}
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "%s: Delete Peer %p\n", __func__, peer);
+ "%s: Delete Peer %pK\n", __func__, peer);
ol_txrx_peer_unref_delete(peers[i]);
}
} while (peer_count >= PEER_ARRAY_COUNT);
@@ -291,9 +294,15 @@
u_int16_t num_frames;
int bytes_sum;
unsigned credit_sum;
+ u_int16_t temp_frms;
+ u_int32_t temp_bytes;
+ bool flush_all = false;
+ struct ol_tx_desc_t *tx_flush_desc;
TXRX_ASSERT2(txq->flag != ol_tx_queue_paused);
TX_SCHED_DEBUG_PRINT("Enter %s\n", __func__);
+ temp_frms = txq->frms;
+ temp_bytes = txq->bytes;
if (txq->frms < max_frames) {
max_frames = txq->frms;
@@ -304,6 +313,13 @@
unsigned frame_credit;
struct ol_tx_desc_t *tx_desc;
tx_desc = TAILQ_FIRST(&txq->head);
+ if(!tx_desc) {
+ flush_all = true;
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: flush frames: num_frames = %d, max_frames = %d\n",
+ __func__, num_frames, max_frames);
+ break;
+ }
frame_credit = htt_tx_msdu_credit(tx_desc->netbuf);
if (credit_sum + frame_credit > *credit) {
@@ -323,8 +339,22 @@
OL_TX_QUEUE_LOG_DEQUEUE(pdev, txq, num_frames, bytes_sum);
TX_SCHED_DEBUG_PRINT("Leave %s\n", __func__);
- *bytes = bytes_sum;
- *credit = credit_sum;
+ if (flush_all && bytes_sum) {
+ *bytes = temp_bytes;
+ *credit = 0;
+ txq->frms = 0;
+ txq->bytes = 0;
+ while (num_frames) {
+ tx_flush_desc = TAILQ_FIRST(head);
+ TAILQ_REMOVE(head, tx_flush_desc, tx_desc_list_elem);
+ ol_tx_desc_frame_free_nonstd(pdev, tx_flush_desc, 0);
+ num_frames--;
+ }
+
+ } else {
+ *bytes = bytes_sum;
+ *credit = credit_sum;
+ }
return num_frames;
}
@@ -1136,7 +1166,7 @@
adf_nbuf_set_next(vdev->ll_pause.txq.head, NULL);
adf_nbuf_unmap(vdev->pdev->osdev, vdev->ll_pause.txq.head,
ADF_OS_DMA_TO_DEVICE);
- adf_nbuf_tx_free(vdev->ll_pause.txq.head, 1 /* error */);
+ adf_nbuf_tx_free(vdev->ll_pause.txq.head, ADF_NBUF_PKT_ERROR);
vdev->ll_pause.txq.head = next;
}
vdev->ll_pause.txq.tail = NULL;
@@ -1161,8 +1191,6 @@
int ms = 0;
throttle_level cur_level;
throttle_phase cur_phase;
- extern uint8_t thermal_band;
- int (*throttle_time_ms)[THROTTLE_PHASE_MAX];
/* update the phase */
pdev->tx_throttle.current_throttle_phase++;
@@ -1171,11 +1199,6 @@
pdev->tx_throttle.current_throttle_phase = THROTTLE_PHASE_OFF;
}
- if (thermal_band == 2)
- throttle_time_ms = pdev->tx_throttle.throttle_time_ms_2g;
- else
- throttle_time_ms = pdev->tx_throttle.throttle_time_ms_5g;
-
if (pdev->tx_throttle.current_throttle_phase == THROTTLE_PHASE_OFF) {
if (ol_tx_pdev_is_target_empty(/*pdev*/)) {
TXRX_PRINT(TXRX_PRINT_LEVEL_WARN, "throttle phase --> OFF\n");
@@ -1185,11 +1208,11 @@
cur_level = pdev->tx_throttle.current_throttle_level;
cur_phase = pdev->tx_throttle.current_throttle_phase;
- ms = throttle_time_ms[cur_level][cur_phase];
+ ms = pdev->tx_throttle.throttle_time_ms[cur_level][cur_phase];
if (pdev->tx_throttle.current_throttle_level !=
THROTTLE_LEVEL_0) {
TXRX_PRINT(TXRX_PRINT_LEVEL_WARN, "start timer %d ms\n", ms);
- adf_os_timer_start(&pdev->tx_throttle.phase_timer, ms);
+ adf_os_timer_mod(&pdev->tx_throttle.phase_timer, ms);
}
}
}
@@ -1206,10 +1229,10 @@
cur_level = pdev->tx_throttle.current_throttle_level;
cur_phase = pdev->tx_throttle.current_throttle_phase;
- ms = throttle_time_ms[cur_level][cur_phase];
+ ms = pdev->tx_throttle.throttle_time_ms[cur_level][cur_phase];
if (pdev->tx_throttle.current_throttle_level != THROTTLE_LEVEL_0) {
TXRX_PRINT(TXRX_PRINT_LEVEL_WARN, "start timer %d ms\n", ms);
- adf_os_timer_start(&pdev->tx_throttle.phase_timer, ms);
+ adf_os_timer_mod(&pdev->tx_throttle.phase_timer, ms);
}
}
}
@@ -1225,8 +1248,6 @@
void ol_tx_throttle_set_level(struct ol_txrx_pdev_t *pdev, int level)
{
int ms = 0;
- extern uint8_t thermal_band;
- int (*throttle_time_ms)[THROTTLE_PHASE_MAX];
if (level >= THROTTLE_LEVEL_MAX) {
TXRX_PRINT(TXRX_PRINT_LEVEL_WARN,
@@ -1240,15 +1261,6 @@
/* Set the current throttle level */
pdev->tx_throttle.current_throttle_level = (throttle_level)level;
- if (thermal_band == 2)
- throttle_time_ms = pdev->tx_throttle.throttle_time_ms_2g;
- else
- throttle_time_ms = pdev->tx_throttle.throttle_time_ms_5g;
-
- VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "thermal band %d time %d",
- thermal_band, throttle_time_ms[level][THROTTLE_PHASE_OFF]);
-
if (pdev->cfg.is_high_latency) {
adf_os_timer_cancel(&pdev->tx_throttle.phase_timer);
@@ -1256,13 +1268,13 @@
/* Set the phase */
if (level != THROTTLE_LEVEL_0) {
pdev->tx_throttle.current_throttle_phase = THROTTLE_PHASE_OFF;
- ms = throttle_time_ms[level][THROTTLE_PHASE_OFF];
+ ms = pdev->tx_throttle.throttle_time_ms[level][THROTTLE_PHASE_OFF];
/* pause all */
ol_txrx_throttle_pause(pdev);
- adf_os_timer_start(&pdev->tx_throttle.phase_timer, ms);
+ adf_os_timer_mod(&pdev->tx_throttle.phase_timer, ms);
} else {
pdev->tx_throttle.current_throttle_phase = THROTTLE_PHASE_ON;
- ms = throttle_time_ms[level][THROTTLE_PHASE_ON];
+ ms = pdev->tx_throttle.throttle_time_ms[level][THROTTLE_PHASE_ON];
/* unpause all */
ol_txrx_throttle_unpause(pdev);
}
@@ -1271,15 +1283,15 @@
pdev->tx_throttle.current_throttle_phase = THROTTLE_PHASE_OFF;
/* Start with the new time */
- ms = throttle_time_ms[level][THROTTLE_PHASE_OFF];
+ ms = pdev->tx_throttle.throttle_time_ms[level][THROTTLE_PHASE_OFF];
adf_os_timer_cancel(&pdev->tx_throttle.phase_timer);
- adf_os_timer_start(&pdev->tx_throttle.phase_timer, ms);
+ adf_os_timer_mod(&pdev->tx_throttle.phase_timer, ms);
}
}
void ol_tx_throttle_init_period(struct ol_txrx_pdev_t *pdev, int period,
- u_int8_t *dutycycle_level_2g, u_int8_t *dutycycle_level_5g)
+ u_int8_t *dutycycle_level)
{
int i;
@@ -1288,26 +1300,16 @@
TXRX_PRINT(TXRX_PRINT_LEVEL_WARN, "level OFF ON\n");
for (i = 0; i < THROTTLE_LEVEL_MAX; i++) {
- pdev->tx_throttle.throttle_time_ms_2g[i][THROTTLE_PHASE_ON] =
+ pdev->tx_throttle.throttle_time_ms[i][THROTTLE_PHASE_ON] =
pdev->tx_throttle.throttle_period_ms -
- ((dutycycle_level_2g[i] * pdev->tx_throttle.throttle_period_ms)
+ ((dutycycle_level[i] * pdev->tx_throttle.throttle_period_ms)
/100);
- pdev->tx_throttle.throttle_time_ms_5g[i][THROTTLE_PHASE_ON] =
+ pdev->tx_throttle.throttle_time_ms[i][THROTTLE_PHASE_OFF] =
pdev->tx_throttle.throttle_period_ms -
- ((dutycycle_level_5g[i] * pdev->tx_throttle.throttle_period_ms)
- /100);
- pdev->tx_throttle.throttle_time_ms_2g[i][THROTTLE_PHASE_OFF] =
- pdev->tx_throttle.throttle_period_ms -
- pdev->tx_throttle.throttle_time_ms_2g[i][THROTTLE_PHASE_ON];
- pdev->tx_throttle.throttle_time_ms_5g[i][THROTTLE_PHASE_OFF] =
- pdev->tx_throttle.throttle_period_ms -
- pdev->tx_throttle.throttle_time_ms_5g[i][THROTTLE_PHASE_ON];
- VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "%d 2g %d %d 5g %d %d\n", i,
- pdev->tx_throttle.throttle_time_ms_2g[i][THROTTLE_PHASE_OFF],
- pdev->tx_throttle.throttle_time_ms_2g[i][THROTTLE_PHASE_ON],
- pdev->tx_throttle.throttle_time_ms_5g[i][THROTTLE_PHASE_OFF],
- pdev->tx_throttle.throttle_time_ms_5g[i][THROTTLE_PHASE_ON]);
+ pdev->tx_throttle.throttle_time_ms[i][THROTTLE_PHASE_ON];
+ TXRX_PRINT(TXRX_PRINT_LEVEL_WARN, "%d %d %d\n", i,
+ pdev->tx_throttle.throttle_time_ms[i][THROTTLE_PHASE_OFF],
+ pdev->tx_throttle.throttle_time_ms[i][THROTTLE_PHASE_ON]);
}
}
@@ -1327,8 +1329,7 @@
dutycycle_level[i] = ol_cfg_throttle_duty_cycle_level(pdev->ctrl_pdev,
i);
- ol_tx_throttle_init_period(pdev, throttle_period,
- &dutycycle_level[0], &dutycycle_level[0]);
+ ol_tx_throttle_init_period(pdev, throttle_period, &dutycycle_level[0]);
adf_os_timer_init(
pdev->osdev,
@@ -1381,7 +1382,7 @@
struct ol_tx_log_queue_state_var_sz_t *record;
align_pad =
- (*align - ((((u_int32_t) type) + 1))) & (*align - 1);
+ (*align - (uint32_t)(((unsigned long) type) + 1)) & (*align - 1);
record = (struct ol_tx_log_queue_state_var_sz_t *)
(type + 1 + align_pad);
*size += record->num_cats_active *
@@ -1686,6 +1687,9 @@
* don't bother.
*/
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
+ "Current target credit: %d",
+ adf_os_atomic_read(&pdev->target_tx_credit));
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
"Tx queue log:");
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
" : Frames Bytes TID PEER");
@@ -1853,7 +1857,7 @@
state = (txq->flag == ol_tx_queue_active) ? "active" : "paused";
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*stxq %p (%s): %d frms, %d bytes\n",
+ "%*stxq %pK (%s): %d frms, %d bytes\n",
indent, " ", txq, state, txq->frms, txq->bytes);
}
@@ -1863,7 +1867,7 @@
struct ol_txrx_vdev_t *vdev;
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "pdev %p tx queues:\n", pdev);
+ "pdev %pK tx queues:\n", pdev);
TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
struct ol_txrx_peer_t *peer;
int i;
@@ -1872,7 +1876,7 @@
continue;
}
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- " vdev %d (%p), txq %d\n", vdev->vdev_id, vdev, i);
+ " vdev %d (%pK), txq %d\n", vdev->vdev_id, vdev, i);
ol_tx_queue_display(&vdev->txqs[i], 4);
}
TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
@@ -1881,7 +1885,7 @@
continue;
}
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- " peer %d (%p), txq %d\n",
+ " peer %d (%pK), txq %d\n",
peer->peer_ids[0], vdev, i);
ol_tx_queue_display(&peer->txqs[i], 6);
}
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c
index d19266e..dd5cff4 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -392,6 +392,20 @@
adf_os_atomic_add(credit_delta, &pdev->target_tx_credit);
}
+int
+ol_tx_target_credit_dec(struct ol_txrx_pdev_t *pdev, int credit)
+{
+ adf_os_spin_lock_bh(&pdev->tx_queue_spinlock);
+ if(adf_os_atomic_read(&pdev->target_tx_credit) < credit) {
+ /* Lack of tx credits, return */
+ adf_os_spin_unlock_bh(&pdev->tx_queue_spinlock);
+ return A_ERROR;
+ }
+ ol_tx_target_credit_update(pdev, -credit);
+ adf_os_spin_unlock_bh(&pdev->tx_queue_spinlock);
+ return A_OK;
+}
+
#ifdef QCA_COMPUTE_TX_DELAY
static void
@@ -534,6 +548,121 @@
OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev);
}
+static inline int
+ol_tx_get_retries_size(u_int32_t *msg_word, int num_msdus)
+{
+ struct htt_tx_compl_ind_append_retries *list = NULL;
+ int offset;
+ int i = 0;
+
+ if (!HTT_TX_COMPL_IND_APPEND_GET(*msg_word))
+ return 0;
+
+ /* offset in 32 bits word */
+ offset = 1 + ((num_msdus + 1) >> 1);
+ list = (struct htt_tx_compl_ind_append_retries *)(msg_word + offset);
+ while (list[i].flag && (i < num_msdus)) {
+ i++;
+ }
+
+ return (i * sizeof(struct htt_tx_compl_ind_append_retries)) >> 2;
+}
+
+static inline int
+ol_tx_get_txtstamps_size(u_int32_t *msg_word, int num_msdus)
+{
+ if (!HTT_TX_COMPL_IND_APPEND1_GET(*msg_word))
+ return 0;
+
+ return (num_msdus * sizeof(struct htt_tx_compl_ind_append_txtstamp))
+ >> 2;
+}
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+static inline struct htt_tx_compl_ind_append_txtstamp *
+ol_tx_get_txtstamps(u_int32_t *msg_word, int num_msdus)
+{
+ u_int32_t has_tx_tsf;
+ struct htt_tx_compl_ind_append_txtstamp *txtstamp_list = NULL;
+ int offset_dwords;
+
+ has_tx_tsf = HTT_TX_COMPL_IND_APPEND1_GET(*msg_word);
+ if (num_msdus <= 0 || !has_tx_tsf)
+ return NULL;
+
+ offset_dwords = 1 + ((num_msdus + 1) >> 1);
+ offset_dwords += ol_tx_get_retries_size(msg_word, num_msdus);
+ txtstamp_list = (struct htt_tx_compl_ind_append_txtstamp *)
+ (msg_word + offset_dwords);
+
+ return txtstamp_list;
+}
+
+static inline void
+ol_tx_timestamp(ol_txrx_pdev_handle pdev, adf_nbuf_t netbuf, u_int64_t ts)
+{
+ if (!netbuf)
+ return;
+
+ if (pdev->ol_tx_timestamp_cb)
+ pdev->ol_tx_timestamp_cb(netbuf, ts);
+}
+#else
+static inline struct htt_tx_compl_ind_append_txtstamp *
+ol_tx_get_txtstamps(u_int32_t *msg_word, int num_msdus)
+{
+ return NULL;
+}
+
+static inline void
+ol_tx_timestamp(ol_txrx_pdev_handle pdev, adf_nbuf_t netbuf, u_int64_t ts)
+{
+}
+#endif /* WLAN_FEATURE_TSF_PLUS */
+
+#ifdef WLAN_FEATURE_DSRC
+#define DSRC_INVALID_TX_POWER 0xffff
+
+static inline struct htt_tx_compl_ind_append_txpower *
+ol_tx_get_txpowers(u_int32_t *msg_word, int num_msdus)
+{
+ struct htt_tx_compl_ind_append_txpower *txpower_list = NULL;
+ int offset_dwords;
+
+ /* Check if tx power exists. */
+ if (!HTT_TX_COMPL_IND_APPEND2_GET(*msg_word))
+ return NULL;
+
+ offset_dwords = 1 + ((num_msdus + 1) >> 1);
+ offset_dwords += ol_tx_get_retries_size(msg_word, num_msdus);
+ offset_dwords += ol_tx_get_txtstamps_size(msg_word, num_msdus);
+ txpower_list = (struct htt_tx_compl_ind_append_txpower *)
+ (msg_word + offset_dwords);
+
+ return txpower_list;
+}
+
+static inline void
+ol_tx_power_handler(u_int16_t desc_id, u_int16_t tx_power)
+{
+ if (DSRC_INVALID_TX_POWER == tx_power)
+ return;
+
+ ol_tx_stats_ring_enque_comp(desc_id, tx_power);
+}
+#else
+static inline struct htt_tx_compl_ind_append_txpower *
+ol_tx_get_txpowers(u_int32_t *msg_word, int num_msdus)
+{
+ return NULL;
+}
+
+static inline void
+ol_tx_power_handler(u_int16_t desc_id, u_int16_t tx_power)
+{
+}
+#endif /* WLAN_FEATURE_DSRC */
+
/* WARNING: ol_tx_inspect_handler()'s bahavior is similar to that of ol_tx_completion_handler().
* any change in ol_tx_completion_handler() must be mirrored in ol_tx_inspect_handler().
*/
@@ -542,10 +671,9 @@
ol_txrx_pdev_handle pdev,
int num_msdus,
enum htt_tx_status status,
- void *tx_desc_id_iterator)
+ void *msg)
{
int i;
- u_int16_t *desc_ids = (u_int16_t *)tx_desc_id_iterator;
u_int16_t tx_desc_id;
struct ol_tx_desc_t *tx_desc;
char *trace_str;
@@ -557,10 +685,27 @@
union ol_tx_desc_list_elem_t *tx_desc_last = NULL;
ol_tx_desc_list tx_descs;
uint32_t is_tx_desc_freed = 0;
+ struct htt_tx_compl_ind_append_txtstamp *txtstamp_list = NULL;
+ struct htt_tx_compl_ind_append_txpower *txpower_list = NULL;
+
+ u_int32_t *msg_word = (u_int32_t *)msg;
+ u_int16_t *desc_ids = (u_int16_t *)(msg_word + 1);
TAILQ_INIT(&tx_descs);
+ if (pdev->cfg.is_high_latency) {
+ /*
+ * For some performance sensitive platform, the ol_tx_sched
+ * must be triggered as soon as possible to reduce latency
+ */
+ ol_tx_sched(pdev);
+ }
+
OL_TX_DELAY_COMPUTE(pdev, status, desc_ids, num_msdus);
+ if (status == htt_tx_status_ok) {
+ txtstamp_list = ol_tx_get_txtstamps(msg_word, num_msdus);
+ txpower_list = ol_tx_get_txpowers(msg_word, num_msdus);
+ }
trace_str = (status) ? "OT:C:F:" : "OT:C:S:";
for (i = 0; i < num_msdus; i++) {
@@ -568,6 +713,14 @@
tx_desc = ol_tx_desc_find(pdev, tx_desc_id);
tx_desc->status = status;
netbuf = tx_desc->netbuf;
+
+ if (txtstamp_list)
+ ol_tx_timestamp(pdev, netbuf,
+ (u_int64_t)txtstamp_list->timestamp[i]);
+
+ if (txpower_list)
+ ol_tx_power_handler(tx_desc_id, txpower_list->tx_power[i]);
+
NBUF_UPDATE_TX_PKT_COUNT(netbuf, NBUF_TX_PKT_FREE);
DPTRACE(adf_dp_trace_ptr(netbuf,
ADF_DP_TRACE_FREE_PACKET_PTR_RECORD,
@@ -621,6 +774,8 @@
* but update the number of available tx descriptors,
* then invoke the scheduler, since new credit is probably
* available now.
+ * For those performance sensitive platform, the ol_tx_sched
+ * now is triggered again
*/
adf_os_atomic_add(num_msdus, &pdev->tx_queue.rsrc_cnt);
ol_tx_sched(pdev);
@@ -1250,3 +1405,39 @@
pdev->ol_tx_packetdump_cb = NULL;
pdev->ol_rx_packetdump_cb = NULL;
}
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+void ol_register_timestamp_callback(tp_ol_timestamp_cb ol_tx_timestamp_cb)
+{
+ v_CONTEXT_t vos_context;
+ ol_txrx_pdev_handle pdev;
+
+ vos_context = vos_get_global_context(VOS_MODULE_ID_TXRX,
+ NULL);
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, vos_context);
+
+ if (!pdev) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: pdev is NULL", __func__);
+ return;
+ }
+ pdev->ol_tx_timestamp_cb = ol_tx_timestamp_cb;
+}
+
+void ol_deregister_timestamp_callback(void)
+{
+ v_CONTEXT_t vos_context;
+ ol_txrx_pdev_handle pdev;
+
+ vos_context = vos_get_global_context(VOS_MODULE_ID_TXRX,
+ NULL);
+ pdev = vos_get_context(VOS_MODULE_ID_TXRX, vos_context);
+
+ if (!pdev) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: pdev is NULL", __func__);
+ return;
+ }
+ pdev->ol_tx_timestamp_cb = NULL;
+}
+#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.c
index c1f0664..b137cdf 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -376,6 +376,9 @@
TXRX_STATS_INIT(pdev);
TAILQ_INIT(&pdev->vdev_list);
+ TAILQ_INIT(&pdev->req_list);
+ pdev->req_list_depth = 0;
+ adf_os_spinlock_init(&pdev->req_list_spinlock);
/* do initial set up of the peer ID -> peer object lookup map */
if (ol_txrx_peer_find_attach(pdev)) {
@@ -496,12 +499,13 @@
void *htt_tx_desc;
u_int32_t paddr_lo;
- if (i == (desc_pool_size - 1))
+ if (i == (desc_pool_size - 1)) {
c_element->next = NULL;
- else
+ pdev->tx_desc.last = c_element;
+ } else {
c_element->next = (union ol_tx_desc_list_elem_t *)
ol_tx_desc_find(pdev, i + 1);
-
+ }
htt_tx_desc = htt_tx_desc_alloc(pdev->htt_pdev, &paddr_lo);
if (! htt_tx_desc) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_FATAL,
@@ -528,7 +532,7 @@
/* link SW tx descs into a freelist */
pdev->tx_desc.num_free = desc_pool_size;
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s first tx_desc:0x%p Last tx desc:0x%p\n", __func__,
+ "%s first tx_desc:0x%pK Last tx desc:0x%pK\n", __func__,
(u_int32_t *) pdev->tx_desc.freelist,
(u_int32_t *) (pdev->tx_desc.freelist + desc_pool_size));
@@ -538,6 +542,8 @@
pdev->htt_pkt_type = htt_pkt_type_native_wifi;
} else if (pdev->frame_format == wlan_frm_fmt_802_3) {
pdev->htt_pkt_type = htt_pkt_type_ethernet;
+ } else if (pdev->frame_format == wlan_frm_fmt_raw) {
+ pdev->htt_pkt_type = htt_pkt_type_raw;
} else {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
"%s Invalid standard frame type: %d\n",
@@ -632,7 +638,9 @@
pdev->rx_opt_proc = ol_rx_fwd_check;
}
} else {
- if (ol_cfg_rx_pn_check(pdev->ctrl_pdev)) {
+ if (VOS_MONITOR_MODE == vos_get_conparam()) {
+ pdev->rx_opt_proc = ol_rx_deliver;
+ } else if (ol_cfg_rx_pn_check(pdev->ctrl_pdev)) {
if (ol_cfg_rx_fwd_disabled(pdev->ctrl_pdev)) {
/*
* PN check done on host, rx->tx forwarding not done at all.
@@ -723,7 +731,7 @@
OL_RX_REORDER_TIMEOUT_INIT(pdev);
- TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1, "Created pdev %p\n", pdev);
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1, "Created pdev %pK\n", pdev);
#if defined(CONFIG_HL_SUPPORT) && defined(DEBUG_HL_LOGGING)
adf_os_spinlock_init(&pdev->txq_log_spinlock);
@@ -826,7 +834,6 @@
OL_TX_SCHED_WRR_ADV_CAT_MCAST_DATA;
pdev->tid_to_ac[OL_TX_NUM_TIDS + OL_TX_VDEV_DEFAULT_MGMT] =
OL_TX_SCHED_WRR_ADV_CAT_MCAST_MGMT;
-
return pdev; /* success */
pn_trace_attach_fail:
@@ -886,7 +893,8 @@
void
ol_txrx_pdev_detach(ol_txrx_pdev_handle pdev, int force)
{
- int i;
+ int i = 0;
+ struct ol_txrx_stats_req_internal *req;
/*checking to ensure txrx pdev structure is not NULL */
if (!pdev) {
@@ -899,8 +907,34 @@
/* check that the pdev has no vdevs allocated */
TXRX_ASSERT1(TAILQ_EMPTY(&pdev->vdev_list));
+ adf_os_spin_lock_bh(&pdev->req_list_spinlock);
+ if (pdev->req_list_depth > 0)
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "Warning: the txrx req list is not empty, depth=%d\n",
+ pdev->req_list_depth
+ );
+ TAILQ_FOREACH(req, &pdev->req_list, req_list_elem) {
+ TAILQ_REMOVE(&pdev->req_list, req, req_list_elem);
+ pdev->req_list_depth--;
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%d: %p,verbose(%d), concise(%d), up_m(0x%x), reset_m(0x%x)\n",
+ i++,
+ req,
+ req->base.print.verbose,
+ req->base.print.concise,
+ req->base.stats_type_upload_mask,
+ req->base.stats_type_reset_mask
+ );
+ adf_os_mem_free(req);
+ }
+ adf_os_spin_unlock_bh(&pdev->req_list_spinlock);
+
+ adf_os_spinlock_destroy(&pdev->req_list_spinlock);
+
OL_RX_REORDER_TIMEOUT_CLEANUP(pdev);
+ ol_per_pkt_tx_stats_enable(0);
+
if (ol_cfg_is_high_latency(pdev->ctrl_pdev)) {
ol_tx_sched_detach(pdev);
}
@@ -926,7 +960,7 @@
* As a side effect, this will complete the deletion of any vdevs
* that are waiting for their peers to finish deletion.
*/
- TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1, "Force delete for pdev %p\n", pdev);
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1, "Force delete for pdev %pK\n", pdev);
ol_txrx_peer_find_hash_erase(pdev);
}
@@ -1012,10 +1046,120 @@
#ifdef QCA_COMPUTE_TX_DELAY
adf_os_spinlock_destroy(&pdev->tx_delay.mutex);
#endif
-
adf_os_mem_free(pdev);
}
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+
+/**
+ * ol_txrx_vdev_init_tcp_del_ack() - initialize tcp delayed ack structure
+ * @vdev: vdev handle
+ *
+ * Return: none
+ */
+void ol_txrx_vdev_init_tcp_del_ack(struct ol_txrx_vdev_t *vdev)
+{
+ int i = 0;
+
+ vdev->driver_del_ack_enabled = false;
+ adf_os_hrtimer_init(vdev->pdev->osdev,
+ &vdev->tcp_ack_hash.timer, ol_tx_hl_vdev_tcp_del_ack_timer);
+ adf_os_create_bh(vdev->pdev->osdev, &vdev->tcp_ack_hash.tcp_del_ack_tq,
+ tcp_del_ack_tasklet, (unsigned long)vdev);
+ adf_os_atomic_init(&vdev->tcp_ack_hash.is_timer_running);
+ adf_os_atomic_init(&vdev->tcp_ack_hash.tcp_node_in_use_count);
+ adf_os_spinlock_init(&vdev->tcp_ack_hash.tcp_free_list_lock);
+ vdev->tcp_ack_hash.tcp_free_list = NULL;
+ for (i = 0; i < OL_TX_HL_DEL_ACK_HASH_SIZE; i++) {
+ adf_os_spinlock_init(&vdev->tcp_ack_hash.node[i].hash_node_lock);
+ vdev->tcp_ack_hash.node[i].no_of_entries = 0;
+ vdev->tcp_ack_hash.node[i].head = NULL;
+ }
+}
+
+/**
+ * ol_txrx_vdev_deinit_tcp_del_ack() - deinitialize tcp delayed ack structure
+ * @vdev: vdev handle
+ *
+ * Return: none
+ */
+void ol_txrx_vdev_deinit_tcp_del_ack(struct ol_txrx_vdev_t *vdev)
+{
+ struct tcp_stream_node *temp = NULL;
+
+ adf_os_destroy_bh(vdev->pdev->osdev, &vdev->tcp_ack_hash.tcp_del_ack_tq);
+
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.tcp_free_list_lock);
+ while (vdev->tcp_ack_hash.tcp_free_list) {
+ temp = vdev->tcp_ack_hash.tcp_free_list;
+ vdev->tcp_ack_hash.tcp_free_list = temp->next;
+ adf_os_mem_free(temp);
+ }
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.tcp_free_list_lock);
+}
+
+/**
+ * ol_txrx_vdev_free_tcp_node() - add tcp node in free list
+ * @vdev: vdev handle
+ * @node: tcp stream node
+ *
+ * Return: none
+ */
+void ol_txrx_vdev_free_tcp_node(struct ol_txrx_vdev_t *vdev,
+ struct tcp_stream_node *node)
+{
+ adf_os_atomic_dec(&vdev->tcp_ack_hash.tcp_node_in_use_count);
+
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.tcp_free_list_lock);
+ if (vdev->tcp_ack_hash.tcp_free_list) {
+ node->next = vdev->tcp_ack_hash.tcp_free_list;
+ vdev->tcp_ack_hash.tcp_free_list = node;
+ } else {
+ vdev->tcp_ack_hash.tcp_free_list = node;
+ node->next = NULL;
+ }
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.tcp_free_list_lock);
+}
+
+/**
+ * ol_txrx_vdev_alloc_tcp_node() - allocate tcp node
+ * @vdev: vdev handle
+ *
+ * Return: tcp stream node
+ */
+struct tcp_stream_node *ol_txrx_vdev_alloc_tcp_node(struct ol_txrx_vdev_t *vdev)
+{
+ struct tcp_stream_node *node = NULL;
+
+ adf_os_spin_lock_bh(&vdev->tcp_ack_hash.tcp_free_list_lock);
+ if (vdev->tcp_ack_hash.tcp_free_list) {
+ node = vdev->tcp_ack_hash.tcp_free_list;
+ vdev->tcp_ack_hash.tcp_free_list = node->next;
+ }
+ adf_os_spin_unlock_bh(&vdev->tcp_ack_hash.tcp_free_list_lock);
+
+ if (!node) {
+ node = adf_os_mem_alloc(vdev->pdev->osdev,
+ sizeof(struct ol_txrx_vdev_t));
+ if (!node) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_FATAL_ERR, "Malloc failed");
+ return NULL;
+ }
+ }
+ adf_os_atomic_inc(&vdev->tcp_ack_hash.tcp_node_in_use_count);
+ return node;
+}
+#else
+static inline
+void ol_txrx_vdev_init_tcp_del_ack(struct ol_txrx_vdev_t *vdev)
+{
+}
+static inline
+void ol_txrx_vdev_deinit_tcp_del_ack(struct ol_txrx_vdev_t *vdev)
+{
+}
+#endif
+
ol_txrx_vdev_handle
ol_txrx_vdev_attach(
ol_txrx_pdev_handle pdev,
@@ -1118,11 +1262,13 @@
ol_tx_hl_vdev_bundle_timer,
vdev, ADF_DEFERRABLE_TIMER);
+ ol_txrx_vdev_init_tcp_del_ack(vdev);
+
/* add this vdev into the pdev's list */
TAILQ_INSERT_TAIL(&pdev->vdev_list, vdev, vdev_list_elem);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "Created vdev %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ "Created vdev %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n",
vdev,
vdev->mac_addr.raw[0], vdev->mac_addr.raw[1], vdev->mac_addr.raw[2],
vdev->mac_addr.raw[3], vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]);
@@ -1155,6 +1301,25 @@
#endif /* QCA_LL_TX_FLOW_CT */
}
+/**
+ * ol_txrx_osif_pdev_mon_register_cbk() - register monitor rx callback
+ * @txrx_pdev: pdev handle
+ * @cbk: monitor rx callback function
+ *
+ * Return: none
+ */
+void ol_txrx_osif_pdev_mon_register_cbk(
+ ol_txrx_pdev_handle txrx_pdev,
+ ol_txrx_vir_mon_rx_fp cbk)
+{
+ TXRX_ASSERT2(txrx_pdev);
+
+ if (NULL == txrx_pdev)
+ return;
+
+ txrx_pdev->osif_rx_mon_cb = cbk;
+}
+
void
ol_txrx_set_curchan(
ol_txrx_pdev_handle pdev,
@@ -1224,7 +1389,7 @@
adf_nbuf_set_next(vdev->ll_pause.txq.head, NULL);
adf_nbuf_unmap(pdev->osdev, vdev->ll_pause.txq.head,
ADF_OS_DMA_TO_DEVICE);
- adf_nbuf_tx_free(vdev->ll_pause.txq.head, 1 /* error */);
+ adf_nbuf_tx_free(vdev->ll_pause.txq.head, ADF_NBUF_PKT_ERROR);
vdev->ll_pause.txq.head = next;
}
adf_os_spin_unlock_bh(&vdev->ll_pause.mutex);
@@ -1242,7 +1407,7 @@
if (!TAILQ_EMPTY(&vdev->peer_list)) {
/* debug print - will be removed later */
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s: not deleting vdev object %p (%02x:%02x:%02x:%02x:%02x:%02x)"
+ "%s: not deleting vdev object %pK (%02x:%02x:%02x:%02x:%02x:%02x)"
"until deletion finishes for all its peers\n",
__func__, vdev,
vdev->mac_addr.raw[0], vdev->mac_addr.raw[1],
@@ -1258,7 +1423,7 @@
adf_os_spin_unlock_bh(&pdev->peer_ref_mutex);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s: deleting vdev object %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ "%s: deleting vdev object %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n",
__func__, vdev,
vdev->mac_addr.raw[0], vdev->mac_addr.raw[1], vdev->mac_addr.raw[2],
vdev->mac_addr.raw[3], vdev->mac_addr.raw[4], vdev->mac_addr.raw[5]);
@@ -1418,7 +1583,7 @@
ol_txrx_peer_find_hash_add(pdev, peer);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO2,
- "vdev %p created peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ "vdev %pK created peer %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n",
vdev, peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1], peer->mac_addr.raw[2],
peer->mac_addr.raw[3], peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
@@ -1726,13 +1891,18 @@
if (adf_os_atomic_dec_and_test(&peer->ref_cnt)) {
u_int16_t peer_id;
- TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "Deleting peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
+ "Deleting peer %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n",
peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1],
peer->mac_addr.raw[2], peer->mac_addr.raw[3],
peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
+ /* set self_peer to null, otherwise may crash when unload driver */
+ if (peer == pdev->self_peer &&
+ VOS_MONITOR_MODE == vos_get_conparam())
+ pdev->self_peer = NULL;
+
peer_id = peer->local_id;
/* remove the reference to the peer from the hash table */
ol_txrx_peer_find_hash_remove(pdev, peer);
@@ -1790,7 +1960,7 @@
adf_os_spin_unlock_bh(&pdev->tx_mutex);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s: deleting vdev object %p "
+ "%s: deleting vdev object %pK "
"(%02x:%02x:%02x:%02x:%02x:%02x)"
" - its last peer is done\n",
__func__, vdev,
@@ -1858,8 +2028,8 @@
/* debug print to dump rx reorder state */
//htt_rx_reorder_log_print(vdev->pdev->htt_pdev);
- TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "%s:peer %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
+ "%s:peer %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n",
__func__, peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1],
peer->mac_addr.raw[2], peer->mac_addr.raw[3],
@@ -1895,7 +2065,7 @@
peer = ol_txrx_peer_find_hash_find(pdev, peer_mac_addr, 0, 0);
if (peer) {
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "%s: Delete extra reference %p\n", __func__, peer);
+ "%s: Delete extra reference %pK\n", __func__, peer);
/* release the extra reference */
ol_txrx_peer_unref_delete(peer);
}
@@ -2000,12 +2170,6 @@
#endif
}
-struct ol_txrx_stats_req_internal {
- struct ol_txrx_stats_req base;
- int serviced; /* state of this request */
- int offset;
-};
-
static inline
u_int64_t OL_TXRX_STATS_PTR_TO_U64(struct ol_txrx_stats_req_internal *req)
{
@@ -2038,7 +2202,8 @@
A_STATUS
ol_txrx_fw_stats_get(
ol_txrx_vdev_handle vdev,
- struct ol_txrx_stats_req *req)
+ struct ol_txrx_stats_req *req,
+ bool response_expected)
{
struct ol_txrx_pdev_t *pdev = vdev->pdev;
u_int64_t cookie;
@@ -2067,6 +2232,13 @@
/* use the non-volatile request object's address as the cookie */
cookie = OL_TXRX_STATS_PTR_TO_U64(non_volatile_req);
+ if (response_expected) {
+ adf_os_spin_lock_bh(&pdev->req_list_spinlock);
+ TAILQ_INSERT_TAIL(&pdev->req_list, non_volatile_req, req_list_elem);
+ pdev->req_list_depth++;
+ adf_os_spin_unlock_bh(&pdev->req_list_spinlock);
+ }
+
if (htt_h2t_dbg_stats_get(
pdev->htt_pdev,
req->stats_type_upload_mask,
@@ -2074,13 +2246,19 @@
HTT_H2T_STATS_REQ_CFG_STAT_TYPE_INVALID, 0,
cookie))
{
+ if (response_expected) {
+ adf_os_spin_lock_bh(&pdev->req_list_spinlock);
+ TAILQ_REMOVE(&pdev->req_list, non_volatile_req, req_list_elem);
+ pdev->req_list_depth--;
+ adf_os_spin_unlock_bh(&pdev->req_list_spinlock);
+ }
+
adf_os_mem_free(non_volatile_req);
return A_ERROR;
}
- if (req->wait.blocking) {
- while (adf_os_mutex_acquire(pdev->osdev, req->wait.sem_ptr)) {}
- }
+ if (response_expected == false)
+ adf_os_mem_free(non_volatile_req);
return A_OK;
}
@@ -2095,11 +2273,27 @@
enum htt_dbg_stats_status status;
int length;
u_int8_t *stats_data;
- struct ol_txrx_stats_req_internal *req;
+ struct ol_txrx_stats_req_internal *req, *tmp;
int more = 0;
+ int found = 0;
req = OL_TXRX_U64_TO_STATS_PTR(cookie);
+ adf_os_spin_lock_bh(&pdev->req_list_spinlock);
+ TAILQ_FOREACH(tmp, &pdev->req_list, req_list_elem) {
+ if (req == tmp) {
+ found = 1;
+ break;
+ }
+ }
+ adf_os_spin_unlock_bh(&pdev->req_list_spinlock);
+
+ if (!found) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "req(%p) from firmware can't be found in the list\n", req);
+ return;
+ }
+
do {
htt_t2h_dbg_stats_hdr_parse(
stats_info_list, &type, &status, &length, &stats_data);
@@ -2223,10 +2417,16 @@
} while (1);
if (! more) {
- if (req->base.wait.blocking) {
- adf_os_mutex_release(pdev->osdev, req->base.wait.sem_ptr);
+ adf_os_spin_lock_bh(&pdev->req_list_spinlock);
+ TAILQ_FOREACH(tmp, &pdev->req_list, req_list_elem) {
+ if (req == tmp) {
+ TAILQ_REMOVE(&pdev->req_list, req, req_list_elem);
+ pdev->req_list_depth--;
+ adf_os_mem_free(req);
+ break;
+ }
}
- adf_os_mem_free(req);
+ adf_os_spin_unlock_bh(&pdev->req_list_spinlock);
}
}
@@ -2294,7 +2494,7 @@
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
"%*s%s:\n", indent, " ", "txrx pdev");
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*spdev object: %p\n", indent+4, " ", pdev);
+ "%*spdev object: %pK\n", indent+4, " ", pdev);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
"%*svdev list:\n", indent+4, " ");
TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
@@ -2302,7 +2502,7 @@
}
ol_txrx_peer_find_display(pdev, indent+4);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*stx desc pool: %d elems @ %p\n", indent+4, " ",
+ "%*stx desc pool: %d elems @ %pK\n", indent+4, " ",
pdev->tx_desc.pool_size, pdev->tx_desc.desc_pages);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW, "\n");
htt_display(pdev->htt_pdev, indent);
@@ -2314,7 +2514,7 @@
struct ol_txrx_peer_t *peer;
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*stxrx vdev: %p\n", indent, " ", vdev);
+ "%*stxrx vdev: %pK\n", indent, " ", vdev);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
"%*sID: %d\n", indent+4, " ", vdev->vdev_id);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
@@ -2335,7 +2535,7 @@
int i;
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*stxrx peer: %p\n", indent, " ", peer);
+ "%*stxrx peer: %pK\n", indent, " ", peer);
for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) {
if (peer->peer_ids[i] != HTT_INVALID_PEER) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
@@ -2621,21 +2821,37 @@
bool ol_txrx_set_ocb_def_tx_param(ol_txrx_vdev_handle vdev,
void *_def_tx_param, uint32_t def_tx_param_size)
{
+ int count, channel_nums = def_tx_param_size /
+ sizeof(struct ocb_tx_ctrl_hdr_t);
struct ocb_tx_ctrl_hdr_t *def_tx_param =
(struct ocb_tx_ctrl_hdr_t *)_def_tx_param;
- if (def_tx_param) {
+ if (def_tx_param == NULL) {
/*
- * Default TX parameters are provided.
- * Validate the contents and
- * save them in the vdev.
+ * Default TX parameters are not provided.
+ * Delete the old defaults.
*/
- if (def_tx_param_size != sizeof(struct ocb_tx_ctrl_hdr_t)) {
- VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
- "Invalid size of OCB default TX params");
- return false;
+ if (vdev->ocb_def_tx_param) {
+ vos_mem_free(vdev->ocb_def_tx_param);
+ vdev->ocb_def_tx_param = NULL;
}
+ return true;
+ }
+ /*
+ * Default TX parameters are provided.
+ * Validate the contents and
+ * save them in the vdev.
+ * Support up to two channel TX ctrl parameters.
+ */
+ if (def_tx_param_size != channel_nums *
+ sizeof(struct ocb_tx_ctrl_hdr_t)) {
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
+ "Invalid size of OCB default TX params");
+ return false;
+ }
+
+ for (count = 0; count < channel_nums; count++, def_tx_param++) {
if (def_tx_param->version != OCB_HEADER_VERSION) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
"Invalid version of OCB default TX params");
@@ -2657,36 +2873,38 @@
}
}
- if (def_tx_param->valid_datarate &&
- def_tx_param->datarate > MAX_DATARATE) {
+ /* Default data rate is always valid set by dsrc_config app. */
+ if (!def_tx_param->valid_datarate ||
+ def_tx_param->datarate > MAX_DATARATE) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
"Invalid default datarate");
return false;
}
+ /* Default tx power is always valid set by dsrc_config. */
+ if (!def_tx_param->valid_pwr) {
+ VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
+ "Invalid default tx power");
+ return false;
+ }
+
if (def_tx_param->valid_tid &&
- def_tx_param->ext_tid > MAX_TID) {
+ def_tx_param->ext_tid > MAX_TID) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR,
"Invalid default TID");
return false;
}
-
- if (vdev->ocb_def_tx_param == NULL)
- vdev->ocb_def_tx_param =
- vos_mem_malloc(sizeof(*vdev->ocb_def_tx_param));
- vos_mem_copy(vdev->ocb_def_tx_param, def_tx_param,
- sizeof(*vdev->ocb_def_tx_param));
- } else {
- /*
- * Default TX parameters are not provided.
- * Delete the old defaults.
- */
- if (vdev->ocb_def_tx_param) {
- vos_mem_free(vdev->ocb_def_tx_param);
- vdev->ocb_def_tx_param = NULL;
- }
}
+ if (vdev->ocb_def_tx_param) {
+ vos_mem_free(vdev->ocb_def_tx_param);
+ vdev->ocb_def_tx_param = NULL;
+ }
+ vdev->ocb_def_tx_param = vos_mem_malloc(def_tx_param_size);
+ if (!vdev->ocb_def_tx_param)
+ return false;
+ vos_mem_copy(vdev->ocb_def_tx_param, _def_tx_param, def_tx_param_size);
+
return true;
}
@@ -2749,6 +2967,8 @@
{
if (pdev->ipa_uc_op_cb) {
pdev->ipa_uc_op_cb(op_msg, pdev->osif_dev);
+ } else {
+ adf_os_mem_free(op_msg);
}
}
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.h
index 2c45b88..08c1e17 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014,2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -38,6 +38,12 @@
u_int16_t
ol_tx_desc_pool_size_hl(ol_pdev_handle ctrl_pdev);
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+struct tcp_stream_node *ol_txrx_vdev_alloc_tcp_node(struct ol_txrx_vdev_t *vdev);
+void ol_txrx_vdev_free_tcp_node(struct ol_txrx_vdev_t *vdev,
+ struct tcp_stream_node *node);
+void ol_txrx_vdev_deinit_tcp_del_ack(struct ol_txrx_vdev_t *vdev);
+#endif
#ifndef OL_TX_AVG_FRM_BYTES
#define OL_TX_AVG_FRM_BYTES 1000
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h
index f09db5c..16f9186 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -487,7 +487,7 @@
tcp_offset = l2_hdr_size + IPV6_HDR_LEN;
} else {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "frame %p non-IP ethertype (%x)\n", frm, ethertype);
+ "frame %pK non-IP ethertype (%x)\n", frm, ethertype);
goto NOT_IP_TCP;
}
if (ip_prot == IP_PROTOCOL_TCP) {
@@ -501,10 +501,10 @@
(tcp_hdr->seq_num[1] << 8) |
(tcp_hdr->seq_num[1] << 0);
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "frame %p: TCP seq num = %d\n", frm, tcp_seq_num);
+ "frame %pK: TCP seq num = %d\n", frm, tcp_seq_num);
#else
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "frame %p: TCP seq num = %d\n", frm,
+ "frame %pK: TCP seq num = %d\n", frm,
((*(p + tcp_offset + 4)) << 24) |
((*(p + tcp_offset + 5)) << 16) |
((*(p + tcp_offset + 6)) << 8) |
@@ -512,7 +512,7 @@
#endif
} else {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "frame %p non-TCP IP protocol (%x)\n", frm, ip_prot);
+ "frame %pK non-TCP IP protocol (%x)\n", frm, ip_prot);
}
}
NOT_IP_TCP:
@@ -547,7 +547,7 @@
}
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO,
- "frame %p data (%p), hex dump of bytes 0-%d of %d:\n",
+ "frame %pK data (%pK), hex dump of bytes 0-%d of %d:\n",
frm, p, len_lim-1, (int) adf_nbuf_len(frm));
p = local_buf;
while (len_lim > 16) {
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_peer_find.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_peer_find.c
index 5196bc3..90ddaa2 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_peer_find.c
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_peer_find.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -305,7 +305,7 @@
*/
adf_os_atomic_init(&peer->ref_cnt); /* set to zero */
adf_os_atomic_inc(&peer->ref_cnt); /* incr to one */
- TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "%s: Delete Peer %p\n", __func__, peer);
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "%s: Delete Peer %pK\n", __func__, peer);
ol_txrx_peer_unref_delete(peer);
}
}
@@ -356,7 +356,7 @@
/* check if there's already a peer object with this MAC address */
peer = ol_txrx_peer_find_hash_find(pdev, peer_mac_addr, 1 /* is aligned */, 0);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s: peer %p ID %d\n", __func__, peer, peer_id);
+ "%s: peer %pK ID %d\n", __func__, peer, peer_id);
if (peer) {
/* peer's ref count was already incremented by peer_find_hash_find */
pdev->peer_id_to_obj_map[peer_id] = peer;
@@ -475,7 +475,7 @@
peer = (peer_id == HTT_INVALID_PEER) ? NULL :
pdev->peer_id_to_obj_map[peer_id];
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
- "%s: peer %p with ID %d to be unmapped.\n", __func__, peer, peer_id);
+ "%s: peer %pK with ID %d to be unmapped.\n", __func__, peer, peer_id);
pdev->peer_id_to_obj_map[peer_id] = NULL;
/*
* Currently peer IDs are assigned for vdevs as well as peers.
@@ -487,8 +487,8 @@
* Remove a reference to the peer.
* If there are no more references, delete the peer object.
*/
- TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
- "%s: Remove the ID %d reference to peer %p\n",
+ TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
+ "%s: Remove the ID %d reference to peer %pK\n",
__func__, peer_id, peer);
ol_txrx_peer_unref_delete(peer);
}
@@ -528,7 +528,7 @@
for (i = 0; i < max_peers; i++) {
if (pdev->peer_id_to_obj_map[i]) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*sid %d -> %p\n",
+ "%*sid %d -> %pK\n",
indent+4, " ", i, pdev->peer_id_to_obj_map[i]);
}
}
@@ -539,7 +539,7 @@
struct ol_txrx_peer_t *peer;
TAILQ_FOREACH(peer, &pdev->peer_hash.bins[i], hash_list_elem) {
VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO_LOW,
- "%*shash idx %d -> %p (%02x:%02x:%02x:%02x:%02x:%02x)\n",
+ "%*shash idx %d -> %pK (%02x:%02x:%02x:%02x:%02x:%02x)\n",
indent+4, " ", i, peer,
peer->mac_addr.raw[0], peer->mac_addr.raw[1],
peer->mac_addr.raw[2], peer->mac_addr.raw[3],
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
index a660e30..cb3404d 100644
--- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
+++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -48,7 +48,6 @@
#include "ol_htt_rx_api.h"
#include "wlan_qct_tl.h"
#include <ol_txrx_ctrl_api.h>
-
/*
* The target may allocate multiple IDs for a peer.
* In particular, the target may allocate one ID to represent the
@@ -87,6 +86,8 @@
#define OL_TXRX_INVALID_VDEV_ID (-1)
+#define INVALID_REORDER_INDEX 0xFFFF
+
struct ol_txrx_pdev_t;
struct ol_txrx_vdev_t;
struct ol_txrx_peer_t;
@@ -165,6 +166,8 @@
} tx_peer_threshold;
#endif
+#define MAX_RADIOTAP_LEN 64
+
struct ol_tx_desc_t {
adf_nbuf_t netbuf;
void *htt_tx_desc;
@@ -200,6 +203,8 @@
struct ol_txrx_vdev_t* vdev;
void *txq;
+ uint8_t rtap[MAX_RADIOTAP_LEN];
+ uint8_t rtap_len;
};
typedef TAILQ_HEAD(, ol_tx_desc_t) ol_tx_desc_list;
@@ -363,13 +368,20 @@
typedef struct ol_tx_sched_t *ol_tx_sched_handle;
#ifndef OL_TXRX_NUM_LOCAL_PEER_IDS
-
+#ifdef WLAN_4SAP_CONCURRENCY
+/*
+ * Each AP will occupy one ID, so it will occupy 4 IDs for 4 SAP mode.
+ * And the remainder IDs will be assigned to other 32 clients.
+ */
+#define OL_TXRX_NUM_LOCAL_PEER_IDS (4 + 32)
+#else
/*
* Each AP will occupy one ID, so it will occupy two IDs for AP-AP mode.
* And the remainder IDs will be assigned to other 32 clients.
*/
#define OL_TXRX_NUM_LOCAL_PEER_IDS (2 + 32)
#endif
+#endif
#ifndef ol_txrx_local_peer_id_t
#define ol_txrx_local_peer_id_t u_int8_t /* default */
@@ -548,6 +560,10 @@
/* ol_txrx_vdev list */
TAILQ_HEAD(, ol_txrx_vdev_t) vdev_list;
+ TAILQ_HEAD(, ol_txrx_stats_req_internal) req_list;
+ int req_list_depth;
+ adf_os_spinlock_t req_list_spinlock;
+
/* peer ID to peer object map (array of pointers to peer objects) */
struct ol_txrx_peer_t **peer_id_to_obj_map;
@@ -600,11 +616,19 @@
tp_ol_packetdump_cb ol_tx_packetdump_cb;
tp_ol_packetdump_cb ol_rx_packetdump_cb;
+ /* virtual montior callback functions */
+ ol_txrx_vir_mon_rx_fp osif_rx_mon_cb;
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+ tp_ol_timestamp_cb ol_tx_timestamp_cb;
+#endif
+
/* tx descriptor pool */
struct {
u_int16_t pool_size;
u_int16_t num_free;
union ol_tx_desc_list_elem_t *freelist;
+ union ol_tx_desc_list_elem_t *last;
uint32_t page_size;
uint16_t desc_reserved_size;
uint8_t page_divider;
@@ -807,8 +831,7 @@
/* Maximum number of frames to send to the target at one time */
u_int32_t tx_threshold;
/* stores time in ms of on and off phase for each throttle level*/
- int throttle_time_ms_2g[THROTTLE_LEVEL_MAX][THROTTLE_PHASE_MAX];
- int throttle_time_ms_5g[THROTTLE_LEVEL_MAX][THROTTLE_PHASE_MAX];
+ int throttle_time_ms[THROTTLE_LEVEL_MAX][THROTTLE_PHASE_MAX];
/* mark as true if traffic is paused due to thermal throttling */
a_bool_t is_paused;
} tx_throttle;
@@ -850,11 +873,56 @@
struct ol_txrx_peer_t *self_peer;
uint32_t total_bundle_queue_length;
+ struct tasklet_struct tcp_ack_tq;
+
+#ifdef MAC_NOTIFICATION_FEATURE
+ /* Callback to indicate failure to user space */
+ void (*tx_failure_cb)(void *ctx, unsigned int num_msdu,
+ unsigned char tid, unsigned int status);
+#endif
};
struct ol_txrx_ocb_chan_info {
uint32_t chan_freq;
+ uint32_t bandwidth;
uint16_t disable_rx_stats_hdr:1;
+ uint8_t mac_address[6];
+};
+
+#define OL_TX_HL_DEL_ACK_HASH_SIZE 256
+
+enum ol_tx_hl_packet_type {
+ TCP_PKT_ACK,
+ TCP_PKT_NO_ACK,
+ NO_TCP_PKT
+};
+
+struct packet_info {
+ enum ol_tx_hl_packet_type type;
+ uint16_t stream_id;
+ uint32_t ack_number;
+ uint32_t dst_ip;
+ uint32_t src_ip;
+ uint16_t dst_port;
+ uint16_t src_port;
+};
+
+struct tcp_stream_node {
+ struct tcp_stream_node *next;
+ uint8_t no_of_ack_replaced;
+ uint16_t stream_id;
+ uint32_t dst_ip;
+ uint32_t src_ip;
+ uint16_t dst_port;
+ uint16_t src_port;
+ uint32_t ack_number;
+ adf_nbuf_t head;
+};
+
+struct tcp_del_ack_hash_node {
+ adf_os_spinlock_t hash_node_lock;
+ uint8_t no_of_entries;
+ struct tcp_stream_node *head;
};
struct ol_txrx_vdev_t {
@@ -955,6 +1023,19 @@
adf_os_timer_t timer;
} bundle_queue;
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+ bool driver_del_ack_enabled;
+ struct {
+ struct tcp_del_ack_hash_node node[OL_TX_HL_DEL_ACK_HASH_SIZE];
+ adf_os_hrtimer_t timer;
+ adf_os_atomic_t is_timer_running;
+ adf_os_atomic_t tcp_node_in_use_count;
+ adf_os_bh_t tcp_del_ack_tq;
+ struct tcp_stream_node *tcp_free_list;
+ adf_os_spinlock_t tcp_free_list_lock;
+ } tcp_ack_hash;
+#endif
+
#if defined(CONFIG_HL_SUPPORT) && defined(FEATURE_WLAN_TDLS)
union ol_txrx_align_mac_addr_t hl_tdls_ap_mac_addr;
bool hlTdlsFlag;
@@ -978,6 +1059,9 @@
struct ol_txrx_ocb_chan_info *ocb_channel_info;
uint32_t ocb_channel_count;
+ /* OCB Configuration flags */
+ uint16_t ocb_config_flags;
+
/* Default OCB TX parameter */
struct ocb_tx_ctrl_hdr_t *ocb_def_tx_param;
@@ -1131,9 +1215,10 @@
u_int8_t last_rmf_pn_valid;
#endif
- /* Properties of the last received PPDU */
+ /* Properties of the last received PPDU */
int16_t last_pkt_rssi_cmb;
int16_t last_pkt_rssi[4];
+ int8_t last_pkt_noise_floor[4];
uint8_t last_pkt_legacy_rate;
uint8_t last_pkt_legacy_rate_sel;
uint32_t last_pkt_timestamp_microsec;
diff --git a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_helper.c b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_helper.c
index 52e14f2..2bf95d5 100644
--- a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_helper.c
+++ b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_helper.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -236,7 +236,7 @@
int i;
epping_poll_t *epping_poll = data;
- EPPING_LOG(VOS_TRACE_LEVEL_FATAL, "%s: arg = %p", __func__, data);
+ EPPING_LOG(VOS_TRACE_LEVEL_FATAL, "%s: arg = %pK", __func__, data);
while (!epping_poll->done) {
down(&epping_poll->sem);
adf_os_atomic_dec(&epping_poll->atm);
@@ -258,7 +258,7 @@
epping_poll->eid = eid;
epping_poll->arg = pEpping_ctx->epping_adapter;
epping_poll->done = false;
- EPPING_LOG(VOS_TRACE_LEVEL_FATAL, "%s: eid = %d, arg = %p",
+ EPPING_LOG(VOS_TRACE_LEVEL_FATAL, "%s: eid = %d, arg = %pK",
__func__, eid, pEpping_ctx->epping_adapter);
sema_init(&epping_poll->sem, 0);
adf_os_atomic_init(&epping_poll->atm);
diff --git a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_main.c b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_main.c
index ccf5881..04c6f20 100644
--- a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_main.c
+++ b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_main.c
@@ -114,6 +114,7 @@
#endif
#ifdef MEMORY_DEBUG
vos_mem_init();
+ adf_net_buf_debug_init();
#endif
pEpping_ctx = vos_mem_malloc(sizeof(epping_context_t));
@@ -169,6 +170,7 @@
vos_mem_free(pEpping_ctx);
#ifdef MEMORY_DEBUG
+ adf_net_buf_debug_exit();
vos_mem_exit();
#endif
#ifdef TIMER_MANAGER
@@ -186,6 +188,7 @@
pEpping_ctx = NULL;
}
#ifdef MEMORY_DEBUG
+ adf_net_buf_debug_exit();
vos_mem_exit();
#endif
#ifdef TIMER_MANAGER
@@ -255,6 +258,7 @@
vos_mem_free(pEpping_ctx);
vos_preClose( &pVosContext );
#ifdef MEMORY_DEBUG
+ adf_net_buf_debug_exit();
vos_mem_exit();
#endif
#ifdef TIMER_MANAGER
diff --git a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_rx.c b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_rx.c
index c6f2d1e..978ad46 100644
--- a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_rx.c
+++ b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_rx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -126,7 +126,7 @@
struct sk_buff *pktSkb = (struct sk_buff *)pPacket->pPktContext;
EPPING_LOG(VOS_TRACE_LEVEL_INFO,
- "%s: pAdapter = 0x%p eid=%d, skb=0x%p, data=0x%p, len=0x%x status:%d",
+ "%s: pAdapter = 0x%pK eid=%d, skb=0x%pK, data=0x%pK, len=0x%x status:%d",
__func__, pAdapter, eid, pktSkb, pPacket->pBuffer,
pPacket->ActualLength, status);
@@ -163,6 +163,7 @@
&pEpping_ctx->kperf_num_rx_recv[eid],
sizeof(unsigned int));
epping_set_kperf_flag(pAdapter, eid, false);
+ adf_net_buf_debug_release_skb(pktSkb);
netif_rx_ni(pktSkb);
break;
case 0: /* RXPERF hard code 0 in FW */
@@ -175,9 +176,11 @@
break;
case EPPING_CMD_CAPTURE_RECV_CNT:
epping_set_kperf_flag(pAdapter, eid, false);
+ adf_net_buf_debug_release_skb(pktSkb);
netif_rx_ni(pktSkb);
break;
default:
+ adf_net_buf_debug_release_skb(pktSkb);
netif_rx_ni(pktSkb);
pEpping_ctx->kperf_num_rx_recv[eid]++;
if ((pAdapter->stats.rx_packets % EPPING_STATS_LOG_COUNT) == 0) {
@@ -187,6 +190,7 @@
break;
}
} else {
+ adf_net_buf_debug_release_skb(pktSkb);
netif_rx_ni(pktSkb);
if ((pAdapter->stats.rx_packets % EPPING_STATS_LOG_COUNT) == 0) {
EPPING_LOG(VOS_TRACE_LEVEL_FATAL, "%s: total_rx_pkts = %lu",
diff --git a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_tx.c b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_tx.c
index 6d4e838..40a5a34 100644
--- a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_tx.c
+++ b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_tx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -205,14 +205,14 @@
HTCSetNodropPkt(pAdapter->pEpping_ctx->HTCHandle, TRUE);
if (epping_tx_send_int(nodrop_skb, pAdapter)) {
EPPING_LOG(VOS_TRACE_LEVEL_FATAL,
- "%s: nodrop: %p xmit fail in timer\n", __func__, nodrop_skb);
+ "%s: nodrop: %pK xmit fail in timer\n", __func__, nodrop_skb);
/* fail to xmit so put the nodrop packet to the nodrop queue */
adf_nbuf_queue_insert_head(&pAdapter->nodrop_queue, nodrop_skb);
break;
} else {
HTCSetNodropPkt(pAdapter->pEpping_ctx->HTCHandle, FALSE);
EPPING_LOG(VOS_TRACE_LEVEL_INFO,
- "%s: nodrop: %p xmit ok in timer\n", __func__, nodrop_skb);
+ "%s: nodrop: %pK xmit ok in timer\n", __func__, nodrop_skb);
}
}
@@ -272,7 +272,7 @@
HTCSetNodropPkt(pAdapter->pEpping_ctx->HTCHandle, TRUE);
if (epping_tx_send_int(nodrop_skb, pAdapter)) {
EPPING_LOG(VOS_TRACE_LEVEL_FATAL,
- "%s: nodrop: %p xmit fail\n", __func__, nodrop_skb);
+ "%s: nodrop: %pK xmit fail\n", __func__, nodrop_skb);
/* fail to xmit so put the nodrop packet to the nodrop queue */
adf_nbuf_queue_insert_head(&pAdapter->nodrop_queue, nodrop_skb);
/* no cookie so free the current skb */
@@ -280,7 +280,7 @@
} else {
HTCSetNodropPkt(pAdapter->pEpping_ctx->HTCHandle, FALSE);
EPPING_LOG(VOS_TRACE_LEVEL_INFO,
- "%s: nodrop: %p xmit ok\n", __func__, nodrop_skb);
+ "%s: nodrop: %pK xmit ok\n", __func__, nodrop_skb);
}
}
@@ -296,12 +296,12 @@
adf_nbuf_free(skb);
++pAdapter->stats.tx_dropped;
EPPING_LOG(VOS_TRACE_LEVEL_FATAL,
- "%s: Tx skb %p dropped, stats.tx_dropped = %ld\n",
+ "%s: Tx skb %pK dropped, stats.tx_dropped = %ld\n",
__func__, skb, pAdapter->stats.tx_dropped);
return -ENOMEM;
} else {
EPPING_LOG(VOS_TRACE_LEVEL_FATAL,
- "%s: nodrop: %p queued\n", __func__, skb);
+ "%s: nodrop: %pK queued\n", __func__, skb);
adf_nbuf_queue_add(&pAdapter->nodrop_queue, skb);
adf_os_spin_lock_bh(&pAdapter->data_lock);
if (pAdapter->epping_timer_state != EPPING_TX_TIMER_RUNNING) {
@@ -375,7 +375,7 @@
}
EPPING_LOG(VOS_TRACE_LEVEL_INFO,
- "%s skb=%p data=%p len=0x%x eid=%d ",
+ "%s skb=%pK data=%pK len=0x%x eid=%d ",
__func__, pktSkb, htc_pkt->pBuffer,
htc_pkt->ActualLength, eid);
@@ -404,7 +404,7 @@
pktSkb = adf_nbuf_queue_remove(&skb_queue);
if (pktSkb == NULL)
break;
- adf_nbuf_free(pktSkb);
+ adf_nbuf_tx_free(pktSkb, ADF_NBUF_PKT_ERROR);
pEpping_ctx->total_tx_acks++;
}
diff --git a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_txrx.c b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_txrx.c
index b2f9039..5fdad1e 100644
--- a/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_txrx.c
+++ b/drivers/staging/qcacld-2.0/CORE/EPPING/src/epping_txrx.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -270,7 +270,7 @@
pAdapter->started = true;
} else {
EPPING_LOG(VOS_TRACE_LEVEL_WARN,
- "%s: pAdapter %p already started\n", __func__, pAdapter);
+ "%s: pAdapter %pK already started\n", __func__, pAdapter);
}
return 0;
}
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h
index 1e52ac9..bc21021 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -268,6 +268,10 @@
QCASAP_PARAM_RX_STBC,
QCASAP_SET_RADAR_DBG,
QCSAP_PARAM_CHAN_WIDTH,
+ QCSAP_SET_DEFAULT_AMPDU,
+ QCSAP_ENABLE_RTS_BURSTING,
+ QCSAP_ENABLE_DYNAMIC_BW,
+ QCSAP_GET_DYNAMIC_BW,
};
int iw_get_channel_list(struct net_device *dev,
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h
index 0c6e0f3..3a73e5e 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -29,6 +29,7 @@
#define WLAN_HDD_ASSOC_H__
#include <wlan_hdd_mib.h>
#include <sme_Api.h>
+#include <linux/ieee80211.h>
#define HDD_MAX_NUM_IBSS_STA ( 32 )
#ifdef FEATURE_WLAN_TDLS
@@ -76,6 +77,75 @@
eConnectionState_NdiConnected,
}eConnectionState;
+/**
+ * struct hdd_conn_flag - connection flags
+ * @ht_present: ht element present or not
+ * @vht_present: vht element present or not
+ * @hs20_present: hs20 element present or not
+ * @ht_op_present: ht operation present or not
+ * @vht_op_present: vht operation present or not
+ */
+struct hdd_conn_flag {
+ uint8_t ht_present:1;
+ uint8_t vht_present:1;
+ uint8_t hs20_present:1;
+ uint8_t ht_op_present:1;
+ uint8_t vht_op_present:1;
+ uint8_t reserved:3;
+};
+
+/*defines for tx_BF_cap_info */
+#define TX_BF_CAP_INFO_TX_BF 0x00000001
+#define TX_BF_CAP_INFO_RX_STAG_RED_SOUNDING 0x00000002
+#define TX_BF_CAP_INFO_TX_STAG_RED_SOUNDING 0x00000004
+#define TX_BF_CAP_INFO_RX_ZFL 0x00000008
+#define TX_BF_CAP_INFO_TX_ZFL 0x00000010
+#define TX_BF_CAP_INFO_IMP_TX_BF 0x00000020
+#define TX_BF_CAP_INFO_CALIBRATION 0x000000c0
+#define TX_BF_CAP_INFO_CALIBRATION_SHIFT 6
+#define TX_BF_CAP_INFO_EXP_CSIT_BF 0x00000100
+#define TX_BF_CAP_INFO_EXP_UNCOMP_STEER_MAT 0x00000200
+#define TX_BF_CAP_INFO_EXP_BF_CSI_FB 0x00001c00
+#define TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT 10
+#define TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT 0x0000e000
+#define TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT 13
+#define TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB 0x00070000
+#define TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT 16
+#define TX_BF_CAP_INFO_CSI_NUM_BF_ANT 0x00180000
+#define TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT 18
+#define TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT 0x00600000
+#define TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT 20
+#define TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT 0x01800000
+#define TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT 22
+#define TX_BF_CAP_INFO_RSVD 0xfe000000
+
+/* defines for antenna selection info */
+#define ANTENNA_SEL_INFO 0x01
+#define ANTENNA_SEL_INFO_EXP_CSI_FB_TX 0x02
+#define ANTENNA_SEL_INFO_ANT_ID_FB_TX 0x04
+#define ANTENNA_SEL_INFO_EXP_CSI_FB 0x08
+#define ANTENNA_SEL_INFO_ANT_ID_FB 0x10
+#define ANTENNA_SEL_INFO_RX_AS 0x20
+#define ANTENNA_SEL_INFO_TX_SOUNDING_PPDU 0x40
+#define ANTENNA_SEL_INFO_RSVD 0x80
+
+/**
+ * struct rate_info - bitrate information
+ *
+ * Information about a receiving or transmitting bitrate
+ *
+ * @flags: bitflag of flags from &enum rate_info_flags
+ * @mcs: mcs index if struct describes a 802.11n bitrate
+ * @legacy: bitrate in 100kbit/s for 802.11abg
+ * @nss: number of streams (VHT only)
+ */
+struct rate_info_ex {
+ uint8_t flags;
+ uint8_t mcs;
+ uint16_t legacy;
+ uint8_t nss;
+};
+
/**This structure stores the connection information */
typedef struct connection_info_s
{
@@ -124,6 +194,48 @@
uint8_t nss;
uint32_t rate_flags;
+ /** Channel frequency */
+ uint32_t freq;
+
+ /** txrate structure holds nss & datarate info */
+ struct rate_info_ex txrate;
+
+ /** holds noise information */
+ int8_t noise;
+
+ /** holds ht capabilities info */
+ struct ieee80211_ht_cap ht_caps;
+
+ /** holds vht capabilities info */
+ struct ieee80211_vht_cap vht_caps;
+
+ /** flag conn info params is present or not */
+ struct hdd_conn_flag conn_flag;
+
+ /** holds passpoint/hs20 info */
+ tDot11fIEhs20vendor_ie hs20vendor_ie;
+
+ /** HT operation info */
+ struct ieee80211_ht_operation ht_operation;
+
+ /** VHT operation info */
+ struct ieee80211_vht_operation vht_operation;
+
+ /** roaming counter */
+ uint32_t roam_count;
+
+ /** holds rssi info */
+ int8_t signal;
+
+ /** holds assoc fail reason */
+ int32_t assoc_status_code;
+
+ /** holds last SSID info */
+ tCsrSSIDInfo last_ssid;
+
+ /** holds last auth type */
+ eCsrAuthType last_auth_type;
+
/* ptk installed state */
bool ptk_installed;
@@ -180,7 +292,5 @@
int hdd_get_peer_idx(hdd_station_ctx_t *sta_ctx, v_MACADDR_t *addr);
VOS_STATUS hdd_roamDeregisterSTA(hdd_adapter_t *adapter, uint8_t sta_id);
-void hdd_get_band(uint8_t channel, uint8_t *band);
-uint8_t hdd_is_mcc_in_2_band(hdd_context_t *hdd_ctx);
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h
index f3847aa..a4dc09d 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -58,6 +58,8 @@
//Number of items that can be configured
#define MAX_CFG_INI_ITEMS 1024
+#define MAX_PRB_REQ_VENDOR_OUI_INI_LEN 160
+#define VENDOR_SPECIFIC_IE_BITMAP 0x20000000
#ifdef SAP_AUTH_OFFLOAD
/* 802.11 pre-share key length */
@@ -300,6 +302,11 @@
#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
#define CFG_CHANNEL_BONDING_MODE_DEFAULT WNI_CFG_CHANNEL_BONDING_MODE_STADEF
+#define CFG_OVERRIDE_HT40_20_24GHZ_NAME "override_ht20_40_24g"
+#define CFG_OVERRIDE_HT40_20_24GHZ_MIN 0
+#define CFG_OVERRIDE_HT40_20_24GHZ_MAX 1
+#define CFG_OVERRIDE_HT40_20_24GHZ_DEFAULT 0
+
#define CFG_CHANNEL_BONDING_MODE_5GHZ_NAME "gChannelBondingMode5GHz"
#define CFG_CHANNEL_BONDING_MODE_MIN WNI_CFG_CHANNEL_BONDING_MODE_STAMIN
#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
@@ -460,9 +467,24 @@
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE "gWlanMccToSccSwitchMode"
-#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_MIN ( VOS_MCC_TO_SCC_SWITCH_DISABLE)
-#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_MAX ( VOS_MCC_TO_SCC_SWITCH_FORCE )
-#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_DEFAULT (VOS_MCC_TO_SCC_SWITCH_DISABLE)
+#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_MIN VOS_MCC_TO_SCC_SWITCH_DISABLE
+#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_MAX VOS_MCC_TO_SCC_SWITCH_FORCE
+#define CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_DEFAULT VOS_MCC_TO_SCC_SWITCH_DISABLE
+
+#define CFG_WLAN_BAND_SWITCH_ENABLE "gWlanBandSwitchEnable"
+#define CFG_WLAN_BAND_SWITCH_ENABLE_MIN ( 0 )
+#define CFG_WLAN_BAND_SWITCH_ENABLE_MAX ( 1 )
+#define CFG_WLAN_BAND_SWITCH_ENABLE_DEFAULT ( 0 )
+
+#define CFG_WLAN_AP_P2PGO_CONC_ENABLE "gWlanApP2pGOConcurrencyEnable"
+#define CFG_WLAN_AP_P2PGO_CONC_ENABLE_MIN ( 0 )
+#define CFG_WLAN_AP_P2PGO_CONC_ENABLE_MAX ( 1 )
+#define CFG_WLAN_AP_P2PGO_CONC_ENABLE_DEFAULT ( 0 )
+
+#define CFG_WLAN_AP_P2PGC_CONC_ENABLE "gWlanApP2pClientConcurEnable"
+#define CFG_WLAN_AP_P2PGC_CONC_ENABLE_MIN ( 0 )
+#define CFG_WLAN_AP_P2PGC_CONC_ENABLE_MAX ( 1 )
+#define CFG_WLAN_AP_P2PGC_CONC_ENABLE_DEFAULT ( 0 )
#endif
@@ -615,16 +637,6 @@
#define CFG_IDLE_TIME_MIN ( 0 )
#define CFG_IDLE_TIME_MAX ( 25 )
#define CFG_IDLE_TIME_DEFAULT ( 25 )
-
-#define CFG_NUM_STA_CHAN_COMBINED_CONC_NAME "gNumStaChanCombinedConc"
-#define CFG_NUM_STA_CHAN_COMBINED_CONC_MIN ( 1 )
-#define CFG_NUM_STA_CHAN_COMBINED_CONC_MAX ( 255 )
-#define CFG_NUM_STA_CHAN_COMBINED_CONC_DEFAULT ( 3 )
-
-#define CFG_NUM_P2P_CHAN_COMBINED_CONC_NAME "gNumP2PChanCombinedConc"
-#define CFG_NUM_P2P_CHAN_COMBINED_CONC_MIN ( 1 )
-#define CFG_NUM_P2P_CHAN_COMBINED_CONC_MAX ( 255 )
-#define CFG_NUM_P2P_CHAN_COMBINED_CONC_DEFAULT ( 1 )
#endif
#define CFG_MAX_PS_POLL_NAME "gMaxPsPoll"
@@ -720,7 +732,7 @@
#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_NAME "gStaKeepAlivePeriod"
#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_MIN ( 0 )
#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_MAX ( 65535)
-#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_DEFAULT ( 0 )
+#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_DEFAULT ( 30 )
//WMM configuration
#define CFG_QOS_WMM_MODE_NAME "WmmIsEnabled"
@@ -728,6 +740,11 @@
#define CFG_QOS_WMM_MODE_MAX (2) //HDD_WMM_NO_QOS
#define CFG_QOS_WMM_MODE_DEFAULT (0) //HDD_WMM_AUTO
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_NAME "gStaLocalEDCAForETSI"
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MIN (0)
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MAX (1)
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_DEFAULT (0)
+
#define CFG_QOS_WMM_80211E_ENABLED_NAME "80211eIsEnabled"
#define CFG_QOS_WMM_80211E_ENABLED_MIN (0)
#define CFG_QOS_WMM_80211E_ENABLED_MAX (1)
@@ -1252,7 +1269,7 @@
#define CFG_ENABLE_HOST_ARPOFFLOAD_NAME "hostArpOffload"
#define CFG_ENABLE_HOST_ARPOFFLOAD_MIN ( 0 )
#define CFG_ENABLE_HOST_ARPOFFLOAD_MAX ( 1 )
-#define CFG_ENABLE_HOST_ARPOFFLOAD_DEFAULT ( 0 )
+#define CFG_ENABLE_HOST_ARPOFFLOAD_DEFAULT ( 1 )
#define CFG_ENABLE_HOST_SSDP_NAME "ssdp"
#define CFG_ENABLE_HOST_SSDP_MIN ( 0 )
@@ -1281,7 +1298,7 @@
#define CFG_ENABLE_HOST_NSOFFLOAD_NAME "hostNSOffload"
#define CFG_ENABLE_HOST_NSOFFLOAD_MIN ( 0 )
#define CFG_ENABLE_HOST_NSOFFLOAD_MAX ( 1 )
-#define CFG_ENABLE_HOST_NSOFFLOAD_DEFAULT ( 0 )
+#define CFG_ENABLE_HOST_NSOFFLOAD_DEFAULT ( 1 )
#define CFG_BAND_CAPABILITY_NAME "BandCapability"
@@ -1294,11 +1311,6 @@
#define CFG_ENABLE_BEACON_EARLY_TERMINATION_MAX ( 1 )
#define CFG_ENABLE_BEACON_EARLY_TERMINATION_DEFAULT ( 0 )
-#define CFG_ENABLE_CLOSE_LOOP_NAME "gEnableCloseLoop"
-#define CFG_ENABLE_CLOSE_LOOP_MIN WNI_CFG_FIXED_RATE_STAMIN
-#define CFG_ENABLE_CLOSE_LOOP_MAX WNI_CFG_FIXED_RATE_STAMAX
-#define CFG_ENABLE_CLOSE_LOOP_DEFAULT WNI_CFG_FIXED_RATE_STADEF
-
#define CFG_ENABLE_BYPASS_11D_NAME "gEnableBypass11d"
#define CFG_ENABLE_BYPASS_11D_MIN ( 0 )
#define CFG_ENABLE_BYPASS_11D_MAX ( 1 )
@@ -1319,6 +1331,25 @@
#define CFG_ENABLE_RAMDUMP_COLLECTION_MAX ( 1 )
#define CFG_ENABLE_RAMDUMP_COLLECTION_DEFAULT ( 1 )
+/*
+ * gStaAuthRetriesForCode17
+ * It is for an IOT issue.
+ * When DUT receives MAX_ASSOC_STA_REACHED_STATUS as
+ * response for Auth frame this ini decides how many
+ * times DUT has to retry.
+ *
+ * This is mainly for an AP where it wants to force
+ * the Station to connect to its 5G profile session
+ * (Dual band AP) by rejecting the Auth on 2.4G band.
+ * But if a station is only 2.4G capable it can try
+ * 3 times where third time AP will allow the
+ * station to connect to this AP.
+ */
+#define CFG_STA_AUTH_RETRIES_FOR_CODE17_NAME "gStaAuthRetriesForCode17"
+#define CFG_STA_AUTH_RETRIES_FOR_CODE17_MIN ( 0 )
+#define CFG_STA_AUTH_RETRIES_FOR_CODE17_MAX ( 5 )
+#define CFG_STA_AUTH_RETRIES_FOR_CODE17_DEFAULT ( 0 )
+
typedef enum
{
eHDD_LINK_SPEED_REPORT_ACTUAL = 0,
@@ -1362,20 +1393,62 @@
#define CFG_ENABLE_VHT_DYNAMIC_STA_CHAINMASK_DEFAULT (0)
/*
+ * gChainMask_2g: to set RX chainmask for 2.4GH if
+ * per band chainmask is supported
+ *
* Valid chain mask values.
* 01 - enables chain0
* 02 - enables chain1
* 03 - enables both chain 0 and chain 1
*/
-#define CFG_CHAIN_MASK_2G "gChainMask_2g"
-#define CFG_CHAIN_MASK_2G_MIN ( 1 )
-#define CFG_CHAIN_MASK_2G_MAX ( 3 )
-#define CFG_CHAIN_MASK_2G_DEFAULT ( 3 )
+#define CFG_RX_CHAIN_MASK_2G "gChainMask_2g"
+#define CFG_RX_CHAIN_MASK_2G_MIN (1)
+#define CFG_RX_CHAIN_MASK_2G_MAX (3)
+#define CFG_RX_CHAIN_MASK_2G_DEFAULT (3)
-#define CFG_CHAIN_MASK_5G "gChainMask_5g"
-#define CFG_CHAIN_MASK_5G_MIN ( 1 )
-#define CFG_CHAIN_MASK_5G_MAX ( 3 )
-#define CFG_CHAIN_MASK_5G_DEFAULT ( 3 )
+/*
+ * gChainMask_5g: to set RX chainmask for 5GH if
+ * per band chainmask is supported
+ *
+ * Valid chain mask values.
+ * 01 - enables chain0
+ * 02 - enables chain1
+ * 03 - enables both chain 0 and chain 1
+ */
+#define CFG_RX_CHAIN_MASK_5G "gChainMask_5g"
+#define CFG_RX_CHAIN_MASK_5G_MIN (1)
+#define CFG_RX_CHAIN_MASK_5G_MAX (3)
+#define CFG_RX_CHAIN_MASK_5G_DEFAULT (3)
+
+/*
+ * gChainMask_2g_tx: to set TX chainmask for 2.4GH if
+ * per band chainmask is supported
+ *
+ * Valid chain mask values.
+ * 01 - enables chain0
+ * 02 - enables chain1
+ * 03 - enables both chain 0 and chain 1
+ */
+#define CFG_TX_CHAIN_MASK_2G "gChainMask_2g_tx"
+#define CFG_TX_CHAIN_MASK_2G_MIN (1)
+#define CFG_TX_CHAIN_MASK_2G_MAX (3)
+#define CFG_TX_CHAIN_MASK_2G_DEFAULT (3)
+
+/*
+ * gChainMask_5g_tx: to set TX chainmask for 5GH if
+ * per band chainmask is supported
+ *
+ * Valid chain mask values.
+ * 01 - enables chain0
+ * 02 - enables chain1
+ * 03 - enables both chain 0 and chain 1
+ */
+#define CFG_TX_CHAIN_MASK_5G "gChainMask_5g_tx"
+#define CFG_TX_CHAIN_MASK_5G_MIN (1)
+#define CFG_TX_CHAIN_MASK_5G_MAX (3)
+#define CFG_TX_CHAIN_MASK_5G_DEFAULT (3)
+
+
/*
* NSS cfg bit definition.
* STA BIT[0:1]
@@ -1443,6 +1516,11 @@
#define CFG_DISABLE_DFS_CH_SWITCH_MAX ( 1 )
#define CFG_DISABLE_DFS_CH_SWITCH_DEFAULT ( 0 )
+#define CFG_ENABLE_RADAR_WAR "gEnableRadarAssocWar"
+#define CFG_ENABLE_RADAR_WAR_MIN ( 0 )
+#define CFG_ENABLE_RADAR_WAR_MAX ( 1 )
+#define CFG_ENABLE_RADAR_WAR_DEFAULT ( 1 )
+
#define CFG_ENABLE_DFS_MASTER_CAPABILITY "gEnableDFSMasterCap"
#define CFG_ENABLE_DFS_MASTER_CAPABILITY_MIN ( 0 )
#define CFG_ENABLE_DFS_MASTER_CAPABILITY_MAX ( 1 )
@@ -1476,6 +1554,135 @@
#define CFG_REPORT_MAX_LINK_SPEED_MAX ( eHDD_LINK_SPEED_REPORT_MAX_SCALED )
#define CFG_REPORT_MAX_LINK_SPEED_DEFAULT ( eHDD_LINK_SPEED_REPORT_MAX_SCALED )
+#define CFG_SET_RTS_FOR_SIFS_BURSTING "gSetRTSForSIFSBursting"
+#define CFG_SET_RTS_FOR_SIFS_BURSTING_MIN (0)
+#define CFG_SET_RTS_FOR_SIFS_BURSTING_MAX (1)
+#define CFG_SET_RTS_FOR_SIFS_BURSTING_DEFAULT (0)
+
+#define CFG_MAX_MPDUS_IN_AMPDU "gMaxMPDUsInAMPDU"
+#define CFG_MAX_MPDUS_IN_AMPDU_MIN (0)
+#define CFG_MAX_MPDUS_IN_AMPDU_MAX (64)
+#define CFG_MAX_MPDUS_IN_AMPDU_DEFAULT (0)
+
+/*
+ * <ini>
+ * gMaxHTMCSForTxData - max HT mcs for TX
+ * @Min: 0
+ * @Max: 383
+ * @Default: 0
+ *
+ * This ini is used to configure the max HT mcs
+ * for tx data.
+ *
+ * Usage: External
+ *
+ * bits 0-15: max HT mcs
+ * bits 16-31: zero to disable, otherwise enable.
+ *
+ * </ini>
+ */
+#define CFG_MAX_HT_MCS_FOR_TX_DATA "gMaxHTMCSForTxData"
+#define CFG_MAX_HT_MCS_FOR_TX_DATA_MIN (WNI_CFG_MAX_HT_MCS_TX_DATA_STAMIN)
+#define CFG_MAX_HT_MCS_FOR_TX_DATA_MAX (WNI_CFG_MAX_HT_MCS_TX_DATA_STAMAX)
+#define CFG_MAX_HT_MCS_FOR_TX_DATA_DEFAULT (WNI_CFG_MAX_HT_MCS_TX_DATA_STADEF)
+
+/*
+ * <ini>
+ * gSapGetPeerInfo - Enable/Disable remote peer info query support
+ * @Min: 0 - Disable remote peer info query support
+ * @Max: 1 - Enable remote peer info query support
+ * @Default: 0
+ *
+ * This ini is used to enable/disable remote peer info query support
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SAP_GET_PEER_INFO "gSapGetPeerInfo"
+#define CFG_SAP_GET_PEER_INFO_MIN (0)
+#define CFG_SAP_GET_PEER_INFO_MAX (1)
+#define CFG_SAP_GET_PEER_INFO_DEFAULT (0)
+
+/*
+ * <ini>
+ * gDisableABGRateForTxData - disable abg rate for tx data
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to disable abg rate for tx data.
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_DISABLE_ABG_RATE_FOR_TX_DATA "gDisableABGRateForTxData"
+#define CFG_DISABLE_ABG_RATE_FOR_TX_DATA_MIN (WNI_CFG_DISABLE_ABG_RATE_FOR_TX_DATA_STAMIN)
+#define CFG_DISABLE_ABG_RATE_FOR_TX_DATA_MAX (WNI_CFG_DISABLE_ABG_RATE_FOR_TX_DATA_STAMAX)
+#define CFG_DISABLE_ABG_RATE_FOR_TX_DATA_DEFAULT (WNI_CFG_DISABLE_ABG_RATE_FOR_TX_DATA_STADEF)
+
+/*
+ * <ini>
+ * gRateForTxMgmt - rate for tx mgmt frame
+ * @Min: 0x0
+ * @Max: 0xFF
+ * @Default: 0xFF
+ *
+ * This ini is used to configure the rate for tx
+ * mgmt frame. Default 0xFF means disable.
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RATE_FOR_TX_MGMT "gRateForTxMgmt"
+#define CFG_RATE_FOR_TX_MGMT_MIN (WNI_CFG_RATE_FOR_TX_MGMT_STAMIN)
+#define CFG_RATE_FOR_TX_MGMT_MAX (WNI_CFG_RATE_FOR_TX_MGMT_STAMAX)
+#define CFG_RATE_FOR_TX_MGMT_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_STADEF)
+
+/*
+ * <ini>
+ * gRateForTxMgmt2G - rate for tx mgmt frame on 2G
+ * @Min: 0x0
+ * @Max: 0xFF
+ * @Default: 0xFF
+ *
+ * This ini is used to configure the rate for tx
+ * mgmt frame on 2G Band. Default 0xFF means disable.
+ * It has higher priority and will overwrite gRateForTxMgmt
+ * setting.
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RATE_FOR_TX_MGMT_2G "gRateForTxMgmt2G"
+#define CFG_RATE_FOR_TX_MGMT_2G_MIN (WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMIN)
+#define CFG_RATE_FOR_TX_MGMT_2G_MAX (WNI_CFG_RATE_FOR_TX_MGMT_2G_STAMAX)
+#define CFG_RATE_FOR_TX_MGMT_2G_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_2G_STADEF)
+
+/*
+ * <ini>
+ * gRateForTxMgmt5G - rate for tx mgmt frame on 5G
+ * @Min: 0x0
+ * @Max: 0xFF
+ * @Default: 0xFF
+ *
+ * This ini is used to configure the rate for tx
+ * mgmt frame on 5G Band. Default 0xFF means disable.
+ * It has higher priority and will overwrite gRateForTxMgmt
+ * setting.
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RATE_FOR_TX_MGMT_5G "gRateForTxMgmt5G"
+#define CFG_RATE_FOR_TX_MGMT_5G_MIN (WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMIN)
+#define CFG_RATE_FOR_TX_MGMT_5G_MAX (WNI_CFG_RATE_FOR_TX_MGMT_5G_STAMAX)
+#define CFG_RATE_FOR_TX_MGMT_5G_DEFAULT (WNI_CFG_RATE_FOR_TX_MGMT_5G_STADEF)
+
/*
* RSSI Thresholds
* Used when eHDD_LINK_SPEED_REPORT_SCALED is selected
@@ -1744,7 +1951,6 @@
#define CFG_AUTO_CHANNEL_SELECT_WEIGHT_MAX (0xFFFFFFFF)
#define CFG_AUTO_CHANNEL_SELECT_WEIGHT_DEFAULT (0x000000FF)
-
#define CFG_ACS_BAND_SWITCH_THRESHOLD "gACSBandSwitchThreshold"
#define CFG_ACS_BAND_SWITCH_THRESHOLD_MIN (0)
#define CFG_ACS_BAND_SWITCH_THRESHOLD_MAX (26664)
@@ -1807,11 +2013,6 @@
#define CFG_IGNORE_DYNAMIC_DTIM_IN_P2P_MODE_DEFAULT ( 0 )
-#define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_NAME "gEnableAutomaticTxPowerControl"
-#define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_MIN ( 0 )
-#define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_MAX ( 1 )
-#define CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_DEFAULT ( 1 )
-
#define CFG_SHORT_GI_40MHZ_NAME "gShortGI40Mhz"
#define CFG_SHORT_GI_40MHZ_MIN 0
#define CFG_SHORT_GI_40MHZ_MAX 1
@@ -1999,45 +2200,25 @@
* then throtling level will get increased by one level and
* will reduce TX duty by the given percentage
*/
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_NAME "g2gThrottleDutyCycleLevel0"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_MAX ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_DEFAULT ( 0 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_NAME "gThrottleDutyCycleLevel0"
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_MIN ( 0 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_MAX ( 0 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_DEFAULT ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_NAME "g2gThrottleDutyCycleLevel1"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_MAX ( 100 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_DEFAULT ( 50 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_NAME "gThrottleDutyCycleLevel1"
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_MIN ( 0 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_MAX ( 100 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_DEFAULT ( 50 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_NAME "g2gThrottleDutyCycleLevel2"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_MAX ( 100 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_DEFAULT ( 75 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_NAME "gThrottleDutyCycleLevel2"
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_MIN ( 0 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_MAX ( 100 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_DEFAULT ( 75 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_NAME "g2gThrottleDutyCycleLevel3"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_MAX ( 100 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_DEFAULT ( 94 )
-
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_NAME "g5gThrottleDutyCycleLevel0"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_MAX ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_DEFAULT ( 0 )
-
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_NAME "g5gThrottleDutyCycleLevel1"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_MAX ( 100 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_DEFAULT ( 50 )
-
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_NAME "g5gThrottleDutyCycleLevel2"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_MAX ( 100 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_DEFAULT ( 75 )
-
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_NAME "g5gThrottleDutyCycleLevel3"
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_MIN ( 0 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_MAX ( 100 )
-#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_DEFAULT ( 94 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_NAME "gThrottleDutyCycleLevel3"
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_MIN ( 0 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_MAX ( 100 )
+#define CFG_THROTTLE_DUTY_CYCLE_LEVEL3_DEFAULT ( 94 )
#define CFG_THERMAL_TEMP_MIN_LEVEL0_NAME "gThermalTempMinLevel0"
#define CFG_THERMAL_TEMP_MIN_LEVEL0_MIN ( 0 )
@@ -2079,6 +2260,139 @@
#define CFG_THERMAL_TEMP_MAX_LEVEL3_MAX ( 1000 )
#define CFG_THERMAL_TEMP_MAX_LEVEL3_DEFAULT ( 0 )
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+/*
+ * <ini>
+ * gThermalShutdownEnable - Enable/Disable Thermal Shutdown feature to protect
+ IC too hot and die
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini is used to enable/disable Thermal Shutdown feature
+ *
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_ENABLE_NAME "gThermalShutdownEnable"
+#define CFG_THERMAL_SHUTDOWN_ENABLE_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_ENABLE_MAX ( 1 )
+#define CFG_THERMAL_SHUTDOWN_ENABLE_DEFAULT ( 1 )
+
+/*
+ * <ini>
+ * gThermalShutdownAutoEnable - Enable/Disable Automatic Thermal Shutdown
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * In Automatic mode, host driver send the suspend command if the condition is
+ * meet, or else the command is send by host app.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_NAME "gThermalShutdownAutoEnable"
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MAX ( 1 )
+#define CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_DEFAULT ( 1 )
+
+/*
+ * <ini>
+ * gThermalShutdownTempSuspend - Temperature threshold of suspend
+ * @Min: 0
+ * @Max: 1000
+ * @Default: 117
+ *
+ * If the reported temperature from firmware is higher than this threshold,
+ * the suspend command will be sent to shutdown the target.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_NAME "gThermalShutdownTempSuspend"
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MAX ( 1000 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_DEFAULT ( 117 )
+
+/*
+ * <ini>
+ * gThermalShutdownTempWarning - Temperature threshold of warning.
+ * @Min: 0
+ * @Max: 1000
+ * @Default: 115
+ *
+ * Firmware report temperature to host as indication if the temperature is
+ * higher than this threshold.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_NAME "gThermalShutdownTempWarning"
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MAX ( 1000 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_WARNING_DEFAULT ( 115 )
+
+/*
+ * <ini>
+ * gThermalShutdownTempResume - Temperature threshold of resume
+ * @Min: 0
+ * @Max: 1000
+ * @Default: 113
+ *
+ * If the reported temperature from firmware is lower than this threshold,
+ * the resume command will be sent to shutdown the target.
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_NAME "gThermalShutdownTempResume"
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MIN ( 0 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MAX ( 1000 )
+#define CFG_THERMAL_SHUTDOWN_TEMP_RESUME_DEFAULT ( 113 )
+
+/*
+ * <ini>
+ * gThermalSampleRate - The sample rate of temperature for firmware
+ * @Min: 1000
+ * @Max: 10000
+ * @Default: 5000
+ *
+ * Thermal Sample Rate (in milliseconds) used by FW to sample temperature of IC
+ *
+ *
+ * Supported Feature: Thermal Shutdown
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_THERMAL_SAMPLE_RATE_NAME "gThermalSampleRate"
+#define CFG_THERMAL_SAMPLE_RATE_MIN ( 1000 )
+#define CFG_THERMAL_SAMPLE_RATE_MAX ( 10000 )
+#define CFG_THERMAL_SAMPLE_RATE_DEFAULT ( 5000 )
+#endif /* FEATURE_WLAN_THERMAL_SHUTDOWN */
/*
* Enable/Disable Modulated DTIM feature
@@ -2239,7 +2553,7 @@
#define CFG_TDLS_EXTERNAL_CONTROL "gTDLSExternalControl"
#define CFG_TDLS_EXTERNAL_CONTROL_MIN (0)
#define CFG_TDLS_EXTERNAL_CONTROL_MAX (1)
-#define CFG_TDLS_EXTERNAL_CONTROL_DEFAULT (0)
+#define CFG_TDLS_EXTERNAL_CONTROL_DEFAULT (1)
#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE "gEnableTDLSOffChannel"
#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_MIN (0)
@@ -2300,6 +2614,12 @@
#endif
+/* Timer to defer for enabling TDLS on P2P listen (Value in milliseconds) */
+#define CFG_TDLS_ENABLE_DEFER_TIMER "gTDLSEnableDeferTime"
+#define CFG_TDLS_ENABLE_DEFER_TIMER_MIN (2000)
+#define CFG_TDLS_ENABLE_DEFER_TIMER_MAX (6000)
+#define CFG_TDLS_ENABLE_DEFER_TIMER_DEFAULT (5000)
+
#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
#define CFG_ACTIVEMODE_OFFLOAD_ENABLE "gEnableActiveModeOffload"
#define CFG_ACTIVEMODE_OFFLOAD_ENABLE_MIN ( 0 )
@@ -2726,12 +3046,16 @@
* 0x1 - Enable mgmt pkt logs (no probe req/rsp).
* 0x2 - Enable EAPOL pkt logs.
* 0x4 - Enable DHCP pkt logs.
+ * 0x8 - Enable mgmt. action pkt logs.
+ * 0x10 - Enable ARP packet logs.
+ * 0x20 - Enable ICMPv6 NS packet logs.
+ * 0x40 - Enable ICMPv6 NA packet logs.
* 0x0 - Disable all the above connection related logs.
*/
#define CFG_ENABLE_DEBUG_CONNECT_ISSUE "gEnableDebugLog"
#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_MIN (0)
#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_MAX (0xFF)
-#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_DEFAULT (6)
+#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_DEFAULT (0x76)
/*
* RX packet handling options
@@ -3007,6 +3331,36 @@
#endif /* QCA_SUPPORT_TXRX_HL_BUNDLE */
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+
+#define CFG_DEL_ACK_THRESHOLD_HIGH "gDriverDelAckHighThreshold"
+#define CFG_DEL_ACK_THRESHOLD_HIGH_DEFAULT (300)
+#define CFG_DEL_ACK_THRESHOLD_HIGH_MIN (0)
+#define CFG_DEL_ACK_THRESHOLD_HIGH_MAX (70000)
+
+#define CFG_DEL_ACK_THRESHOLD_LOW "gDriverDelAckLowThreshold"
+#define CFG_DEL_ACK_THRESHOLD_LOW_DEFAULT (100)
+#define CFG_DEL_ACK_THRESHOLD_LOW_MIN (0)
+#define CFG_DEL_ACK_THRESHOLD_LOW_MAX (70000)
+
+#define CFG_DEL_ACK_TIMER_IN_MS "gDriverDelAckTimerValue"
+#define CFG_DEL_ACK_TIMER_IN_MS_DEFAULT (3)
+#define CFG_DEL_ACK_TIMER_IN_MS_MIN (1)
+#define CFG_DEL_ACK_TIMER_IN_MS_MAX (15)
+
+#define CFG_DEL_ACK_PKT_COUNT "gDriverDelAckPktCount"
+#define CFG_DEL_ACK_PKT_COUNT_DEFAULT (20)
+#define CFG_DEL_ACK_PKT_COUNT_MIN (0)
+#define CFG_DEL_ACK_PKT_COUNT_MAX (50)
+
+#define CFG_DEL_ACK_ENABLE "gDriverDelAckEnable"
+#define CFG_DEL_ACK_ENABLE_DEFAULT (1)
+#define CFG_DEL_ACK_ENABLE_MIN (0)
+#define CFG_DEL_ACK_ENABLE_MAX (1)
+
+#endif /* QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK */
+
+
#ifdef WLAN_FEATURE_11W
#define CFG_PMF_SA_QUERY_MAX_RETRIES_NAME "pmfSaQueryMaxRetries"
#define CFG_PMF_SA_QUERY_MAX_RETRIES_DEFAULT ( 5 )
@@ -3020,7 +3374,11 @@
#endif
#define CFG_MAX_CONCURRENT_CONNECTIONS_NAME "gMaxConcurrentActiveSessions"
+#ifdef WLAN_4SAP_CONCURRENCY
+#define CFG_MAX_CONCURRENT_CONNECTIONS_DEFAULT ( 4 )
+#else
#define CFG_MAX_CONCURRENT_CONNECTIONS_DEFAULT ( 2 )
+#endif
#define CFG_MAX_CONCURRENT_CONNECTIONS_MIN ( 1 )
#define CFG_MAX_CONCURRENT_CONNECTIONS_MAX ( 4 )
@@ -3043,6 +3401,27 @@
#define CFG_REORDER_OFFLOAD_SUPPORT_MAX ( 1 )
#define CFG_REORDER_OFFLOAD_SUPPORT_DEFAULT ( 0 )
+/*
+ * <ini>
+ * gEnableHostapdEdca - Use hostapd EDCA local params
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable using hostapd
+ * EDCA local params.
+ *
+ * Supported Feature: EDCA
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_EDCA_FROM_HOSTAPD "gEnableHostapdEdcaLocal"
+#define CFG_EDCA_FROM_HOSTAPD_MIN ( 0 )
+#define CFG_EDCA_FROM_HOSTAPD_MAX ( 1 )
+#define CFG_EDCA_FROM_HOSTAPD_DEFAULT ( 0 )
+
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
#define CFG_ROAMING_OFFLOAD_NAME "gRoamOffloadEnabled"
#define CFG_ROAMING_OFFLOAD_MIN (0)
@@ -3127,6 +3506,32 @@
#define CFG_ENABLE_NAN_SUPPORT_MAX (1)
#endif
+/*
+ * <ini>
+ * gEnableAcTxqOptimize
+ * @Min: 0
+ * @Max: 0x13
+ * @Default: 0
+ *
+ * This ini is used to enable one AC tx queue optimize
+ *
+ * Usage: Internal/External
+ *
+ * bits 0-1: WMM_AC_BE 0
+ * WMM_AC_BK 1
+ * WMM_AC_VI 2
+ * WMM_AC_VO 3
+ * bits 2-3: reserved
+ * bits 4: Enalbe
+ * bits 5-7: reserved
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE "gEnableAcTxqOptimize"
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE_MIN ( 0x0 )
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE_MAX ( 0x13 )
+#define CFG_ENABLE_AC_TXQ_OPTIMIZE_DEFAULT ( 0x0 )
+
#define CFG_ENABLE_SELF_RECOVERY "gEnableSelfRecovery"
#define CFG_ENABLE_SELF_RECOVERY_MIN ( 0 )
#define CFG_ENABLE_SELF_RECOVERY_MAX ( 1 )
@@ -3492,6 +3897,101 @@
#define CFG_BTC_ANTENNA_ISOLATION_MAX (100)
#define CFG_BTC_ANTENNA_ISOLATION_DEFAULT (0)
+/**
+* For P2P + STA + BT Paging
+* gBTIntervalPageP2PSTA/gWLIntervalPageP2PSTA intervals length (in ms) during
+* intervals length (in ms) during WLAN P2P + STA (multi vdev) + BT Paging,
+* min 20ms, max 200ms
+* Customer could change these parameters' value to improve P2P throughput
+* during BT Page
+* gBTIntervalPageP2PSTA=80
+* gWLIntervalPageP2PSTA=30
+*/
+#define CFG_BTC_BT_INTERVAL_PAGE_P2P_STA "gBTIntervalPageP2PSTA"
+#define CFG_BTC_BT_INTERVAL_PAGE_P2P_STA_MIN (20)
+#define CFG_BTC_BT_INTERVAL_PAGE_P2P_STA_MAX (200)
+#define CFG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT (80)
+
+#define CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA "gWLIntervalPageP2PSTA"
+#define CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA_MIN (20)
+#define CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA_MAX (200)
+#define CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA_DEFAULT (30)
+
+/**
+FG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT
+* intervals length (in ms) during WLAN STA (single vdev) + BT Inquiry,
+* min 20ms, max 200ms
+* Customer could change these parameters' value to improve STA throughput
+* during BT Inquiry
+* gBTIntervalInquirySTA=120
+* gWLIntervalInquirySTA=30
+*/
+#define CFG_BTC_BT_INTERVAL_INQ_STA "gBTIntervalInquirySTA"
+#define CFG_BTC_BT_INTERVAL_INQ_STA_MIN (20)
+#define CFG_BTC_BT_INTERVAL_INQ_STA_MAX (200)
+#define CFG_BTC_BT_INTERVAL_INQ_STA_DEFAULT (120)
+
+#define CFG_BTC_WLAN_INTERVAL_INQ_STA "gWLIntervalInquirySTA"
+#define CFG_BTC_WLAN_INTERVAL_INQ_STA_MIN (20)
+#define CFG_BTC_WLAN_INTERVAL_INQ_STA_MAX (200)
+#define CFG_BTC_WLAN_INTERVAL_INQ_STA_DEFAULT (30)
+
+/**
+* For SAP + BT Inquiry
+* intervals length (in ms) during WLAN SAP (single vdev) + BT Inquiry,
+* min 20ms, max 200ms
+* Customer could change these parameters' value to improve SAP throughput
+* during BT Inquiry
+* gBTIntervalInquirySAP=120
+* gWLIntervalInquirySAP=30
+*/
+#define CFG_BTC_BT_INTERVAL_INQ_SAP "gBTIntervalInquirySAP"
+#define CFG_BTC_BT_INTERVAL_INQ_SAP_MIN (20)
+#define CFG_BTC_BT_INTERVAL_INQ_SAP_MAX (200)
+#define CFG_BTC_BT_INTERVAL_INQ_SAP_DEFAULT (120)
+
+#define CFG_BTC_WLAN_INTERVAL_INQ_SAP "gWLIntervalInquirySAP"
+#define CFG_BTC_WLAN_INTERVAL_INQ_SAP_MIN (20)
+#define CFG_BTC_WLAN_INTERVAL_INQ_SAP_MAX (200)
+#define CFG_BTC_WLAN_INTERVAL_INQ_SAP_DEFAULT (30)
+
+/**
+* For P2P + BT Inquiry
+* intervals length (in ms) during WLAN P2P (single vdev) + BT Inquiry,
+* min 20ms, max 200ms
+* Customer could change these parameters' value to improve P2P throughput
+* during BT Inquiry
+* gBTIntervalInquiryP2P=120
+* gWLIntervalInquiryP2P=30
+*/
+#define CFG_BTC_BT_INTERVAL_INQ_P2P "gBTIntervalInquiryP2P"
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_MIN (20)
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_MAX (200)
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_DEFAULT (120)
+
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P "gWLIntervalInquiryP2P"
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_MIN (20)
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_MAX (200)
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_DEFAULT (30)
+
+/**
+* For P2P + STA + BT Inquiry
+* intervals length (in ms) during WLAN P2P + STA (multi vdev) + BT Inquiry,
+* min 20ms, max 200ms
+* Customer could change these parameters' value to improve P2P throughput
+* during BT Inquiry
+* gBTIntervalInquiryP2PSTA=80
+* gWLIntervalInquiryP2PSTA=30
+*/
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_STA "gBTIntervalInquiryP2PSTA"
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_STA_MIN (20)
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_STA_MAX (200)
+#define CFG_BTC_BT_INTERVAL_INQ_P2P_STA_DEFAULT (80)
+
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA "gWLIntervalInquiryP2PSTA"
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA_MIN (20)
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA_MAX (200)
+#define CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA_DEFAULT (30)
/**
* Config to set WLAN/BT coex tx power
@@ -3503,19 +4003,6 @@
#define CFG_BTC_WLAN_COEX_TX_POWER_MAX (63)
#define CFG_BTC_WLAN_COEX_TX_POWER_DEFAULT (63)
-/* Config to set WLAN on the uplink periodically pauses and unpauses its data queues */
-#ifdef WMI_COEX_BTC_DUTYCYCLE
-#define CFG_COEX_PAUSE_NAME "gCoexWLANPauseDuration"
-#define CFG_COEX_PAUSE_MIN (0)
-#define CFG_COEX_PAUSE_MAX (100)
-#define CFG_COEX_PAUSE_DEFAULT (30)
-
-#define CFG_COEX_UNPAUSE_NAME "gCoexWLANUnpauseDuration"
-#define CFG_COEX_UNPAUSE_MIN (0)
-#define CFG_COEX_UNPAUSE_MAX (100)
-#define CFG_COEX_UNPAUSE_DEFAULT (30)
-#endif
-
/* Parameters for roaming scans performed at high RSSI */
/* Maximum number of scans after RSSI change */
@@ -3558,6 +4045,18 @@
#define TSF_GPIO_PIN_INVALID (255)
#define CFG_SET_TSF_GPIO_PIN_DEFAULT (TSF_GPIO_PIN_INVALID)
+#ifdef WLAN_FEATURE_TSF_PLUS
+/* PTP options */
+#define CFG_SET_TSF_PTP_OPT_NAME "gtsf_ptp_options"
+#define CFG_SET_TSF_PTP_OPT_MIN (0)
+#define CFG_SET_TSF_PTP_OPT_MAX (0xff)
+#define CFG_SET_TSF_PTP_OPT_RX (0x1)
+#define CFG_SET_TSF_PTP_OPT_TX (0x2)
+#define CFG_SET_TSF_PTP_OPT_RAW (0x4)
+#define CFG_SET_TSF_DBG_FS (0x8)
+#define CFG_SET_TSF_PTP_OPT_DEFAULT (0xf)
+#endif
+
#define CFG_MULTICAST_HOST_FW_MSGS "gMulticastHostFwMsgs"
#define CFG_MULTICAST_HOST_FW_MSGS_MIN (0)
#define CFG_MULTICAST_HOST_FW_MSGS_MAX (1)
@@ -3573,6 +4072,11 @@
#define CFG_TX_CHAIN_MASK_1SS_MAX (3)
#define CFG_TX_CHAIN_MASK_1SS_DEFAULT (1)
+#define CFG_TX_SCH_DELAY "gTxSchDelay"
+#define CFG_TX_SCH_DELAY_MIN (0)
+#define CFG_TX_SCH_DELAY_MAX (1)
+#define CFG_TX_SCH_DELAY_DEFAULT (1)
+
#define CFG_SELF_GEN_FRM_PWR "gSelfGenFrmPwr"
#define CFG_SELF_GEN_FRM_PWR_MIN (0)
#define CFG_SELF_GEN_FRM_PWR_MAX (0xffff)
@@ -3991,10 +4495,10 @@
#define CFG_TGT_GTX_USR_CFG_MAX (32)
#define CFG_TGT_GTX_USR_CFG_DEFAULT (32)
-#define CFG_CH_AVOID_SAP_RESTART_NAME "sap_ch_avoid_restart"
-#define CFG_CH_AVOID_SAP_RESTART_MIN (0)
-#define CFG_CH_AVOID_SAP_RESTART_MAX (1)
-#define CFG_CH_AVOID_SAP_RESTART_DEFAULT (0)
+#define CFG_SAP_INTERNAL_RESTART_NAME "gEnableSapInternalRestart"
+#define CFG_SAP_INTERNAL_RESTART_MIN (0)
+#define CFG_SAP_INTERNAL_RESTART_MAX (1)
+#define CFG_SAP_INTERNAL_RESTART_DEFAULT (1)
/*
* This parameter will help to debug ssr reinit failure issues
@@ -4056,6 +4560,15 @@
#define CFG_SIFS_BURST_DURATION_DEFAULT (8)
/*
+ * 0: Disable BPF packet filter
+ * 1: Enable BPF packet filter
+ */
+#define CFG_BPF_PACKET_FILTER_OFFLOAD "gBpfFilterEnable"
+#define CFG_BPF_PACKET_FILTER_OFFLOAD_MIN (0)
+#define CFG_BPF_PACKET_FILTER_OFFLOAD_MAX (1)
+#define CFG_BPF_PACKET_FILTER_OFFLOAD_DEFAULT (1)
+
+/*
* GPIO num used to wakeup host, 0xFF disable wakeup.
* Default value is 0xFF
*/
@@ -4099,6 +4612,455 @@
#define CFG_TARGET_WAKEUP_TYPE_MAX (4)
#define CFG_TARGET_WAKEUP_TYPE_DEFAULT (1)
+/*
+ * maximum interval (in seconds) for a
+ * single scan plan supported by the device.
+ */
+#define CFG_MAX_SCHED_SCAN_PLAN_INT_NAME "g_max_sched_scan_plan_int"
+#define CFG_MAX_SCHED_SCAN_PLAN_INT_MIN (1)
+#define CFG_MAX_SCHED_SCAN_PLAN_INT_MAX (7200)
+#define CFG_MAX_SCHED_SCAN_PLAN_INT_DEFAULT (3600)
+
+/*
+ * maximum number of iterations for a single
+ * scan plan supported by the device.
+ */
+#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_NAME "g_max_sched_scan_plan_itrns"
+#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MIN (1)
+#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MAX (100)
+#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_DEFAULT (10)
+/*
+ * g_sub20_channel_width=0: Indicates do not use Sub 20 MHz bandwidth
+ * g_sub20_channel_width=1: Bring up SAP/STA in 5 MHz bandwidth
+ * g_sub20_channel_width=2: Bring up SAP/STA in 10 MHz bandwidth
+ * g_sub20_channel_width=3: Switch between 5 and 20 MHz bandwidth dynamically
+ * g_sub20_channel_width=4: Switch between 10 and 20 MHz bandwidth dynamically
+ * g_sub20_channel_width=5: Switch between 5/10 and 20 MHz bandwidth dynamically
+ * g_sub20_channel_width=6: Switch between 5/10 and 20 MHz bandwidth manually
+ * Default : Disable
+ */
+#define CFG_SUB_20_CHANNEL_WIDTH_NAME "g_sub20_channel_width"
+#define CFG_SUB_20_CHANNEL_WIDTH_DISABLE (0)
+#define CFG_SUB_20_CHANNEL_WIDTH_5MHZ (1)
+#define CFG_SUB_20_CHANNEL_WIDTH_10MHZ (2)
+#define CFG_SUB_20_CHANNEL_WIDTH_DYN_5MHZ (3)
+#define CFG_SUB_20_CHANNEL_WIDTH_DYN_10MHZ (4)
+#define CFG_SUB_20_CHANNEL_WIDTH_DYN_ALL (5)
+#define CFG_SUB_20_CHANNEL_WIDTH_MANUAL (6)
+
+#define CFG_SUB_20_CHANNEL_WIDTH_MIN (0)
+#define CFG_SUB_20_CHANNEL_WIDTH_MAX (6)
+#define CFG_SUB_20_CHANNEL_WIDTH_DEFAULT (0)
+
+#define CFG_STA_CHANGE_COUNTRYCODE_DYN_NAME "g_sta_change_cc_via_beacon"
+#define CFG_STA_CHANGE_COUNTRYCODE_DYN_ENABLE (1)
+#define CFG_STA_CHANGE_COUNTRYCODE_DYN_DISABLE (0)
+#define CFG_STA_CHANGE_COUNTRYCODE_DYN_DEFAULT (0)
+
+/*
+ * 5G preference parameters for boosting RSSI
+ * enable_band_specific_pref: Enable preference for 5G from INI.
+ * raise_rssi_thresh_5g: A_band_boost_threshold above which 5 GHz is favored.
+ * raise_factor_5g : Factor by which 5GHz RSSI is boosted.
+ * max_raise_rssi_5g: Maximum boost that can be applied to 5GHz RSSI.
+ */
+
+#define CFG_ENABLE_5G_BAND_PREF_NAME "enable_5g_band_pref"
+#define CFG_ENABLE_5G_BAND_PREF_MIN (0)
+#define CFG_ENABLE_5G_BAND_PREF_MAX (1)
+#define CFG_ENABLE_5G_BAND_PREF_DEFAULT (0)
+
+#define CFG_5G_RSSI_BOOST_THRESHOLD_NAME "5g_rssi_boost_threshold"
+#define CFG_5G_RSSI_BOOST_THRESHOLD_MIN (-55)
+#define CFG_5G_RSSI_BOOST_THRESHOLD_MAX (-70)
+#define CFG_5G_RSSI_BOOST_THRESHOLD_DEFAULT (-60)
+
+#define CFG_5G_RSSI_BOOST_FACTOR_NAME "5g_rssi_boost_factor"
+#define CFG_5G_RSSI_BOOST_FACTOR_MIN (0)
+#define CFG_5G_RSSI_BOOST_FACTOR_MAX (2)
+#define CFG_5G_RSSI_BOOST_FACTOR_DEFAULT (1)
+
+#define CFG_5G_MAX_RSSI_BOOST_NAME "5g_max_rssi_boost"
+#define CFG_5G_MAX_RSSI_BOOST_MIN (0)
+#define CFG_5G_MAX_RSSI_BOOST_MAX (20)
+#define CFG_5G_MAX_RSSI_BOOST_DEFAULT (10)
+
+/*
+ * 5G preference parameters for penalizing RSSI
+ * drop_rssi_thresh_5g: threshold below which 5 GHz is not favored.
+ * drop_factor_5g : Factor by which a weak 5GHz RSSI is penalized.
+ * max_drop_rssi_5g: Maximum penalty that can be applied to 5GHz RSSI.
+ */
+
+#define CFG_5G_RSSI_PENALIZE_THRESHOLD_NAME "5g_rssi_penalize_threshold"
+#define CFG_5G_RSSI_PENALIZE_THRESHOLD_MIN (-65)
+#define CFG_5G_RSSI_PENALIZE_THRESHOLD_MAX (-80)
+#define CFG_5G_RSSI_PENALIZE_THRESHOLD_DEFAULT (-70)
+
+#define CFG_5G_RSSI_PENALIZE_FACTOR_NAME "5g_rssi_penalize_factor"
+#define CFG_5G_RSSI_PENALIZE_FACTOR_MIN (0)
+#define CFG_5G_RSSI_PENALIZE_FACTOR_MAX (2)
+#define CFG_5G_RSSI_PENALIZE_FACTOR_DEFAULT (1)
+
+#define CFG_5G_MAX_RSSI_PENALIZE_NAME "5g_max_rssi_penalize"
+#define CFG_5G_MAX_RSSI_PENALIZE_MIN (0)
+#define CFG_5G_MAX_RSSI_PENALIZE_MAX (20)
+#define CFG_5G_MAX_RSSI_PENALIZE_DEFAULT (10)
+
+/* enable/disable probe request whiltelist IE feature */
+#define CFG_PRB_REQ_IE_WHITELIST_NAME "g_enable_probereq_whitelist_ies"
+#define CFG_PRB_REQ_IE_WHITELIST_MIN (0)
+#define CFG_PRB_REQ_IE_WHITELIST_MAX (1)
+#define CFG_PRB_REQ_IE_WHITELIST_DEFAULT (0)
+/*
+ * For IE white listing in Probe Req, following ini parameters from
+ * g_probe_req_ie_bitmap_0 to g_probe_req_ie_bitmap_7 are used. User needs to
+ * input this values in hexa decimal format, when bit is set, corresponding ie
+ * needs to be included in probe request.
+ */
+#define CFG_PRB_REQ_IE_BIT_MAP0_NAME "g_probe_req_ie_bitmap_0"
+#define CFG_PRB_REQ_IE_BIT_MAP0_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP0_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP0_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP1_NAME "g_probe_req_ie_bitmap_1"
+#define CFG_PRB_REQ_IE_BIT_MAP1_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP1_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP1_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP2_NAME "g_probe_req_ie_bitmap_2"
+#define CFG_PRB_REQ_IE_BIT_MAP2_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP2_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP2_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP3_NAME "g_probe_req_ie_bitmap_3"
+#define CFG_PRB_REQ_IE_BIT_MAP3_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP3_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP3_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP4_NAME "g_probe_req_ie_bitmap_4"
+#define CFG_PRB_REQ_IE_BIT_MAP4_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP4_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP4_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP5_NAME "g_probe_req_ie_bitmap_5"
+#define CFG_PRB_REQ_IE_BIT_MAP5_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP5_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP5_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP6_NAME "g_probe_req_ie_bitmap_6"
+#define CFG_PRB_REQ_IE_BIT_MAP6_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP6_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP6_DEFAULT (0x00000000)
+
+#define CFG_PRB_REQ_IE_BIT_MAP7_NAME "g_probe_req_ie_bitmap_7"
+#define CFG_PRB_REQ_IE_BIT_MAP7_MIN (0x00000000)
+#define CFG_PRB_REQ_IE_BIT_MAP7_MAX (0xFFFFFFFF)
+#define CFG_PRB_REQ_IE_BIT_MAP7_DEFAULT (0x00000000)
+
+/*
+ * For vendor specific IE, Probe Req OUI types and sub types which are
+ * to be white listed are specifed in gProbeReqOUIs in the following
+ * example format - gProbeReqOUIs=AABBCCDD EEFF1122
+ */
+#define CFG_PROBE_REQ_OUI_NAME "gProbeReqOUIs"
+#define CFG_PROBE_REQ_OUI_DEFAULT ""
+
+#define CFG_RX_WAKELOCK_TIMEOUT_NAME "rx_wakelock_timeout"
+#define CFG_RX_WAKELOCK_TIMEOUT_DEFAULT (50)
+#define CFG_RX_WAKELOCK_TIMEOUT_MIN (0)
+#define CFG_RX_WAKELOCK_TIMEOUT_MAX (100)
+
+/*
+ * <ini>
+ * g_sap_chanswitch_beacon_cnt - channel switch beacon count
+ * @Min: 1
+ * @Max: 5
+ * @Default: 5
+ *
+ * This ini is used to configure channel switch beacon count
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SAP_CH_SWITCH_BEACON_CNT "g_sap_chanswitch_beacon_cnt"
+#define CFG_SAP_CH_SWITCH_BEACON_CNT_MIN (1)
+#define CFG_SAP_CH_SWITCH_BEACON_CNT_MAX (5)
+#define CFG_SAP_CH_SWITCH_BEACON_CNT_DEFAULT (5)
+
+/*
+ * <ini>
+ * g_sap_chanswitch_mode - channel switch mode
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini is used to configure channel switch mode
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SAP_CH_SWITCH_MODE "g_sap_chanswitch_mode"
+#define CFG_SAP_CH_SWITCH_MODE_MIN (0)
+#define CFG_SAP_CH_SWITCH_MODE_MAX (1)
+#define CFG_SAP_CH_SWITCH_MODE_DEFAULT (1)
+
+/*
+ * <ini>
+ * gDfsBeaconTxEnhanced - beacon tx enhanced
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enhance dfs beacon tx
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_DFS_BEACON_TX_ENHANCED "gDfsBeaconTxEnhanced"
+#define CFG_DFS_BEACON_TX_ENHANCED_MIN (0)
+#define CFG_DFS_BEACON_TX_ENHANCED_MAX (1)
+#define CFG_DFS_BEACON_TX_ENHANCED_DEFAULT (0)
+
+/*
+ * <ini>
+ * gReducedBeaconInterval - beacon interval reduced
+ * @Min: 0
+ * @Max: 100
+ * @Default: 0
+ *
+ * This ini is used to reduce beacon interval when val
+ * great than 0, or the feature is disabled.
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_REDUCED_BEACON_INTERVAL "gReducedBeaconInterval"
+#define CFG_REDUCED_BEACON_INTERVAL_MIN (0)
+#define CFG_REDUCED_BEACON_INTERVAL_MAX (100)
+#define CFG_REDUCED_BEACON_INTERVAL_DEFAULT (0)
+
+#define CFG_NO_ACK_ENABLE "gEnableNoAck"
+#define CFG_NO_ACK_MIN (0)
+#define CFG_NO_ACK_MAX (1)
+#define CFG_NO_ACK_DEFAULT (0)
+
+#ifdef FEATURE_COEX_PTA_CONFIG_ENABLE
+/*
+ * <ini>
+ * gCoexPtaConfigEnable - enable pta coex
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable the coexistence between QCA wifi and External BT.
+ * when val is 1, or the feature is disabled.
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_COEX_PTA_CONFIG_ENABLE "gCoexPtaConfigEnable"
+#define CFG_COEX_PTA_CONFIG_ENABLE_MIN (0)
+#define CFG_COEX_PTA_CONFIG_ENABLE_MAX (2)
+#define CFG_COEX_PTA_CONFIG_ENABLE_DEFAULT (0)
+
+/*
+ * <ini>
+ * gCoexPtaConfigEnable - configure pta coex param
+ * @Min: 0x00000000
+ * @Max: 0xFFFFFFFF
+ * @Default: 0x00000000
+ *
+ * This ini is used to configure the coexistence param between QCA wifi and External BT.
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+
+#define CFG_COEX_PTA_CONFIG_PARAM "gCoexPtaConfigParam"
+#define CFG_COEX_PTA_CONFIG_PARAM_MIN (0x00000000)
+#define CFG_COEX_PTA_CONFIG_PARAM_MAX (0xFFFFFFFF)
+#define CFG_COEX_PTA_CONFIG_PARAM_DEFAULT (0x00000000)
+#endif
+
+/*
+ * <ini>
+ * arp_ac_category - ARP access category
+ * @Min: 0
+ * @Max: 3
+ * @Default: 3
+ *
+ * Firmware by default categorizes ARP packets with VOICE TID.
+ * This ini shall be used to override the default configuration.
+ * Access category enums are referenced in ieee80211_common.h
+ * WME_AC_BE = 0 (Best effort)
+ * WME_AC_BK = 1 (Background)
+ * WME_AC_VI = 2 (Video)
+ * WME_AC_VO = 3 (Voice)
+ *
+ * Related: none
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_ARP_AC_CATEGORY "arp_ac_category"
+#define CFG_ARP_AC_CATEGORY_MIN (0)
+#define CFG_ARP_AC_CATEGORY_MAX (3)
+#define CFG_ARP_AC_CATEGORY_DEFAULT (3)
+
+/*
+ * gSapProbeRespOffload: when set in sap, offloads the
+ * probe response transmission to firmware
+ */
+#define CFG_SAP_PROBE_RESP_OFFLOAD_NAME "gSapProbeRespOffload"
+#define CFG_SAP_PROBE_RESP_OFFLOAD_MIN (0)
+#define CFG_SAP_PROBE_RESP_OFFLOAD_MAX (1)
+#define CFG_SAP_PROBE_RESP_OFFLOAD_DEFAULT (1)
+
+/*
+ * <ini>
+ * gSkipMacConfig - skip mac config
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to avoid loading mac_wlan.bin if needed
+ * during startup to save time.
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SKIP_MAC_CONFIG "gSkipMacConfig"
+#define CFG_SKIP_MAC_CONFIG_MIN (0)
+#define CFG_SKIP_MAC_CONFIG_MAX (1)
+#define CFG_SKIP_MAC_CONFIG_DEFAULT (0)
+
+#ifdef WLAN_FEATURE_DSRC
+ /*
+ * <ini>
+ * gOcbTxPerPktStatsEnable - enable/disable OCB/DSRC tx per packet stats
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to avoid KPI throughput regression by disabling tx
+ * per packet stats that would degrade throughput.
+ *
+ * Related: HI_ACS_FLAGS_SDIO_REDUCE_TX_COMPL_SET
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_OCB_TX_PER_PKT_STATS_ENABLE_NAME "gOcbTxPerPktStatsEnable"
+#define CFG_OCB_TX_PER_PKT_STATS_ENABLE_MIN ( 0 )
+#define CFG_OCB_TX_PER_PKT_STATS_ENABLE_MAX ( 1 )
+#define CFG_OCB_TX_PER_PKT_STATS_ENABLE_DEFAULT ( 0 )
+#endif /* WLAN_FEATURE_DSRC */
+
+/*
+ * <ini>
+ * gCCAThresholdEnable - enable/disable CCA threshold setting
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to overide CCA threshold for ESTI Adaptivity.
+ *
+ * Related: NOne
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_CCA_THRESHOLD_ENABLE_NAME "gCCAThresholdEnable"
+#define CFG_CCA_THRESHOLD_ENABLE_MIN (0)
+#define CFG_CCA_THRESHOLD_ENABLE_MAX (1)
+#define CFG_CCA_THRESHOLD_ENABLE_DEFAULT (0)
+
+/*
+ * <ini>
+ * gCCAThreshold2G - CCA threshold for 2G band
+ * @Min: 10
+ * @Max: 127
+ * @Default: 28
+ *
+ * Once CCA threshold is enabled, this is threshold for 2G band.
+ *
+ * Related: None
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_CCA_THRESHOLD_2G_NAME "gCCAThreshold2G"
+#define CFG_CCA_THRESHOLD_2G_MIN (10)
+#define CFG_CCA_THRESHOLD_2G_MAX (127)
+#define CFG_CCA_THRESHOLD_2G_DEFAULT (28)
+
+/*
+ * <ini>
+ * gCCAThreshold5G - CCA threshold for 5G band
+ * @Min: 10
+ * @Max: 127
+ * @Default: 28
+ *
+ * Once CCA threshold is enabled, this is threshold for 5G band.
+ *
+ * Related: None
+ *
+ * Usage: Internal/External
+ *
+ * </ini>
+ */
+#define CFG_CCA_THRESHOLD_5G_NAME "gCCAThreshold5G"
+#define CFG_CCA_THRESHOLD_5G_MIN (10)
+#define CFG_CCA_THRESHOLD_5G_MAX (127)
+#define CFG_CCA_THRESHOLD_5G_DEFAULT (28)
+
+/*
+ * <ini>
+ * gEnableMonOnSta - extend the monitor capability for STA
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * this is used to control monitor feature for STA.
+ *
+ * Related: none
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_MONITOR_ON_STA "gEnableMonOnSta"
+#define CFG_ENABLE_MONITOR_ON_STA_MIN (0)
+#define CFG_ENABLE_MONITOR_ON_STA_MAX (1)
+#define CFG_ENABLE_MONITOR_ON_STA_DEFAULT (0)
+
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -4137,6 +5099,7 @@
v_U32_t nAutoBmpsTimerValue;
eHddDot11Mode dot11Mode;
v_U32_t nChannelBondingMode24GHz;
+ bool override_ht20_40_24g;
v_U32_t nChannelBondingMode5GHz;
v_U32_t MaxRxAmpduFactor;
v_U16_t TxRate;
@@ -4236,10 +5199,6 @@
/* In units of milliseconds */
uint32_t idle_time_conc;
- v_U8_t nNumStaChanCombinedConc; //number of channels combined for
- //STA in each split scan operation
- v_U8_t nNumP2PChanCombinedConc; //number of channels combined for
- //P2P in each split scan operation
#endif
v_U8_t nMaxPsPoll;
@@ -4259,6 +5218,7 @@
//WMM QoS Configuration
hdd_wmm_user_mode_t WmmMode;
+ v_U8_t gStaLocalEDCAEnable;
v_BOOL_t b80211eIsEnabled;
v_U8_t UapsdMask; // what ACs to setup U-APSD for at assoc
v_U32_t InfraUapsdVoSrvIntv;
@@ -4390,12 +5350,10 @@
v_U16_t nTeleBcnTransLiNumIdleBeacons;
v_U16_t nTeleBcnMaxLiNumIdleBeacons;
v_U8_t bcnEarlyTermWakeInterval;
- v_U32_t enableCloseLoop;
v_U8_t enableBypass11d;
v_U8_t enableDFSChnlScan;
v_U8_t enable_dfs_pno_chnl_scan;
v_U8_t enableDynamicDTIM;
- v_U8_t enableAutomaticTxPowerControl;
v_U8_t ShortGI40MhzEnable;
eHddLinkSpeedReportType reportMaxLinkSpeed;
v_S31_t linkSpeedRssiHigh;
@@ -4412,14 +5370,10 @@
v_BOOL_t isP2pDeviceAddrAdministrated;
v_U8_t thermalMitigationEnable;
v_U32_t throttlePeriod;
- uint32_t throttle_dutycycle_level0_2g;
- uint32_t throttle_dutycycle_level1_2g;
- uint32_t throttle_dutycycle_level2_2g;
- uint32_t throttle_dutycycle_level3_2g;
- uint32_t throttle_dutycycle_level0_5g;
- uint32_t throttle_dutycycle_level1_5g;
- uint32_t throttle_dutycycle_level2_5g;
- uint32_t throttle_dutycycle_level3_5g;
+ uint32_t throttle_dutycycle_level0;
+ uint32_t throttle_dutycycle_level1;
+ uint32_t throttle_dutycycle_level2;
+ uint32_t throttle_dutycycle_level3;
#if defined(CONFIG_HL_SUPPORT) && defined(QCA_BAD_PEER_TX_FLOW_CL)
bool bad_peer_txctl_enable;
uint32_t bad_peer_txctl_prd;
@@ -4455,8 +5409,10 @@
v_U8_t vhtRxMCS2x2;
v_U8_t vhtTxMCS2x2;
v_BOOL_t enable2x2;
- uint8_t chain_mask_2g;
- uint8_t chain_mask_5g;
+ uint8_t chain_mask_2g_rx;
+ uint8_t chain_mask_5g_rx;
+ uint8_t chain_mask_2g_tx;
+ uint8_t chain_mask_5g_tx;
uint32_t vdev_type_nss_2g;
uint32_t vdev_type_nss_5g;
v_BOOL_t txchainmask1x1;
@@ -4579,6 +5535,9 @@
#endif
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
v_U32_t WlanMccToSccSwitchMode;
+ bool wlan_band_switch_enable;
+ bool wlan_ap_p2pgo_conc_enable;
+ bool wlan_ap_p2pclient_conc_enable;
#endif
#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
v_U32_t WlanAutoShutdown;
@@ -4588,6 +5547,7 @@
v_U8_t max_sap_peers;
v_U8_t max_go_peers;
v_U8_t disableDFSChSwitch;
+ v_U8_t enable_radar_war;
v_U8_t enableDFSMasterCap;
v_U16_t thermalTempMinLevel0;
v_U16_t thermalTempMaxLevel0;
@@ -4597,9 +5557,21 @@
v_U16_t thermalTempMaxLevel2;
v_U16_t thermalTempMinLevel3;
v_U16_t thermalTempMaxLevel3;
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ /* Thermal Shutdown feature is enabled or not. */
+ bool thermal_shutdown_enabled;
+ /* Thermal Shutdown is autonomous in driver or requested by user app. */
+ bool thermal_shutdown_auto_enabled;
+ uint16_t thermal_resume_threshold;
+ uint16_t thermal_warning_threshold;
+ uint16_t thermal_suspend_threshold;
+ uint16_t thermal_sample_rate;
+#endif
+
v_U32_t TxPower2g;
v_U32_t TxPower5g;
v_U32_t gEnableDebugLog;
+ uint8_t enable_ac_txq_optimize;
v_U8_t rxhandle;
uint8_t cpu_map_list[CFG_RPS_RX_QUEUE_CPU_MAP_LIST_LEN];
v_BOOL_t fDfsPhyerrFilterOffload;
@@ -4609,6 +5581,14 @@
v_BOOL_t fRegChangeDefCountry;
v_U8_t acsScanBandPreference;
uint32_t auto_channel_select_weight;
+ uint8_t enable_rts_sifsbursting;
+ uint8_t max_mpdus_inampdu;
+ uint16_t max_ht_mcs_txdata;
+ bool sap_get_peer_info;
+ bool disable_abg_rate_txdata;
+ uint8_t rate_for_tx_mgmt;
+ uint8_t rate_for_tx_mgmt_2g;
+ uint8_t rate_for_tx_mgmt_5g;
#ifdef QCA_LL_TX_FLOW_CT
v_U32_t TxFlowLowWaterMark;
v_U32_t TxFlowHighWaterMarkOffset;
@@ -4653,6 +5633,15 @@
uint16_t pkt_bundle_timer_value;
uint16_t pkt_bundle_size;
#endif
+
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+ uint8_t del_ack_enable;
+ uint32_t del_ack_threshold_high;
+ uint32_t del_ack_threshold_low;
+ uint16_t del_ack_timer_value;
+ uint16_t del_ack_pkt_count;
+#endif
+
/* FW debug log parameters */
v_U32_t enableFwLogType;
v_U32_t enableFwLogLevel;
@@ -4682,6 +5671,7 @@
bool crash_inject_enabled;
v_S31_t dfsRadarPriMultiplier;
v_U8_t reorderOffloadSupport;
+ uint8_t enable_hostapd_edca_local;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
v_BOOL_t isRoamOffloadEnabled;
@@ -4797,16 +5787,36 @@
uint32_t dynamic_wlan_bt_coex;
uint32_t antenna_isolation;
+ uint32_t coex_page_p2p_sta_bt_interval;
+ uint32_t coex_page_p2p_sta_wlan_interval;
+
+ uint32_t coex_inquiry_sta_bt_interval;
+ uint32_t coex_inquiry_sta_wlan_interval;
+
+ uint32_t coex_inquiry_sap_bt_interval;
+ uint32_t coex_inquiry_sap_wlan_interval;
+
+ uint32_t coex_inquiry_p2p_bt_interval;
+ uint32_t coex_inquiry_p2p_wlan_interval;
+
+ uint32_t coex_inquiry_p2p_sta_bt_interval;
+ uint32_t coex_inquiry_p2p_sta_wlan_interval;
uint32_t coex_tx_power;
-#ifdef WMI_COEX_BTC_DUTYCYCLE
- uint32_t coex_btc_PauseDuration;
- uint32_t coex_btc_UnPauseDuration;
+ v_BOOL_t gEnableNoAck;
+
+#ifdef FEATURE_COEX_PTA_CONFIG_ENABLE
+ uint8_t coex_pta_config_enable;
+ uint32_t coex_pta_config_param;
#endif
uint8_t inform_bss_rssi_raw;
#ifdef WLAN_FEATURE_TSF
uint32_t tsf_gpio_pin;
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+ uint8_t tsf_ptp_options;
+#endif /* WLAN_FEATURE_TSF_PLUS */
#endif
uint8_t multicast_host_fw_msgs;
uint32_t fine_time_meas_cap;
@@ -4818,6 +5828,7 @@
uint16_t pkt_err_disconn_th;
bool tx_chain_mask_cck;
uint8_t tx_chain_mask_1ss;
+ uint8_t tx_sch_delay;
uint16_t self_gen_frm_pwr;
#ifdef FEATURE_WLAN_EXTSCAN
@@ -4884,7 +5895,7 @@
/* parameter to control GTX */
uint32_t tgt_gtx_usr_cfg;
- bool sap_restrt_ch_avoid;
+ bool sap_internal_restart;
bool bug_on_reinit_failure;
/* parameter to force sap into 11n */
bool sap_force_11n_for_11ac;
@@ -4892,10 +5903,60 @@
bool active_mode_offload;
/* parameter for indicating sifs burst duration to fw */
uint8_t sifs_burst_duration;
+
+ bool bpf_packet_filter_enable;
+ /* parameter for defer timer for enabling TDLS on p2p listen */
+ uint16_t tdls_enable_defer_time;
uint32_t host_wakeup_gpio;
uint32_t host_wakeup_type;
uint32_t target_wakeup_gpio;
uint32_t target_wakeup_type;
+ uint32_t max_sched_scan_plan_interval;
+ uint32_t max_sched_scan_plan_iterations;
+ /* 5G preference parameters for boosting RSSI */
+ bool enable_5g_band_pref;
+ int8_t rssi_boost_threshold_5g;
+ uint8_t rssi_boost_factor_5g;
+ uint8_t max_rssi_boost_5g;
+ /* 5G preference parameters for dropping RSSI*/
+ int8_t rssi_penalize_threshold_5g;
+ uint8_t rssi_penalize_factor_5g;
+ uint8_t max_rssi_penalize_5g;
+
+ bool probe_req_ie_whitelist;
+ /* probe request bit map ies */
+ uint32_t probe_req_ie_bitmap_0;
+ uint32_t probe_req_ie_bitmap_1;
+ uint32_t probe_req_ie_bitmap_2;
+ uint32_t probe_req_ie_bitmap_3;
+ uint32_t probe_req_ie_bitmap_4;
+ uint32_t probe_req_ie_bitmap_5;
+ uint32_t probe_req_ie_bitmap_6;
+ uint32_t probe_req_ie_bitmap_7;
+
+ /* Probe Request multiple vendor OUIs */
+ uint8_t probe_req_ouis[MAX_PRB_REQ_VENDOR_OUI_INI_LEN];
+ /* parameter for indicating sub20 channel width */
+ uint8_t sub_20_channel_width;
+ bool sta_change_cc_via_beacon;
+ uint32_t rx_wakelock_timeout;
+ /* beacon count before channel switch */
+ uint8_t sap_chanswitch_beacon_cnt;
+ uint8_t sap_chanswitch_mode;
+ uint8_t dfs_beacon_tx_enhanced;
+ uint16_t reduced_beacon_interval;
+ uint32_t arp_ac_category;
+ /* parameter to control probe resp offloads */
+ bool sap_probe_resp_offload;
+ uint32_t sta_auth_retries_for_code17;
+ uint8_t skip_mac_config;
+#ifdef WLAN_FEATURE_DSRC
+ bool ocb_tx_per_pkt_stats_enabled;
+#endif
+ bool cca_threshold_enable;
+ uint32_t cca_threshold_2g;
+ uint32_t cca_threshold_5g;
+ uint8_t mon_on_sta_enable;
};
typedef struct hdd_config hdd_config_t;
@@ -5013,6 +6074,9 @@
Function declarations and documentation
-------------------------------------------------------------------------*/
VOS_STATUS hdd_parse_config_ini(hdd_context_t *pHddCtx);
+uint32_t hdd_validate_prb_req_ie_bitmap(hdd_context_t* pHddCtx);
+VOS_STATUS hdd_parse_probe_req_ouis(hdd_context_t* pHddCtx);
+void hdd_free_probe_req_ouis(hdd_context_t* pHddCtx);
VOS_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx);
VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx );
VOS_STATUS hdd_set_sme_chan_list(hdd_context_t *hdd_ctx);
@@ -5034,6 +6098,14 @@
VOS_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, v_U32_t val);
void hdd_update_tgt_cfg(void *context, void *param);
+/**
+ * hdd_update_dfs_cac_block_tx_flag() - to set dfs_cac_block_tx flag
+ * @context: Pointer to hdd contex
+ * @cac_block_tx: value to be set
+ *
+ * Return: none
+ */
+void hdd_update_dfs_cac_block_tx_flag(void *context, bool cac_block_tx);
bool hdd_dfs_indicate_radar(void *context, void *param);
VOS_STATUS hdd_string_to_u8_array( char *str, tANI_U8 *intArray, tANI_U8 *len,
@@ -5060,4 +6132,69 @@
void hdd_set_btc_bt_wlan_interval(hdd_context_t *pHddCtx);
VOS_STATUS hdd_update_nss(hdd_context_t *hdd_ctx, uint8_t nss);
+/**
+ * hdd_set_dfs_regdomain() - During SSR, restore DFS regulatory domain
+ * with valid value
+ * @phddctx: context for hdd
+ * @restore: valure to verify the state
+ *
+ * Return: None
+ */
+void hdd_set_dfs_regdomain(hdd_context_t *phddctx, bool restore);
+
+/**
+ * hdd_cfg_is_ptp_opt_enable - check if PTP Option is enabled
+ *
+ * @hdd_ctx_ptr: context for hdd
+ *
+ * This function returns true if PTP option is enabled, returns
+ * false if PTP option is disabled
+ */
+#ifdef WLAN_FEATURE_TSF_PLUS
+bool hdd_cfg_is_ptp_opt_enable(hdd_context_t *hdd_ctx_ptr);
+#else
+static inline
+bool hdd_cfg_is_ptp_opt_enable(hdd_context_t *hdd_ctx_ptr)
+{
+ return 0;
+}
+#endif
+
+#ifdef FEATURE_WLAN_SUB_20_MHZ
+uint8_t hdd_cfg_get_sub20_dyn_capabilities(hdd_context_t *hdd_ctx_ptr);
+uint8_t hdd_cfg_get_static_sub20_channel_width(hdd_context_t *hdd_ctx_ptr);
+bool hdd_cfg_is_sub20_channel_width_enabled(hdd_context_t *hdd_ctx_ptr);
+bool hdd_cfg_is_static_sub20_channel_width_enabled(hdd_context_t *hdd_ctx_ptr);
+uint8_t hdd_cfg_get_sub20_channel_config(hdd_context_t *hdd_ctx_ptr);
+#else
+static inline
+uint8_t hdd_cfg_get_sub20_dyn_capabilities(hdd_context_t *hdd_ctx_ptr)
+{
+ return SUB20_MODE_NONE;
+}
+
+static inline
+uint8_t hdd_cfg_get_static_sub20_channel_width(hdd_context_t *hdd_ctx_ptr)
+{
+ return SUB20_MODE_NONE;
+}
+
+static inline
+bool hdd_cfg_is_sub20_channel_width_enabled(hdd_context_t *hdd_ctx_ptr)
+{
+ return false;
+}
+
+static inline
+bool hdd_cfg_is_static_sub20_channel_width_enabled(hdd_context_t *hdd_ctx_ptr)
+{
+ return false;
+}
+
+static inline
+uint8_t hdd_cfg_get_sub20_channel_config(hdd_context_t *hdd_ctx_ptr)
+{
+ return 0;
+}
+#endif
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg80211.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg80211.h
index efdf2b3..6b84e98 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -111,6 +111,9 @@
#define MAX_CHANNEL (NUM_2_4GHZ_CHANNELS + NUM_5GHZ_CHANNELS)
+#define IS_CHANNEL_VALID(channel) ((channel >= 0 && channel < 15) \
+ || (channel >= 36 && channel <= 184))
+
typedef struct {
u8 element_id;
u8 len;
@@ -123,6 +126,28 @@
}__attribute__((packed)) qcom_ie_age ;
#endif
+#ifndef NL80211_AUTHTYPE_FILS_SK
+#define NL80211_AUTHTYPE_FILS_SK 5
+#endif
+#ifndef NL80211_AUTHTYPE_FILS_SK_PFS
+#define NL80211_AUTHTYPE_FILS_SK_PFS 6
+#endif
+#ifndef NL80211_AUTHTYPE_FILS_PK
+#define NL80211_AUTHTYPE_FILS_PK 7
+#endif
+#ifndef WLAN_AKM_SUITE_FILS_SHA256
+#define WLAN_AKM_SUITE_FILS_SHA256 0x000FAC0E
+#endif
+#ifndef WLAN_AKM_SUITE_FILS_SHA384
+#define WLAN_AKM_SUITE_FILS_SHA384 0x000FAC0F
+#endif
+#ifndef WLAN_AKM_SUITE_FT_FILS_SHA256
+#define WLAN_AKM_SUITE_FT_FILS_SHA256 0x000FAC10
+#endif
+#ifndef WLAN_AKM_SUITE_FT_FILS_SHA384
+#define WLAN_AKM_SUITE_FT_FILS_SHA384 0x000FAC11
+#endif
+
/* Vendor id to be used in vendor specific command and events
* to user space.
* NOTE: The authoritative place for definition of QCA_NL80211_VENDOR_ID,
@@ -216,13 +241,16 @@
QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_INFO = 61,
/* Start Wifi Logger */
QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_START = 62,
- /* Start Wifi Memory Dump */
- QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP = 63,
+
+ /* FW Memory Dump feature is deprecated */
+
QCA_NL80211_VENDOR_SUBCMD_ROAM = 64,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST = 65,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST = 66,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND = 67,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST = 68,
+
+ /*
+ * APIs corresponding to the sub commands 65-68 are deprecated.
+ * These sub commands are reserved and not supposed to be used
+ * for any other purpose
+ */
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_SET_LIST = 69,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_SET_PASSPOINT_LIST = 70,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_RESET_PASSPOINT_LIST = 71,
@@ -269,6 +297,79 @@
QCA_NL80211_VENDOR_SUBCMD_ACS_POLICY = 116,
QCA_NL80211_VENDOR_SUBCMD_STA_CONNECT_ROAM_POLICY = 117,
QCA_NL80211_VENDOR_SUBCMD_SET_SAP_CONFIG = 118,
+ QCA_NL80211_VENDOR_SUBCMD_GET_STATION = 121,
+
+ /* subcommand for link layer statistics extension */
+ QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT = 127,
+ /* subcommand to get chain rssi value */
+ QCA_NL80211_VENDOR_SUBCMD_GET_CHAIN_RSSI = 138,
+ QCA_NL80211_VENDOR_SUBCMD_CHIP_PWRSAVE_FAILURE = 148,
+ /* subcommand to flush peer tids */
+ QCA_NL80211_VENDOR_SUBCMD_PEER_FLUSH_PENDING = 162,
+
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ /* Thermal Shutdown cmds to protect chip */
+ QCA_NL80211_VENDOR_SUBCMD_THERMAL_CMD = 165,
+ QCA_NL80211_VENDOR_SUBCMD_TEMPERATURE_EVENT = 166,
+ QCA_NL80211_VENDOR_SUBCMD_RESUME_COMP_EVENT = 167,
+#endif
+};
+
+/**
+ * enum qca_wlan_802_11_mode - dot11 mode
+ * @QCA_WLAN_802_11_MODE_INVALID: Invalid dot11 mode
+ * @QCA_WLAN_802_11_MODE_11A: mode A
+ * @QCA_WLAN_802_11_MODE_11B: mode B
+ * @QCA_WLAN_802_11_MODE_11G: mode G
+ * @QCA_WLAN_802_11_MODE_11N: mode N
+ * @QCA_WLAN_802_11_MODE_11AC: mode AC
+ */
+enum qca_wlan_802_11_mode {
+ QCA_WLAN_802_11_MODE_INVALID,
+ QCA_WLAN_802_11_MODE_11A,
+ QCA_WLAN_802_11_MODE_11B,
+ QCA_WLAN_802_11_MODE_11G,
+ QCA_WLAN_802_11_MODE_11N,
+ QCA_WLAN_802_11_MODE_11AC,
+};
+
+/**
+ * enum qca_wlan_auth_type - Authentication key management type
+ * @QCA_WLAN_AUTH_TYPE_INVALID: Invalid key management type
+ * @QCA_WLAN_AUTH_TYPE_OPEN: Open key
+ * @QCA_WLAN_AUTH_TYPE_SHARED: shared key
+ * @QCA_WLAN_AUTH_TYPE_WPA: wpa key
+ * @QCA_WLAN_AUTH_TYPE_WPA_PSK: wpa psk key
+ * @QCA_WLAN_AUTH_TYPE_WPA_NONE: wpa none key
+ * @QCA_WLAN_AUTH_TYPE_RSN: rsn key
+ * @QCA_WLAN_AUTH_TYPE_RSN_PSK: rsn psk key
+ * @QCA_WLAN_AUTH_TYPE_FT: ft key
+ * @QCA_WLAN_AUTH_TYPE_FT_PSK: ft psk key
+ * @QCA_WLAN_AUTH_TYPE_SHA256: shared 256 key
+ * @QCA_WLAN_AUTH_TYPE_SHA256_PSK: shared 256 psk
+ * @QCA_WLAN_AUTH_TYPE_WAI: wai key
+ * @QCA_WLAN_AUTH_TYPE_WAI_PSK wai psk key
+ * @QCA_WLAN_AUTH_TYPE_CCKM_WPA: cckm wpa key
+ * @QCA_WLAN_AUTH_TYPE_CCKM_RSN: cckm rsn key
+ */
+enum qca_wlan_auth_type {
+ QCA_WLAN_AUTH_TYPE_INVALID,
+ QCA_WLAN_AUTH_TYPE_OPEN,
+ QCA_WLAN_AUTH_TYPE_SHARED,
+ QCA_WLAN_AUTH_TYPE_WPA,
+ QCA_WLAN_AUTH_TYPE_WPA_PSK,
+ QCA_WLAN_AUTH_TYPE_WPA_NONE,
+ QCA_WLAN_AUTH_TYPE_RSN,
+ QCA_WLAN_AUTH_TYPE_RSN_PSK,
+ QCA_WLAN_AUTH_TYPE_FT,
+ QCA_WLAN_AUTH_TYPE_FT_PSK,
+ QCA_WLAN_AUTH_TYPE_SHA256,
+ QCA_WLAN_AUTH_TYPE_SHA256_PSK,
+ QCA_WLAN_AUTH_TYPE_WAI,
+ QCA_WLAN_AUTH_TYPE_WAI_PSK,
+ QCA_WLAN_AUTH_TYPE_CCKM_WPA,
+ QCA_WLAN_AUTH_TYPE_CCKM_RSN,
+ QCA_WLAN_AUTH_TYPE_AUTOSWITCH,
};
enum qca_nl80211_vendor_subcmds_index {
@@ -307,6 +408,7 @@
QCA_NL80211_VENDOR_SUBCMD_LL_RADIO_STATS_INDEX,
QCA_NL80211_VENDOR_SUBCMD_LL_IFACE_STATS_INDEX,
QCA_NL80211_VENDOR_SUBCMD_LL_PEER_INFO_STATS_INDEX,
+ QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX,
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
/* EXT TDLS */
QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX,
@@ -327,21 +429,18 @@
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX,
#endif /* FEATURE_WLAN_EXTSCAN */
-#ifdef FEATURE_WLAN_EXTSCAN
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX,
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ QCA_NL80211_VENDOR_SUBCMD_TEMPERATURE_EVENT_INDEX,
+ QCA_NL80211_VENDOR_SUBCMD_RESUME_COMP_EVENT_INDEX,
#endif
+
/* OCB events */
QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX,
-#ifdef WLAN_FEATURE_MEMDUMP
- QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX,
-#endif /* WLAN_FEATURE_MEMDUMP */
QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX,
#ifdef WLAN_FEATURE_NAN_DATAPATH
QCA_NL80211_VENDOR_SUBCMD_NDP_INDEX,
#endif /* WLAN_FEATURE_NAN_DATAPATH */
+ QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX,
};
/* EXT TDLS */
@@ -433,6 +532,21 @@
/* Unsigned 32-bit value from enum qca_set_band */
QCA_WLAN_VENDOR_ATTR_SETBAND_VALUE = 12,
+ /* used by QCA_NL80211_VENDOR_SUBCMD_GET_CHAIN_RSSI */
+ QCA_WLAN_VENDOR_ATTR_CHAIN_INDEX = 26,
+ QCA_WLAN_VENDOR_ATTR_CHAIN_RSSI = 27,
+
+ /* Used in QCA_NL80211_VENDOR_SUBCMD_STATS_EXT command
+ * to report frame aggregation statistics to userspace.
+ */
+ QCA_WLAN_VENDOR_ATTR_RX_AGGREGATION_STATS_HOLES_NUM = 34,
+ QCA_WLAN_VENDOR_ATTR_RX_AGGREGATION_STATS_HOLES_INFO = 35,
+
+ /* Used in QCA_NL80211_VENDOR_SUBCMD_GET_CHAIN_RSSI command
+ * to report the corresponding antenna index to the chain rssi value
+ */
+ QCA_WLAN_VENDOR_ATTR_ANTENNA_INFO = 40,
+
/* keep last */
QCA_WLAN_VENDOR_ATTR_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_MAX =
@@ -786,10 +900,6 @@
/* Unsigned 32bit value; a EXTSCAN Capabilities attribute. */
QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_NUM_WHITELISTED_SSID,
- /* EXTSCAN attributes for
- * QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND sub-command &
- * QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST sub-command
- */
/* Use attr QCA_WLAN_VENDOR_ATTR_EXTSCAN_NUM_RESULTS_AVAILABLE
* to indicate number of results.
*/
@@ -800,7 +910,14 @@
*/
QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_BUCKETS_SCANNED,
-
+ /*
+ * Unsigned 32bit value; a EXTSCAN Capabilities attribute to send maximum
+ * number of blacklist bssid's that firmware can support.
+ */
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_MAX_NUM_BLACKLISTED_BSSID,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_PAD,
+#endif
/* keep last */
QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_MAX =
@@ -1122,6 +1239,18 @@
*/
QCA_WLAN_VENDOR_ATTR_LL_STATS_RADIO_TX_TIME_PER_LEVEL,
+ /* Unsigned 32bit value */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_RTS_SUCC_CNT,
+ /* Unsigned 32bit value */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_RTS_FAIL_CNT,
+ /* Unsigned 32bit value */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_PPDU_SUCC_CNT,
+ /* Unsigned 32bit value */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_PPDU_FAIL_CNT,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_PAD,
+#endif
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_WMM_AC_PENDING_MSDU = 83,
/* keep last */
QCA_WLAN_VENDOR_ATTR_LL_STATS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_LL_STATS_MAX =
@@ -1301,6 +1430,8 @@
*/
QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS = 22,
+ /* Unsigned 32-bit value, representing the PNO Request ID */
+ QCA_WLAN_VENDOR_ATTR_PNO_CONFIG_REQUEST_ID = 23,
/* keep last */
QCA_WLAN_VENDOR_ATTR_PNO_AFTER_LAST,
@@ -1448,6 +1579,54 @@
QCA_WLAN_VENDOR_ATTR_ND_OFFLOAD_AFTER_LAST - 1,
};
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+/**
+ * enum qca_wlan_vendor_attr_get_temperature_rsp - vendor subcmd to get chip
+ * temperature
+ *
+ * @QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_INVALID: invalid
+ * @QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_TEMPERATURE: 32 bits temperature
+ *
+ * enum values are used for NL attributes for data used by
+ * QCA_NL80211_VENDOR_SUBCMD_GET_TEMPERATURE sub command.
+ */
+enum qca_wlan_vendor_attr_get_temperature_rsp {
+ QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_INVALID = 0,
+ QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_TEMPERATURE,
+ QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_MAX =
+ QCA_WLAN_VENDOR_ATTR_GET_TEMP_RSP_AFTER_LAST - 1,
+};
+
+/**
+ * enum qca_wlan_vendor_attr_get_thermal_params_rsp - vendor subcmd to get
+ * parameters of thermal shutdown feature
+ *
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_INVALID: invalid
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SHUTDOWN_EN: 8 bits flag
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SHUTDOWN_AUTO_EN: 8 bits flag
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_RESUME_THRESH: 16 bits threshold
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_WARNING_THRESH: 16 bits threshold
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SUSPEND_THRESH: 16 bits threshold
+ * @QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SAMPLE_RATE: 16 bits sample rate
+ *
+ * enum values are used for NL attributes for data used by
+ * QCA_NL80211_VENDOR_SUBCMD_GET_THERMAL_PARAMS sub command.
+ */
+enum qca_wlan_vendor_attr_get_thermal_params_rsp {
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_INVALID = 0,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SHUTDOWN_EN,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SHUTDOWN_AUTO_EN,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_RESUME_THRESH,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_WARNING_THRESH,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SUSPEND_THRESH,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_SAMPLE_RATE,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_MAX =
+ QCA_WLAN_VENDOR_ATTR_GET_THM_PARAMS_RSP_AFTER_LAST - 1,
+};
+#endif
+
/**
* enum qca_wlan_vendor_features - vendor device/driver features
* @QCA_WLAN_VENDOR_FEATURE_KEY_MGMT_OFFLOAD: Device supports key
@@ -1461,6 +1640,27 @@
NUM_QCA_WLAN_VENDOR_FEATURES
};
+/**
+ * enum qca_wlan_vendor_attr_flush_pending - Attributes for
+ * flush pending traffic in firmware.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_PEER_ADDR: Configure peer mac address.
+ * @QCA_WLAN_VENDOR_ATTR_AC: Configure access category the pending
+ * packets using. It is u8 value with bit0~3 represent AC_BE, AC_BK,
+ * AC_VI, AC_VO respectively. Set the corresponding bit to 1 to flush
+ * packets with access category.
+ */
+enum qca_wlan_vendor_attr_flush_pending{
+ QCA_WLAN_VENDOR_ATTR_FLUSH_PENDING_INVALID = 0,
+ QCA_WLAN_VENDOR_ATTR_PEER_ADDR = 1,
+ QCA_WLAN_VENDOR_ATTR_AC = 2,
+
+ /* keep last */
+ QCA_WLAN_VENDOR_ATTR_FLUSH_PENDING_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_FLUSH_PENDING_MAX =
+ QCA_WLAN_VENDOR_ATTR_FLUSH_PENDING_AFTER_LAST - 1,
+};
+
/* Feature defines */
#define WIFI_FEATURE_INFRA 0x0001 /* Basic infrastructure mode */
#define WIFI_FEATURE_INFRA_5G 0x0002 /* Support for 5 GHz Band */
@@ -1489,6 +1689,10 @@
#define WIFI_FEATURE_MKEEP_ALIVE 0x100000 /* WiFi mkeep_alive */
#define WIFI_FEATURE_CONFIG_NDO 0x200000 /* ND offload configure */
#define WIFI_FEATURE_TX_TRANSMIT_POWER 0x400000 /* Tx transmit power levels */
+#define WIFI_FEATURE_CONTROL_ROAMING 0x800000 /* Enable/Disable roaming */
+#define WIFI_FEATURE_IE_WHITELIST 0x1000000 /* Support Probe IE white listing */
+#define WIFI_FEATURE_SCAN_RAND 0x2000000 /* Support MAC & Probe Sequence Number randomization */
+
/* Add more features here */
#define WIFI_TDLS_SUPPORT BIT(0)
@@ -1497,7 +1701,6 @@
/**
* enum wifi_logger_supported_features - values for supported logger features
- * @WIFI_LOGGER_MEMORY_DUMP_SUPPORTED - Memory dump of FW
* @WIFI_LOGGER_PER_PACKET_TX_RX_STATUS_SUPPORTED - Per packet statistics
* @WIFI_LOGGER_CONNECT_EVENT_SUPPORTED - Logging of Connectivity events
* @WIFI_LOGGER_POWER_EVENT_SUPPORTED - Power of driver
@@ -1505,7 +1708,6 @@
* @WIFI_LOGGER_WATCHDOG_TIMER_SUPPORTED - monitor FW health
*/
enum wifi_logger_supported_features {
- WIFI_LOGGER_MEMORY_DUMP_SUPPORTED = (1 << (0)),
WIFI_LOGGER_PER_PACKET_TX_RX_STATUS_SUPPORTED = (1 << (1)),
WIFI_LOGGER_CONNECT_EVENT_SUPPORTED = (1 << (2)),
WIFI_LOGGER_POWER_EVENT_SUPPORTED = (1 << (3)),
@@ -1555,6 +1757,33 @@
QCA_ACS_MODE_IEEE80211AD,
};
+#define CFG_NON_AGG_RETRY_MAX (31)
+#define CFG_AGG_RETRY_MAX (31)
+#define CFG_MGMT_RETRY_MAX (31)
+#define CFG_CTRL_RETRY_MAX (31)
+#define CFG_PROPAGATION_DELAY_MAX (63)
+#define CFG_PROPAGATION_DELAY_BASE (64)
+#define CFG_AGG_RETRY_MIN (5)
+
+/**
+ * enum qca_access_policy - access control policy
+ *
+ * Access control policy is applied on the configured IE
+ * (QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY_IE).
+ * To be set with QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY.
+ *
+ * @QCA_ACCESS_POLICY_ACCEPT_UNLESS_LISTED: Deny Wi-Fi Connections which match
+ * with the specific configuration (IE) set, i.e. allow all the
+ * connections which do not match the configuration.
+ * @QCA_ACCESS_POLICY_DENY_UNLESS_LISTED: Accept Wi-Fi Connections which match
+ * with the specific configuration (IE) set, i.e. deny all the
+ * connections which do not match the configuration.
+ */
+enum qca_access_policy {
+ QCA_ACCESS_POLICY_ACCEPT_UNLESS_LISTED,
+ QCA_ACCESS_POLICY_DENY_UNLESS_LISTED,
+};
+
/**
* enum qca_wlan_vendor_config: wifi config attr
*
@@ -1573,10 +1802,44 @@
* @QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY: management frame sw retry threshold
* @QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY: control frame sw retry threshold
* @QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY:
- * propagtion delay for 2G/5G band(Units in ms)
+ * propagation delay for 2G/5G band(Units in us)
* @QCA_WLAN_VENDOR_ATTR_CONFIG_TX_FAIL_COUNT: Unsigned 32-bit value to
* configure the number of unicast TX fail packet count.
* The peer is disconnected once this threshold is reached.
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_DEFAULT_IES: Update the default scan IEs
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND:
+ * Unsigned 32-bit value attribute for generic commands
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_VALUE:
+ * Unsigned 32-bit data attribute for generic command response
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA:
+ * Unsigned 32-bit data attribute for generic command response
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_LENGTH:
+ * Unsigned 32-bit length attribute for
+ * QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_FLAGS:
+ * Unsigned 32-bit flags attribute for QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY: Vendor IE access policy
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY_IE_LIST: Vendor IE to be used
+ * with access policy
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_IFINDEX: interface index for vdev specific
+ * parameters
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_QPOWER: Unsigned 8bit length attribute to update
+ * power save config to turn off/on qpower
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_VOICE:
+ * 32-bit unsigned value to set reorder timeout for AC_VO
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_VIDEO:
+ * 32-bit unsigned value to set reorder timeout for AC_VI
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_BESTEFFORT:
+ * 32-bit unsigned value to set reorder timeout for AC_BE
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_BACKGROUND:
+ * 32-bit unsigned value to set reorder timeout for AC_BK
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_BLOCKSIZE_PEER_MAC:
+ * 6-byte MAC address to point out the specific peer
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_BLOCKSIZE_WINLIMIT:
+ * 32-bit unsigned value to set window size for specific peer
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_ABS_DELAY:
+ * 32-bit unsigned value to configure the propagation absolute
+ * delay for 2G/5G band (units in us)
* @QCA_WLAN_VENDOR_ATTR_CONFIG_LAST: last config
* @QCA_WLAN_VENDOR_ATTR_CONFIG_MAX: max config
*/
@@ -1597,11 +1860,85 @@
QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY,
QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY,
QCA_WLAN_VENDOR_ATTR_CONFIG_TX_FAIL_COUNT,
+ /* Attribute used to set scan default IEs to the driver.
+ *
+ * These IEs can be used by scan operations that will be initiated by
+ * the driver/firmware.
+ *
+ * For further scan requests coming to the driver, these IEs should be
+ * merged with the IEs received along with scan request coming to the
+ * driver. If a particular IE is present in the scan default IEs but not
+ * present in the scan request, then that IE should be added to the IEs
+ * sent in the Probe Request frames for that scan request. */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_DEFAULT_IES,
+ /* Unsigned 32-bit attribute for generic commands */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND,
+ /* Unsigned 32-bit value attribute for generic commands */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_VALUE,
+ /* Unsigned 32-bit data attribute for generic command response */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA,
+ /* Unsigned 32-bit length attribute for
+ * QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_LENGTH,
+ /* Unsigned 32-bit flags attribute for
+ * QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_DATA */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_FLAGS,
+ /* Unsigned 32-bit, defining the access policy.
+ * See enum qca_access_policy. Used with
+ * QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY_IE_LIST. */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY,
+ /* Sets the list of full set of IEs for which a specific access policy
+ * has to be applied. Used along with
+ * QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY to control the access.
+ * Zero length payload can be used to clear this access constraint. */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ACCESS_POLICY_IE_LIST,
+ /* Unsigned 32-bit, specifies the interface index (netdev) for which the
+ * corresponding configurations are applied. If the interface index is
+ * not specified, the configurations are attributed to the respective
+ * wiphy. */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_IFINDEX,
+ /* Unsigned 8-bit, for setting qpower dynamically */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_QPOWER,
+
+ /* 32-bit unsigned value to trigger antenna diversity features:
+ * 1-Enable, 0-Disable */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_ENA = 27,
+ /* 32-bit unsigned value to configure specific chain antenna */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_CHAIN = 28,
+ /* 32-bit unsigned value to trigger cycle selftest
+ * 1-Enable, 0-Disable */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_SELFTEST = 29,
+ /* 32-bit unsigned to configure the cycle time of selftest
+ * the unit is micro-second */
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_SELFTEST_INTVL = 30,
+
+ QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_VOICE = 31,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_VIDEO = 32,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_BESTEFFORT = 33,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_RX_REORDER_TIMEOUT_BACKGROUND = 34,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_RX_BLOCKSIZE_PEER_MAC = 35,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_RX_BLOCKSIZE_WINLIMIT = 36,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_SUB20_CHAN_WIDTH = 39,
+ QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_ABS_DELAY = 40,
+ /* 32-bit unsigned value to set probe period*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_PERIOD = 41,
+ /* 32-bit unsigned value to set stay period*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_STAY_PERIOD = 42,
+ /* 32-bit unsigned value to set snr diff*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_SNR_DIFF = 43,
+ /* 32-bit unsigned value to set probe dewll time*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_DWELL_TIME = 44,
+ /* 32-bit unsigned value to set mgmt snr weight*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_MGMT_SNR_WEIGHT = 45,
+ /* 32-bit unsigned value to set data snr weight*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_DATA_SNR_WEIGHT = 46,
+ /* 32-bit unsigned value to set ack snr weight*/
+ QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_ACK_SNR_WEIGHT = 47,
/* keep last */
QCA_WLAN_VENDOR_ATTR_CONFIG_LAST,
QCA_WLAN_VENDOR_ATTR_CONFIG_MAX =
- QCA_WLAN_VENDOR_ATTR_CONFIG_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_CONFIG_LAST - 1
};
/**
@@ -1725,6 +2062,39 @@
};
/**
+ * qca_chip_power_save_failure_reason: Power save failure reason
+ * @QCA_CHIP_POWER_SAVE_FAILURE_REASON_PROTOCOL: Indicates power save failure
+ * due to protocol/module.
+ * @QCA_CHIP_POWER_SAVE_FAILURE_REASON_HARDWARE: power save failure
+ * due to hardware
+ */
+enum qca_chip_power_save_failure_reason {
+ QCA_CHIP_POWER_SAVE_FAILURE_REASON_PROTOCOL = 0,
+ QCA_CHIP_POWER_SAVE_FAILURE_REASON_HARDWARE = 1,
+};
+
+/**
+ * qca_attr_chip_power_save_failure: attributes to vendor subcmd
+ * @QCA_NL80211_VENDOR_SUBCMD_CHIP_PWRSAVE_FAILURE. This carry the requisite
+ * information leading to the power save failure.
+ * @QCA_ATTR_CHIP_POWER_SAVE_FAILURE_INVALID : invalid
+ * @QCA_ATTR_CHIP_POWER_SAVE_FAILURE_REASON : power save failure reason
+ * represented by enum qca_chip_power_save_failure_reason
+ * @QCA_ATTR_CHIP_POWER_SAVE_FAILURE_LAST : Last
+ * @QCA_ATTR_CHIP_POWER_SAVE_FAILURE_MAX : Max value
+ */
+enum qca_attr_chip_power_save_failure {
+ QCA_ATTR_CHIP_POWER_SAVE_FAILURE_INVALID = 0,
+
+ QCA_ATTR_CHIP_POWER_SAVE_FAILURE_REASON = 1,
+
+ /* keep last */
+ QCA_ATTR_CHIP_POWER_SAVE_FAILURE_LAST,
+ QCA_ATTR_CHIP_POWER_SAVE_FAILURE_MAX =
+ QCA_ATTR_CHIP_POWER_SAVE_FAILURE_LAST - 1,
+};
+
+/**
* enum set_reset_packet_filter - set packet filter control commands
* @QCA_WLAN_SET_PACKET_FILTER: Set Packet Filter
* @QCA_WLAN_GET_PACKET_FILTER: Get Packet filter
@@ -1808,6 +2178,16 @@
* Rx wake packet count due to ipv6 multicast
* @QCA_WLAN_VENDOR_ATTR_OTHER_RX_MULTICAST_CNT:
* Rx wake packet count due to non-ipv4 and non-ipv6 packets
+ * @QCA_WLAN_VENDOR_ATTR_RSSI_BREACH_CNT:
+ * wake rssi breach packet count
+ * @QCA_WLAN_VENDOR_ATTR_LOW_RSSI_CNT:
+ * wake low rssi packet count
+ * @QCA_WLAN_VENDOR_ATTR_GSCAN_CNT:
+ * wake gscan packet count
+ * @QCA_WLAN_VENDOR_ATTR_PNO_COMPLETE_CNT:
+ * wake pno complete packet count
+ * @QCA_WLAN_VENDOR_ATTR_PNO_MATCH_CNT:
+ * wake pno match packet count
*/
enum qca_wlan_vendor_attr_wake_stats {
QCA_WLAN_VENDOR_ATTR_GET_WAKE_STATS_INVALID = 0,
@@ -1829,6 +2209,11 @@
QCA_WLAN_VENDOR_ATTR_ICMP4_RX_MULTICAST_CNT,
QCA_WLAN_VENDOR_ATTR_ICMP6_RX_MULTICAST_CNT,
QCA_WLAN_VENDOR_ATTR_OTHER_RX_MULTICAST_CNT,
+ QCA_WLAN_VENDOR_ATTR_RSSI_BREACH_CNT,
+ QCA_WLAN_VENDOR_ATTR_LOW_RSSI_CNT,
+ QCA_WLAN_VENDOR_ATTR_GSCAN_CNT,
+ QCA_WLAN_VENDOR_ATTR_PNO_COMPLETE_CNT,
+ QCA_WLAN_VENDOR_ATTR_PNO_MATCH_CNT,
/* keep last */
QCA_WLAN_VENDOR_GET_WAKE_STATS_AFTER_LAST,
QCA_WLAN_VENDOR_GET_WAKE_STATS_MAX =
@@ -1904,6 +2289,143 @@
QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_AFTER_LAST - 1,
};
+/**
+ * enum qca_wlan_vendor_attr_get_station - Sub commands used by
+ * QCA_NL80211_VENDOR_SUBCMD_GET_STATION to get the corresponding
+ * station information. The information obtained through these
+ * commands signify the current info in connected state and
+ * latest cached information during the connected state , if queried
+ * when in disconnected state.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INVALID: Invalid attribute
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO: bss info
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_ASSOC_FAIL_REASON: assoc fail reason
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_REMOTE: remote peer info
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_AFTER_LAST: After last
+ */
+enum qca_wlan_vendor_attr_get_station {
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INVALID = 0,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO = 1,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_ASSOC_FAIL_REASON = 2,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_REMOTE = 3,
+
+ /* keep last */
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_MAX =
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_AFTER_LAST - 1,
+};
+
+/**
+ * enum qca_wlan_vendor_attr_get_station_info - Station Info queried
+ * through QCA_NL80211_VENDOR_SUBCMD_GET_STATION.
+ *
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_INVALID: Invalid Attribute
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_LINK_STANDARD_NL80211_ATTR:
+ * Get the standard NL attributes Nested with this attribute.
+ * Ex : Query BW , BITRATE32 , NSS , Signal , Noise of the Link -
+ * NL80211_ATTR_SSID / NL80211_ATTR_SURVEY_INFO (Connected Channel) /
+ * NL80211_ATTR_STA_INFO
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AP_STANDARD_NL80211_ATTR:
+ * Get the standard NL attributes Nested with this attribute.
+ * Ex : Query HT/VHT Capability advertized by the AP.
+ * NL80211_ATTR_VHT_CAPABILITY / NL80211_ATTR_HT_CAPABILITY
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ROAM_COUNT:
+ * Number of successful Roam attempts before a
+ * disconnect, Unsigned 32 bit value
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AKM:
+ * Authentication Key Management Type used for the connected session.
+ * Signified by enum qca_wlan_auth_type
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_802_11_MODE: 802.11 Mode of the
+ * connected Session, signified by enum qca_wlan_802_11_mode
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AP_HS20_INDICATION:
+ * HS20 Indication Element
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSOC_FAIL_REASON:
+ * Status Code Corresponding to the Association Failure.
+ * Unsigned 32 bit value.
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_MAX_PHY_RATE:
+ * max phy rate for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_PACKETS:
+ * tx packets for remote peer (interface layer)
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_BYTES:
+ * tx bytes for remote peer (interface layer)
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_PACKETS:
+ * rx packets for remote peer (interface layer)
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BYTES:
+ * rx bytes for remote peer (interface layer)
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_TX_RATE:
+ * last tx rate for remote peer (in kbps)
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_RX_RATE:
+ * last rx rate for remote peer (in kbps)
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_WMM:
+ * wmm for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SUPPORTED_MODE:
+ * supported mode for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_AMPDU:
+ * ampdu for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_STBC:
+ * tx stbc for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_STBC:
+ * rx stbc for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_CH_WIDTH:
+ * ch widht for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SGI_ENABLE:
+ * sgi enable for remote peer
+ * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AFTER_LAST: After last
+ */
+enum qca_wlan_vendor_attr_get_station_info {
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_INVALID = 0,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_LINK_STANDARD_NL80211_ATTR,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AP_STANDARD_NL80211_ATTR,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ROAM_COUNT,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AKM,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_802_11_MODE,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AP_HS20_INDICATION,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_HT_OPERATION,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_VHT_OPERATION,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSOC_FAIL_REASON,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_MAX_PHY_RATE,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_PACKETS,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_BYTES,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_PACKETS,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BYTES,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_TX_RATE,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_RX_RATE,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_WMM,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SUPPORTED_MODE,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_AMPDU,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_STBC,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_STBC,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_CH_WIDTH,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SGI_ENABLE,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_PAD,
+#endif
+ /* keep last */
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_MAX =
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AFTER_LAST - 1,
+};
+
+/* define short names for get station info attributes */
+#define LINK_INFO_STANDARD_NL80211_ATTR \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_LINK_STANDARD_NL80211_ATTR
+#define AP_INFO_STANDARD_NL80211_ATTR \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AP_STANDARD_NL80211_ATTR
+#define INFO_ROAM_COUNT \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ROAM_COUNT
+#define INFO_AKM \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AKM
+#define WLAN802_11_MODE \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_802_11_MODE
+#define AP_INFO_HS20_INDICATION \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AP_HS20_INDICATION
+#define HT_OPERATION \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_HT_OPERATION
+#define VHT_OPERATION \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_VHT_OPERATION
+#define INFO_ASSOC_FAIL_REASON \
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSOC_FAIL_REASON
+
/** enum qca_vendor_attr_txpower_scale - vendor sub commands index
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_INVALID: invalid value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE: scaling value
@@ -1937,6 +2459,316 @@
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_AFTER_LAST - 1
};
+/**
+ * enum qca_wlan_vendor_attr_ll_stats_ext - Attributes for MAC layer monitoring
+ * offload which is an extension for LL_STATS.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_CFG_PERIOD: Monitoring period. Unit in ms.
+ * If MAC counters do not exceed the threshold, FW will report monitored
+ * link layer counters periodically as this setting. The first report is
+ * always triggered by this timer.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_CFG_THRESHOLD: It is a percentage (1-99).
+ * For each MAC layer counter, FW holds two copies. One is the current value.
+ * The other is the last report. Once a current counter's increment is larger
+ * than the threshold, FW will indicate that counter to host even if the
+ * monitoring timer does not expire.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_CHG: Peer STA power state change
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TID: TID of MSDU
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_NUM_MSDU: Count of MSDU with the same
+ * failure code.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_STATUS: TX failure code
+ * 1: TX packet discarded
+ * 2: No ACK
+ * 3: Postpone
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_MAC_ADDRESS: peer MAC address
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_STATE: Peer STA current state
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_GLOBAL: Global threshold.
+ * Threshold for all monitored parameters. If per counter dedicated threshold
+ * is not enabled, this threshold will take effect.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_EVENT_MODE: Indicate what triggers this
+ * event, PERORID_TIMEOUT == 1, THRESH_EXCEED == 0.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_ID: interface ID
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_ID: peer ID
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_BITMAP: bitmap for TX counters
+ * Bit0: TX counter unit in MSDU
+ * Bit1: TX counter unit in MPDU
+ * Bit2: TX counter unit in PPDU
+ * Bit3: TX counter unit in byte
+ * Bit4: Dropped MSDUs
+ * Bit5: Dropped Bytes
+ * Bit6: MPDU retry counter
+ * Bit7: MPDU failure counter
+ * Bit8: PPDU failure counter
+ * Bit9: MPDU aggregation counter
+ * Bit10: MCS counter for ACKed MPDUs
+ * Bit11: MCS counter for Failed MPDUs
+ * Bit12: TX Delay counter
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_BITMAP: bitmap for RX counters
+ * Bit0: MAC RX counter unit in MPDU
+ * Bit1: MAC RX counter unit in byte
+ * Bit2: PHY RX counter unit in PPDU
+ * Bit3: PHY RX counter unit in byte
+ * Bit4: Disorder counter
+ * Bit5: Retry counter
+ * Bit6: Duplication counter
+ * Bit7: Discard counter
+ * Bit8: MPDU aggregation size counter
+ * Bit9: MCS counter
+ * Bit10: Peer STA power state change (wake to sleep) counter
+ * Bit11: Peer STA power save counter, total time in PS mode
+ * Bit12: Probe request counter
+ * Bit13: Other management frames counter
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CCA_BSS_BITMAP: bitmap for CCA
+ * Bit0: Idle time
+ * Bit1: TX time
+ * Bit2: time RX in current bss
+ * Bit3: Out of current bss time
+ * Bit4: Wireless medium busy time
+ * Bit5: RX in bad condition time
+ * Bit6: TX in bad condition time
+ * Bit7: time wlan card not availbe
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_SIGNAL_BITMAP: bitmap for signal
+ * Bit0: Per channel SNR counter
+ * Bit1: Per channel noise floor counter
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_NUM: number of peers
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CHANNEL_NUM: number of channels
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_AC_RX_NUM: number of RX stats
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CCA_BSS: per channel BSS CCA stats
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER: container for per PEER stats
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_MSDU: Number of total TX MSDUs
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_MPDU: Number of total TX MPDUs
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_PPDU: Number of total TX PPDUs
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_BYTES: bytes of TX data
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_DROP: Number of dropped TX packets
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_DROP_BYTES: Bytes dropped
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_RETRY: waiting time without an ACK
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_NO_ACK: number of MPDU not-ACKed
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_NO_BACK: number of PPDU not-ACKed
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_AGGR_NUM:
+ * aggregation stats buffer length
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_SUCC_MCS_NUM: length of mcs stats
+ * buffer for ACKed MPDUs.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_FAIL_MCS_NUM: length of mcs stats
+ * buffer for failed MPDUs.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_DELAY_ARRAY_SIZE:
+ * length of delay stats array.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_AGGR: TX aggregation stats
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_SUCC_MCS: MCS stats for ACKed MPDUs
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_FAIL_MCS: MCS stats for failed MPDUs
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_DELAY: tx delay stats
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU: MPDUs received
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_BYTES: bytes received
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_PPDU: PPDU received
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_PPDU_BYTES: PPDU bytes received
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_LOST: packets lost
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_RETRY: number of RX packets
+ * flagged as retransmissions
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_DUP: number of RX packets
+ * flagged as duplicated
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_DISCARD: number of RX
+ * packets discarded
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_AGGR_NUM: length of RX aggregation
+ * stats buffer.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MCS_NUM: length of RX mcs
+ * stats buffer.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MCS: RX mcs stats buffer
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_AGGR: aggregation stats buffer
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_TIMES: times STAs go to sleep
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_DURATION: STAS' total sleep time
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_PROBE_REQ: number of probe
+ * requests received
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MGMT: number of other mgmt
+ * frames received
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IDLE_TIME: Percentage of idle time
+ * there is no TX, nor RX, nor interference.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_TIME: percentage of time
+ * transmitting packets.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_TIME: percentage of time
+ * for receiving.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_BUSY: percentage of time
+ * interference detected.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_BAD: percentage of time
+ * receiving packets with errors.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_BAD: percentage of time
+ * TX no-ACK.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_NO_AVAIL: percentage of time
+ * the chip is unable to work in normal conditions.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IN_BSS_TIME: percentage of time
+ * receiving packets in current BSS.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_OUT_BSS_TIME: percentage of time
+ * receiving packets not in current BSS.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_ANT_NUM: number of antennas
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_SIGNAL:
+ * This is a container for per antenna signal stats.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_SNR: per antenna SNR value
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_NF: per antenna NF value
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_RSSI_BEACON: RSSI of beacon
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_SNR_BEACON: SNR of beacon
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_REPORT_TIME: u64
+ * Absolute timestamp from 1970/1/1, unit in ms. After receiving the
+ * message, user layer APP could call gettimeofday to get another
+ * timestamp and calculate transfer delay for the message.
+ * @QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MEASUREMENT_TIME: u32
+ * Real period for this measurement, unit in us.
+ */
+enum qca_wlan_vendor_attr_ll_stats_ext {
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_INVALID = 0,
+
+ /* Attributes for configurations */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_CFG_PERIOD,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_CFG_THRESHOLD,
+
+ /* Peer STA power state change */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_CHG,
+
+ /* TX failure event */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TID,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_NUM_MSDU,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_STATUS,
+
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_STATE,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_MAC_ADDRESS,
+
+ /* MAC counters */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_GLOBAL,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_EVENT_MODE,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_ID,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_ID,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_BITMAP,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_BITMAP,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CCA_BSS_BITMAP,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_SIGNAL_BITMAP,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CHANNEL_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_CCA_BSS,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER,
+
+ /* Sub-attribute for PEER_AC_TX */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_MSDU,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_MPDU,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_PPDU,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_BYTES,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_DROP,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_DROP_BYTES,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_RETRY,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_NO_ACK,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_NO_BACK,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_AGGR_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_SUCC_MCS_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_FAIL_MCS_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_AGGR,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_SUCC_MCS,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_FAIL_MCS,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_DELAY_ARRAY_SIZE,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_DELAY,
+
+ /* sub-attribute for PEER_AC_RX */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_BYTES,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_PPDU,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_PPDU_BYTES,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_LOST,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_RETRY,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_DUP,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU_DISCARD,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_AGGR_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MCS_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MCS,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_AGGR,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_TIMES,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_PS_DURATION,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_PROBE_REQ,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MGMT,
+
+ /* sub-attribute for CCA_BSS */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IDLE_TIME,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_TIME,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_TIME,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_BUSY,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_BAD,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_BAD,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_NO_AVAIL,
+
+ /* sub-attribtue for BSS_RX_TIME */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IN_BSS_TIME,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_OUT_BSS_TIME,
+
+ /* sub-attribute for PEER_SIGNAL */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_ANT_NUM,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_SIGNAL,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_SNR,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_NF,
+
+ /* sub-attribute for IFACE_BSS */
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_RSSI_BEACON,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_IFACE_SNR_BEACON,
+
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_REPORT_TIME,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MEASUREMENT_TIME,
+
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_LAST,
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MAX =
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_LAST - 1,
+};
+
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+/**
+ * enum wlan_ts_cmds - thermal commands.
+ *
+ * @WLAN_TS_CMD_GET_PARAMS:
+ * Get the configuration parameters for thermal shutdown for user.
+ * @WLAN_TS_CMD_GET_TEMP:
+ * Get the temperature from FW and send it to user.
+ * @WLAN_TS_CMD_SUSPEND:
+ * Execute the suspend command issued from user.
+ * @WLAN_TS_CMD_RESUME:
+ * Execute the resume command issued from user.
+ */
+enum wlan_ts_cmds {
+ WLAN_TS_CMD_NONE,
+ WLAN_TS_CMD_GET_PARAMS,
+ WLAN_TS_CMD_GET_TEMP,
+ WLAN_TS_CMD_SUSPEND,
+ WLAN_TS_CMD_RESUME,
+};
+
+/**
+ * enum qca_wlan_vendor_attr_thermal_drv_cmd - thermal command value for vendor
+ * sub-command QCA_NL80211_VENDOR_SUBCMD_THERMAL_CMD
+ * @QCA_WLAN_VENDOR_ATTR_THM_CMD_VALUE:
+ * The value of command, driver will implement different operations according
+ * to this value.
+ */
+enum qca_wlan_vendor_attr_thermal_drv_cmd {
+ QCA_WLAN_VENDOR_ATTR_THM_CMD_INVALID = 0,
+ QCA_WLAN_VENDOR_ATTR_THM_CMD_VALUE,
+ QCA_WLAN_VENDOR_ATTR_THM_CMD_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_THM_CMD_MAX =
+ QCA_WLAN_VENDOR_ATTR_THM_CMD_AFTER_LAST - 1,
+};
+#endif
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0))
+/**
+ * enum ieee80211_band - supported frequency bands
+ *
+ * The bands are assigned this way because the supported
+ * bitrates differ in these bands.
+ *
+ * @IEEE80211_BAND_2GHZ: 2.4GHz ISM band
+ * @IEEE80211_BAND_5GHZ: around 5GHz band (4.9-5.7)
+ * @IEEE80211_BAND_60GHZ: around 60 GHz band (58.32 - 64.80 GHz)
+ * @IEEE80211_NUM_BANDS: number of defined bands
+ */
+enum ieee80211_band {
+ IEEE80211_BAND_2GHZ = NL80211_BAND_2GHZ,
+ IEEE80211_BAND_5GHZ = NL80211_BAND_5GHZ,
+ IEEE80211_BAND_60GHZ = NL80211_BAND_60GHZ,
+
+ /* keep last */
+ IEEE80211_NUM_BANDS
+};
+#endif
+
struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_db( hdd_adapter_t *pAdapter,
tCsrRoamInfo *pRoamInfo
);
@@ -2008,6 +2840,8 @@
void* wlan_hdd_change_country_code_cb(void *pAdapter);
void hdd_select_cbmode(hdd_adapter_t *pAdapter, v_U8_t operationChannel,
uint16_t *ch_width);
+void hdd_select_mon_cbmode(hdd_adapter_t *adapter, v_U8_t operation_channel,
+ uint16_t *ch_width);
v_U8_t* wlan_hdd_cfg80211_get_ie_ptr(const v_U8_t *pIes,
int length,
@@ -2035,8 +2869,8 @@
#endif
void hdd_suspend_wlan(void (*callback)(void *callbackContext, boolean suspended),
- void *callbackContext);
-void hdd_resume_wlan(void);
+ void *callbackContext, bool thermal);
+void hdd_resume_wlan(bool thermal);
#if defined(FEATURE_WLAN_CH_AVOID) || defined(FEATURE_WLAN_FORCE_SAP_SCC)
int wlan_hdd_send_avoid_freq_event(hdd_context_t *pHddCtx,
@@ -2049,14 +2883,24 @@
void *pMsg);
#endif /* FEATURE_WLAN_EXTSCAN */
+void wlan_hdd_cfg80211_chainrssi_callback(void *ctx, void *pmsg);
+
void hdd_rssi_threshold_breached(void *hddctx,
struct rssi_breach_event *data);
struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_list(
hdd_adapter_t *pAdapter, tSirMacAddr bssid);
+int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
+ struct cfg80211_wowlan *wow, bool thermal);
int wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
struct cfg80211_wowlan *wow);
+int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy, bool thermal);
+int wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy);
+
+bool hdd_system_suspend_state_set(hdd_context_t *hdd_ctx, bool state);
+int hdd_thermal_suspend_state(hdd_context_t *hdd_ctx);
+
void wlan_hdd_cfg80211_acs_ch_select_evt(hdd_adapter_t *adapter);
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
int wlan_hdd_send_roam_auth_event(hdd_context_t *hdd_ctx_ptr, uint8_t *bssid,
@@ -2124,4 +2968,29 @@
GFP_KERNEL);
}
#endif
+
+/**
+ * enum wlan_hdd_scan_type_for_randomization - type of scan
+ * @WLAN_HDD_HOST_SCAN: refers to scan request from cfg80211_ops "scan"
+ * @WLAN_HDD_PNO_SCAN: refers to scan request is from "sched_scan_start"
+ *
+ * driver uses this enum to identify source of scan
+ *
+ */
+enum wlan_hdd_scan_type_for_randomization {
+ WLAN_HDD_HOST_SCAN,
+ WLAN_HDD_PNO_SCAN,
+};
+
+int wlan_hdd_try_disconnect(hdd_adapter_t *pAdapter);
+
+/**
+ * wlan_hdd_cfg80211_scan_block_cb() - scan block work handler
+ * @work: Pointer to work
+ *
+ * This function is used to do scan block work handler
+ *
+ * Return: None
+ */
+void wlan_hdd_cfg80211_scan_block_cb(struct work_struct *work);
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs.h
index 40415fd..37fc570 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -29,15 +29,24 @@
#define _WLAN_HDD_DEBUGFS_H
#ifdef WLAN_OPEN_SOURCE
+#define MAX_USER_COMMAND_SIZE_FRAME 4096
+
VOS_STATUS hdd_debugfs_init(hdd_adapter_t *pAdapter);
void hdd_debugfs_exit(hdd_context_t *pHddCtx);
+int wlan_hdd_debugfs_open(struct inode *inode, struct file *file);
#else
-inline VOS_STATUS hdd_debugfs_init(hdd_adapter_t *pAdapter)
+static inline VOS_STATUS hdd_debugfs_init(hdd_adapter_t *pAdapter)
{
- return VOS_STATUS_SUCCESS;
+ return VOS_STATUS_SUCCESS;
}
-inline void hdd_debugfs_exit(hdd_context_t *pHddCtx)
+
+static inline void hdd_debugfs_exit(hdd_context_t *pHddCtx)
{
}
+
+static inline int wlan_hdd_debugfs_open(struct inode *inode, struct file *file)
+{
+ return 0;
+}
#endif /* #ifdef WLAN_OPEN_SOURCE */
#endif /* #ifndef _WLAN_HDD_DEBUGFS_H */
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs_ocb.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs_ocb.h
new file mode 100644
index 0000000..2536de3
--- /dev/null
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_debugfs_ocb.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2017 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _WLAN_HDD_DEBUGFS_OCB_H
+#define _WLAN_HDD_DEBUGFS_OCB_H
+
+#ifdef WLAN_FEATURE_DSRC
+int
+wlan_hdd_create_dsrc_chan_stats_file(hdd_adapter_t *adapter,
+ hdd_context_t *hdd_ctx);
+int
+wlan_hdd_create_dsrc_tx_stats_file(hdd_adapter_t *adapter,
+ hdd_context_t *hdd_ctx);
+#else
+static inline int
+wlan_hdd_create_dsrc_chan_stats_file(hdd_adapter_t *adapter,
+ hdd_context_t *hdd_ctx)
+{
+ return 0;
+}
+
+static inline int
+wlan_hdd_create_dsrc_tx_stats_file(hdd_adapter_t *adapter,
+ hdd_context_t *hdd_ctx)
+{
+ return 0;
+}
+#endif /* #ifdef WLAN_FEATURE_DSRC */
+#endif /* #ifndef _WLAN_HDD_DEBUGFS_OCB_H */
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ftm.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ftm.h
index a0260a7..ef16756 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ftm.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ftm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -60,6 +60,12 @@
#if defined(QCA_WIFI_FTM)
VOS_STATUS wlan_hdd_ftm_testmode_cmd(void *data, int len, boolean from_qcmbr);
int wlan_hdd_qcmbr_unified_ioctl(hdd_adapter_t *pAdapter, struct ifreq *ifr);
+VOS_STATUS hdd_ftm_start(hdd_context_t *pHddCtx);
+#else
+static inline VOS_STATUS hdd_ftm_start(hdd_context_t *pHddCtx)
+{
+ return VOS_STATUS_SUCCESS;
+}
#endif
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_hostapd.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_hostapd.h
index 574bb75..2a08dc9 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_hostapd.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_hostapd.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -92,11 +92,13 @@
u_int8_t *gen_ie );
VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCallback);
-VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter );
+VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter, bool reinit);
void hdd_set_ap_ops( struct net_device *pWlanHostapdDev );
int hdd_hostapd_stop (struct net_device *dev);
void hdd_hostapd_channel_wakelock_init(hdd_context_t *pHddCtx);
void hdd_hostapd_channel_wakelock_deinit(hdd_context_t *pHddCtx);
+void hdd_sap_indicate_disconnect_for_sta(hdd_adapter_t *adapter);
+void hdd_sap_destroy_events(hdd_adapter_t *adapter);
#ifdef FEATURE_WLAN_FORCE_SAP_SCC
void hdd_restart_softap (hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter);
#endif /* FEATURE_WLAN_FORCE_SAP_SCC */
@@ -221,4 +223,39 @@
hddLog(LOG1, FL("is_ch_avoid_in_progress %d"), value);
}
+#ifdef FEATURE_WLAN_SUB_20_MHZ
+bool hdd_hostapd_sub20_channelwidth_can_switch(
+ hdd_adapter_t *adapter, uint32_t *sub20_channel_width);
+bool hdd_hostapd_sub20_channelwidth_can_restore(
+ hdd_adapter_t *adapter);
+bool hdd_sub20_channelwidth_can_set(
+ hdd_adapter_t *adapter, uint32_t sub20_channel_width);
+int hdd_softap_set_channel_sub20_chanwidth_change(
+ struct net_device *dev, uint32_t chan_width);
+#else
+static inline bool hdd_hostapd_sub20_channelwidth_can_switch(
+ hdd_adapter_t *adapter, uint32_t *sub20_channel_width)
+{
+ return false;
+}
+
+static inline bool hdd_hostapd_sub20_channelwidth_can_restore(
+ hdd_adapter_t *adapter)
+{
+ return false;
+}
+
+static inline bool hdd_sub20_channelwidth_can_set(
+ hdd_adapter_t *adapter, uint32_t sub20_channel_width)
+{
+ return false;
+}
+
+static inline
+int hdd_softap_set_channel_sub20_chanwidth_change(
+ struct net_device *dev, uint32_t chan_width)
+{
+ return -ENOTSUPP;
+}
+#endif
#endif // end #if !defined( WLAN_HDD_HOSTAPD_H )
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ipa.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ipa.h
index 19809be..17a8841 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ipa.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_ipa.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -63,6 +63,8 @@
int hdd_ipa_suspend(hdd_context_t *hdd_ctx);
int hdd_ipa_resume(hdd_context_t *hdd_ctx);
void hdd_ipa_ready_cb(hdd_context_t *hdd_ctx);
+bool hdd_ipa_is_present(hdd_context_t *hdd_ctx);
+void hdd_ipa_reset_ipaconfig(hdd_context_t *hdd_ctx, v_U32_t ipaconfig);
#ifdef IPA_UC_STA_OFFLOAD
int hdd_ipa_send_mcc_scc_msg(hdd_context_t *hdd_ctx, bool mcc_mode);
@@ -70,7 +72,7 @@
#ifdef IPA_UC_OFFLOAD
void hdd_ipa_uc_force_pipe_shutdown(hdd_context_t *hdd_ctx);
-int hdd_ipa_uc_ssr_reinit(void);
+int hdd_ipa_uc_ssr_reinit(hdd_context_t *hdd_ctx);
int hdd_ipa_uc_ssr_deinit(void);
void hdd_ipa_uc_stat_query(hdd_context_t *pHddCtx,
uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff);
@@ -78,6 +80,33 @@
void hdd_ipa_uc_rt_debug_host_dump(hdd_context_t *hdd_ctx);
void hdd_ipa_dump_info(hdd_context_t *hdd_ctx);
#endif /* IPA_UC_OFFLOAD */
+#else /* IPA_OFFLOAD */
+#define hdd_ipa_set_perf_level(hdd_ctx, tx_p, rx_p) /* no-op */
+/**
+ * hdd_ipa_is_present() - get IPA hw status
+ * @hdd_ctx: pointer to hdd context
+ *
+ * Return: true - ipa hw present
+ * false - ipa hw not present
+ */
+static inline
+bool hdd_ipa_is_present(hdd_context_t *hdd_ctx)
+{
+ return false;
+}
+
+/**
+ * hdd_ipa_reset_ipaconfig() - reset IpaConfig
+ * @hdd_ctx: pointer to hdd context
+ * @ipaconfig: new value for IpaConfig
+ *
+ * Return: none
+ */
+static inline
+void hdd_ipa_reset_ipaconfig(hdd_context_t *hdd_ctx, v_U32_t ipaconfig)
+{
+ return;
+}
#endif /* IPA_OFFLOAD */
#if !defined(IPA_OFFLOAD) || !defined(IPA_UC_OFFLOAD)
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h
index f2e4b46..2f9e90e 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -102,6 +102,7 @@
#define DEVICE_IFACE_OPENED (5)
#define TDLS_INIT_DONE (6)
#define ACS_PENDING (7)
+#define SOFTAP_INIT_DONE (8)
/* HDD global event flags */
#define ACS_IN_PROGRESS (0)
@@ -119,6 +120,7 @@
#define WLAN_WAIT_TIME_ABORTSCAN 2000
#define WLAN_WAIT_TIME_EXTSCAN 1000
#define WLAN_WAIT_TIME_LL_STATS 800
+#define WLAN_WAIT_TIME_POWER_STATS 800
#define WLAN_WAIT_SMPS_FORCE_MODE 500
@@ -149,6 +151,10 @@
#define WLAN_WAIT_TIME_BPF 1000
+#define WLAN_WAIT_TIME_CHAIN_RSSI 1000
+
+#define WLAN_WAIT_TIME_SET_RND 100
+
#define MAX_NUMBER_OF_ADAPTERS 4
#define MAX_CFG_STRING_LEN 255
@@ -199,9 +205,6 @@
#define WLAN_HDD_PUBLIC_ACTION_TDLS_DISC_RESP 14
#define WLAN_HDD_TDLS_ACTION_FRAME 12
-#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
-#define HDD_WAKE_LOCK_DURATION 50 //in msecs
-#endif
#define WLAN_HDD_QOS_ACTION_FRAME 1
#define WLAN_HDD_QOS_MAP_CONFIGURE 4
@@ -215,7 +218,11 @@
/* Maximum number of interfaces allowed(STA, P2P Device, P2P Interfaces) */
#ifndef WLAN_OPEN_P2P_INTERFACE
+#ifdef WLAN_4SAP_CONCURRENCY
+#define WLAN_MAX_INTERFACES 4
+#else
#define WLAN_MAX_INTERFACES 3
+#endif
#else
#define WLAN_MAX_INTERFACES 4
#endif
@@ -257,6 +264,36 @@
typedef v_U8_t tWlanHddMacAddr[HDD_MAC_ADDR_LEN];
+#define HDD_BW_GET_DIFF(_x, _y) (unsigned long)((ULONG_MAX - (_y)) + (_x) + 1)
+
+#define MAX_PROBE_REQ_OUIS 16
+
+#define SCAN_REJECT_THRESHOLD_TIME 300000 /* Time is in msec, equal to 5 mins */
+#define SCAN_REJECT_THRESHOLD 15
+
+
+/*
+ * @eHDD_SCAN_REJECT_DEFAULT: default value
+ * @eHDD_CONNECTION_IN_PROGRESS: connection is in progress
+ * @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
+ */
+typedef enum
+{
+ eHDD_SCAN_REJECT_DEFAULT = 0,
+ eHDD_CONNECTION_IN_PROGRESS,
+ eHDD_REASSOC_IN_PROGRESS,
+ eHDD_EAPOL_IN_PROGRESS,
+ eHDD_SAP_EAPOL_IN_PROGRESS,
+} scan_reject_states;
+
+/*
+ * Maximum no.of random mac addresses supported by firmware
+ * for transmitting management action frames
+ */
+#define MAX_RANDOM_MAC_ADDRS 16
+
/*
* Generic asynchronous request/response support
*
@@ -305,17 +342,34 @@
unsigned int magic;
};
+/**
+ * struct random_mac_context - Context used with hdd_random_mac_callback
+ * @random_mac_completion: Event on which hdd_set_random_mac will wait
+ * @adapter: Pointer to adapter
+ * @magic: For valid context this is set to ACTION_FRAME_RANDOM_CONTEXT_MAGIC
+ * @set_random_addr: Status of random filter set
+ */
+struct random_mac_context {
+ struct completion random_mac_completion;
+ hdd_adapter_t *adapter;
+ unsigned int magic;
+ bool set_random_addr;
+};
+
extern spinlock_t hdd_context_lock;
#define STATS_CONTEXT_MAGIC 0x53544154 //STAT
-#define RSSI_CONTEXT_MAGIC 0x52535349 //RSSI
+#define PEER_INFO_CONTEXT_MAGIC 0x52535349 /* PEER_INFO */
#define POWER_CONTEXT_MAGIC 0x504F5752 //POWR
#define SNR_CONTEXT_MAGIC 0x534E5200 //SNR
#define LINK_CONTEXT_MAGIC 0x4C494E4B //LINKSPEED
#define LINK_STATUS_MAGIC 0x4C4B5354 //LINKSTATUS(LNST)
#define TEMP_CONTEXT_MAGIC 0x74656d70 // TEMP (temperature)
#define FW_STATUS_MAGIC 0x46575354 /* FWSTATUS(FWST) */
+#define POWER_STATS_MAGIC 0x14111990
#define BPF_CONTEXT_MAGIC 0x4575354 /* BPF */
+#define ACTION_FRAME_RANDOM_CONTEXT_MAGIC 0x87878787
+#define ISOLATION_CONTEXT_MAGIC 0x48575354 //Antenna Isolation
#ifdef QCA_LL_TX_FLOW_CT
/* MAX OS Q block time value in msec
@@ -581,6 +635,8 @@
WLAN_HDD_NDI
} device_mode_t;
+#define WLAN_HDD_VDEV_STA_MAX 2
+
typedef enum rem_on_channel_request_type
{
REMAIN_ON_CHANNEL_REQUEST,
@@ -669,6 +725,7 @@
WLAN_HDD_DEV_DIS_RESP,
WLAN_HDD_PROV_DIS_REQ,
WLAN_HDD_PROV_DIS_RESP,
+ WLAN_HDD_ACTION_FRM_TYPE_MAX = 255,
}tActionFrmType;
typedef struct hdd_cfg80211_state_s
@@ -708,6 +765,28 @@
eCsrPhyMode phy_mode;
};
+/**
+ * struct action_frame_cookie - Action frame cookie item in cookie list
+ * @cookie_node: List item
+ * @cookie: Cookie value
+ */
+struct action_frame_cookie {
+ struct list_head cookie_node;
+ uint64_t cookie;
+};
+
+/**
+ * struct action_frame_random_mac - Action Frame random mac addr & related attrs
+ * @in_use: Checks whether random mac is in use
+ * @addr: Contains random mac addr
+ * @cookie_list: List of cookies tied with random mac
+ */
+struct action_frame_random_mac {
+ bool in_use;
+ uint8_t addr[VOS_MAC_ADDR_SIZE];
+ struct list_head cookie_list;
+};
+
struct hdd_station_ctx
{
/** Handle to the Wireless Extension State */
@@ -749,6 +828,8 @@
#ifdef WLAN_FEATURE_NAN_DATAPATH
struct nan_datapath_ctx ndp_ctx;
#endif
+
+ uint8_t broadcast_staid;
};
#define BSS_STOP 0
@@ -758,11 +839,26 @@
int bssState;
vos_event_t vosEvent;
vos_event_t stop_bss_event;
+ vos_event_t sta_disassoc_event;
VOS_STATUS vosStatus;
v_BOOL_t bCommit;
} hdd_hostapd_state_t;
+/**
+ * enum bss_stop_reason - reasons why a BSS is stopped.
+ * @BSS_STOP_REASON_INVALID: no reason specified explicitly.
+ * @BSS_STOP_DUE_TO_MCC_SCC_SWITCH: BSS stopped due to host
+ * driver is trying to switch AP role to a different channel
+ * to maintain SCC mode with the STA role on the same card.
+ * this usually happens when STA is connected to an external
+ * AP that runs on a different channel
+ */
+enum bss_stop_reason
+{
+ BSS_STOP_REASON_INVALID = 0,
+ BSS_STOP_DUE_TO_MCC_SCC_SWITCH = 1,
+};
/*
* Per station structure kept in HDD for multiple station support for SoftAP
@@ -805,8 +901,118 @@
/** Rate Flags for this connection */
uint32_t rate_flags;
+
+ /** SUB 20 Bandwidth Flags */
+ uint8_t sub20_dynamic_channelwidth;
+ /** Extended CSA capabilities */
+ uint8_t ecsa_capable;
+
+ /** Max phy rate */
+ uint32_t max_phy_rate;
+
+ /** Tx packets */
+ uint32_t tx_packets;
+
+ /** Tx bytes */
+ uint64_t tx_bytes;
+
+ /** Rx packets */
+ uint32_t rx_packets;
+
+ /** Rx bytes */
+ uint64_t rx_bytes;
+
+ /** Last tx/rx timestamp */
+ adf_os_time_t last_tx_rx_ts;
+
+ /** Assoc timestamp */
+ adf_os_time_t assoc_ts;
+
+ /** Tx Rate */
+ uint32_t tx_rate;
+
+ /** Rx Rate */
+ uint32_t rx_rate;
+
+ /** Ampdu */
+ bool ampdu;
+
+ /** Short GI */
+ bool sgi_enable;
+
+ /** Tx stbc */
+ bool tx_stbc;
+
+ /** Rx stbc */
+ bool rx_stbc;
+
+ /** Channel Width */
+ uint8_t ch_width;
+
+ /** Mode */
+ uint8_t mode;
+
+ /** Max supported idx */
+ uint8_t max_supp_idx;
+
+ /** Max extended idx */
+ uint8_t max_ext_idx;
+
+ /** HT max mcs idx */
+ uint8_t max_mcs_idx;
+
+ /** VHT rx mcs map */
+ uint8_t rx_mcs_map;
+
+ /** VHT tx mcs map */
+ uint8_t tx_mcs_map;
} hdd_station_info_t;
+/**
+ * struct hdd_rate_info - rate_info in HDD
+ * @rate: tx/rx rate (kbps)
+ * @mode: 0->11abg legacy, 1->HT, 2->VHT (refer to sir_sme_phy_mode)
+ * @nss: number of streams
+ * @mcs: mcs index for HT/VHT mode
+ * @rate_flags: rate flags for last tx/rx
+ *
+ * rate info in HDD
+ */
+struct hdd_rate_info {
+ uint32_t rate;
+ uint8_t mode;
+ uint8_t nss;
+ uint8_t mcs;
+ uint8_t rate_flags;
+};
+
+/**
+ * struct hdd_fw_txrx_stats - fw txrx status in HDD
+ * (refer to station_info struct in Kernel)
+ * @tx_packets: packets transmitted to this station
+ * @tx_bytes: bytes transmitted to this station
+ * @rx_packets: packets received from this station
+ * @rx_bytes: bytes received from this station
+ * @rx_retries: cumulative retry counts
+ * @tx_failed: number of failed transmissions
+ * @rssi: The signal strength (dbm)
+ * @tx_rate: last used tx rate info
+ * @rx_rate: last used rx rate info
+ *
+ * fw txrx status in HDD
+ */
+struct hdd_fw_txrx_stats {
+ uint32_t tx_packets;
+ uint64_t tx_bytes;
+ uint32_t rx_packets;
+ uint64_t rx_bytes;
+ uint32_t tx_retries;
+ uint32_t tx_failed;
+ int8_t rssi;
+ struct hdd_rate_info tx_rate;
+ struct hdd_rate_info rx_rate;
+};
+
struct hdd_ap_ctx_s
{
hdd_hostapd_state_t HostapdState;
@@ -857,6 +1063,9 @@
v_PVOID_t sapContext;
#endif
v_BOOL_t dfs_cac_block_tx;
+ enum bss_stop_reason bss_stop_reason;
+ /* Fw txrx stats info */
+ struct hdd_fw_txrx_stats txrx_stats;
};
typedef struct hdd_scaninfo_s
@@ -1028,6 +1237,9 @@
sHddMib_t hdd_mib;
tANI_U8 sessionId;
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ bool netif_carrier_on;
+#endif
/* Completion variable for session close */
struct completion session_close_comp_var;
@@ -1131,10 +1343,20 @@
#ifdef WLAN_FEATURE_TSF
/* tsf value get from firmware */
- uint32_t tsf_low;
- uint32_t tsf_high;
- /* current in capture tsf state or not */
- enum hdd_tsf_capture_state tsf_state;
+ uint64_t cur_target_time;
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+ /* spin lock for read/write timestamps */
+ spinlock_t host_target_sync_lock;
+ vos_timer_t host_target_sync_timer;
+ uint64_t cur_host_time;
+ uint64_t last_host_time;
+ uint64_t last_target_time;
+ /* to store the count of continuous invalid tstamp-pair */
+ int continuous_error_count;
+ /* to indicate whether tsf_sync has been initialized */
+ adf_os_atomic_t tsf_sync_ready_flag;
+#endif /* WLAN_FEATURE_TSF_PLUS */
#endif
hdd_cfg80211_state_t cfg80211State;
@@ -1211,10 +1433,12 @@
struct sir_ocb_get_tsf_timer_response ocb_get_tsf_timer_resp;
struct sir_dcc_get_stats_response *dcc_get_stats_resp;
struct sir_dcc_update_ndl_response dcc_update_ndl_resp;
-
+ struct dsrc_radio_chan_stats_ctxt dsrc_chan_stats;
+#ifdef WLAN_FEATURE_DSRC
/* MAC addresses used for OCB interfaces */
tSirMacAddr ocb_mac_address[VOS_MAX_CONCURRENCY_PERSONA];
int ocb_mac_addr_count;
+#endif
struct hdd_adapter_pm_context runtime_context;
struct mib_stats_metrics mib_stats;
@@ -1231,6 +1455,11 @@
struct hdd_netif_queue_history
queue_oper_history[WLAN_HDD_MAX_HISTORY_ENTRY];
struct hdd_netif_queue_stats queue_oper_stats[WLAN_REASON_TYPE_MAX];
+ struct power_stats_response *chip_power_stats;
+
+ /* random address management for management action frames */
+ spinlock_t random_mac_lock;
+ struct action_frame_random_mac random_mac[MAX_RANDOM_MAC_ADDRS];
};
#define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station)
@@ -1422,6 +1651,18 @@
};
#endif /* End of WLAN_FEATURE_LINK_LAYER_STATS */
+/**
+ * struct hdd_chain_rssi_context - hdd chain rssi context
+ * @response_event: chain rssi request wait event
+ * @ignore_result: Flag to ignore the result or not
+ * @chain_rssi: chain rssi array
+ */
+struct hdd_chain_rssi_context {
+ struct completion response_event;
+ bool ignore_result;
+ struct chain_rssi_result result;
+};
+
#ifdef WLAN_FEATURE_OFFLOAD_PACKETS
/**
* struct hdd_offloaded_packets - request id to pattern id mapping
@@ -1562,6 +1803,13 @@
v_BOOL_t isLoadInProgress;
v_BOOL_t isUnloadInProgress;
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ bool system_suspended;
+ volatile int thermal_suspend_state;
+ spinlock_t thermal_suspend_lock;
+ struct workqueue_struct *thermal_suspend_wq;
+ struct delayed_work thermal_suspend_work;
+#endif
/**Track whether driver has been suspended.*/
hdd_ps_state_t hdd_ps_state;
@@ -1617,9 +1865,7 @@
/* Thermal mitigation information */
hdd_thermal_mitigation_info_t tmInfo;
-#ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
vos_wake_lock_t rx_wake_lock;
-#endif
/*
* Framework initiated driver restarting
@@ -1690,6 +1936,11 @@
/* debugfs entry */
struct dentry *debugfs_phy;
+#ifdef WLAN_POWER_DEBUGFS
+ /* mutex lock to block concurrent access */
+ struct mutex power_stats_lock;
+#endif
+
/* Use below lock to protect access to isSchedScanUpdatePending
* since it will be accessed in two different contexts.
*/
@@ -1803,14 +2054,9 @@
struct hdd_ll_stats_context ll_stats_context;
#endif /* End of WLAN_FEATURE_LINK_LAYER_STATS */
-#ifdef WLAN_FEATURE_MEMDUMP
- uint8_t *fw_dump_loc;
- uint32_t dump_loc_paddr;
- vos_timer_t memdump_cleanup_timer;
+ struct hdd_chain_rssi_context chain_rssi_context;
+
struct mutex memdump_lock;
- bool memdump_in_progress;
- bool memdump_init_done;
-#endif /* WLAN_FEATURE_MEMDUMP */
uint16_t driver_dump_size;
uint8_t *driver_dump_mem;
@@ -1868,7 +2114,24 @@
vos_timer_t tdls_source_timer;
struct hdd_scan_chan_info *chan_info;
struct mutex chan_info_lock;
- uint8_t thermal_level;
+
+ uint32_t no_of_probe_req_ouis;
+ struct vendor_oui *probe_req_voui;
+ v_U8_t last_scan_reject_session_id;
+ scan_reject_states last_scan_reject_reason;
+ v_TIME_t last_scan_reject_timestamp;
+ uint8_t scan_reject_cnt;
+ uint8_t hdd_dfs_regdomain;
+#ifdef WLAN_FEATURE_TSF
+ /* indicate whether tsf has been initialized */
+ adf_os_atomic_t tsf_ready_flag;
+ /* indicate whether it's now capturing tsf(updating tstamp-pair) */
+ adf_os_atomic_t cap_tsf_flag;
+ /* the context that is capturing tsf */
+ hdd_adapter_t *cap_tsf_context;
+#endif
+ /* flag to show whether moniotr mode is enabled */
+ bool is_mon_enable;
};
/*---------------------------------------------------------------------------
@@ -1899,6 +2162,16 @@
VOS_STATUS hdd_add_adapter_front( hdd_context_t *pHddCtx,
hdd_adapter_list_node_t* pAdapterNode);
+/**
+ * hdd_get_current_vdev_sta_count() - get currnet vdev sta count
+ * @hdd_ctx: hdd context
+ *
+ * Traverse the adapter list to get the vdev sta count
+ *
+ * Return: vdev sta count
+ */
+uint32_t hdd_get_current_vdev_sta_count(hdd_context_t *hdd_ctx);
+
hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
const char* name, tSirMacAddr macAddr,
unsigned char name_assign_type,
@@ -1914,6 +2187,20 @@
hdd_adapter_t * hdd_get_adapter_by_vdev( hdd_context_t *pHddCtx,
tANI_U32 vdev_id );
hdd_adapter_t * hdd_get_adapter_by_macaddr( hdd_context_t *pHddCtx, tSirMacAddr macAddr );
+
+/**
+ * hdd_get_adapter_by_rand_macaddr() - Get adapter using random DA of MA frms
+ * @hdd_ctx: Pointer to hdd context
+ * @mac_addr: random mac address
+ *
+ * This function is used to get adapter from randomized destination mac
+ * address present in management action frames
+ *
+ * Return: If randomized addr is present then return pointer to adapter
+ * else NULL
+ */
+hdd_adapter_t * hdd_get_adapter_by_rand_macaddr(hdd_context_t *hdd_ctx, tSirMacAddr mac_addr);
+
VOS_STATUS hdd_init_station_mode( hdd_adapter_t *pAdapter );
hdd_adapter_t * hdd_get_adapter( hdd_context_t *pHddCtx, device_mode_t mode );
void hdd_deinit_adapter(hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter,
@@ -1959,6 +2246,17 @@
VOS_STATUS hdd_enable_bmps_imps(hdd_context_t *pHddCtx);
VOS_STATUS hdd_disable_bmps_imps(hdd_context_t *pHddCtx, tANI_U8 session_type);
+/**
+ * hdd_thermal_suspend_queue_work() - Queue a thermal suspend work
+ * @hdd_ctx: Pointer to hdd_context_t
+ * @ms: Delay time in milliseconds to execute the work
+ *
+ * Queue thermal suspend work on the workqueue after delay
+ *
+ * Return: false if work was already on a queue, true otherwise.
+ */
+bool hdd_thermal_suspend_queue_work(hdd_context_t *hdd_ctx, unsigned long ms);
+
void wlan_hdd_cfg80211_update_wiphy_caps(struct wiphy *wiphy);
VOS_STATUS hdd_setIbssPowerSaveParams(hdd_adapter_t *pAdapter);
VOS_STATUS wlan_hdd_restart_driver(hdd_context_t *pHddCtx);
@@ -1969,7 +2267,8 @@
v_BOOL_t hdd_is_valid_mac_address(const tANI_U8* pMacAddr);
VOS_STATUS hdd_issta_p2p_clientconnected(hdd_context_t *pHddCtx);
void hdd_ipv4_notifier_work_queue(struct work_struct *work);
-bool hdd_isConnectionInProgress(hdd_context_t *pHddCtx);
+bool hdd_isConnectionInProgress(hdd_context_t *pHddCtx, v_U8_t *session_id,
+ scan_reject_states *reason);
#ifdef WLAN_FEATURE_PACKET_FILTERING
int wlan_hdd_setIPv6Filter(hdd_context_t *pHddCtx, tANI_U8 filterType, tANI_U8 sessionId);
#endif
@@ -2041,6 +2340,7 @@
void hdd_wlan_green_ap_stop_bss(struct hdd_context_s *hdd_ctx);
void hdd_wlan_green_ap_add_sta(struct hdd_context_s *hdd_ctx);
void hdd_wlan_green_ap_del_sta(struct hdd_context_s *hdd_ctx);
+int hdd_wlan_enable_egap(struct hdd_context_s *hdd_ctx);
#else
static inline void hdd_wlan_green_ap_init(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_deinit(struct hdd_context_s *hdd_ctx) {}
@@ -2048,16 +2348,15 @@
static inline void hdd_wlan_green_ap_stop_bss(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_add_sta(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_del_sta(struct hdd_context_s *hdd_ctx) {}
+static inline int hdd_wlan_enable_egap(struct hdd_context_s *hdd_ctx) {
+ return -EINVAL;
+}
#endif
#ifdef WLAN_FEATURE_STATS_EXT
void wlan_hdd_cfg80211_stats_ext_init(hdd_context_t *pHddCtx);
#endif
-#ifdef WLAN_FEATURE_LINK_LAYER_STATS
-void wlan_hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx);
-#endif
-
void hdd_update_macaddr(hdd_config_t *cfg_ini, v_MACADDR_t hw_macaddr);
#if defined(FEATURE_WLAN_LFR) && defined(WLAN_FEATURE_ROAM_SCAN_OFFLOAD)
void wlan_hdd_disable_roaming(hdd_adapter_t *pAdapter);
@@ -2071,10 +2370,10 @@
bool *concurrent_chnl_same);
#ifdef WLAN_FEATURE_MBSSID
void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter);
-void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter);
+void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter, bool reinit);
#else
static inline void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter) {}
-static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) {}
+static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter, bool reinit) {}
#endif
int wlan_hdd_get_link_speed(hdd_adapter_t *sta_adapter, uint32_t *link_speed);
int hdd_wlan_go_set_mcc_p2p_quota(hdd_adapter_t *hostapd_adapter,
@@ -2104,23 +2403,82 @@
return;
}
+
+/**
+ * wlan_hdd_cfg80211_link_layer_stats_init() - Initialize llstats callbacks
+ * @pHddCtx: HDD context
+ *
+ * Return: none
+ */
+void wlan_hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx);
+
#else
static inline bool hdd_link_layer_stats_supported(void)
{
return false;
}
+
static inline void hdd_init_ll_stats_ctx(hdd_context_t *hdd_ctx)
{
return;
}
+
+void wlan_hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx)
+{
+ return;
+}
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+#ifdef FEATURE_WLAN_LFR
+static inline bool hdd_driver_roaming_supported(hdd_context_t *hdd_ctx)
+{
+ return hdd_ctx->cfg_ini->isFastRoamIniFeatureEnabled;
+}
+#else
+static inline bool hdd_driver_roaming_supported(hdd_context_t *hdd_ctx)
+{
+ return false;
+}
+#endif
+
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+static inline bool hdd_firmware_roaming_supported(hdd_context_t *hdd_ctx)
+{
+ return hdd_ctx->cfg_ini->isRoamOffloadScanEnabled;
+}
+#else
+static inline bool hdd_firmware_roaming_supported(hdd_context_t *hdd_ctx)
+{
+ return false;
+}
+#endif
+
+static inline bool hdd_roaming_supported(hdd_context_t *hdd_ctx)
+{
+ bool val;
+
+ val = hdd_driver_roaming_supported(hdd_ctx) ||
+ hdd_firmware_roaming_supported(hdd_ctx);
+
+ return val;
+}
+
+#ifdef CFG80211_SCAN_RANDOM_MAC_ADDR
+static inline bool hdd_scan_random_mac_addr_supported(void)
+{
+ return true;
+}
+#else
+static inline bool hdd_scan_random_mac_addr_supported(void)
+{
+ return false;
+}
+#endif
+
void hdd_get_fw_version(hdd_context_t *hdd_ctx,
uint32_t *major_spid, uint32_t *minor_spid,
uint32_t *siid, uint32_t *crmid);
-bool hdd_is_memdump_supported(void);
-
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
static inline void
hdd_set_needed_headroom(struct net_device *wlan_dev, uint16_t len)
@@ -2160,10 +2518,17 @@
}
#endif
+struct cfg80211_bss *hdd_cfg80211_get_bss(struct wiphy *wiphy,
+ struct ieee80211_channel *channel,
+ const u8 *bssid,
+ const u8 *ssid, size_t ssid_len);
+
void hdd_connect_result(struct net_device *dev, const u8 *bssid,
tCsrRoamInfo *roam_info, const u8 *req_ie,
size_t req_ie_len, const u8 * resp_ie,
- size_t resp_ie_len, u16 status, gfp_t gfp);
+ size_t resp_ie_len, u16 status, gfp_t gfp,
+ bool connect_timeout,
+ tSirResultCodes timeout_reason);
int wlan_hdd_init_tx_rx_histogram(hdd_context_t *pHddCtx);
void wlan_hdd_deinit_tx_rx_histogram(hdd_context_t *pHddCtx);
@@ -2267,13 +2632,62 @@
}
#endif
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+static inline
+void hdd_set_driver_del_ack_enable(uint16_t session_id, hdd_context_t *hdd_ctx,
+ uint64_t rx_packets)
+{
+ tlshim_set_driver_del_ack_enable(session_id, rx_packets,
+ hdd_ctx->cfg_ini->busBandwidthComputeInterval,
+ hdd_ctx->cfg_ini->del_ack_threshold_high,
+ hdd_ctx->cfg_ini->del_ack_threshold_low);
+
+}
+#else
+static inline
+void hdd_set_driver_del_ack_enable(uint16_t session_id, hdd_context_t *hdd_ctx,
+ uint64_t rx_packets)
+{
+}
+#endif
+
+
+
int hdd_reassoc(hdd_adapter_t *pAdapter, const tANI_U8 *bssid,
const tANI_U8 channel, const handoff_src src);
void hdd_sap_restart_handle(struct work_struct *work);
void hdd_set_rps_cpu_mask(hdd_context_t *hdd_ctx);
-
+void hdd_initialize_adapter_common(hdd_adapter_t *adapter);
+void hdd_svc_fw_shutdown_ind(struct device *dev);
+void wlan_hdd_stop_enter_lowpower(hdd_context_t *hdd_ctx);
void wlan_hdd_init_chan_info(hdd_context_t *hdd_ctx);
void wlan_hdd_deinit_chan_info(hdd_context_t *hdd_ctx);
+
+void hdd_chip_pwr_save_fail_detected_cb(void *hddctx,
+ struct chip_pwr_save_fail_detected_params
+ *data);
+
+/**
+ * hdd_drv_cmd_validate() - Validates for space in hdd driver command
+ * @command: pointer to input data (its a NULL terminated string)
+ * @len: length of command name
+ *
+ * This function checks for space after command name and if no space
+ * is found returns error.
+ *
+ * Return: 0 for success non-zero for failure
+ */
+int hdd_drv_cmd_validate(tANI_U8 *command, int len);
+
+/**
+ * wlan_hdd_monitor_mode_enable() - function to enable/disable monitor mode
+ * @hdd_ctx: pointer to HDD context
+ * @enable: 0 - disable, 1 - enable
+ *
+ * Return: 0 for success and error number for failure
+ */
+int wlan_hdd_monitor_mode_enable(hdd_context_t *hdd_ctx, bool enable);
+
#endif // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_memdump.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_memdump.h
index 72143ef..8f7c063 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_memdump.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_memdump.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -40,65 +40,7 @@
/* Assigned size of driver memory dump is 4096 bytes */
#define DRIVER_MEM_DUMP_SIZE 4096
-#ifdef WLAN_FEATURE_MEMDUMP
-/**
- * enum qca_wlan_vendor_attr_memory_dump - values for memory dump attributes
- * @QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_INVALID - Invalid
- * @QCA_WLAN_VENDOR_ATTR_REQUEST_ID - Indicate request ID
- * @QCA_WLAN_VENDOR_ATTR_MEMDUMP_SIZE - Indicate size of the memory dump
- * @QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_AFTER_LAST - To keep track of the last enum
- * @QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_MAX - max value possible for this type
- *
- * enum values are used for NL attributes for data used by
- * QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP sub command.
- */
-enum qca_wlan_vendor_attr_memory_dump {
- QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_INVALID = 0,
- QCA_WLAN_VENDOR_ATTR_REQUEST_ID = 1,
- QCA_WLAN_VENDOR_ATTR_MEMDUMP_SIZE = 2,
-
- QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_AFTER_LAST,
- QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_MAX =
- QCA_WLAN_VENDOR_ATTR_MEMORY_DUMP_AFTER_LAST - 1,
-};
-
-/* Size of fw memory dump is estimated to be 327680 bytes */
-#define FW_MEM_DUMP_SIZE 327680
-#define FW_DRAM_LOCATION 0x00400000
-#define FW_MEM_DUMP_REQ_ID 1
-#define FW_MEM_DUMP_NUM_SEG 1
-#define MEMDUMP_COMPLETION_TIME_MS 800
-
-int memdump_init(void);
-void memdump_deinit(void);
-int wlan_hdd_cfg80211_get_fw_mem_dump(struct wiphy *wiphy,
- struct wireless_dev *wdev,
- const void *data, int data_len);
int hdd_driver_memdump_init(void);
void hdd_driver_memdump_deinit(void);
-#else
-static inline int memdump_init(void)
-{
- return -ENOTSUPP;
-}
-static inline void memdump_deinit(void)
-{
-}
-
-static inline int wlan_hdd_cfg80211_get_fw_mem_dump(struct wiphy *wiphy,
- struct wireless_dev *wdev,
- const void *data, int data_len)
-{
- return -ENOTSUPP;
-}
-static inline int hdd_driver_memdump_init(void)
-{
- return -EINVAL;
-}
-static inline void hdd_driver_memdump_deinit(void)
-{
- return;
-}
-#endif
#endif /* if !defined(WLAN_HDD_MEMDUMP_H)*/
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_p2p.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_p2p.h
index 67810b9..5523687 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_p2p.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_p2p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -47,12 +47,16 @@
#define WLAN_HDD_GET_TYPE_FRM_FC(__fc__) (((__fc__) & 0x0F) >> 2)
#define WLAN_HDD_GET_SUBTYPE_FRM_FC(__fc__) (((__fc__) & 0xF0) >> 4)
#define WLAN_HDD_80211_FRM_DA_OFFSET 4
+#define WLAN_HDD_80211_FRM_SA_OFFSET 10
#define P2P_WILDCARD_SSID_LEN 7
#define P2P_WILDCARD_SSID "DIRECT-"
#define P2P_ROC_DURATION_MULTIPLIER_GO_PRESENT 2
#define P2P_ROC_DURATION_MULTIPLIER_GO_ABSENT 5
+#define ACTION_FRAME_RSP_WAIT 500
+#define ACTION_FRAME_ACK_WAIT 300
+
#ifdef WLAN_FEATURE_11W
#define WLAN_HDD_SET_WEP_FRM_FC(__fc__) ( (__fc__) = ((__fc__) | 0x40))
#endif //WLAN_FEATURE_11W
@@ -206,4 +210,17 @@
#define MAX_ROC_REQ_QUEUE_ENTRY 10
void wlan_hdd_roc_request_dequeue(struct work_struct *work);
+
+/**
+ * hdd_check_random_mac() - Whether addr is present in random_mac array
+ * @adapter: Pointer to adapter
+ * @mac_addr: random mac address
+ *
+ * This function is used to check whether given mac addr is present in list of
+ * random_mac structures in specified adapter
+ *
+ * Return: If random addr is present return true else false
+ */
+bool hdd_check_random_mac(hdd_adapter_t *adapter, uint8_t *random_mac_addr);
+
#endif // __P2P_H
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_packet_filtering.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_packet_filtering.h
index ad7f765..5656947 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_packet_filtering.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_packet_filtering.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -54,7 +54,7 @@
#define HDD_IPV6_CMP_DATA_1 0xDD
#define HDD_WLAN_MAC_ADDR_LEN 6
-#define HDD_MAX_NUM_MULTICAST_ADDRESS 10
+#define HDD_MAX_NUM_MULTICAST_ADDRESS 16
typedef enum
{
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_power.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_power.h
index c1f4bf6..2daea99 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_power.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_power.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012, 2014, 2016-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -88,6 +88,16 @@
HDD_WLAN_RESUME
};
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+enum thermal_suspend_state {
+ HDD_WLAN_THERMAL_ACTIVE,
+ HDD_WLAN_THERMAL_SUSPENDING,
+ HDD_WLAN_THERMAL_SUSPENDED,
+ HDD_WLAN_THERMAL_RESUMING,
+ HDD_WLAN_THERMAL_DEINIT
+};
+#endif
+
/*-------------------------------------------------------------------------
* Function declarations and documentation
* ------------------------------------------------------------------------*/
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tdls.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tdls.h
index eebec6b..7f094ab 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tdls.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tdls.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -34,6 +34,25 @@
\brief Linux HDD TDLS include file
==========================================================================*/
+/**
+ * eTDLSSupportMode - TDLS support modes
+ * @eTDLS_SUPPORT_NOT_ENABLED: TDLS support not enabled
+ * @eTDLS_SUPPORT_DISABLED: suppress implicit trigger and not respond
+ * to the peer
+ * @eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY: suppress implicit trigger,
+ * but respond to the peer
+ * @eTDLS_SUPPORT_ENABLED: implicit trigger
+ * @eTDLS_SUPPORT_EXTERNAL_CONTROL: implicit trigger but only to a
+ * peer mac configured by user space.
+ */
+typedef enum {
+ eTDLS_SUPPORT_NOT_ENABLED = 0,
+ eTDLS_SUPPORT_DISABLED,
+ eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY,
+ eTDLS_SUPPORT_ENABLED,
+ eTDLS_SUPPORT_EXTERNAL_CONTROL
+} eTDLSSupportMode;
+
#ifdef FEATURE_WLAN_TDLS
#define MAX_NUM_TDLS_PEER 3
@@ -79,6 +98,25 @@
#define TDLS_PEER_LIST_SIZE 256
+#define MAX_TDLS_DISCOVERY_CYCLE_RETRIES 2
+#define MIN_TDLS_DISCOVERY_CYCLE_RETRY_TIME (5 * 60 * 1000) /* 5 minutes */
+
+/**
+ * enum tdls_disable_source - TDLS disable sources
+ * @HDD_SET_TDLS_MODE_SOURCE_USER: disable from user
+ * @HDD_SET_TDLS_MODE_SOURCE_SCAN: disable during scan
+ * @HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL: disable during offchannel
+ * @HDD_SET_TDLS_MODE_SOURCE_BTC: disable during bluetooth
+ * @HDD_SET_TDLS_MODE_SOURCE_P2P: disable during p2p
+ */
+enum tdls_disable_source {
+ HDD_SET_TDLS_MODE_SOURCE_USER = 0,
+ HDD_SET_TDLS_MODE_SOURCE_SCAN,
+ HDD_SET_TDLS_MODE_SOURCE_OFFCHANNEL,
+ HDD_SET_TDLS_MODE_SOURCE_BTC,
+ HDD_SET_TDLS_MODE_SOURCE_P2P,
+};
+
typedef struct
{
tANI_U32 tdls;
@@ -107,17 +145,6 @@
struct delayed_work tdls_scan_work;
} tdls_scan_context_t;
-typedef enum {
- eTDLS_SUPPORT_NOT_ENABLED = 0,
- eTDLS_SUPPORT_DISABLED, /* suppress implicit trigger and not respond to the peer */
- eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY, /* suppress implicit trigger, but respond to the peer */
- eTDLS_SUPPORT_ENABLED, /* implicit trigger */
- /* External control means implicit trigger
- * but only to a peer mac configured by user space.
- */
- eTDLS_SUPPORT_EXTERNAL_CONTROL
-} eTDLSSupportMode;
-
enum tdls_spatial_streams {
TDLS_NSS_1x1_MODE = 0,
TDLS_NSS_2x2_MODE = 0xff,
@@ -240,6 +267,7 @@
tANI_U32 discovery_sent_cnt;
tANI_S8 ap_rssi;
struct _hddTdlsPeer_t *curr_candidate;
+ bool is_tdls_disabled_bmps;
v_U32_t magic;
} tdlsCtx_t;
@@ -274,6 +302,8 @@
/* EXT TDLS */
tTDLSLinkReason reason;
cfg80211_exttdls_callback state_change_notification;
+ uint8_t discovery_cycles_retry_cnt;
+ uint64_t last_discovery_req_cycle_ts;
} hddTdlsPeer_t;
typedef struct {
@@ -325,14 +355,16 @@
int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter,
const u8 *mac,
tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams);
-hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, const u8 *mac);
+hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, const u8 *mac,
+ bool need_lock);
int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter, const u8* mac,
tTDLSCapType cap);
void wlan_hdd_tdls_set_peer_link_status(hddTdlsPeer_t *curr_peer,
tTDLSLinkStatus status,
- tTDLSLinkReason reason);
+ tTDLSLinkReason reason,
+ bool need_lock);
void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
const u8* mac,
tTDLSLinkStatus linkStatus,
@@ -378,7 +410,7 @@
hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
const u8* mac,
- u8 skip_self);
+ u8 skip_self, bool need_lock);
int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
struct wiphy *wiphy,
@@ -481,7 +513,9 @@
int wlan_hdd_tdls_antenna_switch(hdd_context_t *hdd_ctx,
hdd_adapter_t *adapter,
uint32_t mode);
-
+void wlan_hdd_change_tdls_mode(void *hdd_ctx);
+void wlan_hdd_start_stop_tdls_source_timer(hdd_context_t *pHddCtx,
+ eTDLSSupportMode tdls_mode);
#else
static inline void hdd_tdls_notify_mode_change(hdd_adapter_t *pAdapter,
@@ -505,6 +539,16 @@
{
return 0;
}
+static inline void
+wlan_hdd_change_tdls_mode(void *hdd_ctx)
+{
+}
+static inline void
+wlan_hdd_start_stop_tdls_source_timer(hdd_context_t *pHddCtx,
+ eTDLSSupportMode tdls_mode)
+{
+}
+
#endif
#endif // __HDD_TDSL_H
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tgt_cfg.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tgt_cfg.h
index 15948d3..bcacb5f 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tgt_cfg.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tgt_cfg.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -58,6 +58,7 @@
#ifdef SAP_AUTH_OFFLOAD
bool sap_auth_offload_service;
#endif
+ bool get_peer_info_enabled;
};
struct hdd_tgt_ht_cap {
@@ -110,11 +111,15 @@
#endif
uint32_t fine_time_measurement_cap;
bool bpf_enabled;
+#ifdef FEATURE_WLAN_RA_FILTERING
+ bool is_ra_rate_limit_enabled;
+#endif
uint16_t wmi_max_len;
#ifdef WLAN_FEATURE_NAN_DATAPATH
bool nan_datapath_enabled;
#endif
uint8_t max_mc_addr_list;
+ bool sub_20_support;
};
struct hdd_dfs_radar_ind {
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tsf.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tsf.h
index c3da0cf..6cabf3b 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tsf.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tsf.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015,2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -32,6 +32,7 @@
Include files
-------------------------------------------------------------------------*/
#include <wlan_hdd_includes.h>
+#include "wlan_hdd_cfg.h"
/*---------------------------------------------------------------------------
Preprocessor definitions and constants
@@ -42,18 +43,66 @@
-------------------------------------------------------------------------*/
#ifdef WLAN_FEATURE_TSF
+
+/**
+ * wlan_hdd_tsf_init() - set gpio and callbacks for
+ * capturing tsf and init tsf_plus
+ * @hdd_ctx: pointer to the hdd_context_t
+ *
+ * This function set the callback to sme module, the callback will be
+ * called when a tsf event is reported by firmware; set gpio number
+ * to FW, FW will toggle this gpio when received a CAP_TSF command;
+ * do tsf_plus init
+ *
+ * Return: nothing
+ */
void wlan_hdd_tsf_init(hdd_context_t *hdd_ctx);
+
+/**
+ * wlan_hdd_tsf_deinit() - reset callbacks for capturing tsf, deinit tsf_plus
+ * @hdd_ctx: pointer to the hdd_context_t
+ *
+ * This function reset the callback to sme module, and deinit tsf_plus
+ *
+ * Return: nothing
+ */
+void wlan_hdd_tsf_deinit(hdd_context_t *hdd_ctx);
+
+/**
+ * hdd_capture_tsf() - capture tsf
+ * @adapter: pointer to adapter
+ * @buf: pointer to uplayer buf
+ * @len : the length of buf
+ *
+ * This function returns tsf value to uplayer.
+ *
+ * Return: Describe the execute result of this routine
+ */
int hdd_capture_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len);
+
+/**
+ * hdd_indicate_tsf() - return tsf to uplayer
+ * @adapter: pointer to adapter
+ * @buf: pointer to uplayer buf
+ * @len : the length of buf
+ *
+ * This function returns tsf value to uplayer.
+ *
+ * Return: Describe the execute result of this routine
+ */
int hdd_indicate_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len);
#else
static inline void
wlan_hdd_tsf_init(hdd_context_t *hdd_ctx)
{
- return;
}
-static inline int
-hdd_indicate_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len)
+static inline void wlan_hdd_tsf_deinit(hdd_context_t *hdd_ctx)
+{
+}
+
+static inline int hdd_indicate_tsf(hdd_adapter_t *adapter,
+ uint32_t *buf, int len)
{
return -ENOTSUPP;
}
@@ -65,4 +114,139 @@
}
#endif
+#if defined(WLAN_FEATURE_TSF_PLUS) && defined(WLAN_FEATURE_TSF)
+#define HDD_TSF_IS_PTP_ENABLED(hdd_ctx) \
+ ((hdd_ctx) && (hdd_ctx)->cfg_ini && \
+ ((hdd_ctx)->cfg_ini->tsf_ptp_options))
+
+#define HDD_TSF_IS_TX_SET(hdd_ctx) \
+ ((hdd_ctx) && (hdd_ctx)->cfg_ini && \
+ (((hdd_ctx)->cfg_ini->tsf_ptp_options & CFG_SET_TSF_PTP_OPT_TX) == \
+ CFG_SET_TSF_PTP_OPT_TX))
+
+#define HDD_TSF_IS_RX_SET(hdd_ctx) \
+ ((hdd_ctx) && (hdd_ctx)->cfg_ini && \
+ (((hdd_ctx)->cfg_ini->tsf_ptp_options & CFG_SET_TSF_PTP_OPT_RX) == \
+ CFG_SET_TSF_PTP_OPT_RX))
+
+#define HDD_TSF_IS_RAW_SET(hdd_ctx) \
+ ((hdd_ctx) && (hdd_ctx)->cfg_ini && \
+ (((hdd_ctx)->cfg_ini->tsf_ptp_options & CFG_SET_TSF_PTP_OPT_RAW) == \
+ CFG_SET_TSF_PTP_OPT_RAW))
+
+#define HDD_TSF_IS_DBG_FS_SET(hdd_ctx) \
+ ((hdd_ctx) && (hdd_ctx)->cfg_ini && \
+ (((hdd_ctx)->cfg_ini->tsf_ptp_options & CFG_SET_TSF_DBG_FS) == \
+ CFG_SET_TSF_DBG_FS))
+
+/**
+ * hdd_start_tsf_sync() - start tsf sync
+ * @adapter: pointer to adapter
+ *
+ * This function initialize and start TSF synchronization
+ *
+ * Return: Describe the execute result of this routine
+ */
+int hdd_start_tsf_sync(hdd_adapter_t *adapter);
+
+/**
+ * hdd_stop_tsf_sync() - stop tsf sync
+ * @adapter: pointer to adapter
+ *
+ * This function stop and de-initialize TSF synchronization
+ *
+ * Return: Describe the execute result of this routine
+ */
+int hdd_stop_tsf_sync(hdd_adapter_t *adapter);
+
+/**
+ * hdd_tsf_notify_wlan_state_change() -
+ * notify tsf module of wlan connection state
+ * @old_state: old wlan state
+ * @new_state: new wlan state
+ *
+ * This function check the old and new connection state, determine whether
+ * to start or stop tsf sync
+ *
+ * Return: nothing
+ */
+void hdd_tsf_notify_wlan_state_change(hdd_adapter_t *adapter,
+ eConnectionState old_state,
+ eConnectionState new_state);
+
+/**
+ * hdd_tx_timestamp() - time stamp TX netbuf
+ *
+ * @netbuf: pointer to a TX netbuf
+ * @target_time: TX time for the netbuf
+ *
+ * This function get corresponding host time from target time,
+ * and time stamp the TX netbuf with this time
+ *
+ * Return: Describe the execute result of this routine
+ */
+int hdd_tx_timestamp(adf_nbuf_t netbuf, uint64_t target_time);
+
+/**
+ * hdd_rx_timestamp() - time stamp RX netbuf
+ *
+ * @netbuf: pointer to a RX netbuf
+ * @target_time: RX time for the netbuf
+ *
+ * This function get corresponding host time from target time,
+ * and time stamp the RX netbuf with this time
+ *
+ * Return: Describe the execute result of this routine
+ */
+int hdd_rx_timestamp(adf_nbuf_t netbuf, uint64_t target_time);
+
+/**
+ * hdd_tsf_record_sk_for_skb() - save sk for skb
+ *
+ * @hdd_ctx: pointer to hdd context
+ * @nbuf: pointer to a TX netbuf
+ *
+ * This function record netbuf->sk in netbuf->tstamp,
+ * in case netbuf->sk will be set to NULL.
+ *
+ * Return: nothing
+ */
+void
+hdd_tsf_record_sk_for_skb(hdd_context_t *hdd_ctx, adf_nbuf_t nbuf);
+#else
+static inline int hdd_start_tsf_sync(hdd_adapter_t *adapter)
+{
+ return -ENOTSUPP;
+}
+
+static inline int hdd_stop_tsf_sync(hdd_adapter_t *adapter)
+{
+ return -ENOTSUPP;
+}
+
+static inline
+void hdd_tsf_notify_wlan_state_change(hdd_adapter_t *adapter,
+ eConnectionState old_state,
+ eConnectionState new_state)
+{
+}
+
+static inline
+int hdd_tx_timestamp(adf_nbuf_t netbuf, uint64_t target_time)
+{
+ return -ENOTSUPP;
+}
+
+static inline
+int hdd_rx_timestamp(adf_nbuf_t netbuf, uint64_t target_time)
+{
+ return -ENOTSUPP;
+}
+
+static inline void
+hdd_tsf_record_sk_for_skb(hdd_context_t *hdd_ctx, adf_nbuf_t nbuf)
+{
+}
+#endif
+
#endif
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tx_rx.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tx_rx.h
index df434b1..2fd820c 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tx_rx.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_tx_rx.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -268,12 +268,27 @@
VOS_STATUS hdd_mon_rx_packet_cbk(v_VOID_t *vos_ctx, adf_nbuf_t rx_buf,
uint8_t sta_id);
+/**
+ * hdd_vir_mon_rx_cbk() - Monitor callback registered to TLSHIM.
+ * @vosContext: [in] pointer to VOS context
+ * @rxBuf: [in] pointer to rx adf_nbuf
+ * @staId: [in] Station Id
+ *
+ * TL will call this to notify the HDD when one or more packets were
+ * received for a registered HDD adapter.
+ * Return: VOS_STATUS_E_FAILURE if any errors encountered, VOS_STATUS_SUCCESS
+ * otherwise
+ */
+VOS_STATUS hdd_vir_mon_rx_cbk(v_VOID_t *vos_ctx, adf_nbuf_t rx_buf,
+ uint8_t sta_id);
+
void wlan_display_tx_timeout_stats(hdd_adapter_t *adapter);
const char *hdd_reason_type_to_string(enum netif_reason_type reason);
const char *hdd_action_type_to_string(enum netif_action_type action);
void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
enum netif_action_type action, enum netif_reason_type reason);
+void wlan_hdd_classify_pkt(struct sk_buff *skb);
#ifdef QCA_PKT_PROTO_TRACE
void hdd_dhcp_pkt_trace_buf_update(struct sk_buff *skb, int is_transmission,
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h
index e18f7f2..6a47ede 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -257,6 +257,8 @@
* TSF_GET_FAIL: get fail
* TSF_RESET_GPIO_FAIL: GPIO reset fail
* TSF_SAP_NOT_STARTED_NO_TSF SAP not started
+ * TSF_NOT_READY: TSF module is not initialized or init failed
+ * TSF_DISABLED_BY_TSFPLUS: cap_tsf/get_tsf are disabled due to TSF_PLUS
*/
enum hdd_tsf_get_state {
TSF_RETURN = 0,
@@ -266,7 +268,9 @@
TSF_CAPTURE_FAIL,
TSF_GET_FAIL,
TSF_RESET_GPIO_FAIL,
- TSF_SAP_NOT_STARTED_NO_TSF
+ TSF_SAP_NOT_STARTED_NO_TSF,
+ TSF_NOT_READY,
+ TSF_DISABLED_BY_TSFPLUS
};
/**
@@ -334,8 +338,6 @@
v_BOOL_t isESEConnection;
eCsrAuthType collectedAuthType; /* Collected from ALL SIOCSIWAUTH Ioctls. Will be negotiatedAuthType - in tCsrProfile */
#endif
- /* Wireless statistics */
- struct iw_statistics iw_stats;
}hdd_wext_state_t;
typedef struct ccp_freq_chan_map_s{
@@ -462,7 +464,7 @@
#endif
#ifdef WLAN_FEATURE_PACKET_FILTERING
-void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set);
+int wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set);
#endif
void* wlan_hdd_change_country_code_callback(void *pAdapter);
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wmm.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wmm.h
index 5e99286..1634157 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wmm.h
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wmm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2012,2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2012,2014, 2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -113,9 +113,8 @@
HDD_WMM_USER_MODE_AUTO = 0,
//SME will add the extra logic to make sure STA associates with a QAP only
HDD_WMM_USER_MODE_QBSS_ONLY = 1,
- //SME will not join a QoS AP, unless the phy mode setting says "Auto". In
- // that case, STA is free to join 11n AP. Although from HDD point of view,
- // it will not be doing any packet classifications
+
+ /* Join any AP, but uapsd is disabled */
HDD_WMM_USER_MODE_NO_QOS = 2,
} hdd_wmm_user_mode_t;
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c
index da29534..d2166d0 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -71,8 +71,9 @@
#include <wlan_logging_sock_svc.h>
#include "tl_shim.h"
#include "wlan_hdd_oemdata.h"
+#include "wlan_hdd_tsf.h"
-uint8_t thermal_band = 2;
+#include "adf_trace.h"
struct ether_addr
{
@@ -105,6 +106,13 @@
v_U8_t ccpRSNOui08[ HDD_RSN_OUI_SIZE ] = { 0x00, 0x0F, 0xAC, 0x05 };
#endif
+#ifdef WLAN_FEATURE_FILS_SK
+uint8_t ccp_rsn_oui_0e[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0E};
+uint8_t ccp_rsn_oui_0f[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0F};
+uint8_t ccp_rsn_oui_10[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x10};
+uint8_t ccp_rsn_oui_11[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x11};
+#endif
+
#if defined(WLAN_FEATURE_VOWIFI_11R)
// Offset where the EID-Len-IE, start.
#define FT_ASSOC_RSP_IES_OFFSET 6 /* Capability(2) + AID(2) + Status Code(2)*/
@@ -119,11 +127,7 @@
SIR_MAC_ERP_INFO_EID,
SIR_MAC_EDCA_PARAM_SET_EID,
SIR_MAC_QOS_CAPABILITY_EID,
- SIR_MAC_CHNL_SWITCH_ANN_EID,
SIR_MAC_HT_INFO_EID,
-#if defined WLAN_FEATURE_VOWIFI
- SIR_MAC_PWR_CONSTRAINT_EID,
-#endif
#ifdef WLAN_FEATURE_11AC
SIR_MAC_VHT_OPMODE_EID,
SIR_MAC_VHT_OPERATION_EID,
@@ -161,6 +165,9 @@
hddLog(LOG1, FL("%pS Changed connectionState from oldState:%d to State:%d"),
(void *)_RET_IP_,
pHddStaCtx->conn_info.connState, connState);
+
+ hdd_tsf_notify_wlan_state_change(pAdapter,
+ pHddStaCtx->conn_info.connState, connState);
pHddStaCtx->conn_info.connState = connState;
/* Check is pending ROC request or not when connection state changed */
@@ -306,11 +313,18 @@
int i;
uint32_t ie_map[8] = {0};
VOS_STATUS vos_status = VOS_STATUS_E_FAILURE;
+ tHalHandle hal_ptr = WLAN_HDD_GET_HAL_CTX(adapter);
+ tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal_ptr);
- for (i = 0; i < ARRAY_SIZE(beacon_filter_table); i++) {
- __set_bit((beacon_filter_table[i] - 1),
+ for (i = 0; i < ARRAY_SIZE(beacon_filter_table); i++)
+ __set_bit(beacon_filter_table[i],
(unsigned long int *)ie_map);
- }
+
+
+ if (TRUE == mac_ptr->sta_change_cc_via_beacon &&
+ adapter->device_mode == WLAN_HDD_INFRA_STATION)
+ __set_bit(SIR_MAC_COUNTRY_EID, (unsigned long int *)ie_map);
+
vos_status = sme_set_beacon_filter(adapter->sessionId, ie_map);
if (!VOS_IS_STATUS_SUCCESS(vos_status)) {
hddLog(LOGE, "%s: failed to set beacon filter",
@@ -320,6 +334,485 @@
return 0;
}
+/**
+ * hdd_copy_vht_caps()- copy vht caps info from roam info to
+ * hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_ht_caps(hdd_station_ctx_t *hdd_sta_ctx,
+ tCsrRoamInfo *roam_info)
+{
+ tDot11fIEHTCaps *roam_ht_cap = &roam_info->ht_caps;
+ struct ieee80211_ht_cap *hdd_ht_cap = &hdd_sta_ctx->conn_info.ht_caps;
+ uint32_t i, temp_ht_cap;
+
+ adf_os_mem_zero(hdd_ht_cap, sizeof(struct ieee80211_ht_cap));
+
+ if (roam_ht_cap->advCodingCap)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_LDPC_CODING;
+ if (roam_ht_cap->supportedChannelWidthSet)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+ temp_ht_cap = roam_ht_cap->mimoPowerSave &
+ (IEEE80211_HT_CAP_SM_PS >> IEEE80211_HT_CAP_SM_PS_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->cap_info |=
+ temp_ht_cap << IEEE80211_HT_CAP_SM_PS_SHIFT;
+ if (roam_ht_cap->greenField)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_GRN_FLD;
+ if (roam_ht_cap->shortGI20MHz)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SGI_20;
+ if (roam_ht_cap->shortGI40MHz)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SGI_40;
+ if (roam_ht_cap->txSTBC)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_TX_STBC;
+ temp_ht_cap = roam_ht_cap->rxSTBC & (IEEE80211_HT_CAP_RX_STBC >>
+ IEEE80211_HT_CAP_RX_STBC_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->cap_info |=
+ temp_ht_cap << IEEE80211_HT_CAP_RX_STBC_SHIFT;
+ if (roam_ht_cap->delayedBA)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_DELAY_BA;
+ if (roam_ht_cap->maximalAMSDUsize)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_MAX_AMSDU;
+ if (roam_ht_cap->dsssCckMode40MHz)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_DSSSCCK40;
+ if (roam_ht_cap->psmp)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_RESERVED;
+ if (roam_ht_cap->stbcControlFrame)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_40MHZ_INTOLERANT;
+ if (roam_ht_cap->lsigTXOPProtection)
+ hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
+
+ /* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
+ if (roam_ht_cap->maxRxAMPDUFactor)
+ hdd_ht_cap->ampdu_params_info |=
+ IEEE80211_HT_AMPDU_PARM_FACTOR;
+ temp_ht_cap = roam_ht_cap->mpduDensity &
+ (IEEE80211_HT_AMPDU_PARM_DENSITY >>
+ IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->ampdu_params_info |=
+ temp_ht_cap << IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT;
+
+ /* 802.11n HT extended capabilities masks */
+ if (roam_ht_cap->pco)
+ hdd_ht_cap->extended_ht_cap_info |=
+ IEEE80211_HT_EXT_CAP_PCO;
+ temp_ht_cap = roam_ht_cap->transitionTime &
+ (IEEE80211_HT_EXT_CAP_PCO_TIME >>
+ IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->extended_ht_cap_info |=
+ temp_ht_cap << IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT;
+ temp_ht_cap = roam_ht_cap->mcsFeedback &
+ (IEEE80211_HT_EXT_CAP_MCS_FB >> IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->extended_ht_cap_info |=
+ temp_ht_cap << IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT;
+
+ /* tx_bf_cap_info capabilities */
+ if (roam_ht_cap->txBF)
+ hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_TX_BF;
+ if (roam_ht_cap->rxStaggeredSounding)
+ hdd_ht_cap->tx_BF_cap_info |=
+ TX_BF_CAP_INFO_RX_STAG_RED_SOUNDING;
+ if (roam_ht_cap->txStaggeredSounding)
+ hdd_ht_cap->tx_BF_cap_info |=
+ TX_BF_CAP_INFO_TX_STAG_RED_SOUNDING;
+ if (roam_ht_cap->rxZLF)
+ hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_RX_ZFL;
+ if (roam_ht_cap->txZLF)
+ hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_TX_ZFL;
+ if (roam_ht_cap->implicitTxBF)
+ hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_IMP_TX_BF;
+ temp_ht_cap = roam_ht_cap->calibration &
+ (TX_BF_CAP_INFO_CALIBRATION >> TX_BF_CAP_INFO_CALIBRATION_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap << TX_BF_CAP_INFO_CALIBRATION_SHIFT;
+ if (roam_ht_cap->explicitCSITxBF)
+ hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_EXP_CSIT_BF;
+ if (roam_ht_cap->explicitUncompressedSteeringMatrix)
+ hdd_ht_cap->tx_BF_cap_info |=
+ TX_BF_CAP_INFO_EXP_UNCOMP_STEER_MAT;
+ temp_ht_cap = roam_ht_cap->explicitBFCSIFeedback &
+ (TX_BF_CAP_INFO_EXP_BF_CSI_FB >>
+ TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap << TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT;
+ temp_ht_cap =
+ roam_ht_cap->explicitUncompressedSteeringMatrixFeedback &
+ (TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT >>
+ TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap <<
+ TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT;
+ temp_ht_cap =
+ roam_ht_cap->explicitCompressedSteeringMatrixFeedback &
+ (TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB >>
+ TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap <<
+ TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT;
+ temp_ht_cap = roam_ht_cap->csiNumBFAntennae &
+ (TX_BF_CAP_INFO_CSI_NUM_BF_ANT >>
+ TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap << TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT;
+ temp_ht_cap = roam_ht_cap->uncompressedSteeringMatrixBFAntennae &
+ (TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT >>
+ TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap <<
+ TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT;
+ temp_ht_cap = roam_ht_cap->compressedSteeringMatrixBFAntennae &
+ (TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT >>
+ TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT);
+ if (temp_ht_cap)
+ hdd_ht_cap->tx_BF_cap_info |=
+ temp_ht_cap <<
+ TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT;
+
+ /* antenna selection */
+ if (roam_ht_cap->antennaSelection)
+ hdd_ht_cap->antenna_selection_info |= ANTENNA_SEL_INFO;
+ if (roam_ht_cap->explicitCSIFeedbackTx)
+ hdd_ht_cap->antenna_selection_info |=
+ ANTENNA_SEL_INFO_EXP_CSI_FB_TX;
+ if (roam_ht_cap->antennaIndicesFeedbackTx)
+ hdd_ht_cap->antenna_selection_info |=
+ ANTENNA_SEL_INFO_ANT_ID_FB_TX;
+ if (roam_ht_cap->explicitCSIFeedback)
+ hdd_ht_cap->antenna_selection_info |=
+ ANTENNA_SEL_INFO_EXP_CSI_FB;
+ if (roam_ht_cap->antennaIndicesFeedback)
+ hdd_ht_cap->antenna_selection_info |=
+ ANTENNA_SEL_INFO_ANT_ID_FB;
+ if (roam_ht_cap->rxAS)
+ hdd_ht_cap->antenna_selection_info |=
+ ANTENNA_SEL_INFO_RX_AS;
+ if (roam_ht_cap->txSoundingPPDUs)
+ hdd_ht_cap->antenna_selection_info |=
+ ANTENNA_SEL_INFO_TX_SOUNDING_PPDU;
+
+ /* mcs data rate */
+ for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; ++i)
+ hdd_ht_cap->mcs.rx_mask[i] =
+ roam_ht_cap->supportedMCSSet[i];
+ hdd_ht_cap->mcs.rx_highest =
+ ((short) (roam_ht_cap->supportedMCSSet[11]) << 8) |
+ ((short) (roam_ht_cap->supportedMCSSet[10]));
+ hdd_ht_cap->mcs.tx_params =
+ roam_ht_cap->supportedMCSSet[12];
+}
+
+#define VHT_CAP_MAX_MPDU_LENGTH_MASK 0x00000003
+#define VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT 2
+#define VHT_CAP_RXSTBC_MASK_SHIFT 8
+#define VHT_CAP_BEAMFORMEE_STS_SHIFT 13
+#define VHT_CAP_BEAMFORMEE_STS_MASK \
+ (0x0000e000 >> VHT_CAP_BEAMFORMEE_STS_SHIFT)
+#define VHT_CAP_SOUNDING_DIMENSIONS_SHIFT 16
+#define VHT_CAP_SOUNDING_DIMENSIONS_MASK \
+ (0x00070000 >> VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
+#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT 23
+#define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \
+ (0x03800000 >> VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT)
+#define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT 26
+
+/**
+ * hdd_copy_ht_caps()- copy ht caps info from roam info to
+ * hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_vht_caps(hdd_station_ctx_t *hdd_sta_ctx,
+ tCsrRoamInfo *roam_info)
+{
+ tDot11fIEVHTCaps *roam_vht_cap = &roam_info->vht_caps;
+ struct ieee80211_vht_cap *hdd_vht_cap =
+ &hdd_sta_ctx->conn_info.vht_caps;
+ uint32_t temp_vht_cap;
+
+ adf_os_mem_zero(hdd_vht_cap, sizeof(struct ieee80211_vht_cap));
+
+ temp_vht_cap = roam_vht_cap->maxMPDULen & VHT_CAP_MAX_MPDU_LENGTH_MASK;
+ hdd_vht_cap->vht_cap_info |= temp_vht_cap;
+ temp_vht_cap = roam_vht_cap->supportedChannelWidthSet &
+ (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK >>
+ VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT);
+ if (temp_vht_cap) {
+ if (roam_vht_cap->supportedChannelWidthSet &
+ (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ >>
+ VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT))
+ hdd_vht_cap->vht_cap_info |=
+ temp_vht_cap <<
+ IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
+ if (roam_vht_cap->supportedChannelWidthSet &
+ (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ >>
+ VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT))
+ hdd_vht_cap->vht_cap_info |=
+ temp_vht_cap <<
+ IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
+ }
+ if (roam_vht_cap->ldpcCodingCap)
+ hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_RXLDPC;
+ if (roam_vht_cap->shortGI80MHz)
+ hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_SHORT_GI_80;
+ if (roam_vht_cap->shortGI160and80plus80MHz)
+ hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_SHORT_GI_160;
+ if (roam_vht_cap->txSTBC)
+ hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_TXSTBC;
+ temp_vht_cap = roam_vht_cap->rxSTBC & (IEEE80211_VHT_CAP_RXSTBC_MASK >>
+ VHT_CAP_RXSTBC_MASK_SHIFT);
+ if (temp_vht_cap)
+ hdd_vht_cap->vht_cap_info |=
+ temp_vht_cap << VHT_CAP_RXSTBC_MASK_SHIFT;
+ if (roam_vht_cap->suBeamFormerCap)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
+ if (roam_vht_cap->suBeamformeeCap)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
+ temp_vht_cap = roam_vht_cap->csnofBeamformerAntSup &
+ (VHT_CAP_BEAMFORMEE_STS_MASK);
+ if (temp_vht_cap)
+ hdd_vht_cap->vht_cap_info |=
+ temp_vht_cap << VHT_CAP_BEAMFORMEE_STS_SHIFT;
+ temp_vht_cap = roam_vht_cap->numSoundingDim &
+ (VHT_CAP_SOUNDING_DIMENSIONS_MASK);
+ if (temp_vht_cap)
+ hdd_vht_cap->vht_cap_info |=
+ temp_vht_cap << VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
+ if (roam_vht_cap->muBeamformerCap)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
+ if (roam_vht_cap->muBeamformeeCap)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
+ if (roam_vht_cap->vhtTXOPPS)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_VHT_TXOP_PS;
+ if (roam_vht_cap->htcVHTCap)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_HTC_VHT;
+ temp_vht_cap = roam_vht_cap->maxAMPDULenExp &
+ (VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
+ if (temp_vht_cap)
+ hdd_vht_cap->vht_cap_info |=
+ temp_vht_cap <<
+ VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT;
+ temp_vht_cap = roam_vht_cap->vhtLinkAdaptCap &
+ (IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB >>
+ VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT);
+ if (temp_vht_cap)
+ hdd_vht_cap->vht_cap_info |= temp_vht_cap <<
+ VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT;
+ if (roam_vht_cap->rxAntPattern)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
+ if (roam_vht_cap->txAntPattern)
+ hdd_vht_cap->vht_cap_info |=
+ IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
+ hdd_vht_cap->supp_mcs.rx_mcs_map = roam_vht_cap->rxMCSMap;
+ hdd_vht_cap->supp_mcs.rx_highest =
+ ((uint16_t)roam_vht_cap->rxHighSupDataRate);
+ hdd_vht_cap->supp_mcs.tx_mcs_map = roam_vht_cap->txMCSMap;
+ hdd_vht_cap->supp_mcs.tx_highest =
+ ((uint16_t)roam_vht_cap->txSupDataRate);
+}
+
+/* ht param */
+#define HT_PARAM_CONTROLLED_ACCESS_ONLY 0x10
+#define HT_PARAM_SERVICE_INT_GRAN 0xe0
+#define HT_PARAM_SERVICE_INT_GRAN_SHIFT 5
+
+/* operatinon mode */
+#define HT_OP_MODE_TX_BURST_LIMIT 0x0008
+
+/* stbc_param */
+#define HT_STBC_PARAM_MCS 0x007f
+
+/**
+ * hdd_copy_ht_operation()- copy HT operation element from roam info to
+ * hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_ht_operation(hdd_station_ctx_t *hdd_sta_ctx,
+ tCsrRoamInfo *roam_info)
+{
+ tDot11fIEHTInfo *roam_ht_ops = &roam_info->ht_operation;
+ struct ieee80211_ht_operation *hdd_ht_ops =
+ &hdd_sta_ctx->conn_info.ht_operation;
+ uint32_t i, temp_ht_ops;
+
+ adf_os_mem_zero(hdd_ht_ops, sizeof(struct ieee80211_ht_operation));
+
+ hdd_ht_ops->primary_chan = roam_ht_ops->primaryChannel;
+
+ /* HT_PARAMS */
+ temp_ht_ops = roam_ht_ops->secondaryChannelOffset &
+ IEEE80211_HT_PARAM_CHA_SEC_OFFSET;
+ if (temp_ht_ops)
+ hdd_ht_ops->ht_param |= temp_ht_ops;
+ else
+ hdd_ht_ops->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
+ if (roam_ht_ops->recommendedTxWidthSet)
+ hdd_ht_ops->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
+ if (roam_ht_ops->rifsMode)
+ hdd_ht_ops->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
+ if (roam_ht_ops->controlledAccessOnly)
+ hdd_ht_ops->ht_param |= HT_PARAM_CONTROLLED_ACCESS_ONLY;
+ temp_ht_ops = roam_ht_ops->serviceIntervalGranularity &
+ (HT_PARAM_SERVICE_INT_GRAN >> HT_PARAM_SERVICE_INT_GRAN_SHIFT);
+ if (temp_ht_ops)
+ hdd_ht_ops->ht_param |= temp_ht_ops <<
+ HT_PARAM_SERVICE_INT_GRAN_SHIFT;
+
+ /* operation mode */
+ temp_ht_ops = roam_ht_ops->opMode &
+ IEEE80211_HT_OP_MODE_PROTECTION;
+ switch (temp_ht_ops) {
+ case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
+ hdd_ht_ops->operation_mode |=
+ IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER;
+ break;
+ case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
+ hdd_ht_ops->operation_mode |=
+ IEEE80211_HT_OP_MODE_PROTECTION_20MHZ;
+ break;
+ case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
+ hdd_ht_ops->operation_mode |=
+ IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED;
+ break;
+ case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
+ default:
+ hdd_ht_ops->operation_mode |=
+ IEEE80211_HT_OP_MODE_PROTECTION_NONE;
+ }
+ if (roam_ht_ops->nonGFDevicesPresent)
+ hdd_ht_ops->operation_mode |=
+ IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT;
+ if (roam_ht_ops->transmitBurstLimit)
+ hdd_ht_ops->operation_mode |=
+ HT_OP_MODE_TX_BURST_LIMIT;
+ if (roam_ht_ops->obssNonHTStaPresent)
+ hdd_ht_ops->operation_mode |=
+ IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
+
+ /* stbc_param */
+ temp_ht_ops = roam_ht_ops->basicSTBCMCS &
+ HT_STBC_PARAM_MCS;
+ if (temp_ht_ops)
+ hdd_ht_ops->stbc_param |= temp_ht_ops;
+ if (roam_ht_ops->dualCTSProtection)
+ hdd_ht_ops->stbc_param |=
+ IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT;
+ if (roam_ht_ops->secondaryBeacon)
+ hdd_ht_ops->stbc_param |=
+ IEEE80211_HT_STBC_PARAM_STBC_BEACON;
+ if (roam_ht_ops->lsigTXOPProtectionFullSupport)
+ hdd_ht_ops->stbc_param |=
+ IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT;
+ if (roam_ht_ops->pcoActive)
+ hdd_ht_ops->stbc_param |=
+ IEEE80211_HT_STBC_PARAM_PCO_ACTIVE;
+ if (roam_ht_ops->pcoPhase)
+ hdd_ht_ops->stbc_param |=
+ IEEE80211_HT_STBC_PARAM_PCO_PHASE;
+
+ /* basic MCs set */
+ for (i = 0; i < 16; ++i)
+ hdd_ht_ops->basic_set[i] =
+ roam_ht_ops->basicMCSSet[i];
+}
+
+/**
+ * hdd_copy_vht_operation()- copy VHT operations element from roam info to
+ * hdd station context.
+ * @hdd_sta_ctx: pointer to hdd station context
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_copy_vht_operation(hdd_station_ctx_t *hdd_sta_ctx,
+ tCsrRoamInfo *roam_info)
+{
+ tDot11fIEVHTOperation *roam_vht_ops = &roam_info->vht_operation;
+ struct ieee80211_vht_operation *hdd_vht_ops =
+ &hdd_sta_ctx->conn_info.vht_operation;
+
+ adf_os_mem_zero(hdd_vht_ops, sizeof(struct ieee80211_vht_operation));
+
+ hdd_vht_ops->chan_width = roam_vht_ops->chanWidth;
+ hdd_vht_ops->center_freq_seg1_idx = roam_vht_ops->chanCenterFreqSeg1;
+ hdd_vht_ops->center_freq_seg2_idx = roam_vht_ops->chanCenterFreqSeg2;
+ hdd_vht_ops->basic_mcs_set = roam_vht_ops->basicMCSSet;
+}
+
+/**
+ * hdd_save_bss_info() - save connection info in hdd sta ctx
+ * @adapter: Pointer to adapter
+ * @roam_info: pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_save_bss_info(hdd_adapter_t *adapter,
+ tCsrRoamInfo *roam_info)
+{
+ hdd_station_ctx_t *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+
+ hdd_sta_ctx->conn_info.freq = vos_chan_to_freq(
+ hdd_sta_ctx->conn_info.operationChannel);
+ if (roam_info->vht_caps.present) {
+ hdd_sta_ctx->conn_info.conn_flag.vht_present = true;
+ hdd_copy_vht_caps(hdd_sta_ctx, roam_info);
+ } else {
+ hdd_sta_ctx->conn_info.conn_flag.vht_present = false;
+ }
+ if (roam_info->ht_caps.present) {
+ hdd_sta_ctx->conn_info.conn_flag.ht_present = true;
+ hdd_copy_ht_caps(hdd_sta_ctx, roam_info);
+ } else {
+ hdd_sta_ctx->conn_info.conn_flag.ht_present = false;
+ }
+ if (roam_info->reassoc)
+ hdd_sta_ctx->conn_info.roam_count++;
+ if (roam_info->hs20vendor_ie.present) {
+ hdd_sta_ctx->conn_info.conn_flag.hs20_present = true;
+ adf_os_mem_copy(&hdd_sta_ctx->conn_info.hs20vendor_ie,
+ &roam_info->hs20vendor_ie,
+ sizeof(roam_info->hs20vendor_ie));
+ } else {
+ hdd_sta_ctx->conn_info.conn_flag.hs20_present = false;
+ }
+ if (roam_info->ht_operation.present) {
+ hdd_sta_ctx->conn_info.conn_flag.ht_op_present = true;
+ hdd_copy_ht_operation(hdd_sta_ctx, roam_info);
+ } else {
+ hdd_sta_ctx->conn_info.conn_flag.ht_op_present = false;
+ }
+ if (roam_info->vht_operation.present) {
+ hdd_sta_ctx->conn_info.conn_flag.vht_op_present = true;
+ hdd_copy_vht_operation(hdd_sta_ctx, roam_info);
+ } else {
+ hdd_sta_ctx->conn_info.conn_flag.vht_op_present = false;
+ }
+}
+
static void
hdd_connSaveConnectInfo(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
eCsrRoamBssType eBssType)
@@ -374,11 +867,15 @@
pHddStaCtx->conn_info.ucEncryptionType = encryptType;
pHddStaCtx->conn_info.authType = pRoamInfo->u.pConnectedProfile->AuthType;
+ pHddStaCtx->conn_info.last_auth_type = pHddStaCtx->conn_info.authType;
pHddStaCtx->conn_info.operationChannel = pRoamInfo->u.pConnectedProfile->operationChannel;
// Save the ssid for the connection
vos_mem_copy( &pHddStaCtx->conn_info.SSID.SSID, &pRoamInfo->u.pConnectedProfile->SSID, sizeof( tSirMacSSid ) );
+ vos_mem_copy(&pHddStaCtx->conn_info.last_ssid.SSID,
+ &pRoamInfo->u.pConnectedProfile->SSID,
+ sizeof(tSirMacSSid));
// Save dot11mode in which STA associated to AP
pHddStaCtx->conn_info.dot11Mode = pRoamInfo->u.pConnectedProfile->dot11Mode;
@@ -387,6 +884,7 @@
pHddStaCtx->conn_info.nss = pRoamInfo->chan_info.nss;
pHddStaCtx->conn_info.rate_flags = pRoamInfo->chan_info.rate_flags;
}
+ hdd_save_bss_info(pAdapter, pRoamInfo);
}
// save the connected BssType
@@ -597,7 +1095,7 @@
if (descriptor == NULL)
{
hddLog(LOGE,
- "%s: pCsrRoamInfo->pBssDesc=%p",
+ "%s: pCsrRoamInfo->pBssDesc=%pK",
__func__, descriptor);
return;
}
@@ -689,6 +1187,7 @@
int type = -1;
v_MACADDR_t peerMacAddr;
+ hdd_adapter_t *mon_adapter = NULL;
#if defined (WLAN_FEATURE_VOWIFI_11R)
// Added to find the auth type on the fly at run time
// rather than with cfg to see if FT is enabled
@@ -805,6 +1304,16 @@
spin_unlock_bh(&pHddCtx->bus_bw_lock);
hdd_start_bus_bw_compute_timer(pAdapter);
#endif
+ if (pHddCtx->cfg_ini->mon_on_sta_enable &&
+ (pAdapter->device_mode == WLAN_HDD_INFRA_STATION)) {
+ /* monitor mode interface should be ready */
+ mon_adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_MONITOR);
+
+ if (mon_adapter && (WLAN_HDD_ADAPTER_MAGIC == mon_adapter->magic) &&
+ tlshim_get_rxmon_cbk()) {
+ wlan_hdd_monitor_mode_enable(pHddCtx, true);
+ }
+ }
}
else if (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState) // IBss Associated
{
@@ -860,6 +1369,11 @@
spin_unlock_bh(&pHddCtx->bus_bw_lock);
hdd_stop_bus_bw_compute_timer(pAdapter);
#endif
+ if (pHddCtx->cfg_ini->mon_on_sta_enable &&
+ (pAdapter->device_mode == WLAN_HDD_INFRA_STATION) &&
+ (true == pHddCtx->is_mon_enable)) {
+ wlan_hdd_monitor_mode_enable(pHddCtx, false);
+ }
}
hdd_dump_concurrency_info(pHddCtx);
@@ -947,6 +1461,52 @@
return( vosStatus );
}
+/**
+ * hdd_print_bss_info() - print bss info
+ * @hdd_sta_ctx: pointer to hdd station context
+ *
+ * Return: None
+ */
+static void hdd_print_bss_info(hdd_station_ctx_t *hdd_sta_ctx)
+{
+ uint32_t *cap_info;
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "WIFI DATA LOGGER");
+ hddLog(VOS_TRACE_LEVEL_INFO, "channel: %d",
+ hdd_sta_ctx->conn_info.freq);
+ hddLog(VOS_TRACE_LEVEL_INFO, "dot11mode: %d",
+ hdd_sta_ctx->conn_info.dot11Mode);
+ hddLog(VOS_TRACE_LEVEL_INFO, "AKM: %d",
+ hdd_sta_ctx->conn_info.last_auth_type);
+ hddLog(VOS_TRACE_LEVEL_INFO, "ssid: %.*s",
+ hdd_sta_ctx->conn_info.last_ssid.SSID.length,
+ hdd_sta_ctx->conn_info.last_ssid.SSID.ssId);
+ hddLog(VOS_TRACE_LEVEL_INFO, "roam count: %d",
+ hdd_sta_ctx->conn_info.roam_count);
+ hddLog(VOS_TRACE_LEVEL_INFO, "ant_info: %d",
+ hdd_sta_ctx->conn_info.txrate.nss);
+ hddLog(VOS_TRACE_LEVEL_INFO, "datarate legacy %d",
+ hdd_sta_ctx->conn_info.txrate.legacy);
+ hddLog(VOS_TRACE_LEVEL_INFO, "datarate mcs: %d",
+ hdd_sta_ctx->conn_info.txrate.mcs);
+ if (hdd_sta_ctx->conn_info.conn_flag.ht_present) {
+ cap_info = (uint32_t *)&hdd_sta_ctx->conn_info.ht_caps;
+ hddLog(VOS_TRACE_LEVEL_INFO, "ht caps: %x", *cap_info);
+ }
+ if (hdd_sta_ctx->conn_info.conn_flag.vht_present) {
+ cap_info = (uint32_t *)&hdd_sta_ctx->conn_info.vht_caps;
+ hddLog(VOS_TRACE_LEVEL_INFO, "vht caps: %x", *cap_info);
+ }
+ if (hdd_sta_ctx->conn_info.conn_flag.hs20_present)
+ hddLog(VOS_TRACE_LEVEL_INFO, "hs20 info: %x",
+ hdd_sta_ctx->conn_info.hs20vendor_ie.release_num);
+ hddLog(VOS_TRACE_LEVEL_INFO, "signal: %d",
+ hdd_sta_ctx->conn_info.signal);
+ hddLog(VOS_TRACE_LEVEL_INFO, "noise: %d",
+ hdd_sta_ctx->conn_info.noise);
+ hddLog(VOS_TRACE_LEVEL_INFO, "assoc_reject.status: %d",
+ hdd_sta_ctx->conn_info.assoc_status_code);
+}
static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
tANI_U32 roamId, eRoamCmdStatus roamStatus,
@@ -990,6 +1550,10 @@
}
#endif /* QCA_PKT_PROTO_TRACE */
+ DPTRACE(adf_dp_trace_mgmt_pkt(ADF_DP_TRACE_MGMT_PACKET_RECORD,
+ pAdapter->sessionId,
+ ADF_PROTO_TYPE_MGMT, ADF_PROTO_MGMT_DISASSOC));
+
/* HDD has initiated disconnect, do not send disconnect indication
* to kernel. Sending disconnected event to kernel for userspace
* initiated disconnect will be handled by diconnect handler call
@@ -1217,8 +1781,10 @@
if (pHddCtx->cfg_ini->enable_dynamic_sta_chainmask)
hdd_decide_dynamic_chain_mask(pHddCtx,
HDD_ANTENNA_MODE_INVALID);
+
//Unblock anyone waiting for disconnect to complete
complete(&pAdapter->disconnect_comp_var);
+ hdd_print_bss_info(pHddStaCtx);
return( status );
}
@@ -1532,15 +2098,10 @@
(int)pCsrRoamInfo->pBssDesc->channelId);
memset(&roam_profile, 0, sizeof(tCsrRoamConnectedProfile));
sme_RoamGetConnectProfile(hal_handle, pAdapter->sessionId, &roam_profile);
- bss = cfg80211_get_bss(pAdapter->wdev.wiphy, chan, pCsrRoamInfo->bssid,
- &roam_profile.SSID.ssId[0], roam_profile.SSID.length,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && !defined(WITH_BACKPORTS) \
- && !defined(IEEE80211_PRIVACY)
- WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
-#else
- IEEE80211_BSS_TYPE_ESS, IEEE80211_PRIVACY_ANY);
-#endif
-
+ bss = hdd_cfg80211_get_bss(pAdapter->wdev.wiphy,
+ chan, pCsrRoamInfo->bssid,
+ &roam_profile.SSID.ssId[0],
+ roam_profile.SSID.length);
if (bss == NULL)
hddLog(LOGE, FL("Get BSS returned NULL"));
buf_ptr = buf_ssid_ie;
@@ -1613,6 +2174,7 @@
hdd_is_roam_sync_in_progress(roaminfo));
hdd_connSetAuthenticated(adapter, VOS_TRUE);
if (hddctx->cfg_ini->enablePowersaveOffload &&
+ (false == hddctx->is_mon_enable) &&
((WLAN_HDD_INFRA_STATION == adapter->device_mode) ||
(WLAN_HDD_P2P_CLIENT == adapter->device_mode))) {
sme_PsOffloadEnableDeferredPowerSave(
@@ -1649,6 +2211,21 @@
pHddStaCtx->roam_info.deferKeyComplete = FALSE;
}
+#if defined(WLAN_FEATURE_FILS_SK) && defined(CFG80211_FILS_SK_OFFLOAD_SUPPORT)
+static void hdd_clear_fils_connection_info(hdd_adapter_t *adapter)
+{
+ hdd_wext_state_t *wext_state = WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
+
+ if (wext_state->roamProfile.fils_con_info) {
+ vos_mem_free(wext_state->roamProfile.fils_con_info);
+ wext_state->roamProfile.fils_con_info = NULL;
+ }
+}
+#else
+static void hdd_clear_fils_connection_info(hdd_adapter_t *adapter)
+{ }
+#endif
+
/**
* hdd_sap_restart_handle() - to handle restarting of SAP
* @work: name of the work
@@ -1683,97 +2260,12 @@
wlan_hdd_restart_sap(sap_adapter);
hdd_change_ch_avoidance_status(hdd_ctx, false);
} else {
- wlan_hdd_start_sap(sap_adapter);
+ wlan_hdd_start_sap(sap_adapter, false);
hdd_change_sap_restart_required_status(hdd_ctx, false);
}
vos_ssr_unprotect(__func__);
}
-void hdd_get_band(uint8_t channel, uint8_t *band)
-{
- if ( channel > 0 && channel < 14 )
- *band = 2;
- else if (channel >= 36 && channel <= 184 )
- *band = 5;
-}
-
-uint8_t hdd_is_mcc_in_2_band(hdd_context_t *hdd_ctx)
-{
- VOS_STATUS status;
- hdd_adapter_t *hdd_adapter = NULL;
- hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
- uint8_t ret = 0;
- hdd_station_ctx_t *sta_ctx;
- hdd_ap_ctx_t *ap_ctx;
- uint8_t band1 = 0, band2 = 0;
- uint8_t channel = 0, band = 0;
- hdd_hostapd_state_t *hostapd_state;
-
- status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
-
- /* loop through all adapters and check MCC for STA,P2P,SAP adapters */
- while (NULL != adapter_node && VOS_STATUS_SUCCESS == status) {
- hdd_adapter = adapter_node->pAdapter;
-
- if (!((hdd_adapter->device_mode >= WLAN_HDD_INFRA_STATION)
- && (hdd_adapter->device_mode
- <= WLAN_HDD_P2P_GO))) {
- /* skip for other adapters */
- status = hdd_get_next_adapter(hdd_ctx,
- adapter_node, &next);
- adapter_node = next;
- continue;
- } else {
- if (WLAN_HDD_INFRA_STATION ==
- hdd_adapter->device_mode ||
- WLAN_HDD_P2P_CLIENT ==
- hdd_adapter->device_mode) {
- sta_ctx =
- WLAN_HDD_GET_STATION_CTX_PTR(
- hdd_adapter);
- if (eConnectionState_Associated ==
- sta_ctx->conn_info.connState)
- channel =
- sta_ctx->conn_info.
- operationChannel;
- hdd_get_band(channel, &band);
- } else if (WLAN_HDD_P2P_GO ==
- hdd_adapter->device_mode ||
- WLAN_HDD_SOFTAP ==
- hdd_adapter->device_mode) {
- ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(hdd_adapter);
- hostapd_state =
- WLAN_HDD_GET_HOSTAP_STATE_PTR(
- hdd_adapter);
- if (hostapd_state->bssState == BSS_START &&
- hostapd_state->vosStatus ==
- VOS_STATUS_SUCCESS)
- channel = ap_ctx->operatingChannel;
- hdd_get_band(channel, &band);
- }
-
- if (band1 == 0 && band != 0) {
- band1 = band;
- } else if (band2 == 0 && band != 0) {
- band2 = band;
- }
-
- if (band1 != 0 && band2 != 0 && band1 != band2) {
- hddLog(LOGE,
- "MCC in 2 bands");
- return 1;
- }
-
- status = hdd_get_next_adapter(hdd_ctx,
- adapter_node, &next);
- adapter_node = next;
- }
- channel = 0;
- band = 0;
- }
- return ret;
-}
-
static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
tANI_U32 roamId, eRoamCmdStatus roamStatus,
eCsrRoamResult roamResult )
@@ -1797,6 +2289,7 @@
hdd_adapter_t *sap_adapter;
hdd_ap_ctx_t *hdd_ap_ctx;
uint8_t default_sap_channel = 6;
+ tSirResultCodes timeout_reason = 0;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
if (pRoamInfo && pRoamInfo->roamSynchInProgress) {
/* change logging before release */
@@ -1912,7 +2405,12 @@
#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
wlan_hdd_auto_shutdown_enable(pHddCtx, VOS_FALSE);
#endif
-
+ /* validate cfg_ini */
+ if (!pHddCtx->cfg_ini) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "cfg_ini is NULL");
+ return eHAL_STATUS_E_NULL_VALUE;
+ }
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
if ((pHddCtx->cfg_ini->WlanMccToSccSwitchMode
!= VOS_MCC_TO_SCC_SWITCH_DISABLE) &&
@@ -1937,6 +2435,11 @@
vos_pkt_trace_buf_update("ST:ASSOC");
}
#endif /* QCA_PKT_PROTO_TRACE */
+
+ DPTRACE(adf_dp_trace_mgmt_pkt(ADF_DP_TRACE_MGMT_PACKET_RECORD,
+ pAdapter->sessionId,
+ ADF_PROTO_TYPE_MGMT, ADF_PROTO_MGMT_ASSOC));
+
//For reassoc, the station is already registered, all we need is to change the state
//of the STA in TL.
//If authentication is required (WPA/WPA2/DWEP), change TL to CONNECTED instead of AUTHENTICATED
@@ -1956,10 +2459,24 @@
/* add bss_id to cfg80211 data base */
bss = wlan_hdd_cfg80211_update_bss_db(pAdapter, pRoamInfo);
if (NULL == bss) {
- pr_err("wlan: Not able to create BSS entry\n");
+ hddLog(LOGE,
+ FL("Not able to add BSS entry"));
wlan_hdd_netif_queue_control(pAdapter,
WLAN_NETIF_CARRIER_OFF,
WLAN_CONTROL_PATH);
+ if (!hddDisconInProgress) {
+ /*
+ * Here driver was not able to add bss in cfg80211 database
+ * this can happen if connected channel is not valid,
+ * i.e reg domain was changed during connection.
+ * Queue disconnect for the session if disconnect is
+ * not in progress.
+ */
+ hddLog(LOGE, FL("Disconnecting..."));
+ sme_RoamDisconnect( WLAN_HDD_GET_HAL_CTX(pAdapter),
+ pAdapter->sessionId,
+ eCSR_DISCONNECT_REASON_UNSPECIFIED);
+ }
return eHAL_STATUS_FAILURE;
}
#ifdef WLAN_FEATURE_VOWIFI_11R
@@ -2015,6 +2532,8 @@
{
if ( !hddDisconInProgress )
{
+ struct cfg80211_bss *roam_bss;
+
/* After roaming is completed, active session count is
* incremented as a part of connect indication but
* effectively the active session count should still
@@ -2029,9 +2548,19 @@
(int)pRoamInfo->pBssDesc->channelId);
hddLog(LOG1, "assocReqlen %d assocRsplen %d", assocReqlen,
assocRsplen);
- cfg80211_roamed(dev,chan, pRoamInfo->bssid,
- pFTAssocReq, assocReqlen, pFTAssocRsp, assocRsplen,
- GFP_KERNEL);
+ roam_bss =
+ hdd_cfg80211_get_bss(
+ pAdapter->wdev.wiphy,
+ chan,
+ pRoamInfo->bssid,
+ pRoamInfo->u.
+ pConnectedProfile->SSID.ssId,
+ pRoamInfo->u.
+ pConnectedProfile->SSID.length);
+ cfg80211_roamed_bss(dev, roam_bss,
+ pFTAssocReq, assocReqlen,
+ pFTAssocRsp, assocRsplen,
+ GFP_KERNEL);
}
if (sme_GetFTPTKState(WLAN_HDD_GET_HAL_CTX(pAdapter),
pAdapter->sessionId))
@@ -2060,7 +2589,8 @@
pFTAssocReq, assocReqlen,
pFTAssocRsp, assocRsplen,
WLAN_STATUS_SUCCESS,
- GFP_KERNEL);
+ GFP_KERNEL, false,
+ pRoamInfo->statusCode);
}
}
else
@@ -2095,7 +2625,7 @@
reqRsnIe, reqRsnLength,
rspRsnIe, rspRsnLength,
WLAN_STATUS_SUCCESS,
- GFP_KERNEL);
+ GFP_KERNEL, false, pRoamInfo->statusCode);
}
}
}
@@ -2203,6 +2733,7 @@
else
{
hdd_context_t* pHddCtx = (hdd_context_t*)pAdapter->pHddCtx;
+ bool connect_timeout = false;
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
if (pRoamInfo)
@@ -2276,22 +2807,25 @@
pRoamInfo ? pRoamInfo->bssid : pWextState->req_bssId);
sme_remove_bssid_from_scan_list(hHal,
pRoamInfo ? pRoamInfo->bssid : pWextState->req_bssId);
+ connect_timeout = true;
}
/* CR465478: Only send up a connection failure result when CSR has
* completed operation - with a ASSOCIATION_FAILURE status.*/
if ( eCSR_ROAM_ASSOCIATION_FAILURE == roamStatus && !hddDisconInProgress )
{
- if (pRoamInfo)
+ if (pRoamInfo) {
hddLog(VOS_TRACE_LEVEL_ERROR,
"%s: send connect failure to nl80211: for bssid " MAC_ADDRESS_STR" result:%d and Status:%d reasonCode %d" ,
__func__, MAC_ADDR_ARRAY(pRoamInfo->bssid),
roamResult, roamStatus, pRoamInfo->reasonCode);
- else
+ pHddStaCtx->conn_info.assoc_status_code = pRoamInfo->statusCode;
+ } else {
hddLog(VOS_TRACE_LEVEL_ERROR,
"%s: connect failed: for bssid " MAC_ADDRESS_STR " result:%d and Status:%d " ,
__func__, MAC_ADDR_ARRAY(pWextState->req_bssId),
roamResult, roamStatus);
+ }
hddLog(LOG1, FL("Invoking packetdump deregistration API"));
wlan_deregister_txrx_packetdump();
@@ -2300,30 +2834,32 @@
if ( eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL == roamResult )
{
if (pRoamInfo)
- hdd_connect_result(dev, pRoamInfo->bssid, NULL,
+ hdd_connect_result(dev, pRoamInfo->bssid,
+ pRoamInfo,
NULL, 0, NULL, 0,
WLAN_STATUS_ASSOC_DENIED_UNSPEC,
- GFP_KERNEL);
+ GFP_KERNEL, connect_timeout, pRoamInfo->statusCode);
else
hdd_connect_result(dev, pWextState->req_bssId, NULL,
NULL, 0, NULL, 0,
WLAN_STATUS_ASSOC_DENIED_UNSPEC,
- GFP_KERNEL);
+ GFP_KERNEL, connect_timeout, timeout_reason);
}
else
{
if (pRoamInfo)
- hdd_connect_result(dev, pRoamInfo->bssid, NULL,
+ hdd_connect_result(dev, pRoamInfo->bssid,
+ pRoamInfo,
NULL, 0, NULL, 0,
pRoamInfo->reasonCode ?
pRoamInfo->reasonCode :
WLAN_STATUS_UNSPECIFIED_FAILURE,
- GFP_KERNEL);
+ GFP_KERNEL, connect_timeout, pRoamInfo->statusCode);
else
hdd_connect_result(dev, pWextState->req_bssId, NULL,
NULL, 0, NULL, 0,
WLAN_STATUS_UNSPECIFIED_FAILURE,
- GFP_KERNEL);
+ GFP_KERNEL, connect_timeout, timeout_reason);
}
/* Clear the roam profile */
hdd_clearRoamProfileIe(pAdapter);
@@ -2394,7 +2930,7 @@
}
-
+ hdd_clear_fils_connection_info(pAdapter);
/*
* Call hdd_decide_dynamic_chain_mask only when CSR has
* completed connect with failure or success i.e. with
@@ -2426,47 +2962,6 @@
}
}
#endif /* FEATURE_WLAN_FORCE_SAP_SCC */
- if (eConnectionState_Associated == pHddStaCtx->conn_info.connState) {
- if (hdd_is_mcc_in_2_band(pHddCtx)) {
- switch (pHddCtx->thermal_level) {
- case 0:
- thermal_band =
- (pHddCtx->cfg_ini->throttle_dutycycle_level0_2g
- > pHddCtx->cfg_ini->throttle_dutycycle_level0_5g)
- ? 2
- : 5;
- break;
- case 1:
- thermal_band =
- (pHddCtx->cfg_ini->throttle_dutycycle_level1_2g
- > pHddCtx->cfg_ini->throttle_dutycycle_level1_5g)
- ? 2
- : 5;
- break;
- case 2:
- thermal_band =
- (pHddCtx->cfg_ini->throttle_dutycycle_level2_2g
- > pHddCtx->cfg_ini->throttle_dutycycle_level2_5g)
- ? 2
- : 5;
- break;
- case 3:
- thermal_band =
- (pHddCtx->cfg_ini->throttle_dutycycle_level3_2g
- > pHddCtx->cfg_ini->throttle_dutycycle_level3_5g)
- ? 2
- : 5;
- break;
- default:
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "invalid thermal level %d",
- pHddCtx->thermal_level);
- }
- } else {
- hdd_get_band(pHddStaCtx->conn_info.operationChannel, &thermal_band);
- }
- sme_SetThermalLevel(pHddCtx->hHal, pHddCtx->thermal_level);
- }
return eHAL_STATUS_SUCCESS;
}
@@ -3008,7 +3503,7 @@
hddLog(VOS_TRACE_LEVEL_ERROR,
"%s: sme_RoamSetKey failed, returned %d",
__func__, vosStatus);
- return VOS_STATUS_E_FAILURE;
+ return eHAL_STATUS_FAILURE;
}
}
hddLog(LOG1, FL("Enabling queues"));
@@ -3244,8 +3739,17 @@
{
if(eSIR_SME_SUCCESS != pRoamInfo->statusCode)
{
+ hddTdlsPeer_t *curr_peer;
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
("%s: Add Sta is failed. %d"),__func__, pRoamInfo->statusCode);
+ mutex_lock(&pHddCtx->tdls_lock);
+ curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
+ pRoamInfo->peerMac, FALSE);
+ if (curr_peer)
+ curr_peer->link_status = eTDLS_LINK_TEARING;
+ else
+ hddLog(LOG1, FL("curr_peer is Null"));
+ mutex_unlock(&pHddCtx->tdls_lock);
}
else
{
@@ -3310,10 +3814,21 @@
}
case eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP:
{
+
+ hddTdlsPeer_t *curr_peer;
if (eSIR_SME_SUCCESS != pRoamInfo->statusCode)
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: Link Establish Request failed. %d", __func__, pRoamInfo->statusCode);
+ mutex_lock(&pHddCtx->tdls_lock);
+ curr_peer = wlan_hdd_tdls_find_peer(pAdapter,
+ pRoamInfo->peerMac, FALSE);
+ if (curr_peer)
+ curr_peer->link_status = eTDLS_LINK_TEARING;
+ else
+ hddLog(LOGE, FL("curr_peer is Null"));
+
+ mutex_unlock(&pHddCtx->tdls_lock);
}
complete(&pAdapter->tdls_link_establish_req_comp);
break;
@@ -3350,7 +3865,6 @@
pHddCtx->tdlsConnInfo[staIdx].sessionId = 255;
vos_mem_zero(&pHddCtx->tdlsConnInfo[staIdx].peerMac,
sizeof(v_MACADDR_t)) ;
- wlan_hdd_tdls_check_bmps(pAdapter);
status = eHAL_STATUS_SUCCESS ;
break ;
}
@@ -3358,6 +3872,12 @@
complete(&pAdapter->tdls_del_station_comp);
}
break ;
+ case eCSR_ROAM_TDLS_CHECK_BMPS:
+ {
+ wlan_hdd_tdls_check_bmps(pAdapter);
+ status = eHAL_STATUS_SUCCESS ;
+ break;
+ }
case eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND:
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
@@ -3444,10 +3964,11 @@
break;
}
- curr_peer = wlan_hdd_tdls_get_peer(pAdapter, pRoamInfo->peerMac);
+ curr_peer = wlan_hdd_tdls_get_peer(pAdapter, pRoamInfo->peerMac,
+ TRUE);
if (!curr_peer)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: curr_peer null", __func__);
status = eHAL_STATUS_FAILURE;
}
@@ -3498,7 +4019,7 @@
curr_peer = wlan_hdd_tdls_find_peer(pAdapter, pRoamInfo->peerMac, TRUE);
if (!curr_peer)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: curr_peer null", __func__);
status = eHAL_STATUS_FAILURE;
}
@@ -3554,7 +4075,7 @@
curr_peer = wlan_hdd_tdls_find_peer(pAdapter, pRoamInfo->peerMac, TRUE);
if (!curr_peer)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: curr_peer null", __func__);
status = eHAL_STATUS_FAILURE;
}
@@ -3624,7 +4145,7 @@
if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
{
hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Bad param, pAdapter [%p]",
+ "%s: Bad param, pAdapter [%pK]",
__func__, pAdapter);
return;
}
@@ -4096,11 +4617,6 @@
#endif
}
break;
- case eCSR_ROAM_LOSTLINK_DETECTED:
- if((roamResult != eCSR_ROAM_RESULT_DISASSOC_IND) &&
- (roamResult != eCSR_ROAM_RESULT_DEAUTH_IND)) {
- break;
- } /* else fall through */
case eCSR_ROAM_LOSTLINK:
if(roamResult == eCSR_ROAM_RESULT_LOSTLINK) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
@@ -4140,7 +4656,8 @@
/* Call to clear any MC Addr List filter applied after
* successful connection.
*/
- wlan_hdd_set_mc_addr_list(pAdapter, FALSE);
+ if (wlan_hdd_set_mc_addr_list(pAdapter, FALSE))
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("failed to clear mc addr list"));
#endif
}
break;
@@ -4308,6 +4825,7 @@
case eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND:
wlan_hdd_tdls_mgmt_completion_callback(pAdapter, pRoamInfo->reasonCode);
break;
+
#endif
#ifdef WLAN_FEATURE_11W
case eCSR_ROAM_UNPROT_MGMT_FRAME_IND:
@@ -4368,9 +4886,37 @@
}
return( halStatus );
}
+
+#ifdef WLAN_FEATURE_FILS_SK
+/**
+ * hdd_translate_fils_rsn_to_csr_auth() - Translate FILS RSN to CSR auth type
+ * @auth_suite: auth suite
+ * @auth_type: pointer to eCsrAuthType
+ *
+ * Return: None
+ */
+static void hdd_translate_fils_rsn_to_csr_auth(u_int8_t auth_suite[4],
+ eCsrAuthType *auth_type)
+{
+ if (!memcmp(auth_suite, ccp_rsn_oui_0e, 4))
+ *auth_type = eCSR_AUTH_TYPE_FILS_SHA256;
+ else if (!memcmp(auth_suite, ccp_rsn_oui_0f, 4))
+ *auth_type = eCSR_AUTH_TYPE_FILS_SHA384;
+ else if (!memcmp(auth_suite, ccp_rsn_oui_10, 4))
+ *auth_type = eCSR_AUTH_TYPE_FT_FILS_SHA256;
+ else if (!memcmp(auth_suite, ccp_rsn_oui_11, 4))
+ *auth_type = eCSR_AUTH_TYPE_FT_FILS_SHA384;
+}
+#else
+static inline void hdd_translate_fils_rsn_to_csr_auth(u_int8_t auth_suite[4],
+ eCsrAuthType *auth_type)
+{
+}
+#endif
+
eCsrAuthType hdd_TranslateRSNToCsrAuthType( u_int8_t auth_suite[4])
{
- eCsrAuthType auth_type;
+ eCsrAuthType auth_type = eCSR_AUTH_TYPE_UNKNOWN;
// is the auth type supported?
if ( memcmp(auth_suite , ccpRSNOui01, 4) == 0)
{
@@ -4408,16 +4954,17 @@
auth_type = eCSR_AUTH_TYPE_RSN_8021X_SHA256;
} else
#endif
- {
- auth_type = eCSR_AUTH_TYPE_UNKNOWN;
- }
+ /* If auth suite is of fils, auth_type will be
+ * overwritten in hdd_translate_fils_rsn_to_csr_auth
+ */
+ hdd_translate_fils_rsn_to_csr_auth(auth_suite, &auth_type);
return auth_type;
}
eCsrAuthType
hdd_TranslateWPAToCsrAuthType(u_int8_t auth_suite[4])
{
- eCsrAuthType auth_type;
+ eCsrAuthType auth_type = eCSR_AUTH_TYPE_UNKNOWN;
// is the auth type supported?
if ( memcmp(auth_suite , ccpWpaOui01, 4) == 0)
{
@@ -4433,9 +4980,11 @@
auth_type = eCSR_AUTH_TYPE_CCKM_WPA;
} else
#endif /* FEATURE_WLAN_ESE */
- {
- auth_type = eCSR_AUTH_TYPE_UNKNOWN;
- }
+ /* If auth suite is of fils, auth_type will be
+ * overwritten in hdd_translate_fils_rsn_to_csr_auth
+ */
+ hdd_translate_fils_rsn_to_csr_auth(auth_suite, &auth_type);
+
hddLog(LOG1, FL("auth_type: %d"), auth_type);
return auth_type;
}
@@ -4518,6 +5067,28 @@
return cipher_type;
}
+#ifdef WLAN_FEATURE_FILS_SK
+/*
+ * hdd_is_fils_connection: API to determine if connection is FILS
+ * @adapter: hdd adapter
+ *
+ * Return: true if fils connection else false
+*/
+static inline bool hdd_is_fils_connection(hdd_adapter_t *adapter)
+{
+ hdd_wext_state_t *wext_state = WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
+ if (wext_state->roamProfile.fils_con_info)
+ return wext_state->roamProfile.fils_con_info->is_fils_connection;
+
+ return false;
+}
+#else
+static inline bool hdd_is_fils_connection(hdd_adapter_t *adapter)
+{
+ return false;
+}
+#endif
+
static tANI_S32 hdd_ProcessGENIE(hdd_adapter_t *pAdapter,
struct ether_addr *pBssid,
eCsrEncryptionType *pEncryptType,
@@ -4535,11 +5106,13 @@
tDot11fIERSN dot11RSNIE;
tDot11fIEWPA dot11WPAIE;
tANI_U32 i;
+ tANI_U32 status;
tANI_U8 *pRsnIe;
tANI_U16 RSNIeLen;
tPmkidCacheInfo PMKIDCache[4]; // Local transfer memory
v_BOOL_t updatePMKCache = FALSE;
+ vos_mem_zero(PMKIDCache, sizeof PMKIDCache);
/* Clear struct of tDot11fIERSN and tDot11fIEWPA specifically setting present
flag to 0 */
memset( &dot11WPAIE, 0 , sizeof(tDot11fIEWPA) );
@@ -4560,10 +5133,17 @@
pRsnIe = gen_ie + 2;
RSNIeLen = gen_ie_len - 2;
// Unpack the RSN IE
- dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
+ status = dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
pRsnIe,
RSNIeLen,
&dot11RSNIE);
+ if (DOT11F_FAILED(status))
+ {
+ hddLog(LOGE,
+ FL("Parse failure in hdd_ProcessGENIE (0x%08x)"),
+ status);
+ return -EINVAL;
+ }
// Copy out the encryption and authentication types
hddLog(LOG1, FL("%s: pairwise cipher suite count: %d"),
__func__, dot11RSNIE.pwise_cipher_suite_count );
@@ -4726,6 +5306,32 @@
}
return 0;
}
+
+#ifdef WLAN_FEATURE_FILS_SK
+/**
+ * hdd_check_fils_rsn_n_set_auth_type() - This API checks whether a give
+ * auth type is fils if yes, sets it in profile.
+ * @rsn_auth_type: auth type
+ *
+ * Return: true if FILS auth else false
+ */
+static bool hdd_check_fils_rsn_n_set_auth_type(tCsrRoamProfile *roam_profile,
+ eCsrAuthType rsn_auth_type)
+{
+ bool is_fils_rsn = false;
+
+ if ((rsn_auth_type == eCSR_AUTH_TYPE_FILS_SHA256) ||
+ (rsn_auth_type == eCSR_AUTH_TYPE_FILS_SHA384) ||
+ (rsn_auth_type == eCSR_AUTH_TYPE_FT_FILS_SHA256) ||
+ (rsn_auth_type == eCSR_AUTH_TYPE_FT_FILS_SHA384))
+ is_fils_rsn = true;
+ if (is_fils_rsn)
+ roam_profile->fils_con_info->akm_type = rsn_auth_type;
+
+ return is_fils_rsn;
+}
+#endif
+
int hdd_set_csr_auth_type ( hdd_adapter_t *pAdapter, eCsrAuthType RSNAuthType)
{
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
@@ -4807,7 +5413,12 @@
eCSR_AUTH_TYPE_RSN_8021X_SHA256;
} else
#endif
-
+#ifdef WLAN_FEATURE_FILS_SK
+ if (hdd_check_fils_rsn_n_set_auth_type(pRoamProfile, RSNAuthType)) {
+ pRoamProfile->AuthType.authType[0] = RSNAuthType;
+ hddLog(LOG1, "updated profile authtype as %d", RSNAuthType);
+ } else
+#endif
if( (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)
== IW_AUTH_KEY_MGMT_802_1X) {
pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN;
@@ -4854,18 +5465,15 @@
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- unsigned long rc;
v_U32_t status = 0;
hdd_wext_state_t *pWextState;
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
v_U32_t roamId;
tCsrRoamProfile *pRoamProfile;
hdd_context_t *pHddCtx;
- eMib_dot11DesiredBssType connectedBssType;
eCsrAuthType RSNAuthType;
uint16_t ch_width;
tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
- hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
int ret;
ENTER();
@@ -4893,25 +5501,15 @@
return -EINVAL;
pRoamProfile = &pWextState->roamProfile;
- if (hdd_connGetConnectedBssType(pHddStaCtx, &connectedBssType) ||
- (eMib_dot11DesiredBssType_independent ==
- pHddStaCtx->conn_info.connDot11DesiredBssType)) {
- VOS_STATUS vosStatus;
- /* Need to issue a disconnect to CSR. */
- INIT_COMPLETION(pAdapter->disconnect_comp_var);
- vosStatus = sme_RoamDisconnect(hHal, pAdapter->sessionId,
- eCSR_DISCONNECT_REASON_UNSPECIFIED);
-
- if (VOS_STATUS_SUCCESS == vosStatus) {
- rc = wait_for_completion_timeout(&pAdapter->disconnect_comp_var,
- msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
- if (!rc) {
- hddLog( LOGE, FL("Disconnect event timed out"));
- }
- }
+ /*Try disconnecting if already in connected state*/
+ status = wlan_hdd_try_disconnect(pAdapter);
+ if (0 > status)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Failed to disconnect the existing"
+ " connection"));
+ return -EALREADY;
}
-
/** when cfg80211 defined, wpa_supplicant wext driver uses
zero-length, null-string ssid for force disconnection.
after disconnection (if previously connected) and cleaning ssid,
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c
index f673160..a1e8202 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -573,6 +573,13 @@
CFG_CHANNEL_BONDING_MODE_MIN,
CFG_CHANNEL_BONDING_MODE_MAX),
+ REG_VARIABLE(CFG_OVERRIDE_HT40_20_24GHZ_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, override_ht20_40_24g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OVERRIDE_HT40_20_24GHZ_DEFAULT,
+ CFG_OVERRIDE_HT40_20_24GHZ_MIN,
+ CFG_OVERRIDE_HT40_20_24GHZ_MAX),
+
REG_VARIABLE( CFG_CHANNEL_BONDING_MODE_5GHZ_NAME, WLAN_PARAM_Integer,
hdd_config_t, nChannelBondingMode5GHz,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK,
@@ -950,21 +957,6 @@
CFG_IDLE_TIME_DEFAULT,
CFG_IDLE_TIME_MIN,
CFG_IDLE_TIME_MAX ),
-
-
- REG_VARIABLE( CFG_NUM_STA_CHAN_COMBINED_CONC_NAME, WLAN_PARAM_Integer,
- hdd_config_t, nNumStaChanCombinedConc,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_NUM_STA_CHAN_COMBINED_CONC_DEFAULT,
- CFG_NUM_STA_CHAN_COMBINED_CONC_MIN,
- CFG_NUM_STA_CHAN_COMBINED_CONC_MAX ),
-
- REG_VARIABLE( CFG_NUM_P2P_CHAN_COMBINED_CONC_NAME, WLAN_PARAM_Integer,
- hdd_config_t, nNumP2PChanCombinedConc,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_NUM_P2P_CHAN_COMBINED_CONC_DEFAULT,
- CFG_NUM_P2P_CHAN_COMBINED_CONC_MIN,
- CFG_NUM_P2P_CHAN_COMBINED_CONC_MAX ),
#endif
REG_VARIABLE( CFG_MAX_PS_POLL_NAME, WLAN_PARAM_Integer,
@@ -1080,6 +1072,13 @@
CFG_QOS_WMM_MODE_MIN,
CFG_QOS_WMM_MODE_MAX ),
+ REG_VARIABLE( CFG_STA_LOCAL_EDCA_FOR_ETSI_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, gStaLocalEDCAEnable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_STA_LOCAL_EDCA_FOR_ETSI_DEFAULT,
+ CFG_STA_LOCAL_EDCA_FOR_ETSI_MIN,
+ CFG_STA_LOCAL_EDCA_FOR_ETSI_MAX ),
+
REG_VARIABLE( CFG_QOS_WMM_80211E_ENABLED_NAME , WLAN_PARAM_Integer,
hdd_config_t, b80211eIsEnabled,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -1478,6 +1477,27 @@
CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_DEFAULT,
CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_MIN,
CFG_WLAN_MCC_TO_SCC_SWITCH_MODE_MAX ),
+
+ REG_VARIABLE( CFG_WLAN_BAND_SWITCH_ENABLE , WLAN_PARAM_Integer,
+ hdd_config_t, wlan_band_switch_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_WLAN_BAND_SWITCH_ENABLE_DEFAULT,
+ CFG_WLAN_BAND_SWITCH_ENABLE_MIN,
+ CFG_WLAN_BAND_SWITCH_ENABLE_MAX ),
+
+ REG_VARIABLE( CFG_WLAN_AP_P2PGO_CONC_ENABLE , WLAN_PARAM_Integer,
+ hdd_config_t, wlan_ap_p2pgo_conc_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_WLAN_AP_P2PGO_CONC_ENABLE_DEFAULT,
+ CFG_WLAN_AP_P2PGO_CONC_ENABLE_MIN,
+ CFG_WLAN_AP_P2PGO_CONC_ENABLE_MAX ),
+
+ REG_VARIABLE( CFG_WLAN_AP_P2PGC_CONC_ENABLE , WLAN_PARAM_Integer,
+ hdd_config_t, wlan_ap_p2pclient_conc_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_WLAN_AP_P2PGC_CONC_ENABLE_DEFAULT,
+ CFG_WLAN_AP_P2PGC_CONC_ENABLE_MIN,
+ CFG_WLAN_AP_P2PGC_CONC_ENABLE_MAX ),
#endif
#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
REG_VARIABLE( CFG_WLAN_AUTO_SHUTDOWN , WLAN_PARAM_Integer,
@@ -2022,20 +2042,6 @@
CFG_BCN_EARLY_TERM_WAKE_MIN,
CFG_BCN_EARLY_TERM_WAKE_MAX ),
- REG_VARIABLE( CFG_AP_DATA_AVAIL_POLL_PERIOD_NAME, WLAN_PARAM_Integer,
- hdd_config_t, apDataAvailPollPeriodInMs,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_AP_DATA_AVAIL_POLL_PERIOD_DEFAULT,
- CFG_AP_DATA_AVAIL_POLL_PERIOD_MIN,
- CFG_AP_DATA_AVAIL_POLL_PERIOD_MAX ),
-
- REG_VARIABLE( CFG_ENABLE_CLOSE_LOOP_NAME, WLAN_PARAM_Integer,
- hdd_config_t, enableCloseLoop,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_ENABLE_CLOSE_LOOP_DEFAULT,
- CFG_ENABLE_CLOSE_LOOP_MIN,
- CFG_ENABLE_CLOSE_LOOP_MAX ),
-
REG_VARIABLE( CFG_ENABLE_BYPASS_11D_NAME, WLAN_PARAM_Integer,
hdd_config_t, enableBypass11d,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -2064,13 +2070,6 @@
CFG_ENABLE_DYNAMIC_DTIM_MIN,
CFG_ENABLE_DYNAMIC_DTIM_MAX ),
- REG_VARIABLE( CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_NAME, WLAN_PARAM_Integer,
- hdd_config_t, enableAutomaticTxPowerControl,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_DEFAULT,
- CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_MIN,
- CFG_ENABLE_AUTOMATIC_TX_POWER_CONTROL_MAX ),
-
REG_VARIABLE( CFG_SHORT_GI_40MHZ_NAME, WLAN_PARAM_Integer,
hdd_config_t, ShortGI40MhzEnable,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -2180,61 +2179,33 @@
CFG_THROTTLE_PERIOD_MIN,
CFG_THROTTLE_PERIOD_MAX ),
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level0_2g,
+ REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL0_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, throttle_dutycycle_level0,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL0_2G_MAX ),
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL0_DEFAULT,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL0_MIN,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL0_MAX ),
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level1_2g,
+ REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL1_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, throttle_dutycycle_level1,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL1_2G_MAX ),
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL1_DEFAULT,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL1_MIN,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL1_MAX ),
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level2_2g,
+ REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL2_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, throttle_dutycycle_level2,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL2_2G_MAX ),
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL2_DEFAULT,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL2_MIN,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL2_MAX ),
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level3_2g,
+ REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL3_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, throttle_dutycycle_level3,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL3_2G_MAX ),
-
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level0_5g,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL0_5G_MAX ),
-
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level1_5g,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL1_5G_MAX ),
-
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level2_5g,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL2_5G_MAX ),
-
- REG_VARIABLE( CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_NAME, WLAN_PARAM_Integer,
- hdd_config_t, throttle_dutycycle_level3_5g,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_DEFAULT,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_MIN,
- CFG_THROTTLE_DUTY_CYCLE_LEVEL3_5G_MAX ),
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL3_DEFAULT,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL3_MIN,
+ CFG_THROTTLE_DUTY_CYCLE_LEVEL3_MAX ),
REG_VARIABLE( CFG_ENABLE_MODULATED_DTIM_NAME, WLAN_PARAM_Integer,
hdd_config_t, enableModulatedDTIM,
@@ -2300,19 +2271,33 @@
CFG_ENABLE_VHT_DYNAMIC_STA_CHAINMASK_MIN,
CFG_ENABLE_VHT_DYNAMIC_STA_CHAINMASK_MAX),
- REG_VARIABLE( CFG_CHAIN_MASK_2G, WLAN_PARAM_Integer,
- hdd_config_t, chain_mask_2g,
+ REG_VARIABLE( CFG_RX_CHAIN_MASK_2G, WLAN_PARAM_Integer,
+ hdd_config_t, chain_mask_2g_rx,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_CHAIN_MASK_2G_DEFAULT,
- CFG_CHAIN_MASK_2G_MIN,
- CFG_CHAIN_MASK_2G_MAX ),
+ CFG_RX_CHAIN_MASK_2G_DEFAULT,
+ CFG_RX_CHAIN_MASK_2G_MIN,
+ CFG_RX_CHAIN_MASK_2G_MAX ),
- REG_VARIABLE( CFG_CHAIN_MASK_5G, WLAN_PARAM_Integer,
- hdd_config_t, chain_mask_5g,
+ REG_VARIABLE( CFG_RX_CHAIN_MASK_5G, WLAN_PARAM_Integer,
+ hdd_config_t, chain_mask_5g_rx,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_CHAIN_MASK_5G_DEFAULT,
- CFG_CHAIN_MASK_5G_MIN,
- CFG_CHAIN_MASK_5G_MAX ),
+ CFG_RX_CHAIN_MASK_5G_DEFAULT,
+ CFG_RX_CHAIN_MASK_5G_MIN,
+ CFG_RX_CHAIN_MASK_5G_MAX ),
+
+ REG_VARIABLE( CFG_TX_CHAIN_MASK_2G, WLAN_PARAM_Integer,
+ hdd_config_t, chain_mask_2g_tx,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_TX_CHAIN_MASK_2G_DEFAULT,
+ CFG_TX_CHAIN_MASK_2G_MIN,
+ CFG_TX_CHAIN_MASK_2G_MAX ),
+
+ REG_VARIABLE( CFG_TX_CHAIN_MASK_5G, WLAN_PARAM_Integer,
+ hdd_config_t, chain_mask_5g_tx,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_TX_CHAIN_MASK_5G_DEFAULT,
+ CFG_TX_CHAIN_MASK_5G_MIN,
+ CFG_TX_CHAIN_MASK_5G_MAX ),
REG_VARIABLE( CFG_VDEV_TYPE_NSS_2G, WLAN_PARAM_Integer,
hdd_config_t, vdev_type_nss_2g,
@@ -2392,6 +2377,13 @@
CFG_DISABLE_DFS_CH_SWITCH_MIN,
CFG_DISABLE_DFS_CH_SWITCH_MAX ),
+ REG_VARIABLE( CFG_ENABLE_RADAR_WAR, WLAN_PARAM_Integer,
+ hdd_config_t, enable_radar_war,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_RADAR_WAR_DEFAULT,
+ CFG_ENABLE_RADAR_WAR_MIN,
+ CFG_ENABLE_RADAR_WAR_MAX ),
+
REG_VARIABLE( CFG_ENABLE_DFS_MASTER_CAPABILITY, WLAN_PARAM_Integer,
hdd_config_t, enableDFSMasterCap,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -2415,6 +2407,62 @@
CFG_DISABLE_DFS_JAPAN_W53_MAX,
chNotify_set_gDisableDfsJapanW53, 0),
+ REG_VARIABLE(CFG_SET_RTS_FOR_SIFS_BURSTING, WLAN_PARAM_Integer,
+ hdd_config_t, enable_rts_sifsbursting,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SET_RTS_FOR_SIFS_BURSTING_DEFAULT,
+ CFG_SET_RTS_FOR_SIFS_BURSTING_MIN,
+ CFG_SET_RTS_FOR_SIFS_BURSTING_MAX),
+
+ REG_VARIABLE(CFG_MAX_MPDUS_IN_AMPDU, WLAN_PARAM_Integer,
+ hdd_config_t, max_mpdus_inampdu,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_MAX_MPDUS_IN_AMPDU_DEFAULT,
+ CFG_MAX_MPDUS_IN_AMPDU_MIN,
+ CFG_MAX_MPDUS_IN_AMPDU_MAX),
+
+ REG_VARIABLE(CFG_MAX_HT_MCS_FOR_TX_DATA, WLAN_PARAM_HexInteger,
+ hdd_config_t, max_ht_mcs_txdata,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_MAX_HT_MCS_FOR_TX_DATA_DEFAULT,
+ CFG_MAX_HT_MCS_FOR_TX_DATA_MIN,
+ CFG_MAX_HT_MCS_FOR_TX_DATA_MAX),
+
+ REG_VARIABLE(CFG_SAP_GET_PEER_INFO, WLAN_PARAM_Integer,
+ hdd_config_t, sap_get_peer_info,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SAP_GET_PEER_INFO_DEFAULT,
+ CFG_SAP_GET_PEER_INFO_MIN,
+ CFG_SAP_GET_PEER_INFO_MAX),
+
+ REG_VARIABLE(CFG_DISABLE_ABG_RATE_FOR_TX_DATA, WLAN_PARAM_Integer,
+ hdd_config_t, disable_abg_rate_txdata,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DISABLE_ABG_RATE_FOR_TX_DATA_DEFAULT,
+ CFG_DISABLE_ABG_RATE_FOR_TX_DATA_MIN,
+ CFG_DISABLE_ABG_RATE_FOR_TX_DATA_MAX),
+
+ REG_VARIABLE(CFG_RATE_FOR_TX_MGMT, WLAN_PARAM_HexInteger,
+ hdd_config_t, rate_for_tx_mgmt,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_MIN,
+ CFG_RATE_FOR_TX_MGMT_MAX),
+
+ REG_VARIABLE(CFG_RATE_FOR_TX_MGMT_2G, WLAN_PARAM_HexInteger,
+ hdd_config_t, rate_for_tx_mgmt_2g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_2G_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_2G_MIN,
+ CFG_RATE_FOR_TX_MGMT_2G_MAX),
+
+ REG_VARIABLE(CFG_RATE_FOR_TX_MGMT_5G, WLAN_PARAM_HexInteger,
+ hdd_config_t, rate_for_tx_mgmt_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_5G_DEFAULT,
+ CFG_RATE_FOR_TX_MGMT_5G_MIN,
+ CFG_RATE_FOR_TX_MGMT_5G_MAX),
+
REG_VARIABLE( CFG_ENABLE_FIRST_SCAN_2G_ONLY_NAME, WLAN_PARAM_Integer,
hdd_config_t, enableFirstScan2GOnly,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3309,6 +3357,50 @@
CFG_THERMAL_TEMP_MAX_LEVEL3_MIN,
CFG_THERMAL_TEMP_MAX_LEVEL3_MAX ),
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_ENABLE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_shutdown_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_ENABLE_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_ENABLE_MIN,
+ CFG_THERMAL_SHUTDOWN_ENABLE_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_shutdown_auto_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MIN,
+ CFG_THERMAL_SHUTDOWN_AUTO_ENABLE_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_TEMP_RESUME_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_resume_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_RESUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MIN,
+ CFG_THERMAL_SHUTDOWN_TEMP_RESUME_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_TEMP_WARNING_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_warning_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_WARNING_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MIN,
+ CFG_THERMAL_SHUTDOWN_TEMP_WARNING_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_suspend_threshold,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_DEFAULT,
+ CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MIN,
+ CFG_THERMAL_SHUTDOWN_TEMP_SUSPEND_MAX),
+
+ REG_VARIABLE( CFG_THERMAL_SAMPLE_RATE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, thermal_sample_rate,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_THERMAL_SAMPLE_RATE_DEFAULT,
+ CFG_THERMAL_SAMPLE_RATE_MIN,
+ CFG_THERMAL_SAMPLE_RATE_MAX),
+#endif /* FEATURE_WLAN_THERMAL_SHUTDOWN */
+
REG_VARIABLE( CFG_SET_TXPOWER_LIMIT2G_NAME , WLAN_PARAM_Integer,
hdd_config_t, TxPower2g,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3372,6 +3464,7 @@
CFG_SAP_SCAN_BAND_PREFERENCE_DEFAULT,
CFG_SAP_SCAN_BAND_PREFERENCE_MIN,
CFG_SAP_SCAN_BAND_PREFERENCE_MAX ),
+
REG_VARIABLE( CFG_AUTO_CHANNEL_SELECT_WEIGHT, WLAN_PARAM_HexInteger,
hdd_config_t, auto_channel_select_weight,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3379,7 +3472,6 @@
CFG_AUTO_CHANNEL_SELECT_WEIGHT_MIN,
CFG_AUTO_CHANNEL_SELECT_WEIGHT_MAX ),
-
#ifdef QCA_LL_TX_FLOW_CT
REG_VARIABLE( CFG_LL_TX_FLOW_LWM, WLAN_PARAM_Integer,
hdd_config_t, TxFlowLowWaterMark,
@@ -3522,6 +3614,12 @@
CFG_ENABLE_PACKET_LOG_DEFAULT,
CFG_ENABLE_PACKET_LOG_MIN,
CFG_ENABLE_PACKET_LOG_MAX ),
+ REG_VARIABLE( CFG_EDCA_FROM_HOSTAPD, WLAN_PARAM_Integer,
+ hdd_config_t, enable_hostapd_edca_local,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK,
+ CFG_EDCA_FROM_HOSTAPD_DEFAULT,
+ CFG_EDCA_FROM_HOSTAPD_MIN,
+ CFG_EDCA_FROM_HOSTAPD_MAX),
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
REG_VARIABLE( CFG_ROAMING_OFFLOAD_NAME, WLAN_PARAM_Integer,
@@ -3620,6 +3718,43 @@
#endif
+#ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
+
+ REG_VARIABLE(CFG_DEL_ACK_THRESHOLD_HIGH, WLAN_PARAM_Integer,
+ hdd_config_t, del_ack_threshold_high,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DEL_ACK_THRESHOLD_HIGH_DEFAULT,
+ CFG_DEL_ACK_THRESHOLD_HIGH_MIN,
+ CFG_DEL_ACK_THRESHOLD_HIGH_MAX),
+
+ REG_VARIABLE(CFG_DEL_ACK_THRESHOLD_LOW, WLAN_PARAM_Integer,
+ hdd_config_t, del_ack_threshold_low,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DEL_ACK_THRESHOLD_LOW_DEFAULT,
+ CFG_DEL_ACK_THRESHOLD_LOW_MIN,
+ CFG_DEL_ACK_THRESHOLD_LOW_MAX),
+
+ REG_VARIABLE(CFG_DEL_ACK_TIMER_IN_MS, WLAN_PARAM_Integer,
+ hdd_config_t, del_ack_timer_value,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DEL_ACK_TIMER_IN_MS_DEFAULT,
+ CFG_DEL_ACK_TIMER_IN_MS_MIN,
+ CFG_DEL_ACK_TIMER_IN_MS_MAX),
+
+ REG_VARIABLE(CFG_DEL_ACK_PKT_COUNT, WLAN_PARAM_Integer,
+ hdd_config_t, del_ack_pkt_count,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DEL_ACK_PKT_COUNT_DEFAULT,
+ CFG_DEL_ACK_PKT_COUNT_MIN,
+ CFG_DEL_ACK_PKT_COUNT_MAX),
+
+ REG_VARIABLE(CFG_DEL_ACK_ENABLE, WLAN_PARAM_Integer,
+ hdd_config_t, del_ack_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DEL_ACK_ENABLE_DEFAULT,
+ CFG_DEL_ACK_ENABLE_MIN,
+ CFG_DEL_ACK_ENABLE_MAX),
+#endif
REG_VARIABLE( CFG_ENABLE_FW_LOG_TYPE , WLAN_PARAM_Integer,
hdd_config_t, enableFwLogType,
@@ -3833,6 +3968,13 @@
CFG_ENABLE_SELF_RECOVERY_MIN,
CFG_ENABLE_SELF_RECOVERY_MAX ),
+ REG_VARIABLE( CFG_ENABLE_AC_TXQ_OPTIMIZE, WLAN_PARAM_HexInteger,
+ hdd_config_t, enable_ac_txq_optimize,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_AC_TXQ_OPTIMIZE_DEFAULT,
+ CFG_ENABLE_AC_TXQ_OPTIMIZE_MIN,
+ CFG_ENABLE_AC_TXQ_OPTIMIZE_MAX ),
+
#ifdef FEATURE_WLAN_FORCE_SAP_SCC
REG_VARIABLE(CFG_SAP_SCC_CHAN_AVOIDANCE, WLAN_PARAM_Integer,
hdd_config_t, SapSccChanAvoidance,
@@ -4261,6 +4403,76 @@
CFG_BTC_ANTENNA_ISOLATION_MIN,
CFG_BTC_ANTENNA_ISOLATION_MAX),
+ REG_VARIABLE(CFG_BTC_BT_INTERVAL_PAGE_P2P_STA, WLAN_PARAM_Integer,
+ hdd_config_t, coex_page_p2p_sta_bt_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT,
+ CFG_BTC_BT_INTERVAL_PAGE_P2P_STA_MIN,
+ CFG_BTC_BT_INTERVAL_PAGE_P2P_STA_MAX),
+
+ REG_VARIABLE(CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA, WLAN_PARAM_Integer,
+ hdd_config_t, coex_page_p2p_sta_wlan_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA_MIN,
+ CFG_BTC_WLAN_INTERVAL_PAGE_P2P_STA_MAX),
+
+ REG_VARIABLE(CFG_BTC_BT_INTERVAL_INQ_STA, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_sta_bt_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_STA_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_STA_MIN,
+ CFG_BTC_BT_INTERVAL_INQ_STA_MAX),
+
+ REG_VARIABLE(CFG_BTC_WLAN_INTERVAL_INQ_STA, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_sta_wlan_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_STA_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_STA_MIN,
+ CFG_BTC_WLAN_INTERVAL_INQ_STA_MAX),
+
+ REG_VARIABLE(CFG_BTC_BT_INTERVAL_INQ_SAP, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_sap_bt_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_SAP_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_SAP_MIN,
+ CFG_BTC_BT_INTERVAL_INQ_SAP_MAX),
+
+ REG_VARIABLE(CFG_BTC_WLAN_INTERVAL_INQ_SAP, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_sap_wlan_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_SAP_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_SAP_MIN,
+ CFG_BTC_WLAN_INTERVAL_INQ_SAP_MAX),
+
+ REG_VARIABLE(CFG_BTC_BT_INTERVAL_INQ_P2P, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_p2p_bt_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_P2P_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_P2P_MIN,
+ CFG_BTC_BT_INTERVAL_INQ_P2P_MAX),
+
+ REG_VARIABLE(CFG_BTC_WLAN_INTERVAL_INQ_P2P, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_p2p_wlan_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_P2P_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_P2P_MIN,
+ CFG_BTC_WLAN_INTERVAL_INQ_P2P_MAX),
+
+ REG_VARIABLE(CFG_BTC_BT_INTERVAL_INQ_P2P_STA, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_p2p_sta_bt_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_P2P_STA_DEFAULT,
+ CFG_BTC_BT_INTERVAL_INQ_P2P_STA_MIN,
+ CFG_BTC_BT_INTERVAL_INQ_P2P_STA_MAX),
+
+ REG_VARIABLE(CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA, WLAN_PARAM_Integer,
+ hdd_config_t, coex_inquiry_p2p_sta_wlan_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA_DEFAULT,
+ CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA_MIN,
+ CFG_BTC_WLAN_INTERVAL_INQ_P2P_STA_MAX),
+
REG_VARIABLE(CFG_BTC_WLAN_COEX_TX_POWER, WLAN_PARAM_Integer,
hdd_config_t, coex_tx_power,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4268,24 +4480,6 @@
CFG_BTC_WLAN_COEX_TX_POWER_MIN,
CFG_BTC_WLAN_COEX_TX_POWER_MAX),
-#ifdef WMI_COEX_BTC_DUTYCYCLE
- REG_VARIABLE(CFG_COEX_PAUSE_NAME,
- WLAN_PARAM_Integer,
- hdd_config_t, coex_btc_PauseDuration,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_COEX_PAUSE_DEFAULT,
- CFG_COEX_PAUSE_MIN,
- CFG_COEX_PAUSE_MAX),
-
- REG_VARIABLE(CFG_COEX_UNPAUSE_NAME,
- WLAN_PARAM_Integer,
- hdd_config_t, coex_btc_UnPauseDuration,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_COEX_UNPAUSE_DEFAULT,
- CFG_COEX_UNPAUSE_MIN,
- CFG_COEX_UNPAUSE_MAX),
-#endif
-
REG_VARIABLE(CFG_INFORM_BSS_RSSI_RAW_NAME, WLAN_PARAM_Integer,
hdd_config_t, inform_bss_rssi_raw,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4299,6 +4493,15 @@
CFG_SET_TSF_GPIO_PIN_DEFAULT,
CFG_SET_TSF_GPIO_PIN_MIN,
CFG_SET_TSF_GPIO_PIN_MAX),
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+ REG_VARIABLE(CFG_SET_TSF_PTP_OPT_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, tsf_ptp_options,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SET_TSF_PTP_OPT_DEFAULT,
+ CFG_SET_TSF_PTP_OPT_MIN,
+ CFG_SET_TSF_PTP_OPT_MAX),
+#endif /* WLAN_FEATURE_TSF_PLUS */
#endif
REG_VARIABLE(CFG_FINE_TIME_MEAS_CAPABILITY, WLAN_PARAM_HexInteger,
hdd_config_t, fine_time_meas_cap,
@@ -4342,6 +4545,13 @@
CFG_TX_CHAIN_MASK_1SS_MIN,
CFG_TX_CHAIN_MASK_1SS_MAX),
+ REG_VARIABLE(CFG_TX_SCH_DELAY, WLAN_PARAM_Integer,
+ hdd_config_t, tx_sch_delay,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_TX_SCH_DELAY_DEFAULT,
+ CFG_TX_SCH_DELAY_MIN,
+ CFG_TX_SCH_DELAY_MAX),
+
REG_VARIABLE(CFG_SELF_GEN_FRM_PWR, WLAN_PARAM_Integer,
hdd_config_t, self_gen_frm_pwr,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4685,12 +4895,12 @@
CFG_TGT_GTX_USR_CFG_MIN,
CFG_TGT_GTX_USR_CFG_MAX),
- REG_VARIABLE(CFG_CH_AVOID_SAP_RESTART_NAME, WLAN_PARAM_Integer,
- hdd_config_t, sap_restrt_ch_avoid,
+ REG_VARIABLE(CFG_SAP_INTERNAL_RESTART_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, sap_internal_restart,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_CH_AVOID_SAP_RESTART_DEFAULT,
- CFG_CH_AVOID_SAP_RESTART_MIN,
- CFG_CH_AVOID_SAP_RESTART_MAX),
+ CFG_SAP_INTERNAL_RESTART_DEFAULT,
+ CFG_SAP_INTERNAL_RESTART_MIN,
+ CFG_SAP_INTERNAL_RESTART_MAX),
REG_VARIABLE(CFG_BUG_ON_REINIT_FAILURE_NAME, WLAN_PARAM_Integer,
hdd_config_t, bug_on_reinit_failure,
@@ -4721,6 +4931,13 @@
CFG_ACTIVE_MODE_OFFLOAD_MIN,
CFG_ACTIVE_MODE_OFFLOAD_MAX),
+ REG_VARIABLE(CFG_STA_CHANGE_COUNTRYCODE_DYN_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, sta_change_cc_via_beacon,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_STA_CHANGE_COUNTRYCODE_DYN_DEFAULT,
+ CFG_STA_CHANGE_COUNTRYCODE_DYN_DISABLE,
+ CFG_STA_CHANGE_COUNTRYCODE_DYN_ENABLE),
+
REG_VARIABLE(CFG_SIFS_BURST_DURATION_NAME, WLAN_PARAM_Integer,
hdd_config_t, sifs_burst_duration,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4728,6 +4945,20 @@
CFG_SIFS_BURST_DURATION_MIN,
CFG_SIFS_BURST_DURATION_MAX),
+ REG_VARIABLE(CFG_BPF_PACKET_FILTER_OFFLOAD, WLAN_PARAM_Integer,
+ struct hdd_config, bpf_packet_filter_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_BPF_PACKET_FILTER_OFFLOAD_DEFAULT,
+ CFG_BPF_PACKET_FILTER_OFFLOAD_MIN,
+ CFG_BPF_PACKET_FILTER_OFFLOAD_MAX),
+
+ REG_VARIABLE(CFG_TDLS_ENABLE_DEFER_TIMER, WLAN_PARAM_Integer,
+ hdd_config_t, tdls_enable_defer_time,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_TDLS_ENABLE_DEFER_TIMER_DEFAULT,
+ CFG_TDLS_ENABLE_DEFER_TIMER_MIN,
+ CFG_TDLS_ENABLE_DEFER_TIMER_MAX),
+
REG_VARIABLE(CFG_HOST_WAKEUP_GPIO_NAME, WLAN_PARAM_Integer,
hdd_config_t, host_wakeup_gpio,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4755,6 +4986,266 @@
CFG_TARGET_WAKEUP_TYPE_DEFAULT,
CFG_TARGET_WAKEUP_TYPE_MIN,
CFG_TARGET_WAKEUP_TYPE_MAX),
+
+ REG_VARIABLE(CFG_MAX_SCHED_SCAN_PLAN_INT_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, max_sched_scan_plan_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_MAX_SCHED_SCAN_PLAN_INT_DEFAULT,
+ CFG_MAX_SCHED_SCAN_PLAN_INT_MIN,
+ CFG_MAX_SCHED_SCAN_PLAN_INT_MAX),
+
+ REG_VARIABLE(CFG_MAX_SCHED_SCAN_PLAN_ITRNS_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, max_sched_scan_plan_iterations,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_MAX_SCHED_SCAN_PLAN_ITRNS_DEFAULT,
+ CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MIN,
+ CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MAX),
+
+ REG_VARIABLE(CFG_ENABLE_5G_BAND_PREF_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, enable_5g_band_pref,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_5G_BAND_PREF_DEFAULT,
+ CFG_ENABLE_5G_BAND_PREF_MIN,
+ CFG_ENABLE_5G_BAND_PREF_MAX),
+
+ REG_VARIABLE(CFG_5G_RSSI_BOOST_THRESHOLD_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, rssi_boost_threshold_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_5G_RSSI_BOOST_THRESHOLD_DEFAULT,
+ CFG_5G_RSSI_BOOST_THRESHOLD_MIN,
+ CFG_5G_RSSI_BOOST_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_5G_RSSI_BOOST_FACTOR_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, rssi_boost_factor_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_5G_RSSI_BOOST_FACTOR_DEFAULT,
+ CFG_5G_RSSI_BOOST_FACTOR_MIN,
+ CFG_5G_RSSI_BOOST_FACTOR_MAX),
+
+ REG_VARIABLE(CFG_5G_MAX_RSSI_BOOST_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, max_rssi_boost_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_5G_MAX_RSSI_BOOST_DEFAULT,
+ CFG_5G_MAX_RSSI_BOOST_MIN,
+ CFG_5G_MAX_RSSI_BOOST_MAX),
+
+ REG_VARIABLE(CFG_5G_RSSI_PENALIZE_THRESHOLD_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, rssi_penalize_threshold_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_5G_RSSI_PENALIZE_THRESHOLD_DEFAULT,
+ CFG_5G_RSSI_PENALIZE_THRESHOLD_MIN,
+ CFG_5G_RSSI_PENALIZE_THRESHOLD_MAX),
+
+ REG_VARIABLE(CFG_5G_RSSI_PENALIZE_FACTOR_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, rssi_penalize_factor_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_5G_RSSI_PENALIZE_FACTOR_DEFAULT,
+ CFG_5G_RSSI_PENALIZE_FACTOR_MIN,
+ CFG_5G_RSSI_PENALIZE_FACTOR_MAX),
+
+ REG_VARIABLE(CFG_5G_MAX_RSSI_PENALIZE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, max_rssi_penalize_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_5G_MAX_RSSI_PENALIZE_DEFAULT,
+ CFG_5G_MAX_RSSI_PENALIZE_MIN,
+ CFG_5G_MAX_RSSI_PENALIZE_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_WHITELIST_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, probe_req_ie_whitelist,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_WHITELIST_DEFAULT,
+ CFG_PRB_REQ_IE_WHITELIST_MIN,
+ CFG_PRB_REQ_IE_WHITELIST_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP0_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_0,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP0_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP0_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP0_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP1_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_1,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP1_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP1_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP1_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP2_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_2,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP2_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP2_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP2_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP3_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_3,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP3_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP3_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP3_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP4_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_4,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP4_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP4_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP4_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP5_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_5,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP5_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP5_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP5_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP6_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_6,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP6_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP6_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP6_MAX),
+
+ REG_VARIABLE(CFG_PRB_REQ_IE_BIT_MAP7_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, probe_req_ie_bitmap_7,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP7_DEFAULT,
+ CFG_PRB_REQ_IE_BIT_MAP7_MIN,
+ CFG_PRB_REQ_IE_BIT_MAP7_MAX),
+
+ REG_VARIABLE_STRING(CFG_PROBE_REQ_OUI_NAME, WLAN_PARAM_String,
+ hdd_config_t, probe_req_ouis,
+ VAR_FLAGS_OPTIONAL,
+ (void *)CFG_PROBE_REQ_OUI_DEFAULT),
+
+ REG_VARIABLE(CFG_SUB_20_CHANNEL_WIDTH_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, sub_20_channel_width,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SUB_20_CHANNEL_WIDTH_DEFAULT,
+ CFG_SUB_20_CHANNEL_WIDTH_MIN,
+ CFG_SUB_20_CHANNEL_WIDTH_MAX),
+
+ REG_VARIABLE(CFG_RX_WAKELOCK_TIMEOUT_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, rx_wakelock_timeout,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RX_WAKELOCK_TIMEOUT_DEFAULT,
+ CFG_RX_WAKELOCK_TIMEOUT_MIN,
+ CFG_RX_WAKELOCK_TIMEOUT_MAX),
+
+ REG_VARIABLE(CFG_SAP_CH_SWITCH_BEACON_CNT, WLAN_PARAM_Integer,
+ hdd_config_t, sap_chanswitch_beacon_cnt,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SAP_CH_SWITCH_BEACON_CNT_DEFAULT,
+ CFG_SAP_CH_SWITCH_BEACON_CNT_MIN,
+ CFG_SAP_CH_SWITCH_BEACON_CNT_MAX),
+
+ REG_VARIABLE(CFG_SAP_CH_SWITCH_MODE, WLAN_PARAM_Integer,
+ hdd_config_t, sap_chanswitch_mode,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SAP_CH_SWITCH_MODE_DEFAULT,
+ CFG_SAP_CH_SWITCH_MODE_MIN,
+ CFG_SAP_CH_SWITCH_MODE_MAX),
+
+ REG_VARIABLE(CFG_DFS_BEACON_TX_ENHANCED, WLAN_PARAM_Integer,
+ hdd_config_t, dfs_beacon_tx_enhanced,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_DFS_BEACON_TX_ENHANCED_DEFAULT,
+ CFG_DFS_BEACON_TX_ENHANCED_MIN,
+ CFG_DFS_BEACON_TX_ENHANCED_MAX),
+
+ REG_VARIABLE(CFG_REDUCED_BEACON_INTERVAL, WLAN_PARAM_Integer,
+ hdd_config_t, reduced_beacon_interval,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_REDUCED_BEACON_INTERVAL_DEFAULT,
+ CFG_REDUCED_BEACON_INTERVAL_MIN,
+ CFG_REDUCED_BEACON_INTERVAL_MAX),
+
+ REG_VARIABLE(CFG_NO_ACK_ENABLE, WLAN_PARAM_Integer,
+ hdd_config_t, gEnableNoAck,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_NO_ACK_DEFAULT,
+ CFG_NO_ACK_MIN,
+ CFG_NO_ACK_MAX),
+
+#ifdef FEATURE_COEX_PTA_CONFIG_ENABLE
+ REG_VARIABLE(CFG_COEX_PTA_CONFIG_ENABLE, WLAN_PARAM_Integer,
+ hdd_config_t, coex_pta_config_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_COEX_PTA_CONFIG_ENABLE_DEFAULT,
+ CFG_COEX_PTA_CONFIG_ENABLE_MIN,
+ CFG_COEX_PTA_CONFIG_ENABLE_MAX),
+
+ REG_VARIABLE(CFG_COEX_PTA_CONFIG_PARAM, WLAN_PARAM_Integer,
+ hdd_config_t, coex_pta_config_param,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_COEX_PTA_CONFIG_PARAM_DEFAULT,
+ CFG_COEX_PTA_CONFIG_PARAM_MIN,
+ CFG_COEX_PTA_CONFIG_PARAM_MAX),
+#endif
+
+ REG_VARIABLE(CFG_ARP_AC_CATEGORY, WLAN_PARAM_Integer,
+ hdd_config_t, arp_ac_category,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ARP_AC_CATEGORY_DEFAULT,
+ CFG_ARP_AC_CATEGORY_MIN,
+ CFG_ARP_AC_CATEGORY_MAX),
+
+ REG_VARIABLE(CFG_SAP_PROBE_RESP_OFFLOAD_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, sap_probe_resp_offload,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SAP_PROBE_RESP_OFFLOAD_DEFAULT,
+ CFG_SAP_PROBE_RESP_OFFLOAD_MIN,
+ CFG_SAP_PROBE_RESP_OFFLOAD_MAX),
+
+ REG_VARIABLE( CFG_STA_AUTH_RETRIES_FOR_CODE17_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, sta_auth_retries_for_code17,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_STA_AUTH_RETRIES_FOR_CODE17_DEFAULT,
+ CFG_STA_AUTH_RETRIES_FOR_CODE17_MIN,
+ CFG_STA_AUTH_RETRIES_FOR_CODE17_MAX ),
+
+ REG_VARIABLE(CFG_SKIP_MAC_CONFIG, WLAN_PARAM_Integer,
+ hdd_config_t, skip_mac_config,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_SKIP_MAC_CONFIG_DEFAULT,
+ CFG_SKIP_MAC_CONFIG_MIN,
+ CFG_SKIP_MAC_CONFIG_MAX),
+#ifdef WLAN_FEATURE_DSRC
+ REG_VARIABLE(CFG_OCB_TX_PER_PKT_STATS_ENABLE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, ocb_tx_per_pkt_stats_enabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OCB_TX_PER_PKT_STATS_ENABLE_DEFAULT,
+ CFG_OCB_TX_PER_PKT_STATS_ENABLE_MIN,
+ CFG_OCB_TX_PER_PKT_STATS_ENABLE_MAX),
+#endif
+
+ REG_VARIABLE(CFG_CCA_THRESHOLD_ENABLE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, cca_threshold_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CCA_THRESHOLD_ENABLE_DEFAULT,
+ CFG_CCA_THRESHOLD_ENABLE_MIN,
+ CFG_CCA_THRESHOLD_ENABLE_MAX),
+
+ REG_VARIABLE(CFG_CCA_THRESHOLD_2G_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, cca_threshold_2g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CCA_THRESHOLD_2G_DEFAULT,
+ CFG_CCA_THRESHOLD_2G_MIN,
+ CFG_CCA_THRESHOLD_2G_MAX),
+
+ REG_VARIABLE(CFG_CCA_THRESHOLD_5G_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, cca_threshold_5g,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CCA_THRESHOLD_5G_DEFAULT,
+ CFG_CCA_THRESHOLD_5G_MIN,
+ CFG_CCA_THRESHOLD_5G_MAX),
+
+ REG_VARIABLE(CFG_ENABLE_MONITOR_ON_STA, WLAN_PARAM_Integer,
+ hdd_config_t, mon_on_sta_enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_MONITOR_ON_STA_DEFAULT,
+ CFG_ENABLE_MONITOR_ON_STA_MIN,
+ CFG_ENABLE_MONITOR_ON_STA_MAX),
};
@@ -4833,8 +5324,8 @@
/* Find the first non white-space*/
for (ptr = str; i_isspace(*ptr); ptr++);
- if (*ptr == '\0')
- return str;
+ if (*ptr == '\0')
+ return str;
/* This is the new start of the string*/
str = ptr;
@@ -4842,8 +5333,8 @@
/* Find the last non white-space */
ptr += strlen(ptr) - 1;
for (; ptr != str && i_isspace(*ptr); ptr--);
- /* Null terminate the following character */
- ptr[1] = '\0';
+ /* Null terminate the following character */
+ ptr[1] = '\0';
return str;
}
@@ -4954,7 +5445,8 @@
hddLog(LOG1, "%s: qcom_cfg.ini Size %zu", __func__, fw->size);
- buffer = (char*)vos_mem_malloc(fw->size);
+ buffer = (char*)vos_mem_malloc(fw->size + 1);
+ buffer[fw->size] = '\0';
if(NULL == buffer) {
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: kmalloc failure",__func__);
@@ -5054,6 +5546,9 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gAPAutoShutOff] Value = [%u]", pHddCtx->cfg_ini->nAPAutoShutOff);
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gWlanMccToSccSwitchMode] Value = [%u]", pHddCtx->cfg_ini->WlanMccToSccSwitchMode);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gWlanBandSwitchEnable] Value = [%u]", pHddCtx->cfg_ini->wlan_band_switch_enable);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gWlanApP2pGOConcurrencyEnable] Value = [%u]", pHddCtx->cfg_ini->wlan_ap_p2pgo_conc_enable);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gWlanApP2pClientConcurEnable] Value = [%u]", pHddCtx->cfg_ini->wlan_ap_p2pclient_conc_enable);
#endif
#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gWlanAutoShutdown] Value = [%u]", pHddCtx->cfg_ini->WlanAutoShutdown);
@@ -5086,6 +5581,8 @@
VOS_TRACE (VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gACSBandSwitchThreshold] value = [%u]", pHddCtx->cfg_ini->acsBandSwitchThreshold);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ChannelBondingMode] Value = [%u]",pHddCtx->cfg_ini->nChannelBondingMode24GHz);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [%s] Value = [%u] ",
+ CFG_OVERRIDE_HT40_20_24GHZ_NAME, pHddCtx->cfg_ini->override_ht20_40_24g);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ChannelBondingMode] Value = [%u]",pHddCtx->cfg_ini->nChannelBondingMode5GHz);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [dot11Mode] Value = [%u]",pHddCtx->cfg_ini->dot11Mode);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [WmmMode] Value = [%u] ",pHddCtx->cfg_ini->WmmMode);
@@ -5139,6 +5636,9 @@
"Name = [enable_tdls_scan] Value = [%u]",
pHddCtx->cfg_ini->enable_tdls_scan);
#endif
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableNoAck] Value = [%u] ",pHddCtx->cfg_ini->gEnableNoAck);
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraDirAcVo] Value = [%u] ",pHddCtx->cfg_ini->InfraDirAcVo);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraNomMsduSizeAcVo] Value = [0x%x] ",pHddCtx->cfg_ini->InfraNomMsduSizeAcVo);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraMeanDataRateAcVo] Value = [0x%x] ",pHddCtx->cfg_ini->InfraMeanDataRateAcVo);
@@ -5242,7 +5742,6 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [maxListenInterval] Value = [%u] ",pHddCtx->cfg_ini->nTeleBcnMaxListenInterval);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [maxLiNumIdleBeacons] Value = [%u] ",pHddCtx->cfg_ini->nTeleBcnMaxLiNumIdleBeacons);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [bcnEarlyTermWakeInterval] Value = [%u] ",pHddCtx->cfg_ini->bcnEarlyTermWakeInterval);
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gApDataAvailPollInterVal] Value = [%u] ",pHddCtx->cfg_ini->apDataAvailPollPeriodInMs);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableBypass11d] Value = [%u] ",pHddCtx->cfg_ini->enableBypass11d);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableDFSChnlScan] Value = [%u] ",pHddCtx->cfg_ini->enableDFSChnlScan);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableDFSPnoChnlScan] Value = [%u] ",pHddCtx->cfg_ini->enable_dfs_pno_chnl_scan);
@@ -5361,6 +5860,11 @@
"Name = [isRoamOffloadEnabled] Value = [%u]",
pHddCtx->cfg_ini->isRoamOffloadEnabled);
#endif
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "Name = [gEnableHostapdEdcaLocal] Value = [%u]",
+ pHddCtx->cfg_ini->enable_hostapd_edca_local);
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
"Name = [gEnableSifsBurst] Value = [%u]",
pHddCtx->cfg_ini->enableSifsBurst);
@@ -5376,6 +5880,10 @@
pHddCtx->cfg_ini->enableSelfRecovery);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gEnableAcTxqOptimize] Value = [%u]",
+ pHddCtx->cfg_ini->enable_ac_txq_optimize);
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
"Name = [gEnableSapSuspend] Value = [%u]",
pHddCtx->cfg_ini->enableSapSuspend);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
@@ -5498,6 +6006,10 @@
"Name = [gEnableDumpCollect] Value = [%u]",
pHddCtx->cfg_ini->is_ramdump_enabled);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [sta_auth_retries_for_code17] Value = [%u] ",
+ pHddCtx->cfg_ini->sta_auth_retries_for_code17);
+
hddLog(LOG2, "Name = [gP2PListenDeferInterval] Value = [%u]",
pHddCtx->cfg_ini->p2p_listen_defer_interval);
@@ -5589,8 +6101,8 @@
pHddCtx->cfg_ini->tgt_gtx_usr_cfg);
hddLog(LOG2, "Name = [%s] Value = [%u]",
- CFG_CH_AVOID_SAP_RESTART_NAME,
- pHddCtx->cfg_ini->sap_restrt_ch_avoid);
+ CFG_SAP_INTERNAL_RESTART_NAME,
+ pHddCtx->cfg_ini->sap_internal_restart);
hddLog(LOG2, "Name = [%s] Value = [%u]",
CFG_SAP_FORCE_11N_FOR_11AC_NAME,
@@ -5602,7 +6114,71 @@
CFG_ACTIVE_MODE_OFFLOAD,
pHddCtx->cfg_ini->active_mode_offload);
+ hddLog(LOG2, "Name = [%s] Value = [%u]",
+ CFG_BPF_PACKET_FILTER_OFFLOAD,
+ pHddCtx->cfg_ini->bpf_packet_filter_enable);
+ hddLog(LOG2, "Name = [%s] Value = [%u] ",
+ CFG_SAP_PROBE_RESP_OFFLOAD_NAME,
+ pHddCtx->cfg_ini->sap_probe_resp_offload);
+
+ hddLog(LOG2, "Name = [%s] Value = [%u]",
+ CFG_SUB_20_CHANNEL_WIDTH_NAME,
+ pHddCtx->cfg_ini->sub_20_channel_width);
+
+ hddLog(LOGE, "Name = [%s] Value = [%u]",
+ CFG_STA_CHANGE_COUNTRYCODE_DYN_NAME ,
+ pHddCtx->cfg_ini->sta_change_cc_via_beacon);
+
+
hdd_ndp_print_ini_config(pHddCtx);
+
+ hddLog(LOG2, "Name = [%s] Value = [%u] ",
+ CFG_TDLS_ENABLE_DEFER_TIMER,
+ pHddCtx->cfg_ini->tdls_enable_defer_time);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_WHITELIST_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_whitelist);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP0_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_0);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP1_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_1);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP2_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_2);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP3_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_3);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP4_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_4);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP5_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_5);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP6_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_6);
+
+ hddLog(LOG2, "Name = [%s] Value = [%x] ",
+ CFG_PRB_REQ_IE_BIT_MAP7_NAME,
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_7);
+
+ hddLog(LOG2, "Name = [%s] Value =[%s]",
+ CFG_PROBE_REQ_OUI_NAME,
+ pHddCtx->cfg_ini->probe_req_ouis);
+
+ hddLog(LOG2, "Name = [%s] Value = [%u]",
+ CFG_ARP_AC_CATEGORY,
+ pHddCtx->cfg_ini->arp_ac_category);
}
#define CFG_VALUE_MAX_LEN 256
@@ -5697,7 +6273,6 @@
#else
printk(KERN_INFO "%s", configStr);
#endif // RETURN_IN_BUFFER
-
}
#ifndef RETURN_IN_BUFFER
@@ -5792,7 +6367,7 @@
{
int status, i = 0;
const struct firmware *fw = NULL;
- char *line, *buffer = NULL;
+ char *line, *buffer = NULL, *temp = NULL;
char *name, *value;
tCfgIniEntry macTable[VOS_MAX_CONCURRENCY_PERSONA];
tSirMacAddr customMacAddr;
@@ -5816,7 +6391,15 @@
goto config_exit;
}
- buffer = (char *)fw->data;
+ temp = buffer = (char *) vos_mem_malloc(fw->size + 1);
+ if (NULL == buffer) {
+ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: unable to allocate memory",__func__);
+ release_firmware(fw);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ vos_mem_copy((void*)buffer,(void *)fw->data, fw->size);
+ buffer[fw->size] = '\0';
/* data format:
* Intf0MacAddress=00AA00BB00CC
@@ -5872,6 +6455,7 @@
config_exit:
release_firmware(fw);
+ vos_mem_free(temp);
return vos_status;
}
@@ -6167,6 +6751,111 @@
}
+#ifdef FEATURE_WLAN_SUB_20_MHZ
+/**
+ * hdd_cfg_get_sub20_dyn_capabilities()
+ * @hdd_ctx_ptr: HDD context
+ *
+ * This function is used to get dynamic capabilities of sub 20MHz channel width
+ * Return: sub 20 channel width
+ */
+uint8_t hdd_cfg_get_sub20_dyn_capabilities(hdd_context_t *hdd_ctx_ptr)
+{
+ hdd_config_t *config_ptr = hdd_ctx_ptr->cfg_ini;
+ uint8_t sub_20_channel_width = config_ptr->sub_20_channel_width;
+
+ switch (sub_20_channel_width) {
+ case CFG_SUB_20_CHANNEL_WIDTH_DYN_5MHZ:
+ return SUB20_MODE_5MHZ;
+ case CFG_SUB_20_CHANNEL_WIDTH_DYN_10MHZ:
+ return SUB20_MODE_10MHZ;
+ case CFG_SUB_20_CHANNEL_WIDTH_DYN_ALL:
+ case CFG_SUB_20_CHANNEL_WIDTH_MANUAL:
+ return SUB20_MODE_5MHZ | SUB20_MODE_10MHZ;
+ default:
+ return SUB20_MODE_NONE;
+ }
+}
+/**
+ * hdd_cfg_get_static_sub20_channel_width()
+ * @hdd_ctx_ptr: HDD context
+ *
+ * This function is used to get static sub 20MHz channel width
+ * Return: sub 20 channel width
+ */
+uint8_t hdd_cfg_get_static_sub20_channel_width(hdd_context_t *hdd_ctx_ptr)
+{
+ hdd_config_t *config_ptr = hdd_ctx_ptr->cfg_ini;
+
+ if (config_ptr->sub_20_channel_width ==
+ CFG_SUB_20_CHANNEL_WIDTH_5MHZ) {
+ return SUB20_MODE_5MHZ;
+ } else if (config_ptr->sub_20_channel_width ==
+ CFG_SUB_20_CHANNEL_WIDTH_10MHZ) {
+ return SUB20_MODE_10MHZ;
+ }
+ return SUB20_MODE_NONE;
+}
+
+/**
+ * hdd_cfg_is_sub20_channel_width_enabled()
+ * @hdd_ctx_ptr: HDD context
+ *
+ * This function is used to check if sub 20MHz enabled
+ * Return: true of false
+ */
+bool hdd_cfg_is_sub20_channel_width_enabled(hdd_context_t *hdd_ctx_ptr)
+{
+ hdd_config_t *config_ptr = hdd_ctx_ptr->cfg_ini;
+
+ return config_ptr->sub_20_channel_width !=
+ CFG_SUB_20_CHANNEL_WIDTH_DISABLE;
+}
+
+/**
+ * hdd_cfg_is_static_sub20_channel_width_enabled()
+ * @hdd_ctx_ptr: HDD context
+ *
+ * This function is used to check if static sub 20MHz enabled
+ * Return: true of false
+ */
+bool hdd_cfg_is_static_sub20_channel_width_enabled(hdd_context_t *hdd_ctx_ptr)
+{
+ hdd_config_t *config_ptr = hdd_ctx_ptr->cfg_ini;
+
+ return (config_ptr->sub_20_channel_width ==
+ CFG_SUB_20_CHANNEL_WIDTH_5MHZ) ||
+ (config_ptr->sub_20_channel_width ==
+ CFG_SUB_20_CHANNEL_WIDTH_10MHZ);
+}
+
+/**
+ * hdd_cfg_get_sub20_channel_config()
+ * @hdd_ctx_ptr: HDD context
+ *
+ * This function is used to get sub20 config
+ * Return: sub20 config value
+ */
+uint8_t hdd_cfg_get_sub20_channel_config(hdd_context_t *hdd_ctx_ptr)
+{
+ hdd_config_t *config_ptr = hdd_ctx_ptr->cfg_ini;
+
+ if (config_ptr->sub_20_channel_width >= CFG_SUB_20_CHANNEL_WIDTH_MIN &&
+ config_ptr->sub_20_channel_width <= CFG_SUB_20_CHANNEL_WIDTH_MAX)
+ return config_ptr->sub_20_channel_width;
+ return 0;
+}
+#endif
+
+#ifdef WLAN_FEATURE_TSF_PLUS
+bool hdd_cfg_is_ptp_opt_enable(hdd_context_t *hdd_ctx_ptr)
+{
+ hdd_config_t *config_ptr = hdd_ctx_ptr->cfg_ini;
+
+ return (config_ptr->tsf_ptp_options != 0);
+}
+#endif
+
static void hdd_set_power_save_config(hdd_context_t *pHddCtx, tSmeConfigParams *smeConfig)
{
hdd_config_t *pConfig = pHddCtx->cfg_ini;
@@ -6282,9 +6971,10 @@
hdd_config_t *pConfig = pHddCtx->cfg_ini;
VOS_STATUS status = VOS_STATUS_SUCCESS;
- hddLog(LOG1, "hdd_set_idle_ps_config: Enter Val %d", val);
+ hddLog(LOG1, "hdd_set_idle_ps_config: Enter Val %d pconfig %pK ",
+ val, pConfig);
- if(pConfig->fIsImpsEnabled)
+ if(pConfig && pConfig->fIsImpsEnabled)
{
status = sme_SetIdlePowersaveConfig(pHddCtx->pvosContext, val);
if(VOS_STATUS_SUCCESS != status)
@@ -6432,7 +7122,7 @@
return VOS_STATUS_E_INVAL;
hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("str %p intArray %p intArrayMaxLen %d"),
+ FL("str %pK intArray %pK intArrayMaxLen %d"),
s, int_array, int_array_max_len);
*len = 0;
@@ -6445,7 +7135,7 @@
if (sscanf(s, "%x", &val) == 1) {
int_array[*len] = (uint16_t) val;
hddLog(VOS_TRACE_LEVEL_DEBUG,
- FL("s %p val %x intArray[%d]=0x%x"),
+ FL("s %pK val %x intArray[%d]=0x%x"),
s, val, *len, int_array[*len]);
*len += 1;
}
@@ -6471,7 +7161,7 @@
/* parse the string */
while (str && ('\0' != *str) && (num < max_entries)) {
field = str;
- while (str && ('\0' != *str) && (separator != *str))
+ while (('\0' != *str) && (separator != *str))
str++;
if ('\0' == *str) {
/* reach the end of string */
@@ -6686,6 +7376,11 @@
#if defined WLAN_FEATURE_VOWIFI
if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_MCAST_BCAST_FILTER_SETTING, pConfig->mcastBcastFilterSetting,
NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+ {
+ fStatus = FALSE;
+ hddLog(LOGE,
+ "Could not pass on WNI_CFG_MCAST_BCAST_FILTER_SETTING to CCM");
+ }
#endif
if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_SINGLE_TID_RC, pConfig->bSingleTidRc,
@@ -6806,29 +7501,6 @@
hddLog(LOGE,"Failure: Could not pass on WNI_CFG_HEART_BEAT_THRESHOLD configuration info to CCM");
}
- if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD, pConfig->apDataAvailPollPeriodInMs,
- NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
- {
- fStatus = FALSE;
- hddLog(LOGE,"Failure: Could not pass on WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD configuration info to CCM");
- }
-
- if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ENABLE_CLOSE_LOOP,
- pConfig->enableCloseLoop, NULL, eANI_BOOLEAN_FALSE)
- ==eHAL_STATUS_FAILURE)
- {
- fStatus = FALSE;
- hddLog(LOGE, "Could not pass on WNI_CFG_ENABLE_CLOSE_LOOP to CCM");
- }
-
- if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TX_PWR_CTRL_ENABLE,
- pConfig->enableAutomaticTxPowerControl, NULL, eANI_BOOLEAN_FALSE)
- ==eHAL_STATUS_FAILURE)
- {
- fStatus = FALSE;
- hddLog(LOGE, "Could not pass on WNI_CFG_TX_PWR_CTRL_ENABLE to CCM");
- }
-
if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_SHORT_GI_40MHZ,
pConfig->ShortGI40MhzEnable, NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
{
@@ -7163,6 +7835,41 @@
hddLog(LOGE, "Could not pass on WNI_CFG_TGT_GTX_USR_CFG to CCM");
}
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_MAX_HT_MCS_TX_DATA,
+ pConfig->max_ht_mcs_txdata, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_MAX_HT_MCS_TX_DATA to CCM");
+ }
+
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_DISABLE_ABG_RATE_FOR_TX_DATA,
+ pConfig->disable_abg_rate_txdata, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_DISABLE_ABG_RATE_FOR_TX_DATA to CCM");
+ }
+
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_RATE_FOR_TX_MGMT,
+ pConfig->rate_for_tx_mgmt, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_RATE_FOR_TX_MGMT to CCM");
+ }
+
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_RATE_FOR_TX_MGMT_2G,
+ pConfig->rate_for_tx_mgmt_2g, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_RATE_FOR_TX_MGMT_2G to CCM");
+ }
+
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_RATE_FOR_TX_MGMT_5G,
+ pConfig->rate_for_tx_mgmt_5g, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE) {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_RATE_FOR_TX_MGMT_5G to CCM");
+ }
+
return fStatus;
}
@@ -7259,12 +7966,10 @@
smeConfig->csrConfig.min_rest_time_conc = pConfig->min_rest_time_conc;
smeConfig->csrConfig.idle_time_conc = pConfig->idle_time_conc;
- smeConfig->csrConfig.nNumStaChanCombinedConc = pConfig->nNumStaChanCombinedConc;
- smeConfig->csrConfig.nNumP2PChanCombinedConc = pConfig->nNumP2PChanCombinedConc;
-
#endif
smeConfig->csrConfig.Is11eSupportEnabled = pConfig->b80211eIsEnabled;
smeConfig->csrConfig.WMMSupportMode = pConfig->WmmMode;
+ smeConfig->csrConfig.gStaLocalEDCAEnable = pConfig->gStaLocalEDCAEnable;
/*
* -channelBondingMode5GHz is getting updated by SAP
* so stacbmode will be used for STA connection.
@@ -7445,6 +8150,14 @@
smeConfig->csrConfig.enableTxLdpc = pConfig->enableTxLdpc;
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
smeConfig->csrConfig.cc_switch_mode = pConfig->WlanMccToSccSwitchMode;
+ smeConfig->csrConfig.band_switch_enable = pConfig->wlan_band_switch_enable;
+ smeConfig->csrConfig.ap_p2pgo_concurrency_enable =
+ pConfig->wlan_ap_p2pgo_conc_enable;
+ smeConfig->csrConfig.ap_p2pclient_concur_enable =
+ pConfig->wlan_ap_p2pclient_conc_enable;
+ smeConfig->csrConfig.ch_width_24g_orig = pConfig->nChannelBondingMode24GHz ?
+ eHT_CHANNEL_WIDTH_40MHZ : eHT_CHANNEL_WIDTH_20MHZ;
+ smeConfig->csrConfig.ch_width_5g_orig = pConfig->vhtChannelWidth;
#endif
smeConfig->csrConfig.max_amsdu_num = pConfig->max_amsdu_num;
@@ -7550,6 +8263,18 @@
smeConfig->csrConfig.sta_roam_policy_params.skip_unsafe_channels = 0;
smeConfig->snr_monitor_enabled = pHddCtx->cfg_ini->fEnableSNRMonitoring;
+ smeConfig->sub20_config_info =
+ hdd_cfg_get_sub20_channel_config(pHddCtx);
+ smeConfig->sub20_channelwidth =
+ hdd_cfg_get_static_sub20_channel_width(pHddCtx);
+ smeConfig->sub20_dynamic_channelwidth =
+ hdd_cfg_get_sub20_dyn_capabilities(pHddCtx);
+
+ smeConfig->csrConfig.sta_auth_retries_for_code17 =
+ pHddCtx->cfg_ini->sta_auth_retries_for_code17;
+
+ smeConfig->sta_change_cc_via_beacon =
+ pHddCtx->cfg_ini->sta_change_cc_via_beacon;
halStatus = sme_UpdateConfig( pHddCtx->hHal, smeConfig);
if ( !HAL_STATUS_SUCCESS( halStatus ) )
@@ -7562,7 +8287,6 @@
return status;
}
-
/**---------------------------------------------------------------------------
\brief hdd_execute_config_command() -
@@ -8064,6 +8788,51 @@
hddLog(LOGE, "Fail to set coex wlan connection parameters");
}
+ if ((config->coex_page_p2p_sta_bt_interval !=0) &&
+ (config->coex_page_p2p_sta_wlan_interval !=0)) {
+ status = sme_set_btc_bt_wlan_interval_page_p2p_sta(
+ config->coex_page_p2p_sta_bt_interval,
+ config->coex_page_p2p_sta_wlan_interval);
+ if (VOS_STATUS_SUCCESS != status)
+ hddLog(LOGE, "Fail to set coex page p2p sta bt interval parameters");
+ }
+
+ if ((config->coex_inquiry_sta_bt_interval !=0) &&
+ (config->coex_inquiry_sta_wlan_interval !=0)) {
+ status = sme_set_btc_bt_wlan_interval_inquiry_sta(
+ config->coex_inquiry_sta_bt_interval,
+ config->coex_inquiry_sta_wlan_interval);
+ if (VOS_STATUS_SUCCESS != status)
+ hddLog(LOGE, "Fail to set coex inquiry sta bt interval parameters");
+ }
+
+ if ((config->coex_inquiry_sap_bt_interval !=0) &&
+ (config->coex_inquiry_sap_wlan_interval !=0)) {
+ status = sme_set_btc_bt_wlan_interval_inquiry_sap(
+ config->coex_inquiry_sap_bt_interval,
+ config->coex_inquiry_sap_wlan_interval);
+ if (VOS_STATUS_SUCCESS != status)
+ hddLog(LOGE, "Fail to set coex inquiry sap bt interval parameters");
+ }
+
+ if ((config->coex_inquiry_p2p_bt_interval !=0) &&
+ (config->coex_inquiry_p2p_wlan_interval !=0)) {
+ status = sme_set_btc_bt_wlan_interval_inquiry_p2p(
+ config->coex_inquiry_p2p_bt_interval,
+ config->coex_inquiry_p2p_wlan_interval);
+ if (VOS_STATUS_SUCCESS != status)
+ hddLog(LOGE, "Fail to set coex inquiry p2p bt interval parameters");
+ }
+
+ if ((config->coex_inquiry_p2p_sta_bt_interval !=0) &&
+ (config->coex_inquiry_p2p_sta_wlan_interval !=0)) {
+ status = sme_set_btc_bt_wlan_interval_inquiry_p2p_sta(
+ config->coex_inquiry_p2p_sta_bt_interval,
+ config->coex_inquiry_p2p_sta_wlan_interval);
+ if (VOS_STATUS_SUCCESS != status)
+ hddLog(LOGE, "Fail to set coex inquiry p2p sta bt interval parameters");
+ }
+
status = sme_set_btc_dynamic_bt_wlan_coex(
config->dynamic_wlan_bt_coex, config->antenna_isolation);
@@ -8075,11 +8844,223 @@
if (VOS_STATUS_SUCCESS != status)
hddLog(LOGE, "Fail to set coex tx power");
-#ifdef WMI_COEX_BTC_DUTYCYCLE
- status = sme_set_btc_coex_dutycycle(config->coex_btc_PauseDuration,config->coex_btc_UnPauseDuration);
+#ifdef FEATURE_COEX_PTA_CONFIG_ENABLE
+ status = sme_configure_pta_coex(config->coex_pta_config_enable,config->coex_pta_config_param);
if (VOS_STATUS_SUCCESS != status)
- hddLog(LOGE, "Fail to set coex PauseDuration");
+ hddLog(LOGE, "Fail to set pta coex");
#endif
}
+
+/**
+ * hdd_validate_prb_req_ie_bitmap - validates user input for ie bit map
+ * @hdd_ctx: the pointer to hdd context
+ *
+ * This function checks whether user have entered valid probe request
+ * ie bitmap and also verifies vendor ouis if vendor specific ie is set
+ *
+ * Return: status of verification
+ * 1 - valid input
+ * 0 - invalid input
+ */
+uint32_t hdd_validate_prb_req_ie_bitmap(hdd_context_t* pHddCtx)
+{
+ if (!(pHddCtx->cfg_ini->probe_req_ie_bitmap_0 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_1 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_2 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_3 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_4 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_5 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_6 ||
+ pHddCtx->cfg_ini->probe_req_ie_bitmap_7))
+ return 0;
+
+ /**
+ * check whether vendor oui IE is set and OUIs are present, each OUI
+ * is eneterd in the form of string of 8 characters from ini, therefore,
+ * for atleast one OUI, minimum length is 8 and hence this string length
+ * is checked for minimum of 8
+ */
+ if ((pHddCtx->cfg_ini->probe_req_ie_bitmap_6 &
+ VENDOR_SPECIFIC_IE_BITMAP) &&
+ (strlen(pHddCtx->cfg_ini->probe_req_ouis) < 8))
+ return 0;
+
+ /* check whether vendor oui IE is not set but OUIs are present */
+ if (!(pHddCtx->cfg_ini->probe_req_ie_bitmap_6 &
+ VENDOR_SPECIFIC_IE_BITMAP) &&
+ (strlen(pHddCtx->cfg_ini->probe_req_ouis) > 0))
+ return 0;
+
+ return 1;
+}
+
+/**
+ * probe_req_voui_convert_to_hex - converts str of 8 chars into two hex values
+ * @temp: string to be converted
+ * @voui: contains the type and subtype values
+ *
+ * This function converts the string length of 8 characters into two
+ * hexa-decimal values, oui_type and oui_subtype, where oui_type is the
+ * hexa decimal value converted from first 6 characters and oui_subtype is
+ * hexa decimal value converted from last 2 characters.
+ * strings which doesn't match with the specified pattern are ignored.
+ *
+ * Return: status of conversion
+ * 1 - if conversion is successful
+ * 0 - if conversion is failed
+ */
+static uint32_t hdd_probe_req_voui_convert_to_hex(uint8_t *temp,
+ struct vendor_oui *voui)
+{
+ uint32_t hex_value[4];
+ uint32_t i = 0;
+ uint32_t indx = 0;
+
+ memset(hex_value, 0x00, sizeof(hex_value));
+ memset(voui, 0x00, sizeof(*voui));
+
+ /* convert string to hex */
+ for (i = 0; i < 8; i++) {
+ if (temp[i] >= '0' && temp[i] <= '9') {
+ hex_value[indx] = (temp[i] - '0') << 4;
+ } else if (temp[i] >= 'A' && temp[i] <= 'F') {
+ hex_value[indx] = (temp[i] - 'A') + 0xA;
+ hex_value[indx] = hex_value[indx] << 4;
+ } else {
+ /* invalid character in oui */
+ return 0;
+ }
+
+ if (temp[i + 1] >= '0' && temp[i + 1] <= '9') {
+ hex_value[indx] |= (temp[i + 1] - '0');
+ i = i + 1;
+ indx = indx + 1;
+ } else if (temp[i + 1] >= 'A' && temp[i + 1] <= 'F') {
+ hex_value[indx] |= ((temp[i + 1] - 'A') + 0xA);
+ i = i + 1;
+ indx = indx + 1;
+ } else {
+ /* invalid character in oui */
+ return 0;
+ }
+ }
+
+ voui->oui_type = (hex_value[0] | (hex_value[1] << 8) |
+ (hex_value[2] << 16));
+ voui->oui_subtype = hex_value[3];
+
+ hddLog(LOG1, FL("OUI_type = %x and OUI_subtype = %x"), voui->oui_type,
+ voui->oui_subtype);
+ return 1;
+}
+
+/**
+ * hdd_parse_probe_req_ouis - form ouis from ini gProbeReqOUIs
+ * @hdd_ctx: the pointer to hdd context
+ *
+ * This function parses the ini string gProbeReqOUIs which needs to in the
+ * following format:
+ * "<8 characters of [0-9] or [A-F]>space<8 characters from [0-9] etc.,"
+ * example: "AABBCCDD 1122EEFF"
+ * and the logic counts the number of OUIS and allocates the memory
+ * for every valid OUI and is stored in hdd_context_t
+ *
+ * Return: status of parsing
+ */
+VOS_STATUS hdd_parse_probe_req_ouis(hdd_context_t* pHddCtx)
+{
+ struct vendor_oui voui[MAX_PROBE_REQ_OUIS];
+ uint8_t *str;
+ uint8_t temp[9];
+ uint32_t start = 0, end = 0;
+ uint32_t oui_indx = 0;
+ uint32_t i = 0;
+
+ pHddCtx->cfg_ini->probe_req_ouis[MAX_PRB_REQ_VENDOR_OUI_INI_LEN - 1] =
+ '\0';
+ if (!strlen(pHddCtx->cfg_ini->probe_req_ouis)) {
+ pHddCtx->no_of_probe_req_ouis = 0;
+ pHddCtx->probe_req_voui = NULL;
+ hddLog(LOG1, FL("NO OUIS to parse"));
+ return VOS_STATUS_SUCCESS;
+ }
+
+ str = (uint8_t *)(pHddCtx->cfg_ini->probe_req_ouis);
+
+ while(str[i] != '\0') {
+ if (str[i] == ' ') {
+ if ((end - start) != 8)
+ {
+ end = start = 0;
+ i++;
+ continue;
+ } else {
+ memcpy(temp, &str[i - 8], 8);
+ i++;
+ temp[8] = '\0';
+ if (hdd_probe_req_voui_convert_to_hex(temp,
+ &voui[oui_indx]) == 0) {
+ end = start = 0;
+ continue;
+ }
+ oui_indx++;
+ if (oui_indx >= MAX_PROBE_REQ_OUIS) {
+ hddLog(LOGE, "Max no.of OUIS supported "
+ "is 16. ignoring the rest");
+ break;
+ }
+ }
+ start = end = 0;
+ } else {
+ i++;
+ end++;
+ }
+ }
+
+ if ((end - start) == 8 && oui_indx < MAX_PROBE_REQ_OUIS) {
+ memcpy(temp, &str[i - 8], 8);
+ temp[8] = '\0';
+ if (hdd_probe_req_voui_convert_to_hex(temp,
+ &voui[oui_indx]) == 1)
+ oui_indx++;
+ }
+
+ if (!oui_indx)
+ return VOS_STATUS_SUCCESS;
+
+ pHddCtx->probe_req_voui = (struct vendor_oui *)vos_mem_malloc(oui_indx *
+ sizeof(struct vendor_oui));
+ if (pHddCtx->probe_req_voui == NULL) {
+ hddLog(LOGE,"Not Enough memory for OUI");
+ pHddCtx->no_of_probe_req_ouis = 0;
+ return VOS_STATUS_E_FAILURE;
+ }
+ vos_mem_zero(pHddCtx->probe_req_voui,
+ oui_indx * sizeof(struct vendor_oui));
+ pHddCtx->no_of_probe_req_ouis = oui_indx;
+ vos_mem_copy(pHddCtx->probe_req_voui, voui,
+ oui_indx * sizeof(struct vendor_oui));
+
+ return VOS_STATUS_SUCCESS;
+}
+
+/**
+ * hdd_free_probe_req_ouis - de-allocates the probe req ouis
+ * @hdd_ctx: the pointer to hdd context
+ *
+ * This function de-alloactes the probe req ouis which are
+ * allocated while parsing of ini string gProbeReqOUIs
+ *
+ * Return: None
+ */
+void hdd_free_probe_req_ouis(hdd_context_t* pHddCtx)
+{
+ if (pHddCtx->probe_req_voui) {
+ vos_mem_free(pHddCtx->probe_req_voui);
+ pHddCtx->probe_req_voui = NULL;
+ }
+
+ pHddCtx->no_of_probe_req_ouis = 0;
+}
diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c
index 6b769d4..ef2ec7c 100644
--- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -106,12 +106,12 @@
#include "wlan_hdd_ocb.h"
#include "qwlan_version.h"
-#include "wlan_hdd_memdump.h"
-
#include "wlan_logging_sock_svc.h"
#include "sapApi.h"
#include "csrApi.h"
+#include "wmi_unified_priv.h"
+
#define g_mode_rates_size (12)
#define a_mode_rates_size (8)
#define FREQ_BASE_80211G (2407)
@@ -131,6 +131,13 @@
#define WLAN_HDD_TGT_NOISE_FLOOR_DBM (-96)
+/*
+ * max_sched_scan_plans defined to 2 for
+ * (1)fast scan
+ * (2)slow scan
+ */
+#define MAX_SCHED_SCAN_PLANS 2
+
/* For IBSS, enable obss, fromllb, overlapOBSS & overlapFromllb protection
check. The bit map is defined in:
@@ -193,8 +200,6 @@
#define WLAN_HDD_MAX_FEATURE_SET 8
#define IS_DFS_MODE_VALID(mode) ((mode >= DFS_MODE_NONE && mode <= DFS_MODE_DEPRIORITIZE))
-#define IS_CHANNEL_VALID(channel) ((channel >= 0 && channel < 15) \
- || (channel >= 36 && channel <= 184))
#ifdef FEATURE_WLAN_EXTSCAN
/*
@@ -231,6 +236,11 @@
/* (30 Mins) */
#define MIN_TIME_REQUIRED_FOR_NEXT_BUG_REPORT (30 * 60 * 1000)
+/*
+ * Count to ratelimit the HDD logs during Scan and connect
+ */
+#define HDD_SCAN_REJECT_RATE_LIMIT 5
+
static const u32 hdd_cipher_suites[] =
{
WLAN_CIPHER_SUITE_WEP40,
@@ -415,6 +425,7 @@
[NL80211_IFTYPE_STATION] = {
.tx = 0xffff,
.rx = BIT(SIR_MAC_MGMT_ACTION) |
+ BIT(SIR_MAC_MGMT_TIME_ADVERT) |
BIT(SIR_MAC_MGMT_PROBE_REQ),
},
[NL80211_IFTYPE_AP] = {
@@ -480,7 +491,11 @@
},
};
-/* AP ( + AP ) combination */
+/*
+ * AP ( + AP) combination or
+ * AP ( + AP + AP + AP) combination if 4-SAP is supported
+ * (WLAN_4SAP_CONCURRENCY)
+ */
static const struct ieee80211_iface_limit
wlan_hdd_ap_iface_limit[] = {
{
@@ -554,6 +569,14 @@
}
};
+static const struct ieee80211_iface_limit
+ wlan_hdd_mon_iface_limit[] = {
+ {
+ .max = 3, /* Monitor interface */
+ .types = BIT(NL80211_IFTYPE_MONITOR),
+ },
+};
+
static struct ieee80211_iface_combination
wlan_hdd_iface_combination[] = {
/* STA */
@@ -577,6 +600,9 @@
.max_interfaces = (SAP_MAX_OBSS_STA_CNT +
VOS_MAX_NO_OF_SAP_MODE),
.n_limits = ARRAY_SIZE(wlan_hdd_ap_iface_limit),
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) || defined(BEACON_INTV_BACKPORTS)
+ .beacon_int_min_gcd = 1,
+#endif
},
/* P2P */
{
@@ -593,6 +619,9 @@
VOS_MAX_NO_OF_SAP_MODE),
.n_limits = ARRAY_SIZE(wlan_hdd_sta_ap_iface_limit),
.beacon_int_infra_match = true,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) || defined(BEACON_INTV_BACKPORTS)
+ .beacon_int_min_gcd = 1,
+#endif
},
/* STA + P2P */
{
@@ -615,6 +644,13 @@
.n_limits = ARRAY_SIZE(wlan_hdd_sta_ap_p2pgo_iface_limit),
.beacon_int_infra_match = true,
},
+ /* Monitor */
+ {
+ .limits = wlan_hdd_mon_iface_limit,
+ .max_interfaces = 3,
+ .num_different_channels = 2,
+ .n_limits = ARRAY_SIZE(wlan_hdd_mon_iface_limit),
+ },
};
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) ||
defined(WITH_BACKPORTS) */
@@ -763,6 +799,30 @@
extern struct net_device_ops net_ops_struct;
+/**
+ * struct cfg_hostapd_edca - Store hostapd EDCA params
+ * and fill them in gLimEdcaParams
+ * structure
+ * @acm: EDCA param
+ * @aifs: EDCA param
+ * @cwmin: EDCA param
+ * @cwmax: EDCA param
+ * @txop: EDCA param
+ * @paramb: EDCA param for 11b
+ * @paramg: EDCA param for 11g
+ * @enable: enable hostapd EDCA params
+ */
+struct cfg_hostapd_edca {
+ uint8_t acm;
+ uint8_t aifs;
+ uint16_t cwmin;
+ uint16_t cwmax;
+ uint8_t txop;
+ uint8_t paramsb[5];
+ uint8_t paramsg[5];
+ uint8_t enable;
+};
+
#ifdef WLAN_NL80211_TESTMODE
enum wlan_hdd_tm_attr
{
@@ -784,6 +844,11 @@
#define WLAN_HDD_TM_DATA_MAX_LEN 5000
+enum wlan_hdd_vendor_ie_access_policy {
+ WLAN_HDD_VENDOR_IE_ACCESS_NONE = 0,
+ WLAN_HDD_VENDOR_IE_ACCESS_ALLOW_IF_LISTED,
+};
+
static const struct nla_policy wlan_hdd_tm_policy[WLAN_HDD_TM_ATTR_MAX + 1] =
{
[WLAN_HDD_TM_ATTR_CMD] = { .type = NLA_U32 },
@@ -799,6 +864,7 @@
{
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_WIFI_BAND] = { .type = NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_MAX_CHANNELS] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_CHANNEL_SPEC_CHANNEL] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_CHANNEL_SPEC_DWELL_TIME] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_CHANNEL_SPEC_PASSIVE] = { .type = NLA_U8 },
@@ -817,7 +883,9 @@
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_FLUSH] = { .type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_MAX] = { .type = NLA_U32 },
- [QCA_WLAN_VENDOR_ATTR_EXTSCAN_AP_THRESHOLD_PARAM_BSSID] = { .type = NLA_UNSPEC },
+ [QCA_WLAN_VENDOR_ATTR_EXTSCAN_AP_THRESHOLD_PARAM_BSSID] = {
+ .type = NLA_UNSPEC,
+ .len = HDD_MAC_ADDR_LEN},
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_AP_THRESHOLD_PARAM_RSSI_LOW] = { .type = NLA_S32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH] = { .type = NLA_S32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_AP_THRESHOLD_PARAM_CHANNEL] = { .type = NLA_U32 },
@@ -826,11 +894,9 @@
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SIGNIFICANT_CHANGE_PARAMS_LOST_AP_SAMPLE_SIZE] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SIGNIFICANT_CHANGE_PARAMS_MIN_BREACHING] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SIGNIFICANT_CHANGE_PARAMS_NUM_AP] = { .type = NLA_U32 },
- [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS] = { .type = NLA_U32 },
- [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_SSID] = { .type = NLA_BINARY,
- .len = IEEE80211_MAX_SSID_LEN },
- [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_FLAGS] = { .type = NLA_U8 },
- [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_AUTH_BIT] = { .type = NLA_U8 },
+ [QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_MAX_PERIOD] = { .type = NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE] = { .type = NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_STEP_COUNT] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_SSID] = { .type = NLA_BINARY,
.len = IEEE80211_MAX_SSID_LEN + 1 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_HOTLIST_PARAMS_LOST_SSID_SAMPLE_SIZE] = { .type = NLA_U32 },
@@ -839,6 +905,54 @@
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_RSSI_LOW] = { .type = NLA_S32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_RSSI_HIGH] = { .type = NLA_S32 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_CONFIGURATION_FLAGS] = { .type = NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_EXTSCAN_BSSID_HOTLIST_PARAMS_LOST_AP_SAMPLE_SIZE] = { .type = NLA_U32 },
+};
+
+static const struct nla_policy
+wlan_hdd_pno_config_policy[QCA_WLAN_VENDOR_ATTR_PNO_MAX + 1] = {
+ [QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_LIST_PARAM_NUM] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_PNO_PASSPOINT_NETWORK_PARAM_ID] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_SSID] = {
+ .type = NLA_BINARY,
+ .len = IEEE80211_MAX_SSID_LEN + 1
+ },
+ [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_FLAGS] = {
+ .type = NLA_U8
+ },
+ [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_AUTH_BIT] = {
+ .type = NLA_U8
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_SAME_NETWORK_BONUS] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS] = {
+ .type = NLA_U32
+ },
+ [QCA_WLAN_VENDOR_ATTR_PNO_CONFIG_REQUEST_ID] = {
+ .type = NLA_U32
+ },
};
static const struct nla_policy
@@ -1189,14 +1303,6 @@
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE
},
- [QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX] = {
- .vendor_id = QCA_NL80211_VENDOR_ID,
- .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND
- },
- [QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX] = {
- .vendor_id = QCA_NL80211_VENDOR_ID,
- .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST
- },
#endif /* FEATURE_WLAN_EXTSCAN */
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -1224,6 +1330,10 @@
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_PEERS_RESULTS
},
+ [QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT
+ },
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
/* EXT TDLS */
[QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX] = {
@@ -1269,30 +1379,27 @@
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND
},
- [QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX] = {
- .vendor_id = QCA_NL80211_VENDOR_ID,
- .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST
- },
- [QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX] = {
- .vendor_id = QCA_NL80211_VENDOR_ID,
- .subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST
- },
[QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST_INDEX] = {
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST
},
#endif /* FEATURE_WLAN_EXTSCAN */
+#ifdef FEATURE_WLAN_THERMAL_SHUTDOWN
+ [QCA_NL80211_VENDOR_SUBCMD_TEMPERATURE_EVENT_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_TEMPERATURE_EVENT
+ },
+ [QCA_NL80211_VENDOR_SUBCMD_RESUME_COMP_EVENT_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_RESUME_COMP_EVENT
+ },
+#endif /* FEATURE_WLAN_THERMAL_SHUTDOWN */
+
/* OCB events */
[QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX] = {
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT
},
-#ifdef WLAN_FEATURE_MEMDUMP
- [QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX] = {
- .vendor_id = QCA_NL80211_VENDOR_ID,
- .subcmd = QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP
- },
-#endif /* WLAN_FEATURE_MEMDUMP */
[QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX] = {
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI
@@ -1303,6 +1410,10 @@
.subcmd = QCA_NL80211_VENDOR_SUBCMD_NDP
},
#endif /* WLAN_FEATURE_NAN_DATAPATH */
+ [QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX] = {
+ .vendor_id = QCA_NL80211_VENDOR_ID,
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_CHIP_PWRSAVE_FAILURE
+ }
};
/**
@@ -1419,19 +1530,19 @@
return -EINVAL;
if (wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION)) {
- hddLog(LOG1, FL("Infra Station mode is supported by driver"));
+ hddLog(LOG1, "Infra Station mode is supported by driver");
fset |= WIFI_FEATURE_INFRA;
}
if (TRUE == hdd_is_5g_supported(pHddCtx)) {
- hddLog(LOG1, FL("INFRA_5G is supported by firmware"));
+ hddLog(LOG1, "INFRA_5G is supported by firmware");
fset |= WIFI_FEATURE_INFRA_5G;
}
#ifdef WLAN_FEATURE_P2P
if ((wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_CLIENT)) &&
(wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_GO))) {
- hddLog(LOG1, FL("WiFi-Direct is supported by driver"));
+ hddLog(LOG1, "WiFi-Direct is supported by driver");
fset |= WIFI_FEATURE_P2P;
}
#endif
@@ -1445,20 +1556,20 @@
#ifdef FEATURE_WLAN_EXTSCAN
if (pHddCtx->cfg_ini->extscan_enabled &&
sme_IsFeatureSupportedByFW(EXTENDED_SCAN)) {
- hddLog(LOG1, FL("EXTScan is supported by firmware"));
+ hddLog(LOG1, "EXTScan is supported by firmware");
fset |= WIFI_FEATURE_EXTSCAN | WIFI_FEATURE_HAL_EPNO;
}
#endif
#ifdef WLAN_FEATURE_NAN
if (sme_IsFeatureSupportedByFW(NAN)) {
- hddLog(LOG1, FL("NAN is supported by firmware"));
+ hddLog(LOG1, "NAN is supported by firmware");
fset |= WIFI_FEATURE_NAN;
}
#endif
if (sme_IsFeatureSupportedByFW(RTT)) {
- hddLog(LOG1, FL("RTT is supported by firmware"));
+ hddLog(LOG1, "RTT is supported by firmware");
fset |= WIFI_FEATURE_D2D_RTT;
fset |= WIFI_FEATURE_D2AP_RTT;
}
@@ -1466,7 +1577,7 @@
#ifdef FEATURE_WLAN_SCAN_PNO
if (pHddCtx->cfg_ini->configPNOScanSupport &&
sme_IsFeatureSupportedByFW(PNO)) {
- hddLog(LOG1, FL("PNO is supported by firmware"));
+ hddLog(LOG1, "PNO is supported by firmware");
fset |= WIFI_FEATURE_PNO;
}
#endif
@@ -1477,14 +1588,14 @@
#ifdef FEATURE_WLAN_TDLS
if ((TRUE == pHddCtx->cfg_ini->fEnableTDLSSupport) &&
sme_IsFeatureSupportedByFW(TDLS)) {
- hddLog(LOG1, FL("TDLS is supported by firmware"));
+ hddLog(LOG1, "TDLS is supported by firmware");
fset |= WIFI_FEATURE_TDLS;
}
if (sme_IsFeatureSupportedByFW(TDLS) &&
(TRUE == pHddCtx->cfg_ini->fEnableTDLSOffChannel) &&
sme_IsFeatureSupportedByFW(TDLS_OFF_CHANNEL)) {
- hddLog(LOG1, FL("TDLS off-channel is supported by firmware"));
+ hddLog(LOG1, "TDLS off-channel is supported by firmware");
fset |= WIFI_FEATURE_TDLS_OFFCHANNEL;
}
#endif
@@ -1499,6 +1610,15 @@
if (hdd_link_layer_stats_supported())
fset |= WIFI_FEATURE_LINK_LAYER_STATS;
+ if (hdd_roaming_supported(pHddCtx))
+ fset |= WIFI_FEATURE_CONTROL_ROAMING;
+
+ if (pHddCtx->cfg_ini->probe_req_ie_whitelist)
+ fset |= WIFI_FEATURE_IE_WHITELIST;
+
+ if (hdd_scan_random_mac_addr_supported())
+ fset |= WIFI_FEATURE_SCAN_RAND;
+
skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(fset) +
NLMSG_HDRLEN);
@@ -1546,6 +1666,49 @@
}
/**
+ * wlan_hdd_fill_whitelist_ie_attrs - fill the white list members
+ * @ie_whitelist: enables whitelist
+ * @probe_req_ie_bitmap: bitmap to be filled
+ * @num_vendor_oui: pointer to no of ouis
+ * @voui: pointer to ouis to be filled
+ * @pHddCtx: pointer to hdd ctx
+ *
+ * This function fills the ie bitmap and vendor oui fields with the
+ * corresponding values present in cfg_ini and PHddCtx
+ *
+ * Return: Return none
+ */
+static void wlan_hdd_fill_whitelist_ie_attrs(bool *ie_whitelist,
+ uint32_t *probe_req_ie_bitmap,
+ uint32_t *num_vendor_oui,
+ struct vendor_oui *voui,
+ hdd_context_t *pHddCtx)
+{
+ uint32_t i = 0;
+
+ *ie_whitelist = true;
+ probe_req_ie_bitmap[0] = pHddCtx->cfg_ini->probe_req_ie_bitmap_0;
+ probe_req_ie_bitmap[1] = pHddCtx->cfg_ini->probe_req_ie_bitmap_1;
+ probe_req_ie_bitmap[2] = pHddCtx->cfg_ini->probe_req_ie_bitmap_2;
+ probe_req_ie_bitmap[3] = pHddCtx->cfg_ini->probe_req_ie_bitmap_3;
+ probe_req_ie_bitmap[4] = pHddCtx->cfg_ini->probe_req_ie_bitmap_4;
+ probe_req_ie_bitmap[5] = pHddCtx->cfg_ini->probe_req_ie_bitmap_5;
+ probe_req_ie_bitmap[6] = pHddCtx->cfg_ini->probe_req_ie_bitmap_6;
+ probe_req_ie_bitmap[7] = pHddCtx->cfg_ini->probe_req_ie_bitmap_7;
+
+ *num_vendor_oui = 0;
+
+ if ((pHddCtx->no_of_probe_req_ouis != 0) && (voui != NULL)) {
+ *num_vendor_oui = pHddCtx->no_of_probe_req_ouis;
+ for (i = 0; i < pHddCtx->no_of_probe_req_ouis; i++) {
+ voui[i].oui_type = pHddCtx->probe_req_voui[i].oui_type;
+ voui[i].oui_subtype =
+ pHddCtx->probe_req_voui[i].oui_subtype;
+ }
+ }
+}
+
+/**
* __wlan_hdd_cfg80211_set_scanning_mac_oui() - set scan MAC
* @wiphy: pointer to wireless wiphy structure.
* @wdev: pointer to wireless_dev structure.
@@ -1567,6 +1730,8 @@
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX + 1];
eHalStatus status;
int ret;
+ struct net_device *ndev = wdev->netdev;
+ hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(ndev);
ENTER();
@@ -1591,11 +1756,16 @@
return -EINVAL;
}
- pReqMsg = vos_mem_malloc(sizeof(*pReqMsg));
+ pReqMsg = vos_mem_malloc(sizeof(*pReqMsg) +
+ (pHddCtx->no_of_probe_req_ouis) *
+ (sizeof(struct vendor_oui)));
if (!pReqMsg) {
hddLog(LOGE, FL("vos_mem_malloc failed"));
return -ENOMEM;
}
+ vos_mem_zero(pReqMsg, sizeof(*pReqMsg) +
+ (pHddCtx->no_of_probe_req_ouis) *
+ (sizeof(struct vendor_oui)));
/* Parse and fetch oui */
if (!tb[QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI]) {
@@ -1607,8 +1777,20 @@
tb[QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI],
sizeof(pReqMsg->oui));
- hddLog(LOG1, FL("Oui (%02x:%02x:%02x)"), pReqMsg->oui[0], pReqMsg->oui[1],
- pReqMsg->oui[2]);
+ /* populate pReqMsg for mac addr randomization */
+ pReqMsg->vdev_id = pAdapter->sessionId;
+ pReqMsg->enb_probe_req_sno_randomization = 1;
+
+ hddLog(LOG1, FL("Oui (%02x:%02x:%02x), vdev_id = %d"), pReqMsg->oui[0],
+ pReqMsg->oui[1], pReqMsg->oui[2], pReqMsg->vdev_id);
+
+ if (pHddCtx->cfg_ini->probe_req_ie_whitelist)
+ wlan_hdd_fill_whitelist_ie_attrs(&pReqMsg->ie_whitelist,
+ pReqMsg->probe_req_ie_bitmap,
+ &pReqMsg->num_vendor_oui,
+ (struct vendor_oui *)((uint8_t *)pReqMsg +
+ sizeof(*pReqMsg)),
+ pHddCtx);
status = sme_SetScanningMacOui(pHddCtx->hHal, pReqMsg);
if (!HAL_STATUS_SUCCESS(status)) {
@@ -1