From 511db296dd61594f057d2bd8495c5257b008d9f9 Mon Sep 17 00:00:00 2001 From: Sumeet Rao Date: Mon, 22 Jul 2019 11:42:48 -0700 Subject: [PATCH] qcacmn: Add CDP api to set rx_pkt_enable,tx_pkt_enable for a peer Since tx_monitor mode and rx_monitor mode consume signficant MIPS when enabled on a per-peer basis, new requirement is to enable such functionality on a per-peer basis. New CDP APIs are added to set these per-peer parameters. CRs-Fixed: 2494471 Change-Id: Ib44845ec98481cc4df36c30f47335522e5274568 --- dp/inc/cdp_txrx_cmn_struct.h | 12 ++++++ dp/inc/cdp_txrx_ctrl.h | 34 +++++++++++++++++ dp/inc/cdp_txrx_ops.h | 6 +++ dp/wifi3.0/dp_main.c | 73 +++++++++++++++++++++++++++++++++++- dp/wifi3.0/dp_peer.h | 13 +++++++ dp/wifi3.0/dp_types.h | 4 +- 6 files changed, 140 insertions(+), 2 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index dde806e10bbb..c9e6754d1114 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -910,6 +910,18 @@ enum cdp_rx_enh_capture_mode { CDP_RX_ENH_CAPTURE_MPDU_MSDU, }; +/** + * cdp_tx_enh_capture_mode - Tx enhanced capture modes + * @CDP_TX_ENH_CAPTURE_DISABLED: Disable Tx enhance capture for all peers + * @CDP_TX_ENH_CAPTURE_ENABLE_ALL_PEERS: Enable tx capture for all peers + * @CDP_TX_ENH_CAPTURE_ENDIS_PER_PEER: Enable/disable per peer as necessary + */ +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, +}; + /* * enum cdp_pdev_bpr_param - different types of parameters * to set value in pdev diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index 347c70ab9775..141f4b480443 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -723,6 +723,40 @@ cdp_get_pldev(ol_txrx_soc_handle soc, return soc->ops->ctrl_ops->txrx_get_pldev(pdev); } +#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH) +/** + * cdp_update_peer_pkt_capture_params() - Sets Rx & Tx Capture params for a peer + * @soc: SOC TXRX handle + * @pdev: CDP pdev pointer + * @is_rx_pkt_cap_enable: enable/disable rx pkt capture for this peer + * @is_tx_pkt_cap_enable: enable/disable tx pkt capture for this peer + * @peer_mac: MAC address of peer for which pkt_cap is to be enabled/disabled + * + * Return: Success when matching peer is found & flags are set, error otherwise + */ +static inline QDF_STATUS +cdp_update_peer_pkt_capture_params(ol_txrx_soc_handle soc, + struct cdp_pdev *pdev, + bool is_rx_pkt_cap_enable, + bool is_tx_pkt_cap_enable, + uint8_t *peer_mac) +{ + if (!soc || !soc->ops) { + dp_err("Invalid SOC instance"); + QDF_BUG(0); + return QDF_STATUS_E_FAILURE; + } + + if (!soc->ops->ctrl_ops || + !soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params) + return QDF_STATUS_E_FAILURE; + + return soc->ops->ctrl_ops->txrx_update_peer_pkt_capture_params + (pdev, is_rx_pkt_cap_enable, is_tx_pkt_cap_enable, + peer_mac); +} +#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */ + #ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG /** * cdp_update_pdev_rx_protocol_tag() - wrapper function to set the protocol diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index f625c62dc104..e96403e9de4c 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -683,6 +683,12 @@ struct cdp_ctrl_ops { struct cdp_vdev *vdev, uint8_t *peer_mac, uint16_t vlan_id); #endif +#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH) + QDF_STATUS (*txrx_update_peer_pkt_capture_params)( + struct cdp_pdev *txrx_pdev_handle, + bool is_rx_pkt_cap_enable, bool is_tx_pkt_cap_enable, + uint8_t *peer_mac); +#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */ }; struct cdp_me_ops { diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 3d02ed93b0a0..376f866c8847 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -125,7 +125,7 @@ dp_config_enh_rx_capture(struct cdp_pdev *pdev_handle, uint8_t val) * Return: QDF_STATUS */ static QDF_STATUS -dp_config_enh_tx_capture(struct cdp_pdev *pdev_handle, int val) +dp_config_enh_tx_capture(struct cdp_pdev *pdev_handle, uint8_t val) { return QDF_STATUS_E_INVAL; } @@ -1087,12 +1087,16 @@ static void dp_print_peer_table(struct dp_vdev *vdev) " nawds_enabled = %d" " bss_peer = %d" " wds_enabled = %d" + " tx_cap_enabled = %d" + " rx_cap_enabled = %d" " delete in progress = %d" " peer id = %d", peer->mac_addr.raw, peer->nawds_enabled, peer->bss_peer, peer->wds_enabled, + peer->tx_cap_enabled, + peer->rx_cap_enabled, peer->delete_in_progress, peer->peer_ids[0]); } @@ -7756,6 +7760,69 @@ static void dp_peer_set_nawds(struct cdp_peer *peer_handle, uint8_t value) peer->nawds_enabled = value; } +/** + * dp_peer_set_tx_capture_enabled: Set tx_cap_enabled bit in peer + * @peer_handle: Peer handle + * @value: Enable/disable setting for tx_cap_enabled + * + * Return: None + */ +static void +dp_peer_set_tx_capture_enabled(struct cdp_peer *peer_handle, bool value) +{ + struct dp_peer *peer = (struct dp_peer *)peer_handle; + + peer->tx_cap_enabled = value; +} + +/** + * dp_peer_set_rx_capture_enabled: Set rx_cap_enabled bit in peer + * @peer_handle: Peer handle + * @value: Enable/disable setting for rx_cap_enabled + * + * Return: None + */ +static void +dp_peer_set_rx_capture_enabled(struct cdp_peer *peer_handle, bool value) +{ + struct dp_peer *peer = (struct dp_peer *)peer_handle; + + peer->rx_cap_enabled = value; +} + +/** + * dp_peer_update_pkt_capture_params: Set Rx & Tx Capture flags for a peer + * @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 + * @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 + */ +QDF_STATUS +dp_peer_update_pkt_capture_params(struct cdp_pdev *pdev, + bool is_rx_pkt_cap_enable, + bool is_tx_pkt_cap_enable, + uint8_t *peer_mac) + +{ + struct dp_peer *peer; + uint8_t local_id; + + peer = (struct dp_peer *)dp_find_peer_by_addr(pdev, + peer_mac, &local_id); + + if (!peer) { + dp_err("Invalid Peer"); + return QDF_STATUS_E_FAILURE; + } + + dp_peer_set_rx_capture_enabled((struct cdp_peer *)peer, + is_rx_pkt_cap_enable); + dp_peer_set_tx_capture_enabled((struct cdp_peer *)peer, + is_tx_pkt_cap_enable); + return QDF_STATUS_SUCCESS; +} + /* * dp_set_vdev_dscp_tid_map_wifi3(): Update Map ID selected for particular vdev * @vdev_handle: DP_VDEV handle @@ -9258,6 +9325,10 @@ static struct cdp_ctrl_ops dp_ops_ctrl = { #ifdef QCA_MULTIPASS_SUPPORT .txrx_peer_set_vlan_id = dp_peer_set_vlan_id, #endif /*QCA_MULTIPASS_SUPPORT*/ +#if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_RX_PKT_CAPTURE_ENH) + .txrx_update_peer_pkt_capture_params = + dp_peer_update_pkt_capture_params, +#endif /* WLAN_TX_PKT_CAPTURE_ENH || WLAN_RX_PKT_CAPTURE_ENH */ }; static struct cdp_me_ops dp_ops_me = { diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 0ab8c9e6b3ab..7a2f08f82290 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -274,4 +274,17 @@ void dp_peer_multipass_list_init(struct dp_vdev *vdev); void dp_peer_multipass_list_remove(struct dp_peer *peer); #endif +/** + * dp_peer_update_pkt_capture_params: Set Rx & Tx Capture flags for a peer + * @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 + * @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 + */ +QDF_STATUS +dp_peer_update_pkt_capture_params(struct cdp_pdev *pdev, + bool is_rx_pkt_cap_enable, + bool is_tx_pkt_cap_enable, + uint8_t *peer_mac); #endif /* _DP_PEER_H_ */ diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index bdbe98523b76..d40dea4915cc 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1658,7 +1658,7 @@ struct dp_pdev { #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ /* tx packet capture enhancement */ - bool tx_capture_enabled; + enum cdp_tx_enh_capture_mode tx_capture_enabled; struct dp_pdev_tx_capture tx_capture; /* stats counter for tx ppdu processed */ uint64_t tx_ppdu_proc; @@ -1944,6 +1944,8 @@ struct dp_peer { wds_enabled:1, /* WDS peer */ authorize:1, /* Set when authorized */ nac:1, /* NAC Peer*/ + tx_cap_enabled:1, /* Peer's tx-capture is enabled */ + rx_cap_enabled:1, /* Peer's rx-capture is enabled */ valid:1; /* valid bit */ /* MCL specific peer local id */