From 7cc67e504fb99c19ce807d757074fe725d15b5b1 Mon Sep 17 00:00:00 2001 From: nobelj Date: Fri, 24 Jan 2020 08:03:49 -0800 Subject: [PATCH 01/12] qcacmn: Support mgmt packet peer filter based on mac address RA mac address is used to support tx capture mgmt peer filter. Change-Id: I895034723d4b75557ad33f55adc017d1caa3a40d --- dp/inc/cdp_txrx_cmn_struct.h | 1 + dp/inc/cdp_txrx_ctrl.h | 5 ++--- dp/inc/cdp_txrx_ops.h | 2 +- dp/wifi3.0/dp_internal.h | 13 +++++++++++++ dp/wifi3.0/dp_main.c | 37 ++++++++++++++++++++++++++---------- dp/wifi3.0/dp_peer.h | 6 ++++-- dp/wifi3.0/dp_rx.h | 5 ++++- dp/wifi3.0/dp_tx.h | 5 ++++- 8 files changed, 56 insertions(+), 18 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index f4ca38746d..e215e4b3c2 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1188,6 +1188,7 @@ enum cdp_tx_enh_capture_mode { CDP_TX_ENH_CAPTURE_DISABLED = 0, CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS, CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER, + CDP_TX_ENH_CAPTURE_MAX, }; /* diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index 5c874f91b1..df78daa284 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -906,7 +906,7 @@ static inline QDF_STATUS cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc, uint8_t pdev_id, bool is_rx_pkt_cap_enable, - bool is_tx_pkt_cap_enable, + uint8_t is_tx_pkt_cap_enable, uint8_t *peer_mac) { if (!soc || !soc->ops) { @@ -921,8 +921,7 @@ cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc, return soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params (soc, pdev_id, is_rx_pkt_cap_enable, - is_tx_pkt_cap_enable, - peer_mac); + is_tx_pkt_cap_enable, peer_mac); } #endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */ diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index f193401973..85be21f66d 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -704,7 +704,7 @@ struct cdp_ctrl_ops { #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH) QDF_STATUS (*txrx_update_peer_pkt_capture_params)( ol_txrx_soc_handle soc, uint8_t pdev_id, - bool is_rx_pkt_cap_enable, bool is_tx_pkt_cap_enable, + bool is_rx_pkt_cap_enable, uint8_t is_tx_pkt_cap_enable, uint8_t *peer_mac); #endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */ QDF_STATUS diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 7e2b7a0e9d..0766b67362 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1802,6 +1802,19 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev) { } +/* + * dp_peer_tx_capture_filter_check: check filter is enable for the filter + * and update tx_cap_enabled flag + * @pdev: DP PDEV handle + * @peer: DP PEER handle + * + * return: void + */ +static inline +void dp_peer_tx_capture_filter_check(struct dp_pdev *pdev, + struct dp_peer *peer) +{ +} #endif #ifdef FEATURE_PERPKT_INFO diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 1113c3315a..7e6b4e4d51 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5581,6 +5581,12 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, DP_STATS_INIT(peer); DP_STATS_UPD(peer, rx.avg_rssi, INVALID_RSSI); + /* + * In tx_monitor mode, filter may be set for unassociated peer + * when unassociated peer get associated peer need to + * update tx_cap_enabled flag to support peer filter. + */ + dp_peer_tx_capture_filter_check(pdev, peer); return QDF_STATUS_SUCCESS; } else { /* @@ -5704,6 +5710,14 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, peer_cookie.ctx; } } + + /* + * In tx_monitor mode, filter may be set for unassociated peer + * when unassociated peer get associated peer need to + * update tx_cap_enabled flag to support peer filter. + */ + dp_peer_tx_capture_filter_check(pdev, peer); + return QDF_STATUS_SUCCESS; } @@ -8399,7 +8413,8 @@ static QDF_STATUS dp_get_psoc_param(struct cdp_soc_t *cdp_soc, * @soc: DP_SOC handle * @pdev_id: id of DP_PDEV handle * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode - * @is_tx_pkt_cap_enable: enable/disable Tx packet capture in monitor mode + * @is_tx_pkt_cap_enable: enable/disable/delete/print + * Tx packet capture in monitor mode * @peer_mac: MAC address for which the above need to be enabled/disabled * * Return: Success if Rx & Tx capture is enabled for peer, false otherwise @@ -8408,28 +8423,30 @@ QDF_STATUS dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc, uint8_t pdev_id, bool is_rx_pkt_cap_enable, - bool is_tx_pkt_cap_enable, + uint8_t is_tx_pkt_cap_enable, uint8_t *peer_mac) { + QDF_STATUS status; struct dp_peer *peer; struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); - if (!pdev) return QDF_STATUS_E_FAILURE; peer = (struct dp_peer *)dp_find_peer_by_addr((struct cdp_pdev *)pdev, peer_mac); - if (!peer) { - dp_err("Invalid Peer"); - return QDF_STATUS_E_FAILURE; - } - dp_peer_set_rx_capture_enabled(peer, is_rx_pkt_cap_enable); - dp_peer_set_tx_capture_enabled(peer, is_tx_pkt_cap_enable); + /* we need to set tx pkt capture for non associated peer */ + status = dp_peer_set_tx_capture_enabled(pdev, peer, + is_tx_pkt_cap_enable, + peer_mac); - return QDF_STATUS_SUCCESS; + status = dp_peer_set_rx_capture_enabled(pdev, peer, + is_rx_pkt_cap_enable, + peer_mac); + + return status; } /* diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 2544110b37..e2794d3d20 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -286,7 +286,9 @@ void dp_peer_ast_index_flow_queue_map_create(void *soc_hdl, * @soc: DP SOC handle * @pdev_id: id of DP pdev handle * @is_rx_pkt_cap_enable: enable/disable Rx packet capture in monitor mode - * @is_tx_pkt_cap_enable: enable/disable Tx packet capture in monitor mode + * @is_tx_pkt_cap_enable: enable/disable/delete/print + * Tx packet capture in monitor mode + * Tx packet capture in monitor mode * @peer_mac: MAC address for which the above need to be enabled/disabled * * Return: Success if Rx & Tx capture is enabled for peer, false otherwise @@ -295,7 +297,7 @@ QDF_STATUS dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc, uint8_t pdev_id, bool is_rx_pkt_cap_enable, - bool is_tx_pkt_cap_enable, + uint8_t is_tx_pkt_cap_enable, uint8_t *peer_mac); /* diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 286989d5cc..97d72396bf 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -1103,8 +1103,11 @@ bool dp_rx_multipass_process(struct dp_peer *peer, qdf_nbuf_t nbuf, #ifndef WLAN_RX_PKT_CAPTURE_ENH static inline -void dp_peer_set_rx_capture_enabled(struct dp_peer *peer_handle, bool value) +QDF_STATUS dp_peer_set_rx_capture_enabled(struct dp_pdev *pdev, + struct dp_peer *peer_handle, + bool value, uint8_t *mac_addr) { + return QDF_STATUS_SUCCESS; } #endif diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 42148b5b9f..0a935e7045 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -357,8 +357,11 @@ static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc) #ifndef WLAN_TX_PKT_CAPTURE_ENH static inline -void dp_peer_set_tx_capture_enabled(struct dp_peer *peer_handle, bool value) +QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev, + struct dp_peer *peer_handle, + uint8_t value, uint8_t *peer_mac) { + return QDF_STATUS_SUCCESS; } #endif #endif From e8a1cf3c703903230ec5e875524d48c66cc933b4 Mon Sep 17 00:00:00 2001 From: Sourav Mohapatra Date: Wed, 5 Feb 2020 16:05:28 +0530 Subject: [PATCH 02/12] qcacmn: Reduce unnecessary logs in various QDF modules Various QDF logs being printed to the driver log are not necessary for debugging purposes. Cleanup the logs that are not required. Change-Id: I9c5685b4d31a741703667943ac458921fa0d480e CRs-Fixed: 2616210 --- qdf/linux/src/qdf_lock.c | 5 +---- qdf/linux/src/qdf_mc_timer.c | 24 +++++++++-------------- utils/logging/src/wlan_logging_sock_svc.c | 4 ++-- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/qdf/linux/src/qdf_lock.c b/qdf/linux/src/qdf_lock.c index 6a541d4163..f16d5d8092 100644 --- a/qdf/linux/src/qdf_lock.c +++ b/qdf/linux/src/qdf_lock.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -829,9 +829,6 @@ void qdf_lock_stats_cookie_create(struct lock_stats *stats, qdf_atomic_inc(&lock_cookie_get_failures); count = qdf_atomic_inc_return(&lock_cookie_untracked_num); stats->cookie = (void *) DUMMY_LOCK_COOKIE; - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, - "%s: cookie allocation failure, using dummy (%s:%d) count %d", - __func__, func, line, count); return; } diff --git a/qdf/linux/src/qdf_mc_timer.c b/qdf/linux/src/qdf_mc_timer.c index e5c2ed2a7b..b4c0453275 100644 --- a/qdf/linux/src/qdf_mc_timer.c +++ b/qdf/linux/src/qdf_mc_timer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -718,16 +718,16 @@ QDF_STATUS qdf_mc_timer_stop(qdf_mc_timer_t *timer) { /* check for invalid pointer */ if (!timer) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s Null timer pointer being passed", __func__); + QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF, + "%s Null timer pointer", __func__); QDF_ASSERT(0); return QDF_STATUS_E_INVAL; } /* check if timer refers to an uninitialized object */ if (LINUX_TIMER_COOKIE != timer->platform_info.cookie) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s: Cannot stop uninitialized timer", __func__); + QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF, + "%s: Cannot stop uninit timer", __func__); QDF_ASSERT(0); return QDF_STATUS_E_INVAL; @@ -738,9 +738,6 @@ QDF_STATUS qdf_mc_timer_stop(qdf_mc_timer_t *timer) if (QDF_TIMER_STATE_RUNNING != timer->state) { qdf_spin_unlock_irqrestore(&timer->platform_info.spinlock); - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH, - "%s: Cannot stop timer in state = %d", - __func__, timer->state); return QDF_STATUS_SUCCESS; } @@ -760,16 +757,16 @@ QDF_STATUS qdf_mc_timer_stop_sync(qdf_mc_timer_t *timer) { /* check for invalid pointer */ if (!timer) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s Null timer pointer being passed", __func__); + QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF, + "%s Null timer pointer", __func__); QDF_ASSERT(0); return QDF_STATUS_E_INVAL; } /* check if timer refers to an uninitialized object */ if (LINUX_TIMER_COOKIE != timer->platform_info.cookie) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s: Cannot stop uninitialized timer", __func__); + QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF, + "%s: Cannot stop uninit timer", __func__); QDF_ASSERT(0); return QDF_STATUS_E_INVAL; @@ -780,9 +777,6 @@ QDF_STATUS qdf_mc_timer_stop_sync(qdf_mc_timer_t *timer) if (QDF_TIMER_STATE_RUNNING != timer->state) { qdf_spin_unlock_irqrestore(&timer->platform_info.spinlock); - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH, - "%s: Cannot stop timer in state = %d", - __func__, timer->state); return QDF_STATUS_SUCCESS; } diff --git a/utils/logging/src/wlan_logging_sock_svc.c b/utils/logging/src/wlan_logging_sock_svc.c index b9a6293645..fa94511c3d 100644 --- a/utils/logging/src/wlan_logging_sock_svc.c +++ b/utils/logging/src/wlan_logging_sock_svc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -287,7 +287,7 @@ static int wlan_add_user_log_time_stamp(char *tbuf, size_t tbuf_sz, uint64_t ts) qdf_get_time_of_the_day_in_hr_min_sec_usec(time_buf, sizeof(time_buf)); - return scnprintf(tbuf, tbuf_sz, "[%.16s][0x%llx]%s", + return scnprintf(tbuf, tbuf_sz, "[%.6s][0x%llx]%s", current_process_name(), ts, time_buf); } From 0094761c8830588846ea109617cf3f9049943bb7 Mon Sep 17 00:00:00 2001 From: Venkata Sharath Chandra Manchala Date: Fri, 17 Jan 2020 14:46:19 -0800 Subject: [PATCH 03/12] qcacmn: Take peer reference before requesting for rx queue status Increase the peer ref count before requesting for reo queue stats and release the ref count after receiving the queue stats on the reo status srng. Change-Id: Ife3b87951e767414efa1bfb45486cd364578d2a7 CRs-Fixed: 2604862 --- dp/inc/cdp_txrx_misc.h | 26 ++-------- dp/inc/cdp_txrx_ops.h | 4 +- dp/wifi3.0/dp_main.c | 113 ++++++++++++++++++----------------------- dp/wifi3.0/dp_peer.c | 3 ++ dp/wifi3.0/dp_types.h | 8 +-- 5 files changed, 62 insertions(+), 92 deletions(-) diff --git a/dp/inc/cdp_txrx_misc.h b/dp/inc/cdp_txrx_misc.h index 5c209565a4..1db265f6ff 100644 --- a/dp/inc/cdp_txrx_misc.h +++ b/dp/inc/cdp_txrx_misc.h @@ -780,27 +780,8 @@ cdp_txrx_ext_stats_request(ol_txrx_soc_handle soc, uint8_t pdev_id, * * return: none */ -static inline void -cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) -{ - if (!soc || !soc->ops || !soc->ops->misc_ops) { - QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, - "%s: Invalid Instance:", __func__); - return; - } - - if (soc->ops->misc_ops->request_rx_hw_stats) - soc->ops->misc_ops->request_rx_hw_stats(soc, vdev_id); -} - -/** - * cdp_wait_for_ext_rx_stats(): wait for reo command status for stats - * @soc: soc handle - * - * return: status - */ static inline QDF_STATUS -cdp_wait_for_ext_rx_stats(ol_txrx_soc_handle soc) +cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) { if (!soc || !soc->ops || !soc->ops->misc_ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -808,10 +789,9 @@ cdp_wait_for_ext_rx_stats(ol_txrx_soc_handle soc) return QDF_STATUS_E_INVAL; } - if (soc->ops->misc_ops->wait_for_ext_rx_stats) - return soc->ops->misc_ops->wait_for_ext_rx_stats(soc); + if (soc->ops->misc_ops->request_rx_hw_stats) + return soc->ops->misc_ops->request_rx_hw_stats(soc, vdev_id); return QDF_STATUS_SUCCESS; } - #endif /* _CDP_TXRX_MISC_H_ */ diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 85be21f66d..0c84365bdd 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1209,8 +1209,8 @@ struct cdp_misc_ops { QDF_STATUS (*txrx_ext_stats_request)(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, struct cdp_txrx_ext_stats *req); - void (*request_rx_hw_stats)(struct cdp_soc_t *soc_hdl, uint8_t vdev_id); - QDF_STATUS (*wait_for_ext_rx_stats)(struct cdp_soc_t *soc_hdl); + QDF_STATUS (*request_rx_hw_stats)(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id); }; /** diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 7e6b4e4d51..a3f81adb35 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5491,26 +5491,6 @@ static inline void dp_peer_rx_bufq_resources_init(struct dp_peer *peer) } #endif -#ifdef WLAN_FEATURE_STATS_EXT -/* - * dp_set_ignore_reo_status_cb() - set ignore reo status cb flag - * @soc: dp soc handle - * @flag: flag to set or reset - * - * Return: None - */ -static inline void dp_set_ignore_reo_status_cb(struct dp_soc *soc, - bool flag) -{ - soc->ignore_reo_status_cb = flag; -} -#else -static inline void dp_set_ignore_reo_status_cb(struct dp_soc *soc, - bool flag) -{ -} -#endif - /* * dp_peer_create_wifi3() - attach txrx peer * @soc_hdl: Datapath soc handle @@ -5677,12 +5657,6 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, vdev->vap_self_peer = peer; } - if (wlan_op_mode_sta == vdev->opmode && - qdf_mem_cmp(peer->mac_addr.raw, vdev->mac_addr.raw, - QDF_MAC_ADDR_SIZE) != 0) { - dp_set_ignore_reo_status_cb(soc, false); - } - for (i = 0; i < DP_MAX_TIDS; i++) qdf_spinlock_create(&peer->rx_tid[i].tid_lock); @@ -6262,8 +6236,11 @@ static void dp_vdev_reset_peer(struct dp_vdev *vdev, if (!vdev) { dp_err("vdev is NULL"); } else { - if (vdev->vap_bss_peer == peer) - vdev->vap_bss_peer = NULL; + if (vdev->vap_bss_peer == peer) { + vdev->vap_bss_peer = NULL; + qdf_mem_zero(vdev->vap_bss_peer_mac_addr, + QDF_MAC_ADDR_SIZE); + } if (vdev && vdev->vap_bss_peer) { bss_peer = vdev->vap_bss_peer; @@ -6530,12 +6507,6 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_spinlock_destroy(&peer->peer_info_lock); dp_peer_multipass_list_remove(peer); - if (wlan_op_mode_sta == peer->vdev->opmode && - qdf_mem_cmp(peer->mac_addr.raw, peer->vdev->mac_addr.raw, - QDF_MAC_ADDR_SIZE) != 0) { - dp_set_ignore_reo_status_cb(peer->vdev->pdev->soc, true); - } - /* * Remove the reference added during peer_attach. * The peer will still be left allocated until the @@ -10367,6 +10338,39 @@ dp_txrx_post_data_stall_event(struct cdp_soc_t *soc_hdl, } #endif /* WLAN_SUPPORT_DATA_STALL */ +#ifdef DP_PEER_EXTENDED_API +/** + * dp_peer_get_ref_find_by_addr - get peer with addr by ref count inc + * @dev: physical device instance + * @peer_mac_addr: peer mac address + * @debug_id: to track enum peer access + * + * Return: peer instance pointer + */ +static void * +dp_peer_get_ref_find_by_addr(struct cdp_pdev *dev, uint8_t *peer_mac_addr, + enum peer_debug_id_type debug_id) +{ + struct dp_pdev *pdev = (struct dp_pdev *)dev; + struct dp_peer *peer; + + peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0, DP_VDEV_ALL); + + if (!peer) + return NULL; + + if (peer->delete_in_progress) { + dp_err("Peer deletion in progress"); + dp_peer_unref_delete(peer); + return NULL; + } + + dp_info_rl("peer %pK mac: %pM", peer, peer->mac_addr.raw); + + return peer; +} +#endif /* DP_PEER_EXTENDED_API */ + #ifdef WLAN_FEATURE_STATS_EXT /* rx hw stats event wait timeout in ms */ #define DP_REO_STATUS_STATS_TIMEOUT 1000 @@ -10417,11 +10421,6 @@ static void dp_rx_hw_stats_cb(struct dp_soc *soc, void *cb_ctxt, struct dp_rx_tid *rx_tid = (struct dp_rx_tid *)cb_ctxt; struct hal_reo_queue_status *queue_status = &reo_status->queue_status; - if (soc->ignore_reo_status_cb) { - qdf_event_set(&soc->rx_hw_stats_event); - return; - } - if (queue_status->header.status != HAL_REO_CMD_SUCCESS) { dp_info("REO stats failure %d for TID %d", queue_status->header.status, rx_tid->tid); @@ -10442,46 +10441,35 @@ static void dp_rx_hw_stats_cb(struct dp_soc *soc, void *cb_ctxt, * * Return: None */ -static void +static QDF_STATUS dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) { struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); struct dp_peer *peer; + QDF_STATUS status; if (!vdev) { - dp_err("vdev is null"); - qdf_event_set(&soc->rx_hw_stats_event); - return; + dp_err("vdev is null for vdev_id: %u", vdev_id); + return QDF_STATUS_E_INVAL; } - peer = vdev->vap_bss_peer; + peer = dp_peer_get_ref_find_by_addr((struct cdp_pdev *)vdev->pdev, + vdev->vap_bss_peer_mac_addr, 0); - if (!peer || peer->delete_in_progress) { - dp_err("Peer deletion in progress"); - qdf_event_set(&soc->rx_hw_stats_event); - return; + if (!peer) { + dp_err("Peer is NULL"); + return QDF_STATUS_E_INVAL; } qdf_event_reset(&soc->rx_hw_stats_event); dp_peer_rxtid_stats(peer, dp_rx_hw_stats_cb, NULL); -} - -/** - * dp_wait_for_ext_rx_stats - wait for rx reo status for rx stats - * @soc_hdl: cdp opaque soc handle - * - * Return: status - */ -static QDF_STATUS -dp_wait_for_ext_rx_stats(struct cdp_soc_t *soc_hdl) -{ - struct dp_soc *soc = (struct dp_soc *)soc_hdl; - QDF_STATUS status; status = qdf_wait_single_event(&soc->rx_hw_stats_event, DP_REO_STATUS_STATS_TIMEOUT); + dp_peer_unref_delete(peer); + return status; } #endif /* WLAN_FEATURE_STATS_EXT */ @@ -10509,8 +10497,7 @@ static struct cdp_misc_ops dp_ops_misc = { #ifdef WLAN_FEATURE_STATS_EXT .txrx_ext_stats_request = dp_txrx_ext_stats_request, .request_rx_hw_stats = dp_request_rx_hw_stats, - .wait_for_ext_rx_stats = dp_wait_for_ext_rx_stats, -#endif +#endif /* WLAN_FEATURE_STATS_EXT */ }; #endif diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index f8b9123b50..a252adcf9a 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -1583,6 +1583,9 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id, dp_info("STA vdev bss_peer!!!!"); peer->bss_peer = 1; peer->vdev->vap_bss_peer = peer; + qdf_mem_copy(peer->vdev->vap_bss_peer_mac_addr, + peer->mac_addr.raw, + QDF_MAC_ADDR_SIZE); } if (peer->vdev->opmode == wlan_op_mode_sta) { diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index defdccc43e..911aeebeb2 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1209,10 +1209,7 @@ struct dp_soc { uint32_t rx_mpdu_missed; } ext_stats; qdf_event_t rx_hw_stats_event; - - /* Ignore reo command queue status during peer delete */ - bool ignore_reo_status_cb; -#endif +#endif /* WLAN_FEATURE_STATS_EXT */ /* Smart monitor capability for HKv2 */ uint8_t hw_nac_monitor_support; @@ -1993,6 +1990,9 @@ struct dp_vdev { bool peer_protocol_count_track; int peer_protocol_count_dropmask; #endif + + /* vap bss peer mac addr */ + uint8_t vap_bss_peer_mac_addr[QDF_MAC_ADDR_SIZE]; }; From 587fdeec253d7865d928ac941458a78b9d23c8c8 Mon Sep 17 00:00:00 2001 From: Jianmin Zhu Date: Tue, 11 Feb 2020 23:41:32 +0800 Subject: [PATCH 04/12] qcacmn: Fix get station stats cmd timeout Request is cleared before response for race condition between request thread wificond and response work thread. 1. wificond thread sent cp_stats_get request and waited for response. 2. worker thread got response from F/W, completed the request. 3. Wificond got the response, finished the request. 4. wificond triggered another cp_stats_get request, created new request, set pending request bit TYPE_STATION_STATS. 5. Kworker thread clear the pending request bit TYPE_STATION_STATS. 6. Cleared request TYPE_STATION_STATS couldn't be completed any more, wificond thread waited for 1.6s, timeout happened. Fix: Clear pending request bit TYPE_STATION_STATS before complete the request, make sure old pending request bit is cleared before new request of same type is set. Change-Id: I7b89571b1e95a6e17aec9d649bd3adfccf3eb02e CRs-Fixed: 2619370 --- umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c b/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c index e1fb014a4c..f5d1abd9e8 100644 --- a/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c +++ b/umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -882,9 +882,9 @@ static void tgt_mc_cp_stats_extract_station_stats( * reset type_map bit for station stats . */ if (tgt_mc_cp_stats_is_last_event(ev, TYPE_STATION_STATS)) { + ucfg_mc_cp_stats_reset_pending_req(psoc, TYPE_STATION_STATS); tgt_mc_cp_stats_prepare_n_send_raw_station_stats(psoc, &last_req); - ucfg_mc_cp_stats_reset_pending_req(psoc, TYPE_STATION_STATS); } } From 1047ea9c6b67149a6dfdacb173e340e923a49c93 Mon Sep 17 00:00:00 2001 From: Chaoli Zhou Date: Fri, 27 Dec 2019 19:09:42 +0800 Subject: [PATCH 05/12] qcacmn: Support get is_over_gsi from IPA driver For Genoa, it use IPA GSI, and whether gsi enabled or not decided by ipa dts setting, which should get from IPA driver, so add such information. Change-Id: I6321afaf35c57d7d5865b896193ab1d44042ee4c --- qdf/linux/src/i_qdf_ipa_wdi3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qdf/linux/src/i_qdf_ipa_wdi3.h b/qdf/linux/src/i_qdf_ipa_wdi3.h index b7d8d79b00..1b7ee00a39 100644 --- a/qdf/linux/src/i_qdf_ipa_wdi3.h +++ b/qdf/linux/src/i_qdf_ipa_wdi3.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -57,7 +57,7 @@ typedef struct ipa_wdi_init_out_params __qdf_ipa_wdi_init_out_params_t; (((struct ipa_wdi_init_out_params *)(out_params))->is_uC_ready) #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_SMMU_ENABLED(out_params) \ (((struct ipa_wdi_init_out_params *)(out_params))->is_smmu_enabled) -#ifdef IPA_WDI3_GSI +#if (defined(IPA_WDI3_GSI)) || (defined(IPA_WDI2_GSI)) #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params) \ (((struct ipa_wdi_init_out_params *)(out_params))->is_over_gsi) #else From 122adb67b3cdbf89ea4c418e273233ea42b11dfc Mon Sep 17 00:00:00 2001 From: Abhishek Ambure Date: Wed, 12 Feb 2020 20:15:14 +0530 Subject: [PATCH 06/12] qcacmn: Add support to get roam scan channel list from fw Firmware advertises WMI_SERVICE_ROAM_SCAN_CHANNEL_LIST_TO_HOST_SUPPORT at the time of initialization, that means host can querry for roam scan channels list to firmware. Host driver sends WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID to firmware to querry roam scan channels list and firmware responds with an event WMI_ROAM_SCAN_CHANNEL_LIST_EVENTID. Change-Id: I419a0206d7b06b6186d0c333c951bca5206f342f CRs-Fixed: 2620607 --- wmi/inc/wmi_unified_param.h | 2 ++ wmi/inc/wmi_unified_priv.h | 3 ++- wmi/inc/wmi_unified_roam_api.h | 14 ++++++++++- wmi/src/wmi_unified_roam_api.c | 12 ++++++++- wmi/src/wmi_unified_tlv.c | 45 ++++++++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 3 deletions(-) diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 764281cfda..64b5567cf3 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -4598,6 +4598,7 @@ typedef enum { wmi_wlan_time_sync_ftm_start_stop_event_id, wmi_wlan_time_sync_q_master_slave_offset_eventid, #endif + wmi_roam_scan_chan_list_id, wmi_events_max, } wmi_conv_event_id; @@ -5106,6 +5107,7 @@ typedef enum { wmi_service_peer_delete_no_peer_flush_tids_cmd, wmi_service_time_sync_ftm, wmi_service_nss_ratio_to_host_support, + wmi_roam_scan_chan_list_to_host_support, wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 9a6229b602..189c693baf 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2232,7 +2232,8 @@ QDF_STATUS (*extract_time_sync_ftm_offset_event)( wmi_unified_t wmi_hdl, void *evt_buf, struct ftm_time_sync_offset *param); #endif /* FEATURE_WLAN_TIME_SYNC_FTM */ - +QDF_STATUS (*send_roam_scan_ch_list_req_cmd)(wmi_unified_t wmi_hdl, + uint32_t vdev_id); }; /* Forward declartion for psoc*/ diff --git a/wmi/inc/wmi_unified_roam_api.h b/wmi/inc/wmi_unified_roam_api.h index 72d5178caa..8cad035b4c 100644 --- a/wmi/inc/wmi_unified_roam_api.h +++ b/wmi/inc/wmi_unified_roam_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -379,6 +379,18 @@ QDF_STATUS wmi_unified_invoke_neighbor_report_cmd( wmi_unified_t wmi_handle, struct wmi_invoke_neighbor_report_params *params); +/** + * wmi_unified_get_roam_scan_ch_list() - send roam scan channel list get cmd + * @wmi_handle: wmi handle + * @vdev_id: vdev id + * + * This function sends roam scan channel list get command to firmware. + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_get_roam_scan_ch_list(wmi_unified_t wmi_handle, + uint8_t vdev_id); + #ifdef WLAN_FEATURE_ROAM_OFFLOAD /** * wmi_unified_set_roam_triggers() - send roam trigger bitmap diff --git a/wmi/src/wmi_unified_roam_api.c b/wmi/src/wmi_unified_roam_api.c index 2faa5cb5ab..90794794bc 100644 --- a/wmi/src/wmi_unified_roam_api.c +++ b/wmi/src/wmi_unified_roam_api.c @@ -1,6 +1,6 @@ /* - * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -317,6 +317,16 @@ QDF_STATUS wmi_unified_invoke_neighbor_report_cmd( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_unified_get_roam_scan_ch_list(wmi_unified_t wmi_handle, + uint8_t vdev_id) +{ + if (wmi_handle->ops->send_roam_scan_ch_list_req_cmd) + return wmi_handle->ops->send_roam_scan_ch_list_req_cmd( + wmi_handle, vdev_id); + + return QDF_STATUS_E_FAILURE; +} + #ifdef WLAN_FEATURE_ROAM_OFFLOAD QDF_STATUS wmi_unified_set_roam_triggers(wmi_unified_t wmi_handle, struct roam_triggers *triggers) diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 8a97fef70c..1baea22c6f 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -11841,6 +11841,46 @@ send_roam_scan_stats_cmd_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * send_roam_scan_ch_list_req_cmd_tlv() - send wmi cmd to get roam scan + * channel list from firmware + * @wmi_handle: wmi handler + * @vdev_id: vdev id + * + * Return: QDF_STATUS + */ +static QDF_STATUS send_roam_scan_ch_list_req_cmd_tlv(wmi_unified_t wmi_handle, + uint32_t vdev_id) +{ + wmi_buf_t buf; + wmi_roam_get_scan_channel_list_cmd_fixed_param *cmd; + uint16_t len = sizeof(*cmd); + int ret; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("%s: Failed to allocate wmi buffer", __func__); + return QDF_STATUS_E_NOMEM; + } + + cmd = (wmi_roam_get_scan_channel_list_cmd_fixed_param *) + wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_roam_get_scan_channel_list_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_roam_get_scan_channel_list_cmd_fixed_param)); + cmd->vdev_id = vdev_id; + wmi_mtrace(WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID, vdev_id, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_ROAM_GET_SCAN_CHANNEL_LIST_CMDID); + if (QDF_IS_STATUS_ERROR(ret)) { + WMI_LOGE("Failed to send get roam scan channels request = %d", + ret); + wmi_buf_free(buf); + } + return ret; +} + /** * extract_roam_scan_stats_res_evt_tlv() - Extract roam scan stats event * @wmi_handle: wmi handle @@ -13471,6 +13511,7 @@ struct wmi_ops tlv_ops = { .extract_time_sync_ftm_offset_event = extract_time_sync_ftm_offset_event_tlv, #endif /* FEATURE_WLAN_TIME_SYNC_FTM */ + .send_roam_scan_ch_list_req_cmd = send_roam_scan_ch_list_req_cmd_tlv, }; /** @@ -13835,6 +13876,8 @@ static void populate_tlv_events_id(uint32_t *event_ids) event_ids[wmi_wlan_time_sync_q_master_slave_offset_eventid] = WMI_VDEV_AUDIO_SYNC_Q_MASTER_SLAVE_OFFSET_EVENTID; #endif +event_ids[wmi_roam_scan_chan_list_id] = + WMI_ROAM_SCAN_CHANNEL_LIST_EVENTID; } /** @@ -14124,6 +14167,8 @@ static void populate_tlv_service(uint32_t *wmi_service) WMI_SERVICE_AUDIO_SYNC_SUPPORT; wmi_service[wmi_service_nss_ratio_to_host_support] = WMI_SERVICE_NSS_RATIO_TO_HOST_SUPPORT; + wmi_service[wmi_roam_scan_chan_list_to_host_support] = + WMI_SERVICE_ROAM_SCAN_CHANNEL_LIST_TO_HOST_SUPPORT; } /** From 35152d55627d33c1f16a1c861a29da28f3eda03f Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Wed, 12 Feb 2020 13:10:13 +0530 Subject: [PATCH 07/12] qcacmn: Add support to dynamically set dwell time for 2g Currently there is no support to dynamically set dwell time for 2g channels. Add support in existing command SETDWELLTIME to dynamically configure dwell time for 2g channels. Along with set, add support to get dwell time for 2g channels with the existing driver command GETDWELLTIME. Change-Id: I8a71e39338e7a81690140f50bc3c5ac7b0bd63eb CRs-Fixed: 2620370 --- umac/scan/dispatcher/inc/wlan_scan_api.h | 22 +++++++++++++- umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h | 30 ++++++++++++++++++- umac/scan/dispatcher/src/wlan_scan_api.c | 25 +++++++++++++++- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/umac/scan/dispatcher/inc/wlan_scan_api.h b/umac/scan/dispatcher/inc/wlan_scan_api.h index a55e9e457f..cda9789af2 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -28,6 +28,26 @@ #include #include "../../core/src/wlan_scan_main.h" +/** + * wlan_scan_cfg_set_active_2g_dwelltime() - API to set scan active 2g dwelltime + * @psoc: pointer to psoc object + * @dwell_time: scan active dwell time + * + * Return: none + */ +void wlan_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc, + uint32_t dwell_time); + +/** + * wlan_scan_cfg_get_active_2g_dwelltime() - API to get active 2g dwelltime + * @psoc: pointer to psoc object + * @dwell_time: scan active dwelltime + * + * Return: scan active dwell time + */ +void wlan_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc, + uint32_t *dwell_time); + /** * wlan_scan_cfg_set_active_dwelltime() - API to set scan active dwelltime * @psoc: pointer to psoc object diff --git a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h index 7a9b9143c9..2377099016 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -661,6 +661,20 @@ void ucfg_scan_cfg_set_active_dwelltime(struct wlan_objmgr_psoc *psoc, return wlan_scan_cfg_set_active_dwelltime(psoc, dwell_time); } +/** + * ucfg_scan_cfg_set_active_2g_dwelltime() - API to set scan active 2g dwelltime + * @psoc: pointer to psoc object + * @dwell_time: scan active dwell time + * + * Return: none + */ +static inline +void ucfg_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc, + uint32_t dwell_time) +{ + return wlan_scan_cfg_set_active_2g_dwelltime(psoc, dwell_time); +} + /** * ucfg_scan_cfg_get_active_dwelltime() - API to get active dwelltime * @psoc: pointer to psoc object @@ -702,6 +716,20 @@ void ucfg_scan_cfg_get_passive_dwelltime(struct wlan_objmgr_psoc *psoc, return wlan_scan_cfg_get_passive_dwelltime(psoc, dwell_time); } +/** + * ucfg_scan_cfg_get_active_2g_dwelltime() - API to get active 2g dwelltime + * @psoc: pointer to psoc object + * @dwell_time: scan active 2g dwelltime + * + * Return: scan active 2g dwelltime + */ +static inline +void ucfg_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc, + uint32_t *dwell_time) +{ + return wlan_scan_cfg_get_active_2g_dwelltime(psoc, dwell_time); +} + /** * ucfg_scan_cfg_get_conc_active_dwelltime() - Get concurrent active dwelltime * @psoc: pointer to psoc object diff --git a/umac/scan/dispatcher/src/wlan_scan_api.c b/umac/scan/dispatcher/src/wlan_scan_api.c index 030e580d98..648f5fba13 100644 --- a/umac/scan/dispatcher/src/wlan_scan_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -67,6 +67,29 @@ void wlan_scan_cfg_set_active_dwelltime(struct wlan_objmgr_psoc *psoc, scan_obj->scan_def.active_dwell = dwell_time; } +void wlan_scan_cfg_get_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc, + uint32_t *dwell_time) +{ + struct wlan_scan_obj *scan_obj; + + scan_obj = wlan_psoc_get_scan_obj(psoc); + if (!scan_obj) + return; + + *dwell_time = scan_obj->scan_def.active_dwell_2g; +} + +void wlan_scan_cfg_set_active_2g_dwelltime(struct wlan_objmgr_psoc *psoc, + uint32_t dwell_time) +{ + struct wlan_scan_obj *scan_obj; + + scan_obj = wlan_psoc_get_scan_obj(psoc); + if (!scan_obj) + return; + scan_obj->scan_def.active_dwell_2g = dwell_time; +} + void wlan_scan_cfg_get_conc_active_dwelltime(struct wlan_objmgr_psoc *psoc, uint32_t *dwell_time) { From 09815803ebf5b9695795659d55262e4aa8cf2bd4 Mon Sep 17 00:00:00 2001 From: Chaoli Zhou Date: Tue, 21 Jan 2020 16:35:01 +0800 Subject: [PATCH 08/12] qcacmn: Change copy engine 5 destination ring entries to 128 Genoa FW use the hardcode 128 for ce5 destination ring entries, so change host code to follow up with it. Change-Id: I1b7e70f8244efc3d3ca3dc659fb3d7687828b9c4 --- hif/src/ce/ce_assignment.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hif/src/ce/ce_assignment.h b/hif/src/ce/ce_assignment.h index 6f9c61284a..a198853cdd 100644 --- a/hif/src/ce/ce_assignment.h +++ b/hif/src/ce/ce_assignment.h @@ -124,7 +124,7 @@ static struct CE_pipe_config target_ce_config_wlan_qcn7605[] = { /* NB: 50% of src nentries, since tx has 2 frags */ #ifdef IPA_OFFLOAD /* ipa_uc->target */ - { /* CE5 */ 5, PIPEDIR_OUT, 512, 64, + { /* CE5 */ 5, PIPEDIR_OUT, 128, 64, (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,}, #else /* unused */ From 0c6d94dd3eaaae23954c28b04ea4792548b19d4c Mon Sep 17 00:00:00 2001 From: Yu Tian Date: Mon, 10 Feb 2020 12:54:10 +0800 Subject: [PATCH 09/12] qcacmn: cdp: Implement API cdp_set_key_sec_type Peer key security type is set in cdp_set_pn_check, this API is called in key install step, but only update Ucast field even if in Mcast key install. This may be set wrongly if Ucast and Mcast security modes are different. Add a new API to set security modes of differ key types separately. Change-Id: Icaa63139d117de75633ca1f81eb618c6b9294b53 CRs-Fixed: 2617461 --- dp/inc/cdp_txrx_cmn.h | 30 ++++++++++++++++ dp/inc/cdp_txrx_ops.h | 6 ++++ dp/wifi3.0/dp_internal.h | 5 +++ dp/wifi3.0/dp_main.c | 1 + dp/wifi3.0/dp_peer.c | 46 +++++++++++++++++++++++++ target_if/crypto/src/target_if_crypto.c | 4 +++ 6 files changed, 92 insertions(+) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index ffc1b940af..06804789c3 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -1677,6 +1677,36 @@ static inline int cdp_set_pn_check(ol_txrx_soc_handle soc, return 0; } +/** + * cdp_set_key_sec_type(): function to set sec mode of key + * @soc: soc handle + * @vdev_id: id of virtual device + * @peer_mac: mac address of peer + * @sec_type: security type + * #is_unicast: ucast or mcast + */ +static inline int cdp_set_key_sec_type(ol_txrx_soc_handle soc, + uint8_t vdev_id, + uint8_t *peer_mac, + enum cdp_sec_type sec_type, + bool is_unicast) +{ + if (!soc || !soc->ops) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid Instance:", __func__); + QDF_BUG(0); + return 0; + } + + if (!soc->ops->cmn_drv_ops || + !soc->ops->cmn_drv_ops->set_key_sec_type) + return 0; + + soc->ops->cmn_drv_ops->set_key_sec_type(soc, vdev_id, + peer_mac, sec_type, is_unicast); + return 0; +} + static inline QDF_STATUS cdp_set_key(ol_txrx_soc_handle soc, uint8_t vdev_id, diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 0c84365bdd..56c4e649ac 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -437,6 +437,12 @@ struct cdp_cmn_ops { uint8_t vdev_id, uint8_t *peermac, enum cdp_sec_type sec_type, uint32_t *rx_pn); + + QDF_STATUS(*set_key_sec_type)(struct cdp_soc_t *soc_handle, + uint8_t vdev_id, uint8_t *peermac, + enum cdp_sec_type sec_type, + bool is_unicast); + QDF_STATUS (*update_config_parameters)(struct cdp_soc *psoc, struct cdp_config_params *params); diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 0766b67362..e1fc51e733 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1140,6 +1140,11 @@ dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, uint8_t *peer_mac, enum cdp_sec_type sec_type, uint32_t *rx_pn); +QDF_STATUS +dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, enum cdp_sec_type sec_type, + bool is_unicast); + void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id); QDF_STATUS diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a3f81adb35..4f89421128 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -9964,6 +9964,7 @@ static struct cdp_cmn_ops dp_ops_cmn = { .txrx_intr_attach = dp_soc_interrupt_attach_wrapper, .txrx_intr_detach = dp_soc_interrupt_detach, .set_pn_check = dp_set_pn_check_wifi3, + .set_key_sec_type = dp_set_key_sec_type_wifi3, .update_config_parameters = dp_update_config_parameters, /* TODO: Add other functions */ .txrx_data_tx_cb_set = dp_txrx_data_tx_cb_set, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index a252adcf9a..c1e08926e0 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -3097,6 +3097,52 @@ fail: } +/** + * dp_set_key_sec_type_wifi3() - set security mode of key + * @soc: Datapath soc handle + * @peer_mac: Datapath peer mac address + * @vdev_id: id of atapath vdev + * @vdev: Datapath vdev + * @pdev - data path device instance + * @sec_type - security type + * #is_unicast - key type + * + */ + +QDF_STATUS +dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, + uint8_t *peer_mac, enum cdp_sec_type sec_type, + bool is_unicast) +{ + struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc, + peer_mac, 0, vdev_id); + QDF_STATUS status = QDF_STATUS_SUCCESS; + int sec_index; + + if (!peer || peer->delete_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Peer is NULL!\n", __func__); + status = QDF_STATUS_E_FAILURE; + goto fail; + } + + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, + "key sec spec for peer %pK %pM: %s key of type %d", + peer, + peer->mac_addr.raw, + is_unicast ? "ucast" : "mcast", + sec_type); + + sec_index = is_unicast ? dp_sec_ucast : dp_sec_mcast; + peer->security[sec_index].sec_type = sec_type; + +fail: + if (peer) + dp_peer_unref_delete(peer); + + return status; +} + void dp_rx_sec_ind_handler(struct dp_soc *soc, uint16_t peer_id, enum cdp_sec_type sec_type, int is_unicast, diff --git a/target_if/crypto/src/target_if_crypto.c b/target_if/crypto/src/target_if_crypto.c index 1460ab4043..abeb87fd10 100644 --- a/target_if/crypto/src/target_if_crypto.c +++ b/target_if/crypto/src/target_if_crypto.c @@ -200,6 +200,10 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev, qdf_mem_copy(&pn[0], ¶ms.key_rsc_ctr, sizeof(pn)); cdp_set_pn_check(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, sec_type, pn); + + cdp_set_key_sec_type(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, + sec_type, pairwise); + cdp_set_key(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, pairwise, (uint32_t *)(req->keyval + WLAN_CRYPTO_IV_SIZE + WLAN_CRYPTO_MIC_LEN)); From 3aa150756b297336771dfd4a5740bd9c052e1ee9 Mon Sep 17 00:00:00 2001 From: Shashikala Prabhu Date: Thu, 13 Feb 2020 12:14:35 +0530 Subject: [PATCH 10/12] qcacmn: Use restricted 80+80 MHz service bit instead of 165 MHz For restricted 80+80 MHz FR, target team initially added wmi_service_bw_165mhz_support to indicate the target is capable of supporting restricted 80+80 MHz. Later, they have added wmi_service_bw_restricted_80p80_support to indicate the same. Therefore rename wmi_service_bw_165mhz_support as wmi_service_bw_restricted_80p80_support. Change-Id: I12229b5d35911d4c34e63902c09592187d902bed CRs-Fixed: 2621249 --- target_if/init_deinit/src/init_event_handler.c | 3 ++- wmi/inc/wmi_unified_param.h | 1 + wmi/src/wmi_unified_tlv.c | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/target_if/init_deinit/src/init_event_handler.c b/target_if/init_deinit/src/init_event_handler.c index 5868c1a84d..bb21d00844 100644 --- a/target_if/init_deinit/src/init_event_handler.c +++ b/target_if/init_deinit/src/init_event_handler.c @@ -126,7 +126,8 @@ static int init_deinit_service_ready_event_handler(ol_scn_t scn_handle, if (wmi_service_enabled(wmi_handle, wmi_service_dynamic_hw_mode)) wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_DYNAMIC_HW_MODE); - if (wmi_service_enabled(wmi_handle, wmi_service_bw_165mhz_support)) + if (wmi_service_enabled(wmi_handle, + wmi_service_bw_restricted_80p80_support)) wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_RESTRICTED_80P80_SUPPORT); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 64b5567cf3..c0bc79d523 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -5101,6 +5101,7 @@ typedef enum { wmi_service_ext2_msg, wmi_service_6ghz_support, wmi_service_bw_165mhz_support, + wmi_service_bw_restricted_80p80_support, wmi_service_packet_capture_support, wmi_service_nan_vdev, wmi_service_multiple_vdev_restart_ext, diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 1baea22c6f..8ce92bdf8d 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -14156,6 +14156,8 @@ static void populate_tlv_service(uint32_t *wmi_service) WMI_SERVICE_6GHZ_SUPPORT; wmi_service[wmi_service_bw_165mhz_support] = WMI_SERVICE_BW_165MHZ_SUPPORT; + wmi_service[wmi_service_bw_restricted_80p80_support] = + WMI_SERVICE_BW_RESTRICTED_80P80_SUPPORT; wmi_service[wmi_service_packet_capture_support] = WMI_SERVICE_PACKET_CAPTURE_SUPPORT; wmi_service[wmi_service_nan_vdev] = WMI_SERVICE_NAN_VDEV_SUPPORT; From 281aa22857db5ff7ef31a6af9e801745cbb1b6de Mon Sep 17 00:00:00 2001 From: Alok Kumar Date: Thu, 6 Feb 2020 12:24:29 +0530 Subject: [PATCH 11/12] qcacmn: Update CE registers and CE IRQ for qca6750 Update CE registers offset during hal srng configuration and configure CE IRQ for qcac6750. Change-Id: I4fd3d37783361f0029c7ef80e32425f8790d1250 CRs-Fixed: 2617699 --- hal/wifi3.0/qca6750/hal_6750.c | 48 ++++++++++++++--------------- hif/src/hif_io32.h | 3 +- hif/src/ipcie/if_ipci.c | 56 ++-------------------------------- hif/src/qca6750def.c | 4 +-- 4 files changed, 30 insertions(+), 81 deletions(-) diff --git a/hal/wifi3.0/qca6750/hal_6750.c b/hal/wifi3.0/qca6750/hal_6750.c index 6132b174bb..94193bcc6b 100644 --- a/hal/wifi3.0/qca6750/hal_6750.c +++ b/hal/wifi3.0/qca6750/hal_6750.c @@ -1566,18 +1566,18 @@ struct hal_hw_srng_config hw_srng_table_6750[] = { .lmac_ring = FALSE, .ring_dir = HAL_SRNG_SRC_RING, .reg_start = { - HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR, - HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR, + HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR, }, .reg_size = { - HWIO_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR - - HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR, - HWIO_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR - - HWIO_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR - + HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_1_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR - + HWIO_HOST_SOC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR, }, .max_size = - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT }, { /* CE_DST */ .start_ring_id = HAL_SRNG_CE_0_DST, @@ -1590,18 +1590,18 @@ struct hal_hw_srng_config hw_srng_table_6750[] = { .lmac_ring = FALSE, .ring_dir = HAL_SRNG_SRC_RING, .reg_start = { - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR, - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR, + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR, }, .reg_size = { - HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR, - HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR + HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR }, .max_size = - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT }, { /* CE_DST_STATUS */ .start_ring_id = HAL_SRNG_CE_0_DST_STATUS, @@ -1610,19 +1610,19 @@ struct hal_hw_srng_config hw_srng_table_6750[] = { .lmac_ring = FALSE, .ring_dir = HAL_SRNG_DST_RING, .reg_start = { - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR, - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR, + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR, }, /* TODO: check destination status ring registers */ .reg_size = { - HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR, - HWIO_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR + HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR, + HWIO_HOST_SOC_CE_1_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR - + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR }, .max_size = - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> - HWIO_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> + HWIO_HOST_SOC_CE_0_DST_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, }, { /* WBM_IDLE_LINK */ .start_ring_id = HAL_SRNG_WBM_IDLE_LINK, diff --git a/hif/src/hif_io32.h b/hif/src/hif_io32.h index 4a8f93a992..e6c282f588 100644 --- a/hif/src/hif_io32.h +++ b/hif/src/hif_io32.h @@ -23,8 +23,7 @@ #include "hif.h" #include "hif_main.h" -#if defined(HIF_REG_WINDOW_SUPPORT) && (defined(HIF_PCI) || \ - defined(HIF_IPCI)) +#if defined(HIF_REG_WINDOW_SUPPORT) && defined(HIF_PCI) static inline void hif_write32_mb_reg_window(void *sc, diff --git a/hif/src/ipcie/if_ipci.c b/hif/src/ipcie/if_ipci.c index 5821eae649..0206bc7a3e 100644 --- a/hif/src/ipcie/if_ipci.c +++ b/hif/src/ipcie/if_ipci.c @@ -401,25 +401,12 @@ static int hif_ce_msi_configure_irq(struct hif_softc *scn) struct HIF_CE_state *ce_sc = HIF_GET_CE_STATE(scn); struct hif_ipci_softc *ipci_sc = HIF_GET_IPCI_SOFTC(scn); - /* do wake irq assignment */ - ret = pld_get_user_msi_assignment(scn->qdf_dev->dev, "WAKE", - &msi_data_count, &msi_data_start, - &msi_irq_start); - if (ret) - return ret; - - scn->wake_irq = pld_get_msi_irq(scn->qdf_dev->dev, msi_irq_start); - ret = request_irq(scn->wake_irq, hif_wake_interrupt_handler, - IRQF_NO_SUSPEND, "wlan_wake_irq", scn); - if (ret) - return ret; - /* do ce irq assignments */ ret = pld_get_user_msi_assignment(scn->qdf_dev->dev, "CE", &msi_data_count, &msi_data_start, &msi_irq_start); if (ret) - goto free_wake_irq; + return ret; scn->bus_ops.hif_irq_disable = &hif_ce_srng_msi_irq_disable; scn->bus_ops.hif_irq_enable = &hif_ce_srng_msi_irq_enable; @@ -462,10 +449,6 @@ free_irq: free_irq(irq, &ce_sc->tasklets[ce_id]); } -free_wake_irq: - free_irq(scn->wake_irq, scn->qdf_dev->dev); - scn->wake_irq = 0; - return ret; } @@ -685,7 +668,7 @@ bool hif_ipci_needs_bmi(struct hif_softc *scn) #ifdef FORCE_WAKE int hif_force_wake_request(struct hif_opaque_softc *hif_handle) { - uint32_t timeout = 0, value; + uint32_t timeout = 0; struct hif_softc *scn = (struct hif_softc *)hif_handle; struct hif_ipci_softc *ipci_scn = HIF_GET_IPCI_SOFTC(scn); @@ -707,36 +690,6 @@ int hif_force_wake_request(struct hif_opaque_softc *hif_handle) return -EINVAL; } HIF_STATS_INC(ipci_scn, mhi_force_wake_success, 1); - hif_write32_mb(scn, - scn->mem + - PCIE_SOC_PCIE_REG_PCIE_SCRATCH_0_SOC_PCIE_REG, - 0); - hif_write32_mb(scn, - scn->mem + - PCIE_PCIE_LOCAL_REG_PCIE_SOC_WAKE_PCIE_LOCAL_REG, - 1); - - HIF_STATS_INC(ipci_scn, soc_force_wake_register_write_success, 1); - /* - * do not reset the timeout - * total_wake_time = MHI_WAKE_TIME + PCI_WAKE_TIME < 50 ms - */ - do { - value = - hif_read32_mb(scn, - scn->mem + - PCIE_SOC_PCIE_REG_PCIE_SCRATCH_0_SOC_PCIE_REG); - if (value) - break; - qdf_mdelay(FORCE_WAKE_DELAY_MS); - timeout += FORCE_WAKE_DELAY_MS; - } while (timeout <= FORCE_WAKE_DELAY_TIMEOUT_MS); - - if (!value) { - hif_err("failed handshake mechanism"); - HIF_STATS_INC(ipci_scn, soc_force_wake_failure, 1); - return -ETIMEDOUT; - } HIF_STATS_INC(ipci_scn, soc_force_wake_success, 1); @@ -757,10 +710,7 @@ int hif_force_wake_release(struct hif_opaque_softc *hif_handle) } HIF_STATS_INC(ipci_scn, mhi_force_wake_release_success, 1); - hif_write32_mb(scn, - scn->mem + - PCIE_PCIE_LOCAL_REG_PCIE_SOC_WAKE_PCIE_LOCAL_REG, - 0); + HIF_STATS_INC(ipci_scn, soc_force_wake_release_success, 1); return 0; } diff --git a/hif/src/qca6750def.c b/hif/src/qca6750def.c index 6ec562ff6c..476a7a66d1 100644 --- a/hif/src/qca6750def.c +++ b/hif/src/qca6750def.c @@ -150,8 +150,8 @@ #define CE_DDR_ADDRESS_FOR_RRI_LOW MISSING #define CE_DDR_ADDRESS_FOR_RRI_HIGH MISSING -#define HOST_IE_ADDRESS HWIO_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_0_ADDR -#define HOST_IE_ADDRESS_2 HWIO_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_1_ADDR +#define HOST_IE_ADDRESS HWIO_HOST_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_0_ADDR +#define HOST_IE_ADDRESS_2 HWIO_HOST_SOC_CE_COMMON_WFSS_CE_COMMON_R0_CE_HOST_IE_1_ADDR #define HOST_IE_COPY_COMPLETE_MASK MISSING #define SR_BA_ADDRESS MISSING From f63aaef3d3724a88b1136f513b94c1fe12da4e66 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Date: Tue, 29 Oct 2019 08:44:18 +0530 Subject: [PATCH 12/12] qcacmn: Rename cmd ring to cmd_credit ring Command ring is now renamed to credit ring on QCN9000 and used for credit based flow. Renaming the ring to give meaningful name. Change-Id: I726aed19477fcfb256e4e0cca8ddb9389035b58c CRs-Fixed: 2562640 --- dp/wifi3.0/dp_main.c | 24 +++++++++++++----------- dp/wifi3.0/dp_stats.c | 8 ++++---- dp/wifi3.0/dp_types.h | 5 +++-- hal/wifi3.0/hal_api.h | 2 +- wlan_cfg/cfg_dp.h | 20 ++++++++++---------- wlan_cfg/wlan_cfg.c | 10 +++++----- wlan_cfg/wlan_cfg.h | 10 +++++----- 7 files changed, 41 insertions(+), 38 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 4f89421128..33071b3d2a 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1050,7 +1050,8 @@ static int dp_srng_calculate_msi_group(struct dp_soc *soc, break; case TCL_DATA: - case TCL_CMD: + /* CMD_CREDIT_RING is used as command in 8074 and credit in 9000 */ + case TCL_CMD_CREDIT: case REO_CMD: case SW2WBM_RELEASE: case WBM_IDLE_LINK: @@ -2976,12 +2977,11 @@ static int dp_soc_cmn_setup(struct dp_soc *soc) goto fail1; } - entries = wlan_cfg_get_dp_soc_tcl_cmd_ring_size(soc_cfg_ctx); - /* TCL command and status rings */ - if (dp_srng_setup(soc, &soc->tcl_cmd_ring, TCL_CMD, 0, 0, + entries = wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size(soc_cfg_ctx); + if (dp_srng_setup(soc, &soc->tcl_cmd_credit_ring, TCL_CMD_CREDIT, 0, 0, entries, 0)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("dp_srng_setup failed for tcl_cmd_ring")); + FL("dp_srng_setup failed for tcl_cmd_credit_ring.")); goto fail2; } @@ -4360,8 +4360,9 @@ static void dp_soc_deinit(void *txrx_soc) } } - /* TCL command and status rings */ - dp_srng_deinit(soc, &soc->tcl_cmd_ring, TCL_CMD, 0); + /* TCL command/credit ring */ + dp_srng_deinit(soc, &soc->tcl_cmd_credit_ring, TCL_CMD_CREDIT, 0); + /* TCL status ring */ dp_srng_deinit(soc, &soc->tcl_status_ring, TCL_STATUS, 0); /* Rx data rings */ @@ -4462,8 +4463,9 @@ static void dp_soc_detach(struct cdp_soc_t *txrx_soc) } } - /* TCL command and status rings */ - dp_srng_cleanup(soc, &soc->tcl_cmd_ring, TCL_CMD, 0); + /* TCL command/credit ring */ + dp_srng_cleanup(soc, &soc->tcl_cmd_credit_ring, TCL_CMD_CREDIT, 0); + /* TCL status rings */ dp_srng_cleanup(soc, &soc->tcl_status_ring, TCL_STATUS, 0); /* Rx data rings */ @@ -7332,8 +7334,8 @@ char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type) return "wbm2sw_release"; case TCL_DATA: return "tcl_data"; - case TCL_CMD: - return "tcl_cmd"; + case TCL_CMD_CREDIT: + return "tcl_cmd_credit"; case TCL_STATUS: return "tcl_status"; case SW2WBM_RELEASE: diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 25a1d71105..8dbe757c05 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -4689,8 +4689,8 @@ void dp_print_soc_cfg_params(struct dp_soc *soc) soc_cfg_ctx->rx_defrag_min_timeout); DP_PRINT_STATS("WBM release ring: %u ", soc_cfg_ctx->wbm_release_ring); - DP_PRINT_STATS("TCL CMD ring: %u ", - soc_cfg_ctx->tcl_cmd_ring); + DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ", + soc_cfg_ctx->tcl_cmd_credit_ring); DP_PRINT_STATS("TCL Status ring: %u ", soc_cfg_ctx->tcl_status_ring); DP_PRINT_STATS("REO Reinject ring: %u ", @@ -4903,8 +4903,8 @@ dp_print_ring_stats(struct dp_pdev *pdev) &pdev->soc->rx_rel_ring, WBM2SW_RELEASE); dp_print_ring_stat_from_hal(pdev->soc, - &pdev->soc->tcl_cmd_ring, - TCL_CMD); + &pdev->soc->tcl_cmd_credit_ring, + TCL_CMD_CREDIT); dp_print_ring_stat_from_hal(pdev->soc, &pdev->soc->tcl_status_ring, TCL_STATUS); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 911aeebeb2..b3bf1fb408 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1014,8 +1014,9 @@ struct dp_soc { /* Number of TCL data rings */ uint8_t num_tcl_data_rings; - /* TCL command ring */ - struct dp_srng tcl_cmd_ring; + /* TCL CMD_CREDIT ring */ + /* It is used as credit based ring on QCN9000 else command ring */ + struct dp_srng tcl_cmd_credit_ring; /* TCL command status ring */ struct dp_srng tcl_status_ring; diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index 3ee323b5df..5406a42942 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -552,7 +552,7 @@ enum hal_ring_type { REO_CMD = 3, REO_STATUS = 4, TCL_DATA = 5, - TCL_CMD = 6, + TCL_CMD_CREDIT = 6, TCL_STATUS = 7, CE_SRC = 8, CE_DST = 9, diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index db0fa7ea06..bfbda42f1a 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -188,9 +188,9 @@ #define WLAN_CFG_WBM_RELEASE_RING_SIZE_MIN 64 #define WLAN_CFG_WBM_RELEASE_RING_SIZE_MAX 64 -#define WLAN_CFG_TCL_CMD_RING_SIZE 32 -#define WLAN_CFG_TCL_CMD_RING_SIZE_MIN 32 -#define WLAN_CFG_TCL_CMD_RING_SIZE_MAX 32 +#define WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE 32 +#define WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MIN 32 +#define WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MAX 32 #define WLAN_CFG_TCL_STATUS_RING_SIZE 32 #define WLAN_CFG_TCL_STATUS_RING_SIZE_MIN 32 @@ -550,12 +550,12 @@ WLAN_CFG_WBM_RELEASE_RING_SIZE, \ CFG_VALUE_OR_DEFAULT, "DP WBM Release Ring") -#define CFG_DP_TCL_CMD_RING \ - CFG_INI_UINT("dp_tcl_cmd_ring", \ - WLAN_CFG_TCL_CMD_RING_SIZE_MIN, \ - WLAN_CFG_TCL_CMD_RING_SIZE_MAX, \ - WLAN_CFG_TCL_CMD_RING_SIZE, \ - CFG_VALUE_OR_DEFAULT, "DP TCL command ring") +#define CFG_DP_TCL_CMD_CREDIT_RING \ + CFG_INI_UINT("dp_tcl_cmd_credit_ring", \ + WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MIN, \ + WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE_MAX, \ + WLAN_CFG_TCL_CMD_CREDIT_RING_SIZE, \ + CFG_VALUE_OR_DEFAULT, "DP TCL Cmd_Credit ring") #define CFG_DP_TCL_STATUS_RING \ CFG_INI_UINT("dp_tcl_status_ring",\ @@ -825,7 +825,7 @@ CFG(CFG_DP_TCP_UDP_CKSUM_OFFLOAD) \ CFG(CFG_DP_DEFRAG_TIMEOUT_CHECK) \ CFG(CFG_DP_WBM_RELEASE_RING) \ - CFG(CFG_DP_TCL_CMD_RING) \ + CFG(CFG_DP_TCL_CMD_CREDIT_RING) \ CFG(CFG_DP_TCL_STATUS_RING) \ CFG(CFG_DP_REO_REINJECT_RING) \ CFG(CFG_DP_RX_RELEASE_RING) \ diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index a3ef5933f9..7413ba335c 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -342,7 +342,7 @@ void wlan_set_srng_cfg(struct wlan_srng_cfg **wlan_cfg) g_wlan_srng_cfg[REO_CMD] = wlan_srng_default_cfg; g_wlan_srng_cfg[REO_STATUS] = wlan_srng_default_cfg; g_wlan_srng_cfg[TCL_DATA] = wlan_srng_default_cfg; - g_wlan_srng_cfg[TCL_CMD] = wlan_srng_default_cfg; + g_wlan_srng_cfg[TCL_CMD_CREDIT] = wlan_srng_default_cfg; g_wlan_srng_cfg[TCL_STATUS] = wlan_srng_default_cfg; g_wlan_srng_cfg[WBM_IDLE_LINK] = wlan_srng_default_cfg; g_wlan_srng_cfg[SW2WBM_RELEASE] = wlan_srng_default_cfg; @@ -516,8 +516,8 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) wlan_cfg_ctx->wbm_release_ring = cfg_get(psoc, CFG_DP_WBM_RELEASE_RING); - wlan_cfg_ctx->tcl_cmd_ring = cfg_get(psoc, - CFG_DP_TCL_CMD_RING); + wlan_cfg_ctx->tcl_cmd_credit_ring = cfg_get(psoc, + CFG_DP_TCL_CMD_CREDIT_RING); wlan_cfg_ctx->tcl_status_ring = cfg_get(psoc, CFG_DP_TCL_STATUS_RING); wlan_cfg_ctx->reo_reinject_ring = cfg_get(psoc, @@ -1068,9 +1068,9 @@ wlan_cfg_get_dp_soc_wbm_release_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg) } int -wlan_cfg_get_dp_soc_tcl_cmd_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg) +wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg) { - return cfg->tcl_cmd_ring; + return cfg->tcl_cmd_credit_ring; } int diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index dda20459fb..61191c8d95 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -143,7 +143,7 @@ struct wlan_srng_cfg { * @nss_cfg: nss configuration * @rx_defrag_min_timeout: rx defrag minimum timeout * @wbm_release_ring: wbm release ring size - * @tcl_cmd_ring: tcl cmd ring size + * @tcl_cmd_credit_ring: tcl command/credit ring size * @tcl_status_ring: tcl status ring size * @reo_reinject_ring: reo reinject ring * @rx_release_ring: rx release ring size @@ -241,7 +241,7 @@ struct wlan_cfg_dp_soc_ctxt { int rx_defrag_min_timeout; int reo_dst_ring_size; int wbm_release_ring; - int tcl_cmd_ring; + int tcl_cmd_credit_ring; int tcl_status_ring; int reo_reinject_ring; int rx_release_ring; @@ -998,13 +998,13 @@ int wlan_cfg_get_dp_soc_wbm_release_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg); /* - * wlan_cfg_get_dp_soc_tcl_cmd_ring_size - Get tcl_cmd_ring size + * wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size - Get command/credit ring size * @wlan_cfg_soc_ctx * - * Return: tcl_cmd_ring size + * Return: tcl_cmd_credit_ring size */ int -wlan_cfg_get_dp_soc_tcl_cmd_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg); +wlan_cfg_get_dp_soc_tcl_cmd_credit_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg); /* * wlan_cfg_get_dp_soc_tcl_status_ring_size - Get tcl_status_ring size