diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-06-07 15:02:06 -0600 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2016-06-07 15:02:06 -0600 |
| commit | ca3abbc1896a35df69db22bd80874596067f5206 (patch) | |
| tree | cbeb049f1f91ae6d1975d4da66d7e942787237f4 | |
| parent | b9f17d272a5f4726765603053fe2ef7453e7abf3 (diff) | |
| parent | 978f6205793ca29f1c1e92472bba50dc38017220 (diff) | |
Promotion of wlan-cld2.driver.lnx.1.0-00030.
CRs Change ID Subject
--------------------------------------------------------------------------------------------------------------
865207 Ib7f2e5ed41c8ea889192814aed10e94e7ecf11e3 qcacld-2.0: CL 1517922 – update fw common interface file
1022448 Id35282eb2768f531459b618e2d134f1236f619dc qcacld-2.0: Reduce SKB CB size to defined limit
688141 I5532b2b134a6a7eec021d5efdad26ced7a21df08 Release 4.0.11.95
688141 I7f4d93b6662d026fca0a36fa0e4332e08a02b2ad Release 4.0.11.94
1020141 I5c34b604297d83673ea065243cc58c3f2180ff3e qcacld-2.0: Add ini keys for WRR tx scheduler tuning
1008087 Ibbf57cf4b3de0ce45e9caeb408c12aa9241d404a qcacld-2.0: Enhance DPTRACE to support RX path
1023179 I92b197f9578aa003bf622617c363fea7334dbcb2 qcacld-2.0: Refactor support to get per chain rssi stats
1022238 I5c5903bc5eded417ede670025c241daf73b96700 qcacld-2.0: Fix P2P GO vdev start failure
1017213 I9d2c9b2d4916552d37aba05b4beb0ac6d3fc2d75 qcacld-2.0: Resolve mem_alloc failure for FW dump
1023527 Idfa13fa0cfa45e028b6d843b1c782384310dda4f Revert "qcacld-2.0: Implement get_wireless_stats IOCTL"
1022956 Ie5b63b6885fd7f2d4f941b6ffad43cbac57040e5 qcacld-2.0: Fix 32 clients support issue in AP+AP mode
1023548 Ib844dd88f3a8b4496f9878b8a1fcddd72acc6a57 Revert "qcacld-2.0: Fix sme active list timeout casued b
1020665 I2e0ae4d5cae8ad991f060d1276dcae6a4a46bdce qcacld-2.0: Fix compilation errors when enable OL_TX_SCH
1023036 I9ddacd8be0f88c6024787c9417e734ef2d5b6cb1 qcacld-2.0: Send proper reason code and originator of di
1023849 Ibf9fdf0a92cc71644f02d6890574eeed0d175d6f qcacld-2.0: extscan: Logs cleanup
1023043 Idd63385a657d1af550cf07bbfe052ce465d30608 qcacld-2.0: Enhance logging for MC address list
1023094 If6d98a5646d259143614726cf8e7b71b46fedef1 qcacld-2.0: update Kbuild for skb pre-alloc support for
1023524 I7c6faa8594a5168d78c1fbba7b8f968411093e0f qcacld-2.0: Avoid pkt trace deinit in FTM and EEPING mod
865207 I0f591f9a620587ef77be09e3714c7156d4189172 qcacld-2.0: CL 1519524 – update fw common interface file
990645 I33369320de5b0aadae661d7d27fbc5ba18e9e409 qcacld-2.0: Fix crash in wlan_hdd_tdls_check_power_save_
1024097 I6a26dbb0707b7981ea091526d1e49dc5bf8c9e91 qcacld-2.0: Restore 802.11 header pointer for PMF case
865207 I427fef8d8f2503c52d511fdae58fe410420e67a0 qcacld-2.0: CL 1522096 – update fw common interface file
865207 I68367a8d688cdc9f85efe01a7c48856c8bab7220 qcacld-2.0: CL 1521398 – update fw common interface file
688141 If8fd526acc5d692c990881d0dd11900b827dae70 Release 4.0.11.93
1021800 I2ea3c2068ffe01c5ff57dd93e9ea9442a5761a59 Revert "wlan: UI still show interface when unplug Card i
1001142 I5ba0268e978c7ddadabc96a4eba18140ff7db3c6 qcacld 2.0: Prevent buffer overflow in QCSAP_IOCTL_VERSI
Change-Id: I86f72ec3a8eae1cb3659f95c2ab65c7c089d4522
CRs-Fixed: 1017213, 1020141, 1023036, 990645, 865207, 1023179, 1020665, 1023094, 1001142, 688141, 1023527, 1023524, 1023849, 1022448, 1022238, 1023548, 1008087, 1023043, 1024097, 1022956, 1021800
46 files changed, 1152 insertions, 412 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_rx.c b/CORE/CLD_TXRX/HTT/htt_rx.c index 3fe3ad69ad5a..ba34bce3caca 100644 --- a/CORE/CLD_TXRX/HTT/htt_rx.c +++ b/CORE/CLD_TXRX/HTT/htt_rx.c @@ -50,6 +50,7 @@ #include <ol_htt_rx_api.h> #include <htt_internal.h> /* HTT_ASSERT, htt_pdev_t, HTT_RX_BUF_SIZE */ #include "regtable.h" +#include "adf_trace.h" #include <ieee80211_common.h> /* ieee80211_frame, ieee80211_qoscntl */ #include <ieee80211_defines.h> /* ieee80211_rx_status */ @@ -1858,6 +1859,8 @@ htt_rx_amsdu_rx_in_order_pop_ll( /* Get the total number of MSDUs */ msdu_count = HTT_RX_IN_ORD_PADDR_IND_MSDU_CNT_GET(*(msg_word + 1)); HTT_RX_CHECK_MSDU_COUNT(msdu_count); + peer_id = HTT_RX_IN_ORD_PADDR_IND_PEER_ID_GET( + *(u_int32_t *)rx_ind_data); msg_word = (u_int32_t *)(rx_ind_data + HTT_RX_IN_ORD_PADDR_IND_HDR_BYTES); if (offload_ind) { @@ -1899,6 +1902,14 @@ htt_rx_amsdu_rx_in_order_pop_ll( */ 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; + ol_rx_log_packet(pdev, peer_id, msdu); + DPTRACE(adf_dp_trace(msdu, + ADF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD, + adf_nbuf_data_addr(msdu), + sizeof(adf_nbuf_data(msdu)), ADF_RX)); + adf_nbuf_trim_tail( msdu, HTT_RX_BUF_SIZE - (RX_STD_DESC_SIZE + HTT_RX_IN_ORD_PADDR_IND_MSDU_LEN_GET(*(msg_word + 1)))); @@ -1916,8 +1927,7 @@ htt_rx_amsdu_rx_in_order_pop_ll( msdu_count--; /* calling callback function for packet logging */ - peer_id = HTT_RX_IN_ORD_PADDR_IND_PEER_ID_GET( - *(u_int32_t *)rx_ind_data); + if (adf_os_unlikely((*((u_int8_t *) &rx_desc->fw_desc.u.val)) & FW_RX_DESC_MIC_ERR_M)) status = RX_PKT_FATE_FW_DROP_INVALID; diff --git a/CORE/CLD_TXRX/HTT/htt_tx.c b/CORE/CLD_TXRX/HTT/htt_tx.c index 3a2fa5e0b3d0..392424f05948 100644 --- a/CORE/CLD_TXRX/HTT/htt_tx.c +++ b/CORE/CLD_TXRX/HTT/htt_tx.c @@ -475,7 +475,7 @@ htt_tx_send_std( NBUF_UPDATE_TX_PKT_COUNT(msdu, NBUF_TX_PKT_HTT); DPTRACE(adf_dp_trace(msdu, ADF_DP_TRACE_HTT_PACKET_PTR_RECORD, adf_nbuf_data_addr(msdu), - sizeof(adf_nbuf_data(msdu)))); + sizeof(adf_nbuf_data(msdu)), ADF_TX)); if (adf_nbuf_queue_len(&pdev->txnbufq) > 0) { HTT_TX_NBUF_QUEUE_ADD(pdev, msdu); diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index 80ab2d5260a1..9bc1e5bb3bdb 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -796,6 +796,10 @@ static int tlshim_mgmt_rx_process(void *context, u_int8_t *data, adf_nbuf_pull_head(wbuf, IEEE80211_CCMP_HEADERLEN); adf_nbuf_trim_tail(wbuf, IEEE80211_CCMP_MICLEN); + /* wh is moved, restore wh with relocated + * ieee80211_frame header. + */ + wh = (struct ieee80211_frame *) adf_nbuf_data(wbuf); rx_pkt->pkt_meta.mpdu_hdr_ptr = adf_nbuf_data(wbuf); rx_pkt->pkt_meta.mpdu_len = adf_nbuf_len(wbuf); rx_pkt->pkt_meta.mpdu_data_len = diff --git a/CORE/CLD_TXRX/TXRX/ol_cfg.c b/CORE/CLD_TXRX/TXRX/ol_cfg.c index 1f9a054d2b46..84466ce74547 100644 --- a/CORE/CLD_TXRX/TXRX/ol_cfg.c +++ b/CORE/CLD_TXRX/TXRX/ol_cfg.c @@ -64,6 +64,7 @@ ol_pdev_handle ol_pdev_cfg_attach(adf_os_device_t osdev, struct txrx_pdev_cfg_param_t cfg_param) { struct txrx_pdev_cfg_t *cfg_ctx; + int i; cfg_ctx = adf_os_mem_alloc(osdev, sizeof(*cfg_ctx)); if (!cfg_ctx) { @@ -115,6 +116,20 @@ ol_pdev_handle ol_pdev_cfg_attach(adf_os_device_t osdev, #endif /* IPA_UC_OFFLOAD */ ol_cfg_update_bundle_params(cfg_ctx, cfg_param); + + for (i = 0; i < OL_TX_NUM_WMM_AC; i++) { + cfg_ctx->ac_specs[i].wrr_skip_weight = + cfg_param.ac_specs[i].wrr_skip_weight; + cfg_ctx->ac_specs[i].credit_threshold = + cfg_param.ac_specs[i].credit_threshold; + cfg_ctx->ac_specs[i].send_limit = + cfg_param.ac_specs[i].send_limit; + cfg_ctx->ac_specs[i].credit_reserve = + cfg_param.ac_specs[i].credit_reserve; + cfg_ctx->ac_specs[i].discard_weight = + cfg_param.ac_specs[i].discard_weight; + } + return (ol_pdev_handle) cfg_ctx; } @@ -319,3 +334,90 @@ unsigned int ol_cfg_ipa_uc_tx_partition_base(ol_pdev_handle pdev) } #endif /* IPA_UC_OFFLOAD */ +/** + * ol_cfg_get_wrr_skip_weight() - brief Query for the param of wrr_skip_weight + * @pdev: handle to the physical device. + * @ac: access control, it will be BE, BK, VI, VO + * + * Return: wrr_skip_weight for specified ac. + */ +int ol_cfg_get_wrr_skip_weight(ol_pdev_handle pdev, int ac) +{ + struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev; + + if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO) + return cfg->ac_specs[ac].wrr_skip_weight; + else + return 0; +} + +/** + * ol_cfg_get_credit_threshold() - Query for the param of credit_threshold + * @pdev: handle to the physical device. + * @ac: access control, it will be BE, BK, VI, VO + * + * Return: credit_threshold for specified ac. + */ +uint32_t ol_cfg_get_credit_threshold(ol_pdev_handle pdev, int ac) +{ + struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev; + + if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO) + return cfg->ac_specs[ac].credit_threshold; + else + return 0; +} + + +/** + * ol_cfg_get_send_limit() - Query for the param of send_limit + * @pdev: handle to the physical device. + * @ac: access control, it will be BE, BK, VI, VO + * + * Return: send_limit for specified ac. + */ +uint16_t ol_cfg_get_send_limit(ol_pdev_handle pdev, int ac) +{ + struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev; + + if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO) + return cfg->ac_specs[ac].send_limit; + else + return 0; +} + + +/** + * ol_cfg_get_credit_reserve() - Query for the param of credit_reserve + * @pdev: handle to the physical device. + * @ac: access control, it will be BE, BK, VI, VO + * + * Return: credit_reserve for specified ac. + */ +int ol_cfg_get_credit_reserve(ol_pdev_handle pdev, int ac) +{ + struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev; + + if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO) + return cfg->ac_specs[ac].credit_reserve; + else + return 0; +} + +/** + * ol_cfg_get_discard_weight() - Query for the param of discard_weight + * @pdev: handle to the physical device. + * @ac: access control, it will be BE, BK, VI, VO + * + * Return: discard_weight for specified ac. + */ +int ol_cfg_get_discard_weight(ol_pdev_handle pdev, int ac) +{ + struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)pdev; + + if (ac >= OL_TX_WMM_AC_BE && ac <= OL_TX_WMM_AC_VO) + return cfg->ac_specs[ac].discard_weight; + else + return 0; +} + diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.c b/CORE/CLD_TXRX/TXRX/ol_rx.c index 769e72b522b0..0c452fd55805 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx.c @@ -60,6 +60,7 @@ #include <ol_vowext_dbg_defs.h> #include <wma.h> #include "pktlog_ac_fmt.h" +#include "adf_trace.h" #ifdef HTT_RX_RESTORE #include "vos_cnss.h" @@ -1317,6 +1318,11 @@ ol_rx_in_order_deliver( while (msdu) { adf_nbuf_t next = adf_nbuf_next(msdu); + DPTRACE(adf_dp_trace(msdu, + ADF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD, + adf_nbuf_data_addr(msdu), + sizeof(adf_nbuf_data(msdu)), ADF_RX)); + OL_RX_PEER_STATS_UPDATE(peer, msdu); OL_RX_ERR_STATISTICS_1(vdev->pdev, vdev, peer, rx_desc, OL_RX_ERR_NONE); TXRX_STATS_MSDU_INCR(vdev->pdev, rx.delivered, msdu); @@ -1333,6 +1339,24 @@ ol_rx_in_order_deliver( OL_RX_OSIF_DELIVER(vdev, peer, msdu_list); } +/** + * ol_rx_log_packet() - log rx packet + * @htt_pdev: htt pdev + * @peer_id: peer_id + * @msdu: skb + * + * Return: none + */ +void ol_rx_log_packet(htt_pdev_handle htt_pdev, + uint8_t peer_id, adf_nbuf_t msdu) +{ + struct ol_txrx_peer_t *peer; + + peer = ol_txrx_peer_find_by_id(htt_pdev->txrx_pdev, peer_id); + if (peer) + adf_dp_trace_log_pkt(peer->vdev->vdev_id, msdu, ADF_RX); +} + void ol_rx_offload_paddr_deliver_ind_handler( htt_pdev_handle htt_pdev, @@ -1353,6 +1377,13 @@ ol_rx_offload_paddr_deliver_ind_handler( 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); + adf_dp_trace_log_pkt(peer->vdev->vdev_id, + head_buf, ADF_RX); + DPTRACE(adf_dp_trace(head_buf, + ADF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD, + adf_nbuf_data_addr(head_buf), + sizeof(adf_nbuf_data(head_buf)), ADF_RX)); vdev = peer->vdev; OL_RX_OSIF_DELIVER(vdev, peer, head_buf); } else { diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.h b/CORE/CLD_TXRX/TXRX/ol_rx.h index b1890025ed30..19676a626306 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx.h +++ b/CORE/CLD_TXRX/TXRX/ol_rx.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. * @@ -63,6 +63,9 @@ ol_rx_in_order_deliver( unsigned tid, adf_nbuf_t head_msdu); +void ol_rx_log_packet(htt_pdev_handle htt_pdev, + uint8_t peer_id, adf_nbuf_t msdu); + void ol_rx_offload_paddr_deliver_ind_handler( htt_pdev_handle htt_pdev, diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.c b/CORE/CLD_TXRX/TXRX/ol_tx.c index f55ddfe9efd1..a2bd003e2502 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx.c @@ -111,7 +111,7 @@ ol_tx_ll(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list) * tx_send call. */ next = adf_nbuf_next(msdu); - ol_tx_send(vdev->pdev, tx_desc, msdu); + ol_tx_send(vdev->pdev, tx_desc, msdu, vdev->vdev_id); msdu = next; } return NULL; /* all MSDUs were accepted */ @@ -242,7 +242,7 @@ ol_tx_vdev_pause_queue_append( DPTRACE(adf_dp_trace(msdu_list, ADF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD, adf_nbuf_data_addr(msdu_list), - sizeof(adf_nbuf_data(msdu_list)))); + sizeof(adf_nbuf_data(msdu_list)), ADF_TX)); vdev->ll_pause.txq.depth++; if (!vdev->ll_pause.txq.head) { @@ -514,7 +514,7 @@ ol_tx_non_std_ll( * downloaded to the target via the HTT tx descriptor. */ htt_tx_desc_display(tx_desc->htt_tx_desc); - ol_tx_send(vdev->pdev, tx_desc, msdu); + ol_tx_send(vdev->pdev, tx_desc, msdu, vdev->vdev_id); msdu = next; } return NULL; /* all MSDUs were accepted */ @@ -1275,7 +1275,7 @@ adf_nbuf_t ol_tx_reinject( htt_tx_desc_set_peer_id(tx_desc->htt_tx_desc, peer_id); - ol_tx_send(vdev->pdev, tx_desc, msdu); + ol_tx_send(vdev->pdev, tx_desc, msdu, vdev->vdev_id); return NULL; } diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c index 58779e43a72d..567729d4fe25 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c @@ -195,12 +195,13 @@ ol_tx_sched_select_batch_rr( struct ol_tx_sched_rr_t *scheduler = pdev->tx_sched.scheduler; struct ol_tx_active_queues_in_tid_t *txq_queue; struct ol_tx_frms_queue_t *next_tq; - u_int16_t frames, used_credits, tx_limit, tx_limit_flag = 0; + u_int16_t frames, used_credits = 0, tx_limit, tx_limit_flag = 0; int bytes; TX_SCHED_DEBUG_PRINT("Enter %s\n", __func__); - if (TAILQ_EMPTY(&scheduler->tx_active_tids_list)) return; + if (TAILQ_EMPTY(&scheduler->tx_active_tids_list)) + return used_credits; txq_queue = TAILQ_FIRST(&scheduler->tx_active_tids_list); @@ -212,10 +213,10 @@ ol_tx_sched_select_batch_rr( credit = OL_A_MIN(credit, TX_SCH_MAX_CREDIT_FOR_THIS_TID(next_tq)); frames = next_tq->frms; /* download as many frames as credit allows */ - tx_limit = ol_tx_bad_peer_dequeue_check(txq, category->specs.send_limit, &tx_limit_flag); + tx_limit = ol_tx_bad_peer_dequeue_check(next_tq, frames, &tx_limit_flag); frames = ol_tx_dequeue( - pdev, txq, &sctx->head, tx_limit, &credit, &bytes); - ol_tx_bad_peer_update_tx_limit(pdev, txq, frames, tx_limit_flag); + pdev, next_tq, &sctx->head, tx_limit, &credit, &bytes); + ol_tx_bad_peer_update_tx_limit(pdev, next_tq, frames, tx_limit_flag); used_credits = credit; txq_queue->frms -= frames; @@ -425,6 +426,36 @@ ol_txrx_set_wmm_param(ol_txrx_pdev_handle data_pdev, struct ol_tx_wmm_param_t wm "Dummy function when OL_TX_SCHED_RR is enabled\n"); } +/** + * ol_tx_sched_stats_display() - tx sched stats display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_display(struct ol_txrx_pdev_t *pdev) +{ +} + +/** + * ol_tx_sched_cur_state_display() - tx sched cur stat display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_cur_state_display(struct ol_txrx_pdev_t *pdev) +{ +} + +/** + * ol_tx_sched_cur_state_display() - reset tx sched stats + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev) +{ +} + #endif /* OL_TX_SCHED == OL_TX_SCHED_RR */ /*--- advanced scheduler ----------------------------------------------------*/ @@ -937,6 +968,72 @@ ol_tx_sched_category_info_wrr_adv( *bytes = category->state.bytes; } + +/** + * ol_tx_sched_wrr_param_update() - update the WRR TX sched params + * @pdev: Pointer to PDEV structure. + * @scheduler: Pointer to tx scheduler. + * + * Update the WRR TX schedule parameters for each category if it is + * specified in the ini file by user. + * + * Return: none + */ +void ol_tx_sched_wrr_param_update(struct ol_txrx_pdev_t *pdev, + struct ol_tx_sched_wrr_adv_t *scheduler) +{ + int i; + char *tx_sched_wrr_name[4] = { + "BE", + "BK", + "VI", + "VO" + }; + + if (NULL == scheduler) + return; + + VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO, + "%s: Tuning the TX scheduler wrr parameters by ini file:", + __func__); + VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO, + " skip credit limit credit disc"); + + for (i = OL_TX_SCHED_WRR_ADV_CAT_BE; + i <= OL_TX_SCHED_WRR_ADV_CAT_VO; i++) { + if (ol_cfg_get_wrr_skip_weight(pdev->ctrl_pdev, i)) { + scheduler->categories[i].specs.wrr_skip_weight = + ol_cfg_get_wrr_skip_weight(pdev->ctrl_pdev, i); + scheduler->categories[i].specs.credit_threshold = + ol_cfg_get_credit_threshold(pdev->ctrl_pdev, i); + scheduler->categories[i].specs.send_limit = + ol_cfg_get_send_limit(pdev->ctrl_pdev, i); + scheduler->categories[i].specs.credit_reserve = + ol_cfg_get_credit_reserve(pdev->ctrl_pdev, i); + scheduler->categories[i].specs.discard_weight = + ol_cfg_get_discard_weight(pdev->ctrl_pdev, i); + + VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO, + "%s-update: %d, %d, %d, %d, %d", + tx_sched_wrr_name[i], + scheduler->categories[i].specs.wrr_skip_weight, + scheduler->categories[i].specs.credit_threshold, + scheduler->categories[i].specs.send_limit, + scheduler->categories[i].specs.credit_reserve, + scheduler->categories[i].specs.discard_weight); + } else { + VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_INFO, + "%s-orig: %d, %d, %d, %d, %d", + tx_sched_wrr_name[i], + scheduler->categories[i].specs.wrr_skip_weight, + scheduler->categories[i].specs.credit_threshold, + scheduler->categories[i].specs.send_limit, + scheduler->categories[i].specs.credit_reserve, + scheduler->categories[i].specs.discard_weight); + } + } +} + void * ol_tx_sched_init_wrr_adv( struct ol_txrx_pdev_t *pdev) @@ -960,6 +1057,8 @@ ol_tx_sched_init_wrr_adv( OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(MCAST_DATA, scheduler); OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(MCAST_MGMT, scheduler); + ol_tx_sched_wrr_param_update(pdev, scheduler); + for (i = 0; i < OL_TX_SCHED_WRR_ADV_NUM_CATEGORIES; i++) { scheduler->categories[i].state.active = 0; scheduler->categories[i].state.frms = 0; @@ -1042,6 +1141,39 @@ ol_txrx_set_wmm_param(ol_txrx_pdev_handle data_pdev, struct ol_tx_wmm_param_t wm } } +/** + * ol_tx_sched_stats_display() - tx sched stats display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_display(struct ol_txrx_pdev_t *pdev) +{ + OL_TX_SCHED_WRR_ADV_CAT_STAT_DUMP(pdev->tx_sched.scheduler); +} + +/** + * ol_tx_sched_cur_state_display() - tx sched cur stat display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_cur_state_display(struct ol_txrx_pdev_t *pdev) +{ + OL_TX_SCHED_WRR_ADV_CAT_CUR_STATE_DUMP(pdev->tx_sched.scheduler); +} + +/** + * ol_tx_sched_cur_state_display() - reset tx sched stats + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev) +{ + OL_TX_SCHED_WRR_ADV_CAT_STAT_CLEAR(pdev->tx_sched.scheduler); +} + #endif /* OL_TX_SCHED == OL_TX_SCHED_WRR_ADV */ /*--- congestion control discard --------------------------------------------*/ @@ -1413,19 +1545,4 @@ ol_tx_sched_log(struct ol_txrx_pdev_t *pdev) #endif /* defined(DEBUG_HL_LOGGING) */ -void ol_tx_sched_stats_display(struct ol_txrx_pdev_t *pdev) -{ - OL_TX_SCHED_WRR_ADV_CAT_STAT_DUMP(pdev->tx_sched.scheduler); -} - -void ol_tx_sched_cur_state_display(struct ol_txrx_pdev_t *pdev) -{ - OL_TX_SCHED_WRR_ADV_CAT_CUR_STATE_DUMP(pdev->tx_sched.scheduler); -} - -void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev) -{ - OL_TX_SCHED_WRR_ADV_CAT_STAT_CLEAR(pdev->tx_sched.scheduler); -} - #endif /* defined(CONFIG_HL_SUPPORT) */ diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c index b35dc99af25c..8616dea07206 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c @@ -211,7 +211,7 @@ void ol_tx_send( struct ol_txrx_pdev_t *pdev, struct ol_tx_desc_t *tx_desc, - adf_nbuf_t msdu) + adf_nbuf_t msdu, uint8_t vdev_id) { int msdu_credit_consumed; u_int16_t id; @@ -222,7 +222,7 @@ ol_tx_send( NBUF_UPDATE_TX_PKT_COUNT(msdu, NBUF_TX_PKT_TXRX); DPTRACE(adf_dp_trace_ptr(msdu, ADF_DP_TRACE_TXRX_PACKET_PTR_RECORD, adf_nbuf_data_addr(msdu), - sizeof(adf_nbuf_data(msdu)), tx_desc->id, 0)); + sizeof(adf_nbuf_data(msdu)), tx_desc->id, vdev_id)); failed = htt_tx_send_std(pdev->htt_pdev, msdu, id); if (adf_os_unlikely(failed)) { diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.h b/CORE/CLD_TXRX/TXRX/ol_tx_send.h index 2d20da995b4d..5eb08abd34ad 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_send.h +++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -60,7 +60,7 @@ void ol_tx_send( struct ol_txrx_pdev_t *pdev, struct ol_tx_desc_t *tx_desc, - adf_nbuf_t msdu); + adf_nbuf_t msdu, uint8_t vdev_id); /** * @brief Send a tx batch download to the target. diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h index 37894217dd8d..466db8462415 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h +++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h @@ -360,7 +360,12 @@ struct ol_tx_sched_t; typedef struct ol_tx_sched_t *ol_tx_sched_handle; #ifndef OL_TXRX_NUM_LOCAL_PEER_IDS -#define OL_TXRX_NUM_LOCAL_PEER_IDS 33 /* default */ + +/* + * 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 #ifndef ol_txrx_local_peer_id_t diff --git a/CORE/EPPING/src/epping_main.c b/CORE/EPPING/src/epping_main.c index b56077bbdb7f..ddb466ed59d1 100644 --- a/CORE/EPPING/src/epping_main.c +++ b/CORE/EPPING/src/epping_main.c @@ -249,10 +249,6 @@ void epping_driver_exit(v_CONTEXT_t pVosContext) } else { -#ifdef QCA_PKT_PROTO_TRACE - vos_pkt_proto_trace_close(); -#endif /* QCA_PKT_PROTO_TRACE */ - //pHddCtx->isUnloadInProgress = TRUE; vos_set_unload_in_progress(TRUE); vos_set_load_unload_in_progress(VOS_MODULE_ID_VOSS, TRUE); } diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 1ae35c8abba3..5c13303563e7 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -48,6 +48,8 @@ #include <wlan_hdd_tgt_cfg.h> #define FW_MODULE_LOG_LEVEL_STRING_LENGTH (255) +#define TX_SCHED_WRR_PARAM_STRING_LENGTH (50) +#define TX_SCHED_WRR_PARAMS_NUM (5) #ifdef DHCP_SERVER_OFFLOAD #define IPADDR_NUM_ENTRIES (4) @@ -3829,6 +3831,43 @@ enum dot11p_mode { #define CFG_EDCA_BE_AIFS_VALUE_MAX (15) #define CFG_EDCA_BE_AIFS_VALUE_DEFAULT (3) + +/* + * This key is mapping to VO defined in data path module through + * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the + * WRR TX sched parameters such as skip, credit, limit, credit, disc for VO. + * e.g., gEnableTxSchedWrrVO = 10, 9, 8, 1, 8 + */ +#define CFG_ENABLE_TX_SCHED_WRR_VO "gEnableTxSchedWrrVO" +#define CFG_ENABLE_TX_SCHED_WRR_VO_DEFAULT "" + +/* + * This key is mapping to VI defined in data path module through + * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the + * WRR TX sched parameters such as skip, credit, limit, credit, disc for VI. + * e.g., gEnableTxSchedWrrVI = 10, 9, 8, 1, 8 + */ +#define CFG_ENABLE_TX_SCHED_WRR_VI "gEnableTxSchedWrrVI" +#define CFG_ENABLE_TX_SCHED_WRR_VI_DEFAULT "" + +/* + * This key is mapping to BE defined in data path module through + * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the + * WRR TX sched parameters such as skip, credit, limit, credit, disc for BE. + * e.g., gEnableTxSchedWrrBE = 10, 9, 8, 1, 8 + */ +#define CFG_ENABLE_TX_SCHED_WRR_BE "gEnableTxSchedWrrBE" +#define CFG_ENABLE_TX_SCHED_WRR_BE_DEFAULT "" + +/* + * This key is mapping to BK defined in data path module through + * OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC. The user can tune the + * WRR TX sched parameters such as skip, credit, limit, credit, disc for BK. + * e.g., gEnableTxSchedWrrBK = 10, 9, 8, 1, 8 + */ +#define CFG_ENABLE_TX_SCHED_WRR_BK "gEnableTxSchedWrrBK" +#define CFG_ENABLE_TX_SCHED_WRR_BK_DEFAULT "" + #define CFG_TGT_GTX_USR_CFG_NAME "tgt_gtx_usr_cfg" #define CFG_TGT_GTX_USR_CFG_MIN (0) #define CFG_TGT_GTX_USR_CFG_MAX (32) @@ -4607,6 +4646,15 @@ struct hdd_config { uint32_t edca_be_aifs; bool enable_dynamic_sta_chainmask; + /* Tuning TX sched parameters for VO (skip credit limit credit disc) */ + uint8_t tx_sched_wrr_vo[TX_SCHED_WRR_PARAM_STRING_LENGTH]; + /* Tuning TX sched parameters for VI (skip credit limit credit disc) */ + uint8_t tx_sched_wrr_vi[TX_SCHED_WRR_PARAM_STRING_LENGTH]; + /* Tuning TX sched parameters for BE (skip credit limit credit disc) */ + uint8_t tx_sched_wrr_be[TX_SCHED_WRR_PARAM_STRING_LENGTH]; + /* Tuning TX sched parameters for BK (skip credit limit credit disc) */ + uint8_t tx_sched_wrr_bk[TX_SCHED_WRR_PARAM_STRING_LENGTH]; + /* parameter to control GTX */ uint32_t tgt_gtx_usr_cfg; bool sap_restrt_ch_avoid; diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h index 94f5a8c78173..6fc13ed3588f 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg80211.h +++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h @@ -2089,15 +2089,15 @@ struct cfg80211_bss *wlan_hdd_cfg80211_inform_bss_frame(hdd_adapter_t *pAdapter, #if defined(CFG80211_DISCONNECTED_V2) || \ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) static inline void wlan_hdd_cfg80211_indicate_disconnect(struct net_device *dev, - bool from_ap, + bool locally_generated, int reason) { cfg80211_disconnected(dev, reason, NULL, 0, - from_ap, GFP_KERNEL); + locally_generated, GFP_KERNEL); } #else static inline void wlan_hdd_cfg80211_indicate_disconnect(struct net_device *dev, - bool from_ap, + bool locally_generated, int reason) { cfg80211_disconnected(dev, reason, NULL, 0, diff --git a/CORE/HDD/inc/wlan_hdd_wext.h b/CORE/HDD/inc/wlan_hdd_wext.h index e18f7f25b663..c4b54031ac3c 100644 --- a/CORE/HDD/inc/wlan_hdd_wext.h +++ b/CORE/HDD/inc/wlan_hdd_wext.h @@ -334,8 +334,6 @@ typedef struct hdd_wext_state_s 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{ diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index ae548cc08030..2b2538f3e402 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -1034,11 +1034,11 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo * pr_info( "wlan: disconnected due to poor signal, rssi is %d dB\n", pRoamInfo->rxRssi); - wlan_hdd_cfg80211_indicate_disconnect(dev, true, - WLAN_REASON_UNSPECIFIED); + wlan_hdd_cfg80211_indicate_disconnect(dev, false, + pRoamInfo->reasonCode); } else - wlan_hdd_cfg80211_indicate_disconnect(dev, true, + wlan_hdd_cfg80211_indicate_disconnect(dev, false, WLAN_REASON_UNSPECIFIED); hddLog(VOS_TRACE_LEVEL_INFO_HIGH, diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 984d187a0bf6..cbb0bf8b4310 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -4569,6 +4569,26 @@ REG_TABLE_ENTRY g_registry_table[] = CFG_EDCA_BE_AIFS_VALUE_MIN, CFG_EDCA_BE_AIFS_VALUE_MAX), + REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_VO, WLAN_PARAM_String, + hdd_config_t, tx_sched_wrr_vo, + VAR_FLAGS_OPTIONAL, + (void *) CFG_ENABLE_TX_SCHED_WRR_VO_DEFAULT), + + REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_VI, WLAN_PARAM_String, + hdd_config_t, tx_sched_wrr_vi, + VAR_FLAGS_OPTIONAL, + (void *) CFG_ENABLE_TX_SCHED_WRR_VI_DEFAULT), + + REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_BE, WLAN_PARAM_String, + hdd_config_t, tx_sched_wrr_be, + VAR_FLAGS_OPTIONAL, + (void *) CFG_ENABLE_TX_SCHED_WRR_BE_DEFAULT), + + REG_VARIABLE_STRING(CFG_ENABLE_TX_SCHED_WRR_BK, WLAN_PARAM_String, + hdd_config_t, tx_sched_wrr_bk, + VAR_FLAGS_OPTIONAL, + (void *) CFG_ENABLE_TX_SCHED_WRR_BK_DEFAULT), + REG_VARIABLE(CFG_TGT_GTX_USR_CFG_NAME, WLAN_PARAM_Integer, hdd_config_t, tgt_gtx_usr_cfg, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, @@ -5410,6 +5430,19 @@ void print_hdd_cfg(hdd_context_t *pHddCtx) CFG_BUG_ON_REINIT_FAILURE_NAME, pHddCtx->cfg_ini->bug_on_reinit_failure); + hddLog(LOG2, "Name = [%s] Value = [%s]", + CFG_ENABLE_TX_SCHED_WRR_VO, + pHddCtx->cfg_ini->tx_sched_wrr_vo); + hddLog(LOG2, "Name = [%s] Value = [%s]", + CFG_ENABLE_TX_SCHED_WRR_VI, + pHddCtx->cfg_ini->tx_sched_wrr_vi); + hddLog(LOG2, "Name = [%s] Value = [%s]", + CFG_ENABLE_TX_SCHED_WRR_BK, + pHddCtx->cfg_ini->tx_sched_wrr_bk); + hddLog(LOG2, "Name = [%s] Value = [%s]", + CFG_ENABLE_TX_SCHED_WRR_BE, + pHddCtx->cfg_ini->tx_sched_wrr_be); + hddLog(LOG2, "Name = [%s] Value = [%u]", CFG_TGT_GTX_USR_CFG_NAME, pHddCtx->cfg_ini->tgt_gtx_usr_cfg); diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index e6c47345251b..4749917bafe1 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -1407,13 +1407,13 @@ __wlan_hdd_cfg80211_get_supported_features(struct wiphy *wiphy, tANI_U32 fset = 0; int ret; + /* ENTER() intentionally not used in a frequently invoked API */ + if (VOS_FTM_MODE == hdd_get_conparam()) { hddLog(LOGE, FL("Command not allowed in FTM mode")); return -EINVAL; } - ENTER(); - ret = wlan_hdd_validate_context(pHddCtx); if (0 != ret) return -EINVAL; @@ -1514,7 +1514,6 @@ __wlan_hdd_cfg80211_get_supported_features(struct wiphy *wiphy, } ret = cfg80211_vendor_cmd_reply(skb); - EXIT(); return ret; nla_put_failure: @@ -2511,7 +2510,7 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, int retval = 0; unsigned long rc; - ENTER(); + /* ENTER() intentionally not used in a frequently invoked API */ if (VOS_FTM_MODE == hdd_get_conparam()) { hddLog(LOGE, FL("Command not allowed in FTM mode")); @@ -2546,8 +2545,6 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, pReqMsg->requestId = nla_get_u32(tb[PARAM_REQUEST_ID]); pReqMsg->sessionId = pAdapter->sessionId; - hddLog(LOG1, FL("Req Id %u Session Id %d"), - pReqMsg->requestId, pReqMsg->sessionId); /* Parse and fetch flush parameter */ if (!tb[PARAM_FLUSH]) { @@ -2555,7 +2552,8 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, goto fail; } pReqMsg->flush = nla_get_u8(tb[PARAM_FLUSH]); - hddLog(LOG1, FL("Flush %d"), pReqMsg->flush); + hddLog(LOG1, FL("Req Id: %u Session Id: %d Flush: %d"), + pReqMsg->requestId, pReqMsg->sessionId, pReqMsg->flush); spin_lock(&hdd_context_lock); context = &pHddCtx->ext_scan_context; @@ -2584,7 +2582,6 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, retval = context->response_status; spin_unlock(&hdd_context_lock); } - EXIT(); return retval; fail: @@ -3253,17 +3250,15 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, struct net_device *dev = wdev->netdev; hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev); uint32_t chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0}; - uint8_t num_channels = 0; - uint8_t num_chan_new = 0; + uint8_t num_channels = 0, num_chan_new = 0, buf[256] = {0}; struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX + 1]; tANI_U32 requestId, maxChannels; tWifiBand wifiBand; eHalStatus status; struct sk_buff *reply_skb; - tANI_U8 i, j, k; - int retval; + int i, j, k, retval, len = 0; - ENTER(); + /* ENTER() intentionally not used in a frequently invoked API */ if (VOS_FTM_MODE == hdd_get_conparam()) { hddLog(LOGE, FL("Command not allowed in FTM mode")); @@ -3288,7 +3283,6 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, } requestId = nla_get_u32( tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID]); - hddLog(LOG1, FL("Req Id %d"), requestId); /* Parse and fetch wifi band */ if (!tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_WIFI_BAND]) { @@ -3297,7 +3291,6 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, } wifiBand = nla_get_u32( tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_WIFI_BAND]); - hddLog(LOG1, FL("Wifi band %d"), wifiBand); /* Parse and fetch max channels */ if (!tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_MAX_CHANNELS]) { @@ -3306,7 +3299,8 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, } maxChannels = nla_get_u32( tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_MAX_CHANNELS]); - hddLog(LOG1, FL("Max channels %d"), maxChannels); + hddLog(LOG1, FL("Req Id: %d Wifi band: %d Max channels: %d"), + requestId, wifiBand, maxChannels); status = sme_GetValidChannelsByBand((tHalHandle)(pHddCtx->hHal), wifiBand, chan_list, @@ -3350,9 +3344,10 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, } } - hddLog(LOG1, FL("Number of channels %d"), num_chan_new); + hddLog(LOG1, FL("Number of channels: %d"), num_chan_new); for (i = 0; i < num_chan_new; i++) - hddLog(LOG1, "Channel: %u ", chan_list[i]); + len += scnprintf(buf + len, sizeof(buf) - len, "%u ", chan_list[i]); + hddLog(LOG1, "Channels: %s", buf); reply_skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(u32) + sizeof(u32) * num_chan_new + @@ -3370,7 +3365,6 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, } retval = cfg80211_vendor_cmd_reply(reply_skb); - EXIT(); return retval; } hddLog(LOGE, FL("valid channels: buffer alloc fail")); @@ -3530,8 +3524,6 @@ static int hdd_extscan_start_fill_bucket_channel_spec( } pReqMsg->buckets[bktIndex].bucket = nla_get_u8( bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_INDEX]); - hddLog(LOG1, FL("Bucket spec Index %d"), - pReqMsg->buckets[bktIndex].bucket); /* Parse and fetch wifi band */ if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BAND]) { @@ -3540,8 +3532,6 @@ static int hdd_extscan_start_fill_bucket_channel_spec( } pReqMsg->buckets[bktIndex].band = nla_get_u8( bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BAND]); - hddLog(LOG1, FL("Wifi band %d"), - pReqMsg->buckets[bktIndex].band); /* Parse and fetch period */ if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_PERIOD]) { @@ -3550,8 +3540,6 @@ static int hdd_extscan_start_fill_bucket_channel_spec( } pReqMsg->buckets[bktIndex].period = nla_get_u32( bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_PERIOD]); - hddLog(LOG1, FL("period %d"), - pReqMsg->buckets[bktIndex].period); /* Parse and fetch report events */ if (!bucket[ @@ -3562,8 +3550,6 @@ static int hdd_extscan_start_fill_bucket_channel_spec( pReqMsg->buckets[bktIndex].reportEvents = nla_get_u8( bucket[ QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_REPORT_EVENTS]); - hddLog(LOG1, FL("report events %d"), - pReqMsg->buckets[bktIndex].reportEvents); /* Parse and fetch max period */ if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_MAX_PERIOD]) { @@ -3572,8 +3558,6 @@ static int hdd_extscan_start_fill_bucket_channel_spec( } pReqMsg->buckets[bktIndex].max_period = nla_get_u32( bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_MAX_PERIOD]); - hddLog(LOG1, FL("max period %u"), - pReqMsg->buckets[bktIndex].max_period); /* Parse and fetch base */ if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE]) { @@ -3582,8 +3566,6 @@ static int hdd_extscan_start_fill_bucket_channel_spec( } pReqMsg->buckets[bktIndex].exponent = nla_get_u32( bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_BASE]); - hddLog(LOG1, FL("base %u"), - pReqMsg->buckets[bktIndex].exponent); /* Parse and fetch step count */ if (!bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_STEP_COUNT]) { @@ -3592,8 +3574,14 @@ static int hdd_extscan_start_fill_bucket_channel_spec( } pReqMsg->buckets[bktIndex].step_count = nla_get_u32( bucket[QCA_WLAN_VENDOR_ATTR_EXTSCAN_BUCKET_SPEC_STEP_COUNT]); - hddLog(LOG1, FL("Step count %u"), - pReqMsg->buckets[bktIndex].step_count); + hddLog(LOG1, FL("Bucket spec Index: %d Wifi band: %d period: %d report events: %d max period: %u base: %u Step count: %u"), + pReqMsg->buckets[bktIndex].bucket, + pReqMsg->buckets[bktIndex].band, + pReqMsg->buckets[bktIndex].period, + pReqMsg->buckets[bktIndex].reportEvents, + pReqMsg->buckets[bktIndex].max_period, + pReqMsg->buckets[bktIndex].exponent, + pReqMsg->buckets[bktIndex].step_count); /* start with known good values for bucket dwell times */ pReqMsg->buckets[bktIndex].min_dwell_time_active = @@ -3977,8 +3965,6 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, pReqMsg->requestId = nla_get_u32(tb[PARAM_REQUEST_ID]); pReqMsg->sessionId = pAdapter->sessionId; - hddLog(LOG1, FL("Req Id %d Session Id %d"), - pReqMsg->requestId, pReqMsg->sessionId); /* Parse and fetch base period */ if (!tb[PARAM_BASE_PERIOD]) { @@ -3986,7 +3972,6 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, goto fail; } pReqMsg->basePeriod = nla_get_u32(tb[PARAM_BASE_PERIOD]); - hddLog(LOG1, FL("Base Period %d"), pReqMsg->basePeriod); /* Parse and fetch max AP per scan */ if (!tb[PARAM_MAX_AP_PER_SCAN]) { @@ -3994,7 +3979,6 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, goto fail; } pReqMsg->maxAPperScan = nla_get_u32(tb[PARAM_MAX_AP_PER_SCAN]); - hddLog(LOG1, FL("Max AP per Scan %d"), pReqMsg->maxAPperScan); /* Parse and fetch report threshold percent */ if (!tb[PARAM_RPT_THRHLD_PERCENT]) { @@ -4003,8 +3987,6 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, } pReqMsg->report_threshold_percent = nla_get_u8( tb[PARAM_RPT_THRHLD_PERCENT]); - hddLog(LOG1, FL("Report Threshold percent %d"), - pReqMsg->report_threshold_percent); /* Parse and fetch report threshold num scans */ if (!tb[PARAM_RPT_THRHLD_NUM_SCANS]) { @@ -4013,7 +3995,10 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, } pReqMsg->report_threshold_num_scans = nla_get_u8( tb[PARAM_RPT_THRHLD_NUM_SCANS]); - hddLog(LOG1, FL("Report Threshold num scans %d"), + hddLog(LOG1, FL("Req Id: %d Session Id: %d Base Period: %d Max AP per Scan: %d Rpt Thld percent: %d Rpt Thld num scans: %d"), + pReqMsg->requestId, pReqMsg->sessionId, + pReqMsg->basePeriod, pReqMsg->maxAPperScan, + pReqMsg->report_threshold_percent, pReqMsg->report_threshold_num_scans); /* Parse and fetch number of buckets */ @@ -14174,6 +14159,15 @@ static int __wlan_hdd_cfg80211_add_beacon(struct wiphy *wiphy, hddLog(VOS_TRACE_LEVEL_DEBUG, FL("Reached max concurrent connections")); return -EINVAL; } + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + hdd_adapter_t *pP2pAdapter = NULL; + pP2pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_DEVICE); + if (pP2pAdapter) { + hddLog(VOS_TRACE_LEVEL_DEBUG, + FL("cancel active p2p device ROC before GO starting")); + wlan_hdd_cancel_existing_remain_on_channel(pP2pAdapter); + } + } if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) || (pAdapter->device_mode == WLAN_HDD_P2P_GO)) { @@ -14257,6 +14251,15 @@ static int __wlan_hdd_cfg80211_set_beacon(struct wiphy *wiphy, hddLog(LOGE, FL("Command not allowed in FTM mode")); return -EINVAL; } + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + hdd_adapter_t *pP2pAdapter = NULL; + pP2pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_DEVICE); + if (pP2pAdapter) { + hddLog(VOS_TRACE_LEVEL_DEBUG, + FL("cancel active p2p device ROC before GO starting")); + wlan_hdd_cancel_existing_remain_on_channel(pP2pAdapter); + } + } if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) || (pAdapter->device_mode == WLAN_HDD_P2P_GO)) { @@ -14565,6 +14568,15 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, hddLog(VOS_TRACE_LEVEL_DEBUG, FL("Reached max concurrent connections")); return -EINVAL; } + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + hdd_adapter_t *pP2pAdapter = NULL; + pP2pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_DEVICE); + if (pP2pAdapter) { + hddLog(VOS_TRACE_LEVEL_DEBUG, + FL("cancel active p2p device ROC before GO starting")); + wlan_hdd_cancel_existing_remain_on_channel(pP2pAdapter); + } + } if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) || (pAdapter->device_mode == WLAN_HDD_P2P_GO) @@ -14699,6 +14711,15 @@ static int __wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy, pAdapter->device_mode == WLAN_HDD_P2P_GO)) { return -EOPNOTSUPP; } + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + hdd_adapter_t *pP2pAdapter = NULL; + pP2pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_DEVICE); + if (pP2pAdapter) { + hddLog(VOS_TRACE_LEVEL_DEBUG, + FL("cancel active p2p device ROC before GO starting")); + wlan_hdd_cancel_existing_remain_on_channel(pP2pAdapter); + } + } old = pAdapter->sessionCtx.ap.beacon; @@ -19190,7 +19211,7 @@ disconnected: */ hddLog(LOG1, FL("Send disconnected event to userspace")); - wlan_hdd_cfg80211_indicate_disconnect(pAdapter->dev, false, + wlan_hdd_cfg80211_indicate_disconnect(pAdapter->dev, true, WLAN_REASON_UNSPECIFIED); #endif @@ -24188,7 +24209,7 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, uint32_t i, j, nl_buf_len; bool ignore_cached_results = false; - ENTER(); + /* ENTER() intentionally not used in a frequently invoked API */ if (wlan_hdd_validate_context(pHddCtx)) return; @@ -24256,7 +24277,6 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, } } - hddLog(LOG2, FL("nl_buf_len = %u"), nl_buf_len); skb = cfg80211_vendor_cmd_alloc_reply_skb(pHddCtx->wiphy, nl_buf_len); if (!skb) { @@ -24386,7 +24406,6 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, complete(&context->response_event); spin_unlock(&hdd_context_lock); } - EXIT(); return; fail: @@ -24866,18 +24885,18 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, tpSirWifiFullScanResultEvent pData) { hdd_context_t *pHddCtx = (hdd_context_t *)ctx; - struct sk_buff *skb = NULL; + struct sk_buff *skb; struct timespec ts; int flags = vos_get_gfp_flags(); struct hdd_ext_scan_context *context; - ENTER(); + /* ENTER() intentionally not used in a frequently invoked API */ if (wlan_hdd_validate_context(pHddCtx)) return; if (!pData) { - hddLog(VOS_TRACE_LEVEL_ERROR, FL("pData is null")); + hddLog(LOGE, FL("pData is null")); return; } /* @@ -24905,8 +24924,6 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, Instead it wants a monotonic increasing value since boot */ vos_get_monotonic_boottime_ts(&ts); pData->ap.ts = ((u64)ts.tv_sec * 1000000) + (ts.tv_nsec / 1000); - hddLog(LOG1, "Req Id %u More Data %u", - pData->requestId, pData->moreData); hddLog(LOG1, "AP Info: Timestamp %llu Ssid: %s " "Bssid (" MAC_ADDRESS_STR ") " "Channel %u " @@ -24980,12 +24997,9 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, hddLog(LOGE, FL("Failed to include buckets_scanned")); goto nla_put_failure; } - hddLog(LOG1, FL("Full scan buckets_scanned: %u"), - context->buckets_scanned); spin_unlock(&hdd_context_lock); cfg80211_vendor_event(skb, flags); - EXIT(); return; nla_put_failure: @@ -25189,14 +25203,13 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, int flags = vos_get_gfp_flags(); struct hdd_ext_scan_context *context; - ENTER(); + /* ENTER() intentionally not used in a frequently invoked API */ if (wlan_hdd_validate_context(pHddCtx)) return; if (!data) { hddLog(LOGE, FL("data is null")); - EXIT(); return; } @@ -25214,7 +25227,6 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, context->buckets_scanned = data->buckets_scanned; /* No need to report to user space */ spin_unlock(&hdd_context_lock); - EXIT(); return; } else { spin_unlock(&hdd_context_lock); @@ -25228,7 +25240,6 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, if (!skb) { hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed")); - EXIT(); return; } @@ -25241,12 +25252,10 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, } cfg80211_vendor_event(skb, flags); - EXIT(); return; nla_put_failure: kfree_skb(skb); - EXIT(); return; } @@ -25389,7 +25398,7 @@ void wlan_hdd_cfg80211_extscan_callback(void *ctx, const tANI_U16 evType, { hdd_context_t *pHddCtx = (hdd_context_t *)ctx; - ENTER(); + /* ENTER() intentionally not used in a frequently invoked API */ if (wlan_hdd_validate_context(pHddCtx)) return; @@ -25467,7 +25476,6 @@ void wlan_hdd_cfg80211_extscan_callback(void *ctx, const tANI_U16 evType, hddLog(LOGE, FL("Unknown event type %u"), evType); break; } - EXIT(); } #endif /* FEATURE_WLAN_EXTSCAN */ diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index dceb6103dab3..62cb37d28e84 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -120,7 +120,6 @@ extern int process_wma_set_command(int sessid, int paramid, /* EID byte + length byte + four byte WiFi OUI */ #define DOT11F_EID_HEADER_LEN (6) -#define DUMP_DP_TRACE 0 /*--------------------------------------------------------------------------- * Function definitions @@ -2638,6 +2637,10 @@ static int __iw_softap_set_two_ints_getnone(struct net_device *dev, value[1], value[2]); if (value[1] == DUMP_DP_TRACE) adf_dp_trace_dump_all(value[2]); + else if (value[1] == ENABLE_DP_TRACE_LIVE_MODE) + adf_dp_trace_enable_live_mode(); + else if (value[1] == CLEAR_DP_TRACE_BUFFER) + adf_dp_trace_clear_buffer(); else hddLog(LOGE, "unexpected value for dump_dp_trace"); break; @@ -6339,7 +6342,7 @@ static const struct iw_priv_args hostapd_private_args[] = { { QCSAP_IOCTL_STOPBSS, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED, 0, "stopbss" }, { QCSAP_IOCTL_VERSION, 0, - IW_PRIV_TYPE_CHAR | QCSAP_MAX_WSC_IE, "version" }, + IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN, "version" }, { QCSAP_IOCTL_GET_STA_INFO, 0, IW_PRIV_TYPE_CHAR | WE_SAP_MAX_STA_INFO, "get_sta_info" }, { QCSAP_IOCTL_GET_WPS_PBC_PROBE_REQ_IES, diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index f30ef00eb49d..b3e855aad8a7 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -9871,9 +9871,14 @@ static void __hdd_set_multicast_list(struct net_device *dev) { mc_count = netdev_mc_count(dev); hddLog(VOS_TRACE_LEVEL_INFO, - "%s: mc_count = %u", __func__, mc_count); + "%s: mc_count : %u, max_mc_addr_list : %d", + __func__, mc_count, pHddCtx->max_mc_addr_list); netdev_for_each_mc_addr(ha, dev) { + hddLog(VOS_TRACE_LEVEL_INFO, + FL("ha_addr[%d] "MAC_ADDRESS_STR), + i, MAC_ADDR_ARRAY(ha->addr)); + if (i == mc_count || i == pHddCtx->max_mc_addr_list) break; /* @@ -11807,7 +11812,7 @@ VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx ) pAdapter->sessionCtx.station.hdd_ReassocScenario = VOS_FALSE; /* indicate disconnected event to nl80211 */ - wlan_hdd_cfg80211_indicate_disconnect(pAdapter->dev, true, + wlan_hdd_cfg80211_indicate_disconnect(pAdapter->dev, false, WLAN_REASON_UNSPECIFIED); } else if (eConnectionState_Connecting == connState) @@ -15859,7 +15864,8 @@ static void hdd_driver_exit(void) pHddCtx->driver_being_stopped = false; #ifdef QCA_PKT_PROTO_TRACE - vos_pkt_proto_trace_close(); + if (VOS_FTM_MODE != hdd_get_conparam()) + vos_pkt_proto_trace_close(); #endif /* QCA_PKT_PROTO_TRACE */ while(pHddCtx->isLogpInProgress || vos_is_logp_in_progress(VOS_MODULE_ID_VOSS, NULL)) { diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c index e0adb662ee3a..abccb6fe25c6 100644 --- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c @@ -390,15 +390,15 @@ int __hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) NBUF_SET_PACKET_TRACK(skb, NBUF_TX_PKT_DATA_TRACK); NBUF_UPDATE_TX_PKT_COUNT(skb, NBUF_TX_PKT_HDD); - adf_dp_trace_set_track(skb); - DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_PACKET_PTR_RECORD, - (uint8_t *)&skb->data, sizeof(skb->data))); - DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_PACKET_RECORD, - (uint8_t *)skb->data, skb->len)); + adf_dp_trace_set_track(skb, ADF_TX); + DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, + (uint8_t *)&skb->data, sizeof(skb->data), ADF_TX)); + DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_TX_PACKET_RECORD, + (uint8_t *)skb->data, skb->len, ADF_TX)); if (skb->len > ADF_DP_TRACE_RECORD_SIZE) - DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_PACKET_RECORD, + DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_TX_PACKET_RECORD, (uint8_t *)&skb->data[ADF_DP_TRACE_RECORD_SIZE], - (skb->len - ADF_DP_TRACE_RECORD_SIZE))); + (skb->len - ADF_DP_TRACE_RECORD_SIZE), ADF_TX)); skb = skb_next; continue; @@ -468,7 +468,7 @@ static void __hdd_softap_tx_timeout(struct net_device *dev) int i = 0; DPTRACE(adf_dp_trace(NULL, ADF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT, - NULL, 0)); + NULL, 0, ADF_TX)); hdd_ctx = WLAN_HDD_GET_CTX(adapter); if (hdd_ctx->isLogpInProgress) { @@ -835,8 +835,11 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext, ++pAdapter->stats.rx_packets; pAdapter->stats.rx_bytes += skb->len; - adf_dp_trace_log_pkt(pAdapter->sessionId, skb, - WIFI_EVENT_DRIVER_EAPOL_FRAME_RECEIVED); + DPTRACE(adf_dp_trace(rxBuf, + ADF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD, + adf_nbuf_data_addr(rxBuf), + sizeof(adf_nbuf_data(rxBuf)), ADF_RX)); + #ifdef QCA_PKT_PROTO_TRACE if ((pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) || (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP)) { diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c index ed7016db4b80..4c6acb27ec17 100644 --- a/CORE/HDD/src/wlan_hdd_tdls.c +++ b/CORE/HDD/src/wlan_hdd_tdls.c @@ -2198,20 +2198,19 @@ void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter) void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter) { - tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter); - hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); - - if ((NULL == pHddCtx) || (NULL == pHddTdlsCtx)) - { - VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, - FL("pHddCtx or pHddTdlsCtx points to NULL")); - return; - } + tdlsCtx_t *pHddTdlsCtx; + hdd_context_t *pHddCtx; VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"%s", __func__); + pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + + if (0 != wlan_hdd_validate_context(pHddCtx)) + return; + mutex_lock(&pHddCtx->tdls_lock); + pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter); if (NULL == pHddTdlsCtx) { mutex_unlock(&pHddCtx->tdls_lock); diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index 7cd0b3f1a2b0..f5df394f8927 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -358,11 +358,11 @@ void hdd_tx_resume_cb(void *adapter_context, void hdd_drop_skb(hdd_adapter_t *adapter, struct sk_buff *skb) { DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_DROP_PACKET_RECORD, - (uint8_t *)skb->data, skb->len)); + (uint8_t *)skb->data, skb->len, ADF_TX)); if (skb->len > ADF_DP_TRACE_RECORD_SIZE) DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_DROP_PACKET_RECORD, (uint8_t *)&skb->data[ADF_DP_TRACE_RECORD_SIZE], - (skb->len - ADF_DP_TRACE_RECORD_SIZE))); + (skb->len - ADF_DP_TRACE_RECORD_SIZE), ADF_TX)); ++adapter->stats.tx_dropped; ++adapter->hdd_stats.hddTxRxStats.txXmitDropped; @@ -385,12 +385,12 @@ void hdd_drop_skb_list(hdd_adapter_t *adapter, struct sk_buff *skb, while (skb) { DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_DROP_PACKET_RECORD, - (uint8_t *)skb->data, skb->len)); + (uint8_t *)skb->data, skb->len, ADF_TX)); if (skb->len > ADF_DP_TRACE_RECORD_SIZE) DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_DROP_PACKET_RECORD, (uint8_t *)&skb->data[ADF_DP_TRACE_RECORD_SIZE], - (skb->len - ADF_DP_TRACE_RECORD_SIZE))); + (skb->len - ADF_DP_TRACE_RECORD_SIZE), ADF_TX)); ++adapter->stats.tx_dropped; ++adapter->hdd_stats.hddTxRxStats.txXmitDropped; @@ -633,20 +633,19 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) list_tail = list_tail->next; } vos_mem_zero(skb->cb, sizeof(skb->cb)); - adf_dp_trace_log_pkt(pAdapter->sessionId, skb, - WIFI_EVENT_DRIVER_EAPOL_FRAME_TRANSMIT_REQUESTED); + adf_dp_trace_log_pkt(pAdapter->sessionId, skb, ADF_TX); NBUF_SET_PACKET_TRACK(skb, NBUF_TX_PKT_DATA_TRACK); NBUF_UPDATE_TX_PKT_COUNT(skb, NBUF_TX_PKT_HDD); - adf_dp_trace_set_track(skb); - DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_PACKET_PTR_RECORD, - (uint8_t *)&skb->data, sizeof(skb->data))); - DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_PACKET_RECORD, - (uint8_t *)skb->data, skb->len)); + adf_dp_trace_set_track(skb, ADF_TX); + DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, + (uint8_t *)&skb->data, sizeof(skb->data), ADF_TX)); + DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_TX_PACKET_RECORD, + (uint8_t *)skb->data, skb->len, ADF_TX)); if (skb->len > ADF_DP_TRACE_RECORD_SIZE) - DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_PACKET_RECORD, + DPTRACE(adf_dp_trace(skb, ADF_DP_TRACE_HDD_TX_PACKET_RECORD, (uint8_t *)&skb->data[ADF_DP_TRACE_RECORD_SIZE], - (skb->len - ADF_DP_TRACE_RECORD_SIZE))); + (skb->len - ADF_DP_TRACE_RECORD_SIZE), ADF_TX)); skb = skb_next; continue; @@ -824,7 +823,7 @@ static void __hdd_tx_timeout(struct net_device *dev) hddLog(LOGE, FL("Transmission timeout occurred jiffies %lu trans_start %lu"), jiffies, dev->trans_start); DPTRACE(adf_dp_trace(NULL, ADF_DP_TRACE_HDD_TX_TIMEOUT, - NULL, 0)); + NULL, 0, ADF_TX)); /* * Getting here implies we disabled the TX queues for too long. Queues are * disabled either because of disassociation or low resource scenarios. In @@ -1229,8 +1228,10 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext, continue; } - adf_dp_trace_log_pkt(pAdapter->sessionId, skb, - WIFI_EVENT_DRIVER_EAPOL_FRAME_RECEIVED); + DPTRACE(adf_dp_trace(rxBuf, + ADF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD, + adf_nbuf_data_addr(rxBuf), + sizeof(adf_nbuf_data(rxBuf)), ADF_RX)); #ifdef QCA_PKT_PROTO_TRACE if ((pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) || diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index e49ea8ed4996..fd738dac6bce 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -458,7 +458,6 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2}, #endif #define WE_SET_MON_MODE_CHAN 3 #define WE_DUMP_DP_TRACE_LEVEL 4 -#define DUMP_DP_TRACE 0 #define WLAN_STATS_INVALID 0 #define WLAN_STATS_RETRY_CNT 1 @@ -4793,48 +4792,12 @@ static int iw_get_nick(struct net_device *dev, * __get_wireless_stats() - get wireless stats * @dev: pointer to net_device * - * Return: pointer to iw_statistics on success, NULL otherwise + * Return: %NULL */ static struct iw_statistics *__get_wireless_stats(struct net_device *dev) { - hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev); - hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); - hdd_wext_state_t *wext_state = WLAN_HDD_GET_WEXT_STATE_PTR(adapter); - hdd_station_ctx_t *hdd_sta_ctx; - v_S7_t snr = 0, rssi = 0; - int status; - ENTER(); - - status = wlan_hdd_validate_context(hdd_ctx); - if (0 != status) - return NULL; - - hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); - if (eConnectionState_Associated != hdd_sta_ctx->conn_info.connState) { - hddLog(VOS_TRACE_LEVEL_INFO, - FL("not in associated state: %d"), - hdd_sta_ctx->conn_info.connState); - return NULL; - } - - wlan_hdd_get_station_stats(adapter); - wlan_hdd_get_snr(adapter, &snr); - wlan_hdd_get_rssi(adapter, &rssi); - - vos_mem_zero(&wext_state->iw_stats, sizeof(wext_state->iw_stats)); - wext_state->iw_stats.status = 0; - wext_state->iw_stats.qual.qual = snr; - wext_state->iw_stats.qual.level = rssi; - wext_state->iw_stats.qual.noise = rssi - snr; - wext_state->iw_stats.discard.code = 0; - wext_state->iw_stats.discard.retries = 0; - wext_state->iw_stats.miss.beacon = 0; - wext_state->iw_stats.qual.updated = - IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; - - EXIT(); - return &(wext_state->iw_stats); + return NULL; } /** @@ -4855,6 +4818,7 @@ static struct iw_statistics *get_wireless_stats(struct net_device *dev) return iw_stats; } + /** * __iw_set_encode() - SIOCSIWENCODE ioctl handler * @dev: device upon which the ioctl was received @@ -10335,6 +10299,11 @@ void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, v_U8_t set) sme_8023MulticastList(hHal, pAdapter->sessionId, pMulticastAddrs); } + else { + hddLog(VOS_TRACE_LEVEL_INFO, + FL("MC address list not sent to FW, cnt: %d"), + pAdapter->mc_addr_list.mc_cnt); + } } else { @@ -11397,6 +11366,10 @@ static int __iw_set_two_ints_getnone(struct net_device *dev, value[1], value[2]); if (value[1] == DUMP_DP_TRACE) adf_dp_trace_dump_all(value[2]); + else if (value[1] == ENABLE_DP_TRACE_LIVE_MODE) + adf_dp_trace_enable_live_mode(); + else if (value[1] == CLEAR_DP_TRACE_BUFFER) + adf_dp_trace_clear_buffer(); else hddLog(LOGE, "unexpected value for dump_dp_trace"); break; diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h index af55de9950a1..aac66ec46068 100644 --- a/CORE/MAC/inc/aniGlobal.h +++ b/CORE/MAC/inc/aniGlobal.h @@ -99,6 +99,8 @@ typedef struct sAniSirGlobal *tpAniSirGlobal; // New HAL API interface defs. #include "logDump.h" +#include "ol_txrx_ctrl_api.h" + //Check if this definition can actually move here from halInternal.h even for Volans. In that case //this featurization can be removed. #define PMAC_STRUCT( _hHal ) ( (tpAniSirGlobal)_hHal ) @@ -1131,6 +1133,8 @@ typedef struct sMacOpenParameters bool force_target_assert_enabled; uint16_t pkt_bundle_timer_value; uint16_t pkt_bundle_size; + + struct ol_tx_sched_wrr_ac_specs_t ac_specs[OL_TX_NUM_WMM_AC]; } tMacOpenParameters; typedef struct sHalMacStartParameters diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index ff53ffd151a7..bc3a01579cc6 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 11 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 92 +#define QWLAN_VERSION_BUILD 95 -#define QWLAN_VERSIONSTR "4.0.11.92" +#define QWLAN_VERSIONSTR "4.0.11.95" #define AR6320_REV1_VERSION 0x5000000 diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index b8373d4878a6..7b194bab0e73 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -1087,10 +1087,7 @@ static void ramdump_work_handler(struct work_struct *ramdump) goto out_fail; } - ramdump_scn->ramdump_size = DRAM_SIZE + IRAM_SIZE + AXI_SIZE; - ramdump_scn->ramdump_base = - vos_mem_malloc(ramdump_scn->ramdump_size); - + /* Buffer for ramdump should be pre-allocated when probing SDIO */ if (!ramdump_scn->ramdump_base) { pr_err("%s: fail to alloc mem for FW RAM dump\n", __func__); @@ -1141,13 +1138,6 @@ out_fail: #endif #endif -#ifdef TARGET_DUMP_FOR_NON_QC_PLATFORM - if (ramdump_scn->ramdump_base) { - vfree(ramdump_scn->ramdump_base); - ramdump_scn->ramdump_base = NULL; - ramdump_scn->ramdump_size = 0; - } -#endif vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, FALSE); return; } diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.c b/CORE/SERVICES/COMMON/adf/adf_trace.c index 8311147a7aec..0a4fddb95ff3 100644 --- a/CORE/SERVICES/COMMON/adf/adf_trace.c +++ b/CORE/SERVICES/COMMON/adf/adf_trace.c @@ -75,9 +75,10 @@ void adf_dp_trace_init(void) g_adf_dp_trace_data.head = INVALID_ADF_DP_TRACE_ADDR; g_adf_dp_trace_data.tail = INVALID_ADF_DP_TRACE_ADDR; g_adf_dp_trace_data.num = 0; - g_adf_dp_trace_data.proto_bitmap = 0; + g_adf_dp_trace_data.proto_bitmap = NBUF_PKT_TRAC_TYPE_DHCP | + NBUF_PKT_TRAC_TYPE_EAPOL; g_adf_dp_trace_data.no_of_record = 0; - g_adf_dp_trace_data.verbosity = ADF_DP_TRACE_VERBOSITY_DEFAULT; + g_adf_dp_trace_data.verbosity = ADF_DP_TRACE_VERBOSITY_LOW; g_adf_dp_trace_data.enable = true; for (i = 0; i < ADF_DP_TRACE_MAX; i++) @@ -155,17 +156,26 @@ uint8_t adf_dp_get_proto_bitmap(void) /** * adf_dp_trace_set_track() - Marks whether the packet needs to be traced * @nbuf : defines the netbuf + * @dir: direction * * Return: None */ -void adf_dp_trace_set_track(adf_nbuf_t nbuf) +void adf_dp_trace_set_track(adf_nbuf_t nbuf, enum adf_proto_dir dir) { + uint32_t count = 0; + spin_lock_bh(&l_dp_trace_lock); - g_adf_dp_trace_data.count++; + if (ADF_TX == dir) + count = ++g_adf_dp_trace_data.tx_count; + else if (ADF_RX == dir) + count = ++g_adf_dp_trace_data.rx_count; + if ((g_adf_dp_trace_data.no_of_record != 0) && - (g_adf_dp_trace_data.count % - g_adf_dp_trace_data.no_of_record == 0)) { - ADF_NBUF_SET_DP_TRACE(nbuf, 1); + (count % g_adf_dp_trace_data.no_of_record == 0)) { + if (ADF_TX == dir) + ADF_NBUF_CB_TX_DP_TRACE(nbuf) = 1; + else if (ADF_RX == dir) + ADF_NBUF_CB_RX_DP_TRACE(nbuf) = 1; } spin_unlock_bh(&l_dp_trace_lock); } @@ -183,10 +193,10 @@ static void dump_hex_trace(char *str, uint8_t *buf, uint8_t buf_len) uint8_t i; /* Dump the bytes in the last line */ - printk("%s: ", str); + adf_os_print("%s: ", str); for (i = 0; i < buf_len; i++) - printk("%02x ", buf[i]); - printk("\n"); + adf_os_print("%02x ", buf[i]); + adf_os_print("\n"); } /** @@ -206,32 +216,40 @@ const char *adf_dp_code_to_string(enum ADF_DP_TRACE_ID code) return "DHCP:"; case ADF_DP_TRACE_ARP_PACKET_RECORD: return "ARP:"; - case ADF_DP_TRACE_HDD_PACKET_PTR_RECORD: - return "HDD: PTR:"; - case ADF_DP_TRACE_HDD_PACKET_RECORD: - return "HDD: DATA:"; + case ADF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD: + return "HDD: TX: PTR:"; + case ADF_DP_TRACE_HDD_TX_PACKET_RECORD: + return "HDD: TX: DATA:"; case ADF_DP_TRACE_CE_PACKET_PTR_RECORD: - return "CE: PTR:"; + return "CE: TX: PTR:"; case ADF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD: - return "CE:F: PTR:"; + return "CE: TX: FAST: PTR:"; case ADF_DP_TRACE_FREE_PACKET_PTR_RECORD: - return "FREE: PTR:"; + return "FREE: TX: PTR:"; + case ADF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD: + return "HTT: RX: PTR:"; + case ADF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD: + return "HTT: RX: OF: PTR:"; + case ADF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD: + return "HDD: RX: PTR:"; case ADF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD: - return "TX:Q: PTR:"; + return "TXRX: TX: Q: PTR:"; case ADF_DP_TRACE_TXRX_PACKET_PTR_RECORD: - return "TX: PTR:"; + return "TXRX: TX: PTR:"; case ADF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD: - return "TX:F: PTR:"; + return "TXRX: TX: FAST: PTR:"; case ADF_DP_TRACE_HTT_PACKET_PTR_RECORD: - return "HTT: PTR:"; + return "HTT: TX: PTR:"; case ADF_DP_TRACE_HTC_PACKET_PTR_RECORD: - return "HTC: PTR:"; + return "HTC: TX: PTR:"; case ADF_DP_TRACE_HIF_PACKET_PTR_RECORD: - return "HIF: PTR:"; + return "HIF: TX: PTR:"; + case ADF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD: + return "TXRX: RX: PTR:"; case ADF_DP_TRACE_HDD_TX_TIMEOUT: - return "STA: TO:"; + return "HDD: STA: TO:"; case ADF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT: - return "SAP: TO:"; + return "HDD: SAP: TO:"; default: return "Invalid"; } @@ -247,9 +265,9 @@ const char *adf_dp_dir_to_str(enum adf_proto_dir dir) { switch (dir) { case ADF_TX: - return "->"; + return " --> "; case ADF_RX: - return "<-"; + return " <-- "; default: return "invalid"; } @@ -324,7 +342,8 @@ const char *adf_dp_subtype_to_str(enum adf_proto_subtype subtype) * * Return: true/false */ -bool adf_dp_enable_check(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code) +bool adf_dp_enable_check(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code, + enum adf_proto_dir dir) { /* Return when Dp trace is not enabled */ if (!g_adf_dp_trace_data.enable) @@ -335,7 +354,8 @@ bool adf_dp_enable_check(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code) if ((nbuf) && ((NBUF_GET_PACKET_TRACK(nbuf) != NBUF_TX_PKT_DATA_TRACK) || - (!ADF_NBUF_GET_DP_TRACE(nbuf)))) + ((dir == ADF_TX) && (ADF_NBUF_CB_TX_DP_TRACE(nbuf) == 0)) || + ((dir == ADF_RX) && (ADF_NBUF_CB_RX_DP_TRACE(nbuf) == 0)))) return false; return true; @@ -346,13 +366,15 @@ bool adf_dp_enable_check(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code) * @code: dptrace code * @data: data pointer * @size: size of buffer + * @print: print it in kmsg * * Return: none */ void adf_dp_add_record(enum ADF_DP_TRACE_ID code, - uint8_t *data, uint8_t size) + uint8_t *data, uint8_t size, bool print) { struct adf_dp_trace_record_s *rec = NULL; + int index; spin_lock_bh(&l_dp_trace_lock); @@ -381,6 +403,7 @@ void adf_dp_add_record(enum ADF_DP_TRACE_ID code, } rec = &g_adf_dp_trace_tbl[g_adf_dp_trace_data.tail]; + index = g_adf_dp_trace_data.tail; rec->code = code; rec->size = 0; if (data != NULL && size > 0) { @@ -394,18 +417,21 @@ void adf_dp_add_record(enum ADF_DP_TRACE_ID code, rec->time = adf_os_gettimestamp(); rec->pid = (in_interrupt() ? 0 : current->pid); spin_unlock_bh(&l_dp_trace_lock); + + if (g_adf_dp_trace_data.live_mode || print == true) + adf_dp_trace_cb_table[rec->code] (rec, index); } /** * adf_log_eapol_pkt() - log EAPOL packet * @session_id: vdev_id * @skb: skb pointer - * @event_type: event_type + * @dir: direction * * Return: true/false */ bool adf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, - uint8_t event_type) + enum adf_proto_dir dir) { enum adf_proto_subtype subtype; @@ -417,9 +443,11 @@ bool adf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, session_id, (skb->data + ADF_NBUF_SRC_MAC_OFFSET), (skb->data + ADF_NBUF_DEST_MAC_OFFSET), ADF_PROTO_TYPE_EAPOL, subtype, - event_type == ADF_RX ? - ADF_RX : ADF_TX)); - ADF_NBUF_SET_DP_TRACE(skb, 1); + dir)); + if (ADF_TX == dir) + ADF_NBUF_CB_TX_DP_TRACE(skb) = 1; + else if (ADF_RX == dir) + ADF_NBUF_CB_RX_DP_TRACE(skb) = 1; return true; } return false; @@ -429,12 +457,12 @@ bool adf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, * adf_log_dhcp_pkt() - log DHCP packet * @session_id: vdev_id * @skb: skb pointer - * @event_type: event_type + * @dir: direction * * Return: true/false */ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, - uint8_t event_type) + enum adf_proto_dir dir) { enum adf_proto_subtype subtype = ADF_PROTO_INVALID; @@ -446,9 +474,12 @@ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, session_id, (skb->data + ADF_NBUF_SRC_MAC_OFFSET), (skb->data + ADF_NBUF_DEST_MAC_OFFSET), ADF_PROTO_TYPE_DHCP, subtype, - event_type == ADF_RX ? - ADF_RX : ADF_TX)); - ADF_NBUF_SET_DP_TRACE(skb, 1); + dir)); + if (ADF_TX == dir) + ADF_NBUF_CB_TX_DP_TRACE(skb) = 1; + else if (ADF_RX == dir) + ADF_NBUF_CB_RX_DP_TRACE(skb) = 1; + return true; } return false; @@ -458,12 +489,12 @@ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, * adf_log_arp_pkt() - log ARP packet * @session_id: vdev_id * @skb: skb pointer - * @event_type: event_type + * @dir: direction * * Return: true/false */ bool adf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb, - uint8_t event_type) + enum adf_proto_dir dir) { enum adf_proto_subtype proto_subtype; @@ -476,9 +507,12 @@ bool adf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb, session_id, (skb->data + ADF_NBUF_SRC_MAC_OFFSET), (skb->data + ADF_NBUF_DEST_MAC_OFFSET), ADF_PROTO_TYPE_ARP, proto_subtype, - event_type == ADF_RX ? - ADF_RX : ADF_TX)); - ADF_NBUF_SET_DP_TRACE(skb, 1); + dir)); + if (ADF_TX == dir) + ADF_NBUF_CB_TX_DP_TRACE(skb) = 1; + else if (ADF_RX == dir) + ADF_NBUF_CB_RX_DP_TRACE(skb) = 1; + return true; } return false; @@ -488,20 +522,20 @@ bool adf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb, * adf_dp_trace_log_pkt() - log packet type enabled through iwpriv * @session_id: vdev_id * @skb: skb pointer - * @event_type: event type + * @dir: direction * * Return: none */ void adf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb, - uint8_t event_type) + enum adf_proto_dir dir) { if (adf_dp_get_proto_bitmap()) { if (adf_log_arp_pkt(session_id, - skb, event_type) == false) { + skb, dir) == false) { if (adf_log_dhcp_pkt(session_id, - skb, event_type) == false) { + skb, dir) == false) { if (adf_log_eapol_pkt(session_id, - skb, event_type) == false) { + skb, dir) == false) { return; } } @@ -522,10 +556,10 @@ void adf_dp_display_proto_pkt(struct adf_dp_trace_record_s *record, struct adf_dp_trace_proto_buf *buf = (struct adf_dp_trace_proto_buf *)record->data; - adf_os_print("%04d: %012llu: %s vdev_id %d\n", index, + adf_os_print("DPT: %04d: %012llu: %s vdev_id %d\n", index, record->time, adf_dp_code_to_string(record->code), buf->vdev_id); - adf_os_print("SA: " MAC_ADDRESS_STR " %s DA: " MAC_ADDRESS_STR + adf_os_print("DPT: SA: " MAC_ADDRESS_STR " %s DA: " MAC_ADDRESS_STR " Type %s Subtype %s\n", MAC_ADDR_ARRAY(buf->sa.bytes), adf_dp_dir_to_str(buf->dir), MAC_ADDR_ARRAY(buf->da.bytes), adf_dp_type_to_str(buf->type), @@ -551,7 +585,7 @@ void adf_dp_trace_proto_pkt(enum ADF_DP_TRACE_ID code, uint8_t vdev_id, struct adf_dp_trace_proto_buf buf; int buf_size = sizeof(struct adf_dp_trace_ptr_buf); - if (adf_dp_enable_check(NULL, code) == false) + if (adf_dp_enable_check(NULL, code, dir) == false) return; if (buf_size > ADF_DP_TRACE_RECORD_SIZE) @@ -563,7 +597,7 @@ void adf_dp_trace_proto_pkt(enum ADF_DP_TRACE_ID code, uint8_t vdev_id, buf.type = type; buf.subtype = subtype; buf.vdev_id = vdev_id; - adf_dp_add_record(code, (uint8_t *)&buf, buf_size); + adf_dp_add_record(code, (uint8_t *)&buf, buf_size, true); } /** @@ -579,9 +613,15 @@ void adf_dp_display_ptr_record(struct adf_dp_trace_record_s *record, struct adf_dp_trace_ptr_buf *buf = (struct adf_dp_trace_ptr_buf *)record->data; - adf_os_print("%04d: %012llu: %s msdu_id: %d, status: %d", index, - record->time, adf_dp_code_to_string(record->code), - buf->msdu_id, buf->status); + if (record->code == ADF_DP_TRACE_FREE_PACKET_PTR_RECORD) + adf_os_print("%04d: %012llu: %s msdu_id: %d, status: %d\n", index, + record->time, adf_dp_code_to_string(record->code), + buf->msdu_id, buf->status); + else + adf_os_print("%04d: %012llu: %s msdu_id: %d, vdev_id: %d\n", index, + record->time, adf_dp_code_to_string(record->code), + buf->msdu_id, buf->status); + dump_hex_trace("cookie", (uint8_t *)&buf->cookie, sizeof(buf->cookie)); } @@ -601,7 +641,7 @@ void adf_dp_trace_ptr(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code, struct adf_dp_trace_ptr_buf buf; int buf_size = sizeof(struct adf_dp_trace_ptr_buf); - if (adf_dp_enable_check(nbuf, code) == false) + if (adf_dp_enable_check(nbuf, code, ADF_TX) == false) return; if (buf_size > ADF_DP_TRACE_RECORD_SIZE) @@ -610,7 +650,7 @@ void adf_dp_trace_ptr(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code, adf_os_mem_copy(&buf.cookie, data, size); buf.msdu_id = msdu_id; buf.status = status; - adf_dp_add_record(code, (uint8_t *)&buf, buf_size); + adf_dp_add_record(code, (uint8_t *)&buf, buf_size, false); } /** @@ -623,7 +663,7 @@ void adf_dp_trace_ptr(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code, void adf_dp_display_record(struct adf_dp_trace_record_s *pRecord, uint16_t recIndex) { - adf_os_print("%04d: %012llu: %s", recIndex, + adf_os_print("DPT: %04d: %012llu: %s\n", recIndex, pRecord->time, adf_dp_code_to_string(pRecord->code)); switch (pRecord->code) { case ADF_DP_TRACE_HDD_TX_TIMEOUT: @@ -634,7 +674,7 @@ void adf_dp_display_record(struct adf_dp_trace_record_s *pRecord, VOS_TRACE(VOS_MODULE_ID_ADF, VOS_TRACE_LEVEL_ERROR, "HDD SoftAP TX Timeout\n"); break; - case ADF_DP_TRACE_HDD_PACKET_RECORD: + case ADF_DP_TRACE_HDD_TX_PACKET_RECORD: dump_hex_trace("DATA", pRecord->data, pRecord->size); break; default: @@ -652,12 +692,38 @@ void adf_dp_display_record(struct adf_dp_trace_record_s *pRecord, * Return: None */ void adf_dp_trace(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code, - uint8_t *data, uint8_t size) + uint8_t *data, uint8_t size, enum adf_proto_dir dir) { - if (adf_dp_enable_check(nbuf, code) == false) + + if (adf_dp_enable_check(nbuf, code, dir) == false) return; - adf_dp_add_record(code, data, size); + adf_dp_add_record(code, data, size, false); +} + +/** + * adf_dp_trace_enable_live_mode() - enable live mode + * + * Return: none + */ +void adf_dp_trace_enable_live_mode(void) +{ + g_adf_dp_trace_data.live_mode = 1; +} + +void adf_dp_trace_clear_buffer(void) +{ + g_adf_dp_trace_data.head = INVALID_ADF_DP_TRACE_ADDR; + g_adf_dp_trace_data.tail = INVALID_ADF_DP_TRACE_ADDR; + g_adf_dp_trace_data.num = 0; + g_adf_dp_trace_data.proto_bitmap = 0; + g_adf_dp_trace_data.no_of_record = 0; + g_adf_dp_trace_data.verbosity = ADF_DP_TRACE_VERBOSITY_DEFAULT; + g_adf_dp_trace_data.enable = true; + + memset(g_adf_dp_trace_tbl, 0, + MAX_ADF_DP_TRACE_RECORDS * sizeof(struct adf_dp_trace_record_s)); + } /** diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.h b/CORE/SERVICES/COMMON/adf/adf_trace.h index b426edd26ae2..e01cfbc17f7c 100644 --- a/CORE/SERVICES/COMMON/adf/adf_trace.h +++ b/CORE/SERVICES/COMMON/adf/adf_trace.h @@ -56,6 +56,11 @@ #define ADF_DP_TRACE_VERBOSITY_LOW 1 #define ADF_DP_TRACE_VERBOSITY_DEFAULT 0 +#define DUMP_DP_TRACE 0 +#define ENABLE_DP_TRACE_LIVE_MODE 1 +#define CLEAR_DP_TRACE_BUFFER 2 + + /** * struct adf_mac_addr - mac address array * @bytes: MAC address bytes @@ -68,8 +73,8 @@ struct adf_mac_addr { * enum ADF_DP_TRACE_ID - Generic ID to identify various events in data path * @ADF_DP_TRACE_INVALID: Invalid ID * @ADF_DP_TRACE_DROP_PACKET_RECORD: Dropped packet stored with this id - * @ADF_DP_TRACE_HDD_PACKET_PTR_RECORD: nbuf->data ptr of HDD - * @ADF_DP_TRACE_HDD_PACKET_RECORD: nbuf->data stored with this id + * @ADF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD: nbuf->data ptr of HDD + * @ADF_DP_TRACE_HDD_TX_PACKET_RECORD: nbuf->data stored with this id * @ADF_DP_TRACE_CE_PACKET_PTR_RECORD: nbuf->data ptr of CE * @ADF_DP_TRACE_CE_PACKET_RECORD: nbuf->data stored with this id * @ADF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD: nbuf->data ptr of txrx queue @@ -91,10 +96,13 @@ enum ADF_DP_TRACE_ID { ADF_DP_TRACE_DEFAULT_VERBOSITY, ADF_DP_TRACE_HDD_TX_TIMEOUT, ADF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT, - ADF_DP_TRACE_HDD_PACKET_PTR_RECORD, + ADF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD, ADF_DP_TRACE_CE_PACKET_PTR_RECORD, ADF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD, ADF_DP_TRACE_FREE_PACKET_PTR_RECORD, + ADF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD, + ADF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD, + ADF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD, ADF_DP_TRACE_LOW_VERBOSITY, ADF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD, ADF_DP_TRACE_TXRX_PACKET_PTR_RECORD, @@ -102,8 +110,9 @@ enum ADF_DP_TRACE_ID { ADF_DP_TRACE_HTT_PACKET_PTR_RECORD, ADF_DP_TRACE_HTC_PACKET_PTR_RECORD, ADF_DP_TRACE_HIF_PACKET_PTR_RECORD, + ADF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD, ADF_DP_TRACE_MED_VERBOSITY, - ADF_DP_TRACE_HDD_PACKET_RECORD, + ADF_DP_TRACE_HDD_TX_PACKET_RECORD, ADF_DP_TRACE_HIGH_VERBOSITY, ADF_DP_TRACE_MAX }; @@ -166,7 +175,9 @@ struct s_adf_dp_trace_data { uint8_t no_of_record; uint8_t verbosity; bool enable; - uint32_t count; + uint32_t tx_count; + uint32_t rx_count; + bool live_mode; }; /* Function declarations and documenation */ @@ -174,9 +185,9 @@ struct s_adf_dp_trace_data { void adf_dp_trace_init(void); void adf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records, uint8_t verbosity); -void adf_dp_trace_set_track(adf_nbuf_t nbuf); +void adf_dp_trace_set_track(adf_nbuf_t nbuf, enum adf_proto_dir dir); void adf_dp_trace(adf_nbuf_t nbuf, enum ADF_DP_TRACE_ID code, - uint8_t *data, uint8_t size); + uint8_t *data, uint8_t size, enum adf_proto_dir dir); void adf_dp_trace_dump_all(uint32_t count); typedef void (*tp_adf_dp_trace_cb)(struct adf_dp_trace_record_s* , uint16_t); void adf_dp_display_record(struct adf_dp_trace_record_s *record, @@ -194,7 +205,9 @@ adf_dp_trace_proto_pkt(enum ADF_DP_TRACE_ID code, uint8_t vdev_id, void adf_dp_display_proto_pkt(struct adf_dp_trace_record_s *record, uint16_t index); void adf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb, - uint8_t event_type); + enum adf_proto_dir dir); +void adf_dp_trace_enable_live_mode(void); +void adf_dp_trace_clear_buffer(void); #else static inline void adf_dp_trace_init(void) @@ -206,12 +219,14 @@ static inline void adf_dp_trace_set_value(uint8_t proto_bitmap, { } -static inline void adf_dp_trace_set_track(adf_nbuf_t nbuf) +static inline void adf_dp_trace_set_track(adf_nbuf_t nbuf, + enum adf_proto_dir dir) { } static inline void adf_dp_trace(adf_nbuf_t nbuf, - enum ADF_DP_TRACE_ID code, uint8_t *data, uint8_t size) + enum ADF_DP_TRACE_ID code, uint8_t *data, uint8_t size, + enum adf_proto_dir dir) { } @@ -254,10 +269,19 @@ adf_dp_display_proto_pkt(struct adf_dp_trace_record_s *record, } static inline void adf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb, - uint8_t event_type) + enum adf_proto_dir dir) { } +static inline +void adf_dp_trace_enable_live_mode(void) +{ +} + +static inline +void adf_dp_trace_clear_buffer(void) +{ +} #endif #endif /* __ADF_TRACE_H */ diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h index 1a48042bd43e..70fd459f891b 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h @@ -65,6 +65,17 @@ typedef void (*__adf_nbuf_callback_fn) (struct sk_buff *skb); #define CVG_NBUF_MAX_EXTRA_FRAGS 2 typedef void (*adf_nbuf_trace_update_t)(char *); +struct nbuf_rx_cb { + uint8_t dp_trace:1, + reserved:7; + uint8_t packet_trace; +}; + +#define ADF_NBUF_CB_RX_DP_TRACE(skb) \ + (((struct nbuf_rx_cb*)((skb)->cb))->dp_trace) + +#define ADF_NBUF_CB_RX_PACKET_TRACE(skb) \ + (((struct nbuf_rx_cb*)((skb)->cb))->packet_trace) struct cvg_nbuf_cb { /* @@ -88,9 +99,10 @@ struct cvg_nbuf_cb { * Store info for data path tracing */ struct { - uint8_t packet_state; - uint8_t packet_track; - uint8_t dp_trace; + uint8_t packet_state: 4; + uint8_t packet_track: 2; + uint8_t dp_trace: 1; + uint8_t dp_trace_reserved: 1; } trace; /* @@ -218,10 +230,7 @@ struct cvg_nbuf_cb { #define NBUF_UPDATE_TX_PKT_COUNT(skb, PACKET_STATE) \ adf_nbuf_set_state(skb, PACKET_STATE) -#define ADF_NBUF_SET_DP_TRACE(skb, enable) \ - (((struct cvg_nbuf_cb *)((skb)->cb))->trace.dp_trace \ - = enable) -#define ADF_NBUF_GET_DP_TRACE(skb) \ +#define ADF_NBUF_CB_TX_DP_TRACE(skb) \ (((struct cvg_nbuf_cb *)((skb)->cb))->trace.dp_trace) #define __adf_nbuf_get_num_frags(skb) \ diff --git a/CORE/SERVICES/COMMON/ol_cfg.h b/CORE/SERVICES/COMMON/ol_cfg.h index 1aa590eb8a77..f6c562342783 100644 --- a/CORE/SERVICES/COMMON/ol_cfg.h +++ b/CORE/SERVICES/COMMON/ol_cfg.h @@ -39,6 +39,8 @@ #include "wlan_tgt_def_config.h" #endif +#include "ol_txrx_ctrl_api.h" + /** * @brief format of data frames delivered to/from the WLAN driver by/to the OS */ @@ -92,6 +94,8 @@ struct txrx_pdev_cfg_t { #endif /* IPA_UC_OFFLOAD */ uint16_t pkt_bundle_timer_value; uint16_t pkt_bundle_size; + + struct ol_tx_sched_wrr_ac_specs_t ac_specs[OL_TX_NUM_WMM_AC]; }; /** @@ -537,4 +541,15 @@ int ol_cfg_get_bundle_size(ol_pdev_handle pdev) } #endif + +int ol_cfg_get_wrr_skip_weight(ol_pdev_handle pdev, int ac); + +uint32_t ol_cfg_get_credit_threshold(ol_pdev_handle pdev, int ac); + +uint16_t ol_cfg_get_send_limit(ol_pdev_handle pdev, int ac); + +int ol_cfg_get_credit_reserve(ol_pdev_handle pdev, int ac); + +int ol_cfg_get_discard_weight(ol_pdev_handle pdev, int ac); + #endif /* _OL_CFG__H_ */ diff --git a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h index 260c7b70b65f..cd2e7fed0ecd 100644 --- a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h +++ b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h @@ -247,12 +247,12 @@ ol_txrx_peer_update(ol_txrx_vdev_handle data_vdev, u_int8_t *peer_mac, ol_txrx_peer_update_select_t select); enum { - OL_TX_WMM_AC_BE, - OL_TX_WMM_AC_BK, - OL_TX_WMM_AC_VI, - OL_TX_WMM_AC_VO, + OL_TX_WMM_AC_BE, + OL_TX_WMM_AC_BK, + OL_TX_WMM_AC_VI, + OL_TX_WMM_AC_VO, - OL_TX_NUM_WMM_AC + OL_TX_NUM_WMM_AC }; /** @@ -967,6 +967,30 @@ ol_txrx_peer_stats_copy( #define ol_txrx_peer_stats_copy(pdev, peer, stats) A_ERROR /* failure */ #endif /* QCA_ENABLE_OL_TXRX_PEER_STATS */ +/** + * struct ol_tx_sched_wrr_ac_specs_t - the wrr ac specs params structure + * @wrr_skip_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs. + * wrr_skip_weight + * @credit_threshold: map to ol_tx_sched_wrr_adv_category_info_t.specs. + * credit_threshold + * @send_limit: map to ol_tx_sched_wrr_adv_category_info_t.specs. + * send_limit + * @credit_reserve: map to ol_tx_sched_wrr_adv_category_info_t.specs. + * credit_reserve + * @discard_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs. + * discard_weight + * + * This structure is for wrr ac specs params set from user, it will update + * its content corresponding to the ol_tx_sched_wrr_adv_category_info_t.specs. + */ +struct ol_tx_sched_wrr_ac_specs_t { + int wrr_skip_weight; + uint32_t credit_threshold; + uint16_t send_limit; + int credit_reserve; + int discard_weight; +}; + /* Config parameters for txrx_pdev */ struct txrx_pdev_cfg_param_t { u_int8_t is_full_reorder_offload; @@ -982,6 +1006,8 @@ struct txrx_pdev_cfg_param_t { u_int32_t uc_tx_partition_base; uint16_t pkt_bundle_timer_value; uint16_t pkt_bundle_size; + + struct ol_tx_sched_wrr_ac_specs_t ac_specs[OL_TX_NUM_WMM_AC]; }; /** diff --git a/CORE/SERVICES/COMMON/wlan_module_ids.h b/CORE/SERVICES/COMMON/wlan_module_ids.h index 5573f75d28b2..ac69a90da7e2 100644 --- a/CORE/SERVICES/COMMON/wlan_module_ids.h +++ b/CORE/SERVICES/COMMON/wlan_module_ids.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2015 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. * @@ -32,72 +32,73 @@ /* Wlan module ids , global across all the modules */ typedef enum { WLAN_MODULE_ID_MIN = 0, - WLAN_MODULE_INF = WLAN_MODULE_ID_MIN, /* 0x00 */ - WLAN_MODULE_WMI, - WLAN_MODULE_STA_PWRSAVE, - WLAN_MODULE_WHAL, - WLAN_MODULE_COEX, - WLAN_MODULE_ROAM, - WLAN_MODULE_RESMGR_CHAN_MANAGER, - WLAN_MODULE_RESMGR, - WLAN_MODULE_VDEV_MGR, - WLAN_MODULE_SCAN, - WLAN_MODULE_RATECTRL, - WLAN_MODULE_AP_PWRSAVE, - WLAN_MODULE_BLOCKACK, - WLAN_MODULE_MGMT_TXRX, - WLAN_MODULE_DATA_TXRX, - WLAN_MODULE_HTT, - WLAN_MODULE_HOST, /* 0x10 */ - WLAN_MODULE_BEACON, - WLAN_MODULE_OFFLOAD, - WLAN_MODULE_WAL, - WAL_MODULE_DE, - WLAN_MODULE_PCIELP, - WLAN_MODULE_RTT, - WLAN_MODULE_RESOURCE, - WLAN_MODULE_DCS, - WLAN_MODULE_CACHEMGR, - WLAN_MODULE_ANI, - WLAN_MODULE_P2P, - WLAN_MODULE_CSA, - WLAN_MODULE_NLO, - WLAN_MODULE_CHATTER, - WLAN_MODULE_WOW, - WLAN_MODULE_WAL_VDEV, /* 0x20 */ - WLAN_MODULE_WAL_PDEV, - WLAN_MODULE_TEST, - WLAN_MODULE_STA_SMPS, - WLAN_MODULE_SWBMISS, - WLAN_MODULE_WMMAC, - WLAN_MODULE_TDLS, - WLAN_MODULE_HB, - WLAN_MODULE_TXBF, - WLAN_MODULE_BATCH_SCAN, - WLAN_MODULE_THERMAL_MGR, - WLAN_MODULE_PHYERR_DFS, - WLAN_MODULE_RMC, - WLAN_MODULE_STATS, - WLAN_MODULE_NAN, - WLAN_MODULE_IBSS_PWRSAVE, - WLAN_MODULE_HIF_UART, /* 0x30 */ - WLAN_MODULE_LPI, - WLAN_MODULE_EXTSCAN, - WLAN_MODULE_UNIT_TEST, - WLAN_MODULE_MLME, - WLAN_MODULE_SUPPL, - WLAN_MODULE_ERE, - WLAN_MODULE_OCB, - WLAN_MODULE_RSSI_MONITOR, - WLAN_MODULE_WPM, - WLAN_MODULE_CSS, /* 0x3a */ - WLAN_MODULE_PPS, /* 0x3b */ - WLAN_MODULE_SCAN_CH_PREDICT, /* 0x3c */ - WLAN_MODULE_MAWC, - WLAN_MODULE_CMC_QMIC, /* 0x3e */ - WLAN_MODULE_EGAP, /* 0x3f */ - WLAN_MODULE_NAN20, - WLAN_MODULE_QBOOST, + WLAN_MODULE_INF = WLAN_MODULE_ID_MIN, /* 0x0 */ + WLAN_MODULE_WMI, /* 0x1 */ + WLAN_MODULE_STA_PWRSAVE, /* 0x2 */ + WLAN_MODULE_WHAL, /* 0x3 */ + WLAN_MODULE_COEX, /* 0x4 */ + WLAN_MODULE_ROAM, /* 0x5 */ + WLAN_MODULE_RESMGR_CHAN_MANAGER, /* 0x6 */ + WLAN_MODULE_RESMGR, /* 0x7 */ + WLAN_MODULE_VDEV_MGR, /* 0x8 */ + WLAN_MODULE_SCAN, /* 0x9 */ + WLAN_MODULE_RATECTRL, /* 0xa */ + WLAN_MODULE_AP_PWRSAVE, /* 0xb */ + WLAN_MODULE_BLOCKACK, /* 0xc */ + WLAN_MODULE_MGMT_TXRX, /* 0xd */ + WLAN_MODULE_DATA_TXRX, /* 0xe */ + WLAN_MODULE_HTT, /* 0xf */ + WLAN_MODULE_HOST, /* 0x10 */ + WLAN_MODULE_BEACON, /* 0x11 */ + WLAN_MODULE_OFFLOAD, /* 0x12 */ + WLAN_MODULE_WAL, /* 0x13 */ + WAL_MODULE_DE, /* 0x14 */ + WLAN_MODULE_PCIELP, /* 0x15 */ + WLAN_MODULE_RTT, /* 0x16 */ + WLAN_MODULE_RESOURCE, /* 0x17 */ + WLAN_MODULE_DCS, /* 0x18 */ + WLAN_MODULE_CACHEMGR, /* 0x19 */ + WLAN_MODULE_ANI, /* 0x1a */ + WLAN_MODULE_P2P, /* 0x1b */ + WLAN_MODULE_CSA, /* 0x1c */ + WLAN_MODULE_NLO, /* 0x1d */ + WLAN_MODULE_CHATTER, /* 0x1e */ + WLAN_MODULE_WOW, /* 0x1f */ + WLAN_MODULE_WAL_VDEV, /* 0x20 */ + WLAN_MODULE_WAL_PDEV, /* 0x21 */ + WLAN_MODULE_TEST, /* 0x22 */ + WLAN_MODULE_STA_SMPS, /* 0x23 */ + WLAN_MODULE_SWBMISS, /* 0x24 */ + WLAN_MODULE_WMMAC, /* 0x25 */ + WLAN_MODULE_TDLS, /* 0x26 */ + WLAN_MODULE_HB, /* 0x27 */ + WLAN_MODULE_TXBF, /* 0x28 */ + WLAN_MODULE_BATCH_SCAN, /* 0x29 */ + WLAN_MODULE_THERMAL_MGR, /* 0x2a */ + WLAN_MODULE_PHYERR_DFS, /* 0x2b */ + WLAN_MODULE_RMC, /* 0x2c */ + WLAN_MODULE_STATS, /* 0x2d */ + WLAN_MODULE_NAN, /* 0x2e */ + WLAN_MODULE_IBSS_PWRSAVE, /* 0x2f */ + WLAN_MODULE_HIF_UART, /* 0x30 */ + WLAN_MODULE_LPI, /* 0x31 */ + WLAN_MODULE_EXTSCAN, /* 0x32 */ + WLAN_MODULE_UNIT_TEST, /* 0x33 */ + WLAN_MODULE_MLME, /* 0x34 */ + WLAN_MODULE_SUPPL, /* 0x35 */ + WLAN_MODULE_ERE, /* 0x36 */ + WLAN_MODULE_OCB, /* 0x37 */ + WLAN_MODULE_RSSI_MONITOR, /* 0x38 */ + WLAN_MODULE_WPM, /* 0x39 */ + WLAN_MODULE_CSS, /* 0x3a */ + WLAN_MODULE_PPS, /* 0x3b */ + WLAN_MODULE_SCAN_CH_PREDICT, /* 0x3c */ + WLAN_MODULE_MAWC, /* 0x3d */ + WLAN_MODULE_CMC_QMIC, /* 0x3e */ + WLAN_MODULE_EGAP, /* 0x3f */ + WLAN_MODULE_NAN20, /* 0x40 */ + WLAN_MODULE_QBOOST, /* 0x41 */ + WLAN_MODULE_P2P_LISTEN_OFFLOAD, /* 0x42 */ WLAN_MODULE_ID_MAX, WLAN_MODULE_ID_INVALID = WLAN_MODULE_ID_MAX, diff --git a/CORE/SERVICES/COMMON/wmi_services.h b/CORE/SERVICES/COMMON/wmi_services.h index 102c0210972e..37dc6f93eb1c 100644 --- a/CORE/SERVICES/COMMON/wmi_services.h +++ b/CORE/SERVICES/COMMON/wmi_services.h @@ -160,6 +160,12 @@ typedef enum { WMI_SERVICE_MESH_11S, WMI_SERVICE_HALF_RATE_QUARTER_RATE_SUPPORT, /* FW+HW supports 10 MHz (half rate) and 5 MHz (quarter rate) channel bandwidth */ WMI_SERVICE_VDEV_RX_FILTER, /* Support per-vdev specs of which rx frames to filter out */ + WMI_SERVICE_P2P_LISTEN_OFFLOAD_SUPPORT, + /* + * FW supports marking the first data packet which wakes + * the host from suspend + */ + WMI_SERVICE_MARK_FIRST_WAKEUP_PACKET, WMI_MAX_SERVICE=128 /* max service */ } WMI_SERVICE; diff --git a/CORE/SERVICES/COMMON/wmi_tlv_defs.h b/CORE/SERVICES/COMMON/wmi_tlv_defs.h index 4fb2f7cfa854..640244e4d260 100644 --- a/CORE/SERVICES/COMMON/wmi_tlv_defs.h +++ b/CORE/SERVICES/COMMON/wmi_tlv_defs.h @@ -711,6 +711,9 @@ typedef enum { _place_holder_tlv_tag_2, WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats, WMITLV_TAG_STRUC_wmi_rssi_stats, + WMITLV_TAG_STRUC_wmi_p2p_lo_start_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_p2p_lo_stop_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_p2p_lo_stopped_event_fixed_param, } WMITLV_TAG_ID; /* @@ -998,6 +1001,8 @@ typedef enum { OP(WMI_WOW_SET_ACTION_WAKE_UP_CMDID) \ OP(WMI_PEER_BWF_REQUEST_CMDID) \ OP(WMI_DBGLOG_TIME_STAMP_SYNC_CMDID) \ + OP(WMI_P2P_LISTEN_OFFLOAD_START_CMDID) \ + OP(WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID) \ /* add new CMD_LIST elements above this line */ /* @@ -1148,6 +1153,7 @@ typedef enum { OP(WMI_PDEV_HW_MODE_TRANSITION_EVENTID) \ OP(WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID) \ OP(WMI_RADIO_TX_POWER_LEVEL_STATS_EVENTID) \ + OP(WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID) \ /* add new EVT_LIST elements above this line */ @@ -1417,6 +1423,23 @@ WMITLV_CREATE_PARAM_STRUC(WMI_P2P_SET_VENDOR_IE_DATA_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_p2p_set_oppps_cmd_fixed_param, wmi_p2p_set_oppps_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_P2P_SET_OPPPS_PARAM_CMDID); +/* P2P set listen offload start parameters Cmd */ +#define WMITLV_TABLE_WMI_P2P_LISTEN_OFFLOAD_START_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_p2p_lo_start_cmd_fixed_param, wmi_p2p_lo_start_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, device_types_data, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, prob_resp_data, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_P2P_LISTEN_OFFLOAD_START_CMDID); + +/* P2P set listen offload stop parameters Cmd */ +#define WMITLV_TABLE_WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_p2p_lo_stop_cmd_fixed_param, wmi_p2p_lo_stop_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID); + +/* P2P set listen offload stopped parameters Event */ +#define WMITLV_TABLE_WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_p2p_lo_stopped_event_fixed_param, wmi_p2p_lo_stopped_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID); + /* Pdev set channel Cmd */ #define WMITLV_TABLE_WMI_PDEV_SET_CHANNEL_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_channel, wmi_channel, chan, WMITLV_SIZE_FIX) diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h index 5a4dc3f68f48..96d3a4ca2aaf 100644 --- a/CORE/SERVICES/COMMON/wmi_unified.h +++ b/CORE/SERVICES/COMMON/wmi_unified.h @@ -78,7 +78,7 @@ extern "C" { #define MAX_TX_RATE_VALUES 10 /*Max Tx Rates*/ #define MAX_RSSI_VALUES 10 /*Max Rssi values*/ -#define MAX_CHAINS 8 +#define WMI_MAX_CHAINS 8 /* The WLAN_MAX_AC macro cannot be changed without breaking WMI compatibility. */ @@ -551,8 +551,12 @@ typedef enum { WMI_P2P_DISC_OFFLOAD_APPIE_CMDID, /** set the BSSID/device name pattern of p2p find offload */ WMI_P2P_DISC_OFFLOAD_PATTERN_CMDID, - /** set OppPS related parameters **/ - WMI_P2P_SET_OPPPS_PARAM_CMDID, + /** set OppPS related parameters **/ + WMI_P2P_SET_OPPPS_PARAM_CMDID, + /** set listen offload start related parameters */ + WMI_P2P_LISTEN_OFFLOAD_START_CMDID, + /** set listen offload stop related parameters */ + WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID, /** AP power save specific config */ /** set AP power save specific param */ @@ -1103,9 +1107,10 @@ typedef enum { /** P2P disc found */ WMI_P2P_DISC_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_P2P), - /*send noa info to host when noa is changed for beacon tx offload enable*/ WMI_P2P_NOA_EVENTID, + /** send p2p listen offload stopped event with different reason */ + WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID, /** Send EGAP Info to host */ WMI_AP_PS_EGAP_INFO_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_AP_PS), @@ -1393,6 +1398,7 @@ WMI_CHANNEL_CHANGE_CAUSE_CSA, #define WMI_CHAN_FLAG_HALF_RATE 14 /* Indicates half rate channel */ #define WMI_CHAN_FLAG_QUARTER_RATE 15 /* Indicates quarter rate channel */ #define WMI_CHAN_FLAG_DFS_CFREQ2 16 /* Enable radar event reporting for sec80 in VHT80p80 */ +#define WMI_CHAN_FLAG_ALLOW_HE 17 /* HE (11ax) is allowed on this channel */ #define WMI_SET_CHANNEL_FLAG(pwmi_channel,flag) do { \ (pwmi_channel)->info |= (1 << flag); \ @@ -1563,12 +1569,12 @@ enum { * we pack PPET16 and PPT8 for four RU's in one element of array. * * ppet16_ppet8_ru3_ru0 array element 0 holds: - * | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | + * | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | *rsvd |NSS1,RU4|NSS1,RU4|NSS1,RU3|NSS1,RU3|NSS1,RU2|NSS1,RU2|NSS1,RU1|NSS1,RU1| *31:23| 22:20 | 19:17 | 17:15 | 14:12 | 11:9 | 8:6 | 5:3 | 2:0 | * * ppet16_ppet8_ru3_ru0 array element 1 holds: - * | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | + * | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | PPET8 | PPET16 | *rsvd |NSS2,RU4|NSS2,RU4|NSS2,RU3|NSS2,RU3|NSS2,RU2|NSS2,RU2|NSS2,RU1|NSS2,RU1| *31:23| 22:20 | 19:17 | 17:15 | 14:12 | 11:9 | 8:6 | 5:3 | 2:0 | * @@ -1579,22 +1585,22 @@ enum { * Note that in these macros, "ru" is one-based, not zero-based, while * nssm1 is zero-based. */ -#define WMI_SET_PPET8(ppet16_ppet8_ru3_ru0, ppet, ru, nssm1) \ +#define WMI_SET_PPET16(ppet16_ppet8_ru3_ru0, ppet, ru, nssm1) \ do { \ ppet16_ppet8_ru3_ru0[nssm1] &= ~(7 << (((ru-1)%4)*6)); \ ppet16_ppet8_ru3_ru0[nssm1] |= ((ppet&7) << (((ru-1)%4)*6)); \ } while (0) -#define WMI_GET_PPET8(ppet16_ppet8_ru3_ru0, ru, nssm1) \ +#define WMI_GET_PPET16(ppet16_ppet8_ru3_ru0, ru, nssm1) \ ((ppet16_ppet8_ru3_ru0[nssm1] >> (((ru-1)%4)*6))&7) -#define WMI_SET_PPET16(ppet16_ppet8_ru3_ru0, ppet, ru, nssm1) \ +#define WMI_SET_PPET8(ppet16_ppet8_ru3_ru0, ppet, ru, nssm1) \ do { \ ppet16_ppet8_ru3_ru0[nssm1] &= ~(7 << (((ru-1)%4)*6+3)); \ ppet16_ppet8_ru3_ru0[nssm1] |= ((ppet&7) << (((ru-1)%4)*6+3)); \ } while (0) -#define WMI_GET_PPET16(ppet16_ppet8_ru3_ru0, ru, nssm1) \ +#define WMI_GET_PPET8(ppet16_ppet8_ru3_ru0, ru, nssm1) \ ((ppet16_ppet8_ru3_ru0[nssm1] >> (((ru-1)%4)*6+3))&7) typedef struct _wmi_ppe_threshold { @@ -4670,8 +4676,8 @@ typedef struct { /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_rssi_stats */ A_UINT32 tlv_header; A_UINT32 vdev_id; - A_INT32 rssi_avg_beacon[MAX_CHAINS]; - A_INT32 rssi_avg_data[MAX_CHAINS]; + A_INT32 rssi_avg_beacon[WMI_MAX_CHAINS]; + A_INT32 rssi_avg_data[WMI_MAX_CHAINS]; wmi_mac_addr peer_macaddr; } wmi_rssi_stats; @@ -5280,6 +5286,46 @@ typedef enum { /* vdev-specific mgmt tx power in dBm units (signed integer value) */ WMI_VDEV_PARAM_MGMT_TX_POWER, + + /* + * === ADD NEW VDEV PARAM TYPES ABOVE THIS LINE === + * The below vdev param types are used for prototyping, and are + * prone to change. + */ + WMI_VDEV_PARAM_PROTOTYPE = 0x8000, + /* 11AX SPECIFIC defines */ + WMI_VDEV_PARAM_BSS_COLOR, + /* In case of AP this will enable / disable MU-MIMO mode */ + WMI_VDEV_PARAM_SET_UL_MU_MIMO, + /* + * set fragmentation level of the vdev's peers. + * Values can be WMI_HE_FRAG_SUPPORT_LEVEL0..WMI_HE_FRAG_SUPPORT_LEVEL3 + */ + WMI_VDEV_PARAM_SET_FRAG_LEVEL, + /* + * control different features of HEControl: + * Bit 0:- 1/0-> Enable/Disable transmssion of UL scheduling. + * Bit 1:- 1/0-> Enable / disable honoring of ROMI from a peer. + * Applicable in AP mode only. + */ + WMI_VDEV_PARAM_SET_HECONTROL, + /* + * enable / disable trigger access for a AP vdev's peers. + * For a STA mode vdev this will enable/disable triggered access + * and enable/disable Multi User mode of operation. + */ + WMI_VDEV_PARAM_SET_HEMU_MODE, + /* + * For Tx OFDMA this will set values of CP length or guard interval + * to be + * 0: Auto + * 1: 0.8 us + * 2: 1.6 us + * 3: 3.2 us + * Similar to Guard Interval + */ + WMI_VDEV_PARAM_TX_OFDMA_CPLEN, + /*=== END VDEV_PARAM_PROTOTYPE SECTION ===*/ } WMI_VDEV_PARAM; /* vdev capabilities bit mask */ @@ -7645,6 +7691,68 @@ typedef struct { WMI_F_RMW((hdr)->oppps_attr, (v) & 0x7f, \ WMI_UNIFIED_OPPPS_ATTR_CTWIN); +typedef enum p2p_lo_start_ctrl_flags_e { + /* flush prob. req when host is awake */ + P2P_LO_START_CTRL_FLAG_FLUSH_LISTEN_RESULT = 1 << 0, +} p2p_lo_start_ctrl_flags; + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 ctl_flags; /* refer to enum_p2p_lo_start_ctrl_flags_e */ + A_UINT32 channel; /* MHz */ + A_UINT32 period; /* ms */ + A_UINT32 interval; /* ms, interval should be larger than period */ + A_UINT32 count; /* 0 means forever */ + /* + * device_types_len specifies the number of bytes in the + * device_types_data[] byte-array TLV that follows this TLV. + * The data in device_types_data[] is in 8-byte elements, so + * device_types_len will be a multiple of 8. + */ + A_UINT32 device_types_len; + /* + * prob_resp_len specifies the number of bytes in the + * prob_resp_data[] byte-array TLV that follows this TLV. + */ + A_UINT32 prob_resp_len; + /* + * Two other TLVs follow this TLV: + * A_UINT8 device_types_data[device_types_len]; + * A_UINT8 prob_resp_data[prob_resp_len]; + * The information in device_types_data[] and prob_resp_data[] + * needs to be provided to the target in over-the-air byte order. + * On a big-endian host, if device_types_data and prob_resp_data + * are initially in the correct over-the-air byte order, + * the automatic byteswap for endianness-correction during WMI + * message download will mess up the byte order. + * Thus, a big-endian host needs to explicitly byte-swap the bytes + * within each quad-byte segment of device_types_data[] and + * prob_resp_data[], so that the automatic byte-swap applied during + * WMI download from a big-endian host to the little-endian target + * will restore device_types_data and prob_resp_data into the + * correct byte ordering. + */ +} wmi_p2p_lo_start_cmd_fixed_param; + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 vdev_id; +} wmi_p2p_lo_stop_cmd_fixed_param; + +typedef enum p2p_lo_stopped_reason_e { + P2P_LO_STOPPED_REASON_COMPLETE = 0, /* finished as scheduled */ + P2P_LO_STOPPED_REASON_RECV_STOP_CMD, /* host stops it */ + P2P_LO_STOPPED_REASON_INVALID_LO_PAR, /* invalid listen offload par */ + P2P_LO_STOPPED_REASON_FW_NOT_SUPPORT, /* vdev cannot support it right now */ +} p2p_lo_stopped_reason; + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 reason;/* refer to p2p_lo_stopped_reason_e */ +} wmi_p2p_lo_stopped_event_fixed_param; + typedef struct { A_UINT32 time32; //upper 32 bits of time stamp A_UINT32 time0; //lower 32 bits of time stamp @@ -7843,6 +7951,7 @@ typedef enum wake_reason_e { WOW_REASON_OEM_RESPONSE_EVENT = WOW_REASON_NAN_RTT, /* reuse deprecated reason value */ WOW_REASON_TDLS_CONN_TRACKER_EVENT, WOW_REASON_CRITICAL_LOG, + WOW_REASON_P2P_LISTEN_OFFLOAD, WOW_REASON_DEBUG_TEST = 0xFF, } WOW_WAKE_REASON_TYPE; @@ -8026,11 +8135,16 @@ typedef struct { A_UINT32 pattern_type; }WMI_WOW_DEL_PATTERN_CMD_fixed_param; +#define WMI_WOW_MAX_EVENT_BM_LEN 4 + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_WMI_WOW_ADD_DEL_EVT_CMD_fixed_param */ A_UINT32 vdev_id; A_UINT32 is_add; - A_UINT32 event_bitmap; + union { + A_UINT32 event_bitmap; + A_UINT32 event_bitmaps[WMI_WOW_MAX_EVENT_BM_LEN]; + }; }WMI_WOW_ADD_DEL_EVT_CMD_fixed_param; /* @@ -9249,6 +9363,11 @@ enum wmm_ac_downgrade_policy { WMM_AC_DOWNGRADE_INVALID, }; +/* WMM EDCA Params type */ +#define WMM_PARAM_TYPE_LEGACY 0 +/* Relaxed EDCA parameters for 11ax to be used in case of triggered access */ +#define WMM_PARAM_TYPE_11AX_EDCA 1 + typedef struct { A_UINT32 tlv_header; A_UINT32 cwmin; @@ -9263,6 +9382,7 @@ typedef struct { A_UINT32 tlv_header; A_UINT32 vdev_id; wmi_wmm_vparams wmm_params[4]; /* 0 be, 1 bk, 2 vi, 3 vo */ + A_UINT32 wmm_param_type; /* see WMM_PARAM_TYPE_xxx defs */ } wmi_vdev_set_wmm_params_cmd_fixed_param; typedef struct { @@ -13785,7 +13905,7 @@ typedef struct { } wmi_roam_configure_mawc_cmd_fixed_param; #define WMI_PACKET_FILTER_COMPARE_DATA_LEN_DWORD 2 -#define WMI_PACKET_FILTER_MAX_CMP_PER_PACKET_FILTER 10 +#define WMI_PACKET_FILTER_MAX_CMP_PER_PACKET_FILTER 5 typedef enum { PACKET_FILTER_TYPE_INVALID = 0, @@ -13853,6 +13973,13 @@ typedef struct { A_UINT32 coalesce_time; // not currently used - fill with 0x0 WMI_PACKET_FILTER_PARAMS_TYPE paramsData[ WMI_PACKET_FILTER_MAX_CMP_PER_PACKET_FILTER]; + /* + * deprecated0: + * This field simply provides filler space to retain the original message + * format while reducing WMI_PACKET_FILTER_MAX_CMP_PER_PACKET_FILTER + * from 10 to 5. + */ + WMI_PACKET_FILTER_PARAMS_TYPE deprecated0[5]; } WMI_PACKET_FILTER_CONFIG_CMD_fixed_param; /* enable / disable all filters within the specified vdev */ diff --git a/CORE/SERVICES/COMMON/wmi_version.h b/CORE/SERVICES/COMMON/wmi_version.h index 864a5bf2e1c5..57c2ed41c3da 100644 --- a/CORE/SERVICES/COMMON/wmi_version.h +++ b/CORE/SERVICES/COMMON/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 254 +#define __WMI_REVISION_ 259 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work diff --git a/CORE/SERVICES/HIF/PCIe/copy_engine.c b/CORE/SERVICES/HIF/PCIe/copy_engine.c index 7ade81b38786..c2047c2af24b 100644 --- a/CORE/SERVICES/HIF/PCIe/copy_engine.c +++ b/CORE/SERVICES/HIF/PCIe/copy_engine.c @@ -428,7 +428,7 @@ CE_sendlist_send(struct CE_handle *copyeng, DPTRACE(adf_dp_trace((adf_nbuf_t)per_transfer_context, ADF_DP_TRACE_CE_PACKET_PTR_RECORD, (uint8_t *)&(((adf_nbuf_t)per_transfer_context)->data), - sizeof(((adf_nbuf_t)per_transfer_context)->data))); + sizeof(((adf_nbuf_t)per_transfer_context)->data), ADF_TX)); } else { /* * Probably not worth the additional complexity to support diff --git a/CORE/SERVICES/HIF/PCIe/hif_pci.c b/CORE/SERVICES/HIF/PCIe/hif_pci.c index 3a1de9d23d07..26c73b5928f9 100644 --- a/CORE/SERVICES/HIF/PCIe/hif_pci.c +++ b/CORE/SERVICES/HIF/PCIe/hif_pci.c @@ -375,7 +375,7 @@ HIFSend_head(HIF_DEVICE *hif_device, NBUF_UPDATE_TX_PKT_COUNT(nbuf, NBUF_TX_PKT_HIF); DPTRACE(adf_dp_trace(nbuf, ADF_DP_TRACE_HIF_PACKET_PTR_RECORD, adf_nbuf_data_addr(nbuf), - sizeof(adf_nbuf_data(nbuf)))); + sizeof(adf_nbuf_data(nbuf)), ADF_TX)); status = CE_sendlist_send(ce_hdl, nbuf, &sendlist, transfer_id); A_ASSERT(status == A_OK); diff --git a/CORE/SERVICES/HIF/USB/if_usb.c b/CORE/SERVICES/HIF/USB/if_usb.c index a2edc1cc9057..4b92609454ec 100644 --- a/CORE/SERVICES/HIF/USB/if_usb.c +++ b/CORE/SERVICES/HIF/USB/if_usb.c @@ -285,9 +285,6 @@ static void hif_usb_remove(struct usb_interface *interface) /* do cold reset */ HIFDiagWriteCOLDRESET(sc->hif_device); - if (usb_sc->suspend_state) { - hif_usb_resume(usb_sc->interface); - } unregister_reboot_notifier(&sc->reboot_notifier); usb_put_dev(interface_to_usbdev(interface)); if (atomic_read(&hif_usb_unload_state) == diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c index 602adf59432a..3786d71036c4 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c @@ -114,12 +114,24 @@ static inline void hif_release_ramdump_mem(unsigned long *address) #else static inline void *hif_get_virt_ramdump_mem(unsigned long *size) { - *size = 0; - return NULL; + size_t length = 0; + int flags = GFP_KERNEL; + + length = DRAM_SIZE + IRAM_SIZE + AXI_SIZE; + + if (size != NULL) + *size = (unsigned long)length; + + if (in_interrupt() || irqs_disabled() || in_atomic()) + flags = GFP_ATOMIC; + + return kzalloc(length, flags); } static inline void hif_release_ramdump_mem(unsigned long *address) { + if (address != NULL) + kfree(address); } #endif #endif diff --git a/CORE/SERVICES/HTC/htc_send.c b/CORE/SERVICES/HTC/htc_send.c index ec70a40fed00..c67f17366c4d 100644 --- a/CORE/SERVICES/HTC/htc_send.c +++ b/CORE/SERVICES/HTC/htc_send.c @@ -1331,7 +1331,7 @@ A_STATUS HTCSendDataPkt(HTC_HANDLE HTCHandle, adf_nbuf_t netbuf, int Epid, NBUF_UPDATE_TX_PKT_COUNT(netbuf, NBUF_TX_PKT_HTC); DPTRACE(adf_dp_trace(netbuf, ADF_DP_TRACE_HTC_PACKET_PTR_RECORD, adf_nbuf_data_addr(netbuf), - sizeof(adf_nbuf_data(netbuf)))); + sizeof(adf_nbuf_data(netbuf)), ADF_TX)); status = HIFSend_head(target->hif_dev, pEndpoint->UL_PipeID, diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 81d4d758911f..743f7a4bea60 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -3187,7 +3187,7 @@ static int wma_stats_event_handler(void *handle, u_int8_t *cmd_param_info, vos_msg_t vos_msg = {0}; u_int32_t buf_size, buf_data_size; u_int8_t *buf, *temp; - bool rssi_stats_present = FALSE; + bool rssi_stats_support = FALSE; param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)cmd_param_info; if (!param_buf) { @@ -3200,16 +3200,20 @@ static int wma_stats_event_handler(void *handle, u_int8_t *cmd_param_info, (event->num_vdev_stats * sizeof(wmi_vdev_stats)) + (event->num_peer_stats * sizeof(wmi_peer_stats)) + (event->num_mib_stats * sizeof(wmi_mib_stats)); + buf_data_size = buf_size - sizeof(*event); - if (param_buf->data) { - rssi_event = (wmi_per_chain_rssi_stats *) - ((uint8_t *)param_buf->data + buf_data_size); - if (((rssi_event->tlv_header & 0xFFFF0000) >> 16) == - WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) { + + rssi_event = param_buf->chain_stats; + if (rssi_event) { + if ((((rssi_event->tlv_header & 0xFFFF0000) >> 16) == + WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) && + ((rssi_event->tlv_header & 0x0000FFFF) == + WMITLV_GET_STRUCT_TLVLEN( + wmi_per_chain_rssi_stats))) { buf_size += sizeof(*rssi_event) + (rssi_event->num_per_chain_rssi_stats * sizeof(wmi_rssi_stats)); - rssi_stats_present = TRUE; + rssi_stats_support = TRUE; } } @@ -3221,14 +3225,13 @@ static int wma_stats_event_handler(void *handle, u_int8_t *cmd_param_info, vos_mem_zero(buf, buf_size); vos_mem_copy(buf, event, sizeof(*event)); temp = buf + sizeof(*event); - vos_mem_copy(temp, (u_int8_t *)param_buf->data, + vos_mem_copy(temp, (uint8_t *)param_buf->data, buf_data_size); temp += buf_data_size; - if (rssi_stats_present) { - vos_mem_copy(temp, (u_int8_t *)param_buf->chain_stats, - sizeof(*param_buf->chain_stats)); - temp += sizeof(*param_buf->chain_stats); - vos_mem_copy(temp, (u_int8_t *)param_buf->rssi_stats, + if (rssi_stats_support) { + vos_mem_copy(temp, rssi_event, sizeof(*rssi_event)); + temp += sizeof(*rssi_event); + vos_mem_copy(temp, (uint8_t *)param_buf->rssi_stats, (rssi_event->num_per_chain_rssi_stats * sizeof(wmi_rssi_stats))); } @@ -3446,8 +3449,10 @@ static void wma_fw_stats_ind(tp_wma_handle wma, u_int8_t *buf) } rssi_event = (wmi_per_chain_rssi_stats *)temp; - if ((rssi_event->tlv_header & 0xFFFF0000) >> 16 == - WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) { + if ((((rssi_event->tlv_header & 0xFFFF0000) >> 16) == + WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) && + ((rssi_event->tlv_header & 0x0000FFFF) == + WMITLV_GET_STRUCT_TLVLEN(wmi_per_chain_rssi_stats))) { WMA_LOGD("%s: num_rssi_stats %u", __func__, rssi_event->num_per_chain_rssi_stats); if (rssi_event->num_per_chain_rssi_stats > 0) { @@ -3486,7 +3491,6 @@ static int wma_extscan_rsp_handler(tp_wma_handle wma, uint8_t *buf) uint8_t vdev_id; tpAniSirGlobal mac_ctx = (tpAniSirGlobal)vos_get_context( VOS_MODULE_ID_PE, wma->vos_context); - WMA_LOGI("%s: Enter", __func__); if (!mac_ctx) { WMA_LOGE("%s: Invalid mac_ctx", __func__); return -EINVAL; @@ -3747,7 +3751,6 @@ static int wma_extscan_operations_event_handler(void *handle, int buf_len; vos_msg_t vos_msg = {0}; - WMA_LOGI("%s: Enter", __func__); param_buf = (WMI_EXTSCAN_OPERATION_EVENTID_param_tlvs *) cmd_param_info; if (!param_buf) { @@ -3788,7 +3791,6 @@ static int wma_extscan_operations_event_handler(void *handle, vos_mem_free(buf); return -EINVAL; } - WMA_LOGI("WDA_EXTSCAN_OPERATION_IND posted"); return 0; } @@ -4223,9 +4225,8 @@ static int wma_extscan_cached_results_event_handler(void *handle, src_hotlist = param_buf->bssid_list; src_rssi = param_buf->rssi_list; numap = event->num_entries_in_page; - WMA_LOGI("Total_entries %u first_entry_index %u", event->total_entries, - event->first_entry_index); - WMA_LOGI("num_entries_in_page %d", numap); + WMA_LOGI("Total_entries: %u first_entry_index: %u num_entries_in_page: %u", + event->total_entries, event->first_entry_index, numap); if (!src_hotlist || !src_rssi || !numap) { WMA_LOGW("%s: Cached results empty, send 0 results", __func__); goto noresults; @@ -4265,7 +4266,6 @@ static int wma_extscan_cached_results_event_handler(void *handle, pMac->sme.pExtScanIndCb(pMac->hHdd, eSIR_EXTSCAN_CACHED_RESULTS_IND, dest_cachelist); - WMA_LOGI("%s: sending cached results event", __func__); dest_result = dest_cachelist->result; for (i = 0; i < dest_cachelist->num_scan_ids; i++) { @@ -4284,7 +4284,6 @@ noresults: pMac->sme.pExtScanIndCb(pMac->hHdd, eSIR_EXTSCAN_CACHED_RESULTS_IND, &empty_cachelist); - WMA_LOGI("%s: sending cached results event", __func__); return 0; } @@ -5022,13 +5021,11 @@ static int wma_unified_link_radio_stats_event_handler(void *handle, return -ENOMEM; } - WMA_LOGD("Radio Stats Fixed Param:"); WMA_LOGD("request_id %u num_radio %u more_radio_events %u", fixed_param->request_id, fixed_param->num_radio, fixed_param->more_radio_events); - WMA_LOGD("Radio Info"); - WMA_LOGD("radio_id %u on_time %u tx_time %u rx_time %u on_time_scan %u " + WMA_LOGD("Radio Info: radio_id %u on_time %u tx_time %u rx_time %u on_time_scan %u " "on_time_nbd %u on_time_gscan %u on_time_roam_scan %u " "on_time_pno_scan %u on_time_hs20 %u num_channels %u", radio_stats->radio_id, radio_stats->on_time, @@ -7112,6 +7109,39 @@ void ol_cfg_update_bundle_params(struct txrx_pdev_cfg_param_t *olCfg, } #endif + +/** + * ol_cfg_update_ac_specs_params() - update ac_specs params + * @olcfg: cfg handle + * @mac_params: mac params + * + * Return: none + */ +void ol_cfg_update_ac_specs_params(struct txrx_pdev_cfg_param_t *olcfg, + tMacOpenParameters *mac_params) +{ + int i; + + if (NULL == olcfg) + return; + + if (NULL == mac_params) + return; + + for (i = 0; i < OL_TX_NUM_WMM_AC; i++) { + olcfg->ac_specs[i].wrr_skip_weight = + mac_params->ac_specs[i].wrr_skip_weight; + olcfg->ac_specs[i].credit_threshold = + mac_params->ac_specs[i].credit_threshold; + olcfg->ac_specs[i].send_limit = + mac_params->ac_specs[i].send_limit; + olcfg->ac_specs[i].credit_reserve = + mac_params->ac_specs[i].credit_reserve; + olcfg->ac_specs[i].discard_weight = + mac_params->ac_specs[i].discard_weight; + } +} + #ifdef FEATURE_RUNTIME_PM /** * wma_runtime_context_init() - API to init wma runtime contexts @@ -7338,6 +7368,7 @@ VOS_STATUS WDA_open(v_VOID_t *vos_context, v_VOID_t *os_ctx, #endif ol_cfg_update_bundle_params(&olCfg, mac_params); + ol_cfg_update_ac_specs_params(&olCfg, mac_params); ((pVosContextType) vos_context)->cfg_ctx = ol_pdev_cfg_attach(((pVosContextType) vos_context)->adf_ctx, olCfg); @@ -7999,9 +8030,6 @@ static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle, WMA_LOGA("BSS is not yet stopped. Defering vdev(vdev id %x) deletion", vdev_id); iface->del_staself_req = pdel_sta_self_req_param; - if (generateRsp) - wma_send_msg(wma_handle, WDA_DEL_STA_SELF_RSP, - (void *)pdel_sta_self_req_param, 0); return status; } @@ -21571,11 +21599,6 @@ static int wma_wow_wakeup_host_event(void *handle, u_int8_t *event, if (param_buf->wow_packet_buffer) { wow_buf_pkt_len = *(uint32_t *)param_buf->wow_packet_buffer; - WMA_LOGD("wow_packet_buffer dump"); - vos_trace_hex_dump(VOS_MODULE_ID_WDA, - VOS_TRACE_LEVEL_DEBUG, - param_buf->wow_packet_buffer, - wow_buf_pkt_len); wma_extscan_wow_event_callback(handle, (u_int8_t *)(param_buf->wow_packet_buffer + 4), wow_buf_pkt_len); @@ -26933,8 +26956,6 @@ static VOS_STATUS wma_process_ll_stats_getReq nchannels += src_bucket->numChannels; src_bucket++; } - WMA_LOGD("%s: Total buckets: %d total #of channels is %d", - __func__, nbuckets, nchannels); len += nchannels * sizeof(wmi_extscan_bucket_channel); /* Allocate the memory */ *buf = wmi_buf_alloc(wma_handle->wmi_handle, len); @@ -26959,8 +26980,8 @@ static VOS_STATUS wma_process_ll_stats_getReq if (pstart->configuration_flags & EXTSCAN_LP_EXTENDED_BATCHING) cmd->configuration_flags |= WMI_EXTSCAN_EXTENDED_BATCHING_EN; - WMA_LOGI("%s: configuration_flags: 0x%x", __func__, - cmd->configuration_flags); + WMA_LOGD("%s: Total buckets: %d total #of channels: %d cfgn_flags: 0x%x", + __func__, nbuckets, nchannels, cmd->configuration_flags); cmd->min_rest_time = WMA_EXTSCAN_REST_TIME; cmd->max_rest_time = WMA_EXTSCAN_REST_TIME; diff --git a/CORE/SERVICES/WMI/wmi_unified.c b/CORE/SERVICES/WMI/wmi_unified.c index c5bd9ad31b7e..b371ed06b251 100644 --- a/CORE/SERVICES/WMI/wmi_unified.c +++ b/CORE/SERVICES/WMI/wmi_unified.c @@ -703,6 +703,8 @@ static u_int8_t* get_wmi_cmd_string(WMI_CMD_ID wmi_command) CASE_RETURN_STRING(WMI_PEER_BWF_REQUEST_CMDID); CASE_RETURN_STRING(WMI_DBGLOG_TIME_STAMP_SYNC_CMDID); CASE_RETURN_STRING(_place_holder_cmd_1); + CASE_RETURN_STRING(WMI_P2P_LISTEN_OFFLOAD_START_CMDID); + CASE_RETURN_STRING(WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID); } return "Invalid WMI cmd"; } diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index 983e08aaaa06..0ce823314587 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -296,6 +296,74 @@ static void vos_set_bundle_params(tMacOpenParameters *param, } #endif +/** + * vos_set_ac_specs_params() - set ac_specs params in mac open param + * @param: Pointer to mac open param + * @hdd_ctx: Pointer to hdd context + * + * Return: none + */ +static void vos_set_ac_specs_params(tMacOpenParameters *param, + hdd_context_t *hdd_ctx) +{ + uint8_t num_entries = 0; + uint8_t tx_sched_wrr_param[TX_SCHED_WRR_PARAMS_NUM]; + uint8_t *tx_sched_wrr_ac; + int i; + + if (NULL == hdd_ctx) + return; + + if (NULL == param) + return; + + if (NULL == hdd_ctx->cfg_ini) { + /* Do nothing if hdd_ctx is invalid */ + VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, + "%s: Warning: hdd_ctx->cfg_ini is NULL", __func__); + return; + } + + for (i = 0; i < OL_TX_NUM_WMM_AC; i++) { + switch (i) { + case OL_TX_WMM_AC_BE: + tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_be; + break; + case OL_TX_WMM_AC_BK: + tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_bk; + break; + case OL_TX_WMM_AC_VI: + tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_vi; + break; + case OL_TX_WMM_AC_VO: + tx_sched_wrr_ac = hdd_ctx->cfg_ini->tx_sched_wrr_vo; + break; + default: + tx_sched_wrr_ac = NULL; + } + + hdd_string_to_u8_array(tx_sched_wrr_ac, + tx_sched_wrr_param, + &num_entries, + sizeof(tx_sched_wrr_param)); + + if (num_entries == TX_SCHED_WRR_PARAMS_NUM) { + param->ac_specs[i].wrr_skip_weight = + tx_sched_wrr_param[0]; + param->ac_specs[i].credit_threshold = + tx_sched_wrr_param[1]; + param->ac_specs[i].send_limit = + tx_sched_wrr_param[2]; + param->ac_specs[i].credit_reserve = + tx_sched_wrr_param[3]; + param->ac_specs[i].discard_weight = + tx_sched_wrr_param[4]; + } + + num_entries = 0; + } +} + /*--------------------------------------------------------------------------- @@ -574,6 +642,7 @@ VOS_STATUS vos_open( v_CONTEXT_t *pVosContext, v_SIZE_t hddContextSize ) vos_set_nan_enable(&macOpenParms, pHddCtx); vos_set_bundle_params(&macOpenParms, pHddCtx); + vos_set_ac_specs_params(&macOpenParms, pHddCtx); vStatus = WDA_open( gpVosContext, gpVosContext->pHDDContext, hdd_update_tgt_cfg, @@ -1032,6 +1032,14 @@ CDEFINES += -DCONFIG_HL_SUPPORT \ -DHIF_MBOX_SLEEP_WAR endif +ifeq ($(CONFIG_ARCH_MDMCALIFORNIUM), y) +ifeq ($(CONFIG_QCA_WIFI_SDIO), 1) +ifeq ($(CONFIG_WCNSS_SKB_PRE_ALLOC), y) +CDEFINES += -DFEATURE_SKB_PRE_ALLOC +endif +endif +endif + ifeq ($(CONFIG_ARCH_MDM9607), y) ifeq ($(CONFIG_QCA_WIFI_SDIO), 1) CDEFINES += -DDEBUG_HL_LOGGING |
