diff --git a/utils/pktlog/include/pktlog_wifi3.h b/utils/pktlog/include/pktlog_wifi3.h new file mode 100644 index 0000000000..77927227fd --- /dev/null +++ b/utils/pktlog/include/pktlog_wifi3.h @@ -0,0 +1,70 @@ +/** + * 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 above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "pktlog_ac_i.h" +#include "wlan_logging_sock_svc.h" + +#ifndef REMOVE_PKT_LOG +/** + * process_offload_pktlog_wifi3() - Process full pktlog events + * pdev: abstract pdev handle + * data: pktlog buffer + * + * Return: zero on success, non-zero on failure + */ +A_STATUS +process_offload_pktlog_wifi3(struct cdp_pdev *pdev, void *data); + +/** + * process_rx_desc_remote_wifi3() - Process pktlog buffers received + * from monitor status ring + * @pdev: pdev handle + * @data: pktlog buffer pointer + * + * Return: 0 - success/non-zero - failure + */ +int process_rx_desc_remote_wifi3(void *pdev, void *data); + +/** + * process_pktlog_lite_wifi3() - Process pktlog buffers received + * from monitor status ring + * @pdev: pdev handle + * @data: pktlog buffer pointer + * + * Return: 0 - success/non-zero - failure + */ +int process_pktlog_lite_wifi3(void *context, void *log_data, + uint16_t log_type); +#else +static inline A_STATUS +process_offload_pktlog_wifi3(struct cdp_pdev *pdev, void *data) +{ + return 0; +} + +static inline +int process_rx_desc_remote_wifi3(void *pdev, void *data) +{ + return 0; +} + +static inline int +process_pktlog_lite_wifi3(void *context, void *log_data, + uint16_t log_type) +{ + return 0; +} +#endif /* REMOVE_PKT_LOG */ diff --git a/utils/pktlog/pktlog_ac.c b/utils/pktlog/pktlog_ac.c index e71b0675c7..cd083b204a 100644 --- a/utils/pktlog/pktlog_ac.c +++ b/utils/pktlog/pktlog_ac.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -286,7 +286,7 @@ void pktlog_callback(void *pdev, enum WDI_EVENT event, void *log_data, switch (event) { case WDI_EVENT_OFFLOAD_ALL: { - if (process_offload_pktlog(pdev, log_data)) { + if (process_offload_pktlog_wifi3(pdev, log_data)) { qdf_print("Unable to process offload info"); return; } @@ -370,7 +370,7 @@ lit_pktlog_callback(void *context, enum WDI_EVENT event, void *log_data, switch (event) { case WDI_EVENT_RX_DESC: { - if (process_rx_desc_remote(context, log_data)) { + if (process_rx_desc_remote_wifi3(context, log_data)) { qdf_print("Unable to process RX info"); return; } @@ -378,8 +378,8 @@ lit_pktlog_callback(void *context, enum WDI_EVENT event, void *log_data, } case WDI_EVENT_LITE_T2H: { - if (process_pktlog_lite(context, log_data, - PKTLOG_TYPE_LITE_T2H)) { + if (process_pktlog_lite_wifi3(context, log_data, + PKTLOG_TYPE_LITE_T2H)) { qdf_print("Unable to process lite_t2h"); return; } @@ -387,8 +387,8 @@ lit_pktlog_callback(void *context, enum WDI_EVENT event, void *log_data, } case WDI_EVENT_LITE_RX: { - if (process_pktlog_lite(context, log_data, - PKTLOG_TYPE_LITE_RX)) { + if (process_pktlog_lite_wifi3(context, log_data, + PKTLOG_TYPE_LITE_RX)) { qdf_print("Unable to process lite_rx"); return; } diff --git a/utils/pktlog/pktlog_internal.c b/utils/pktlog/pktlog_internal.c index d02bf3021c..7907bc3114 100644 --- a/utils/pktlog/pktlog_internal.c +++ b/utils/pktlog/pktlog_internal.c @@ -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 @@ -695,83 +695,6 @@ A_STATUS process_tx_info(struct cdp_pdev *txrx_pdev, void *data) } #endif -/** - * process_offload_pktlog() - Process full pktlog events - * pdev: abstract pdev handle - * data: pktlog buffer - * - * Return: zero on success, non-zero on failure - */ -A_STATUS -process_offload_pktlog(struct cdp_pdev *pdev, void *data) -{ - struct pktlog_dev_t *pl_dev = get_pktlog_handle(); - struct ath_pktlog_info *pl_info; - struct ath_pktlog_hdr pl_hdr; - uint32_t *pl_tgt_hdr; - void *txdesc_hdr_ctl = NULL; - size_t log_size = 0; - size_t tmp_log_size = 0; - - if (!pl_dev) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "Invalid context in %s\n", __func__); - return A_ERROR; - } - - if (!data) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "Invalid data in %s\n", __func__); - return A_ERROR; - } - - pl_tgt_hdr = (uint32_t *)data; - - pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) & - ATH_PKTLOG_HDR_FLAGS_MASK) >> - ATH_PKTLOG_HDR_FLAGS_SHIFT; - pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) & - ATH_PKTLOG_HDR_MISSED_CNT_MASK) >> - ATH_PKTLOG_HDR_MISSED_CNT_SHIFT; - pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) & - ATH_PKTLOG_HDR_LOG_TYPE_MASK) >> - ATH_PKTLOG_HDR_LOG_TYPE_SHIFT; - pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) & - ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT; - pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET); - - pktlog_hdr_set_specific_data(&pl_hdr, - *(pl_tgt_hdr + - ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET)); - - if (pl_hdr.size > MAX_PKTLOG_RECV_BUF_SIZE) { - pl_dev->invalid_packets++; - return A_ERROR; - } - - /* - * Must include to process different types - * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR - */ - pl_info = pl_dev->pl_info; - tmp_log_size = sizeof(frm_hdr) + pl_hdr.size; - log_size = pl_hdr.size; - txdesc_hdr_ctl = - (void *)pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr); - if (!txdesc_hdr_ctl) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "Failed to allocate pktlog descriptor"); - return A_NO_MEMORY; - } - qdf_assert(txdesc_hdr_ctl); - qdf_assert(pl_hdr->size < PKTLOG_MAX_TX_WORDS * sizeof(u_int32_t)); - qdf_mem_copy(txdesc_hdr_ctl, - ((void *)data + sizeof(struct ath_pktlog_hdr)), - pl_hdr.size); - cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, txdesc_hdr_ctl); - - return A_OK; -} /* TODO: hardware dependent function */ A_STATUS process_rx_info_remote(void *pdev, void *data) @@ -1476,91 +1399,4 @@ A_STATUS process_rate_update(void *pdev, void *data) return A_OK; } #endif - -#if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390) || \ -defined(QCA_WIFI_QCA6490) -int process_rx_desc_remote(void *pdev, void *data) -{ - struct pktlog_dev_t *pl_dev = get_pktlog_handle(); - struct ath_pktlog_hdr pl_hdr; - struct ath_pktlog_rx_info rxstat_log; - size_t log_size; - struct ath_pktlog_info *pl_info; - qdf_nbuf_t log_nbuf = (qdf_nbuf_t)data; - - if (!pl_dev) { - qdf_err("Pktlog handle is NULL"); - return -EINVAL; - } - - pl_info = pl_dev->pl_info; - qdf_mem_zero(&pl_hdr, sizeof(pl_hdr)); - pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S); - pl_hdr.missed_cnt = 0; - pl_hdr.log_type = PKTLOG_TYPE_RX_STATBUF; - pl_hdr.size = qdf_nbuf_len(log_nbuf); - pl_hdr.timestamp = 0; - log_size = pl_hdr.size; - rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info, - log_size, &pl_hdr); - - if (!rxstat_log.rx_desc) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, - "%s: Rx descriptor is NULL", __func__); - return -EINVAL; - } - - qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size); - cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, - rxstat_log.rx_desc); - return 0; -} - -int -process_pktlog_lite(void *context, void *log_data, uint16_t log_type) -{ - struct pktlog_dev_t *pl_dev = get_pktlog_handle(); - struct ath_pktlog_info *pl_info; - struct ath_pktlog_hdr pl_hdr; - struct ath_pktlog_rx_info rxstat_log; - size_t log_size; - qdf_nbuf_t log_nbuf = (qdf_nbuf_t)log_data; - - if (!pl_dev) { - qdf_err("Pktlog handle is NULL"); - return -EINVAL; - } - - pl_info = pl_dev->pl_info; - qdf_mem_zero(&pl_hdr, sizeof(pl_hdr)); - pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S); - pl_hdr.missed_cnt = 0; - pl_hdr.log_type = log_type; - pl_hdr.size = qdf_nbuf_len(log_nbuf); - pl_hdr.timestamp = 0; - log_size = pl_hdr.size; - rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info, - log_size, &pl_hdr); - if (!rxstat_log.rx_desc) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, - "%s: Rx descriptor is NULL", __func__); - return -EINVAL; - } - - qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size); - - cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc); - return 0; -} -#else -int process_rx_desc_remote(void *pdev, void *data) -{ - return 0; -} -int -process_pktlog_lite(void *context, void *log_data, uint16_t log_type) -{ - return 0; -} -#endif #endif /*REMOVE_PKT_LOG */ diff --git a/utils/pktlog/pktlog_wifi3.c b/utils/pktlog/pktlog_wifi3.c new file mode 100644 index 0000000000..01c8f60d6c --- /dev/null +++ b/utils/pktlog/pktlog_wifi3.c @@ -0,0 +1,166 @@ +/** + * 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 above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* WIFI3 - Refers to platforms - 6290/6390/6490 */ +#include "pktlog_wifi3.h" + +#ifndef REMOVE_PKT_LOG +A_STATUS +process_offload_pktlog_wifi3(struct cdp_pdev *pdev, void *data) +{ + struct pktlog_dev_t *pl_dev = get_pktlog_handle(); + struct ath_pktlog_info *pl_info; + struct ath_pktlog_hdr pl_hdr; + uint32_t *pl_tgt_hdr; + void *txdesc_hdr_ctl = NULL; + size_t log_size = 0; + size_t tmp_log_size = 0; + + if (!pl_dev) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Invalid context in %s\n", __func__); + return A_ERROR; + } + + if (!data) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Invalid data in %s\n", __func__); + return A_ERROR; + } + + pl_tgt_hdr = (uint32_t *)data; + + pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) & + ATH_PKTLOG_HDR_FLAGS_MASK) >> + ATH_PKTLOG_HDR_FLAGS_SHIFT; + pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) & + ATH_PKTLOG_HDR_MISSED_CNT_MASK) >> + ATH_PKTLOG_HDR_MISSED_CNT_SHIFT; + pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) & + ATH_PKTLOG_HDR_LOG_TYPE_MASK) >> + ATH_PKTLOG_HDR_LOG_TYPE_SHIFT; + pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) & + ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT; + pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET); + + pktlog_hdr_set_specific_data(&pl_hdr, + *(pl_tgt_hdr + + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET)); + + if (pl_hdr.size > MAX_PKTLOG_RECV_BUF_SIZE) { + pl_dev->invalid_packets++; + return A_ERROR; + } + + /* + * Must include to process different types + * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR + */ + pl_info = pl_dev->pl_info; + tmp_log_size = sizeof(frm_hdr) + pl_hdr.size; + log_size = pl_hdr.size; + txdesc_hdr_ctl = + (void *)pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr); + if (!txdesc_hdr_ctl) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Failed to allocate pktlog descriptor"); + return A_NO_MEMORY; + } + qdf_assert(txdesc_hdr_ctl); + qdf_assert(pl_hdr->size < PKTLOG_MAX_TX_WORDS * sizeof(u_int32_t)); + qdf_mem_copy(txdesc_hdr_ctl, + ((void *)data + sizeof(struct ath_pktlog_hdr)), + pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, txdesc_hdr_ctl); + + return A_OK; +} + +int process_rx_desc_remote_wifi3(void *pdev, void *data) +{ + struct pktlog_dev_t *pl_dev = get_pktlog_handle(); + struct ath_pktlog_hdr pl_hdr; + struct ath_pktlog_rx_info rxstat_log; + size_t log_size; + struct ath_pktlog_info *pl_info; + qdf_nbuf_t log_nbuf = (qdf_nbuf_t)data; + + if (!pl_dev) { + qdf_err("Pktlog handle is NULL"); + return -EINVAL; + } + + pl_info = pl_dev->pl_info; + qdf_mem_zero(&pl_hdr, sizeof(pl_hdr)); + pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S); + pl_hdr.missed_cnt = 0; + pl_hdr.log_type = PKTLOG_TYPE_RX_STATBUF; + pl_hdr.size = qdf_nbuf_len(log_nbuf); + pl_hdr.timestamp = 0; + log_size = pl_hdr.size; + rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info, + log_size, &pl_hdr); + + if (!rxstat_log.rx_desc) { + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, + "%s: Rx descriptor is NULL", __func__); + return -EINVAL; + } + + qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + rxstat_log.rx_desc); + return 0; +} + +int +process_pktlog_lite_wifi3(void *context, void *log_data, + uint16_t log_type) +{ + struct pktlog_dev_t *pl_dev = get_pktlog_handle(); + struct ath_pktlog_info *pl_info; + struct ath_pktlog_hdr pl_hdr; + struct ath_pktlog_rx_info rxstat_log; + size_t log_size; + qdf_nbuf_t log_nbuf = (qdf_nbuf_t)log_data; + + if (!pl_dev) { + qdf_err("Pktlog handle is NULL"); + return -EINVAL; + } + + pl_info = pl_dev->pl_info; + qdf_mem_zero(&pl_hdr, sizeof(pl_hdr)); + pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S); + pl_hdr.missed_cnt = 0; + pl_hdr.log_type = log_type; + pl_hdr.size = qdf_nbuf_len(log_nbuf); + pl_hdr.timestamp = 0; + log_size = pl_hdr.size; + rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info, + log_size, &pl_hdr); + if (!rxstat_log.rx_desc) { + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, + "%s: Rx descriptor is NULL", __func__); + return -EINVAL; + } + + qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size); + + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc); + return 0; +} +#endif /* REMOVE_PKT_LOG */