diff --git a/core/cds/inc/cds_sched.h b/core/cds/inc/cds_sched.h index 0a269007a4..dfed8a8ccc 100644 --- a/core/cds/inc/cds_sched.h +++ b/core/cds/inc/cds_sched.h @@ -310,6 +310,8 @@ typedef struct _cds_context_type { void (*sme_get_nss_for_vdev)(void*, enum tQDF_ADAPTER_MODE, uint8_t *, uint8_t *); + void (*ol_txrx_update_mac_id)(uint8_t , uint8_t); + /* This list is not sessionized. This mandatory channel list would be * as per OEMs preference as per the regulatory/other considerations. * So, this would remain same for all the interfaces. diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index 376f1978f7..998853eec1 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -378,6 +378,8 @@ QDF_STATUS cds_open(void) goto err_sme_close; } + gp_cds_context->ol_txrx_update_mac_id = ol_txrx_update_mac_id; + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_HIGH, "%s: CDS successfully Opened", __func__); diff --git a/core/cds/src/cds_concurrency.c b/core/cds/src/cds_concurrency.c index 24bd5278ff..71320408e2 100644 --- a/core/cds/src/cds_concurrency.c +++ b/core/cds/src/cds_concurrency.c @@ -2129,6 +2129,14 @@ static void cds_update_conc_list(uint32_t conn_index, uint32_t vdev_id, bool in_use) { + cds_context_type *cds_ctx; + + cds_ctx = cds_get_context(QDF_MODULE_ID_QDF); + if (!cds_ctx) { + cds_err("Invalid CDS Context"); + return; + } + if (conn_index >= MAX_NUMBER_OF_CONC_CONNECTIONS) { cds_err("Number of connections exceeded conn_index: %d", conn_index); @@ -2144,6 +2152,9 @@ static void cds_update_conc_list(uint32_t conn_index, conc_connection_list[conn_index].in_use = in_use; cds_dump_connection_status_info(); + if (cds_ctx->ol_txrx_update_mac_id) + cds_ctx->ol_txrx_update_mac_id(vdev_id, mac); + } /** diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c index db52497615..d201313ac2 100644 --- a/core/dp/txrx/ol_rx.c +++ b/core/dp/txrx/ol_rx.c @@ -64,6 +64,27 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer, qdf_nbuf_t rx_buf_list); +/** + * ol_rx_send_pktlog_event() - send rx packetlog event + * @pdev: pdev handle + * @peer: peer handle + * @msdu: skb list + * + * Return: none + */ +void ol_rx_send_pktlog_event(struct ol_txrx_pdev_t *pdev, + struct ol_txrx_peer_t *peer, qdf_nbuf_t msdu) +{ + struct ol_rx_remote_data data; + + data.msdu = msdu; + if (peer) + data.mac_id = peer->vdev->mac_id; + else + data.mac_id = 0; + + wdi_event_handler(WDI_EVENT_RX_DESC_REMOTE, pdev, &data); +} #ifdef HTT_RX_RESTORE @@ -508,8 +529,7 @@ ol_rx_indication_handler(ol_txrx_pdev_handle pdev, /* Pktlog */ #ifdef WDI_EVENT_ENABLE - wdi_event_handler(WDI_EVENT_RX_DESC_REMOTE, - pdev, head_msdu); + ol_rx_send_pktlog_event(pdev, peer, head_msdu); #endif if (msdu_chaining) { @@ -586,9 +606,8 @@ ol_rx_indication_handler(ol_txrx_pdev_handle pdev, #ifdef WDI_EVENT_ENABLE if (status != htt_rx_status_ctrl_mgmt_null) { /* Pktlog */ - wdi_event_handler( - WDI_EVENT_RX_DESC_REMOTE, pdev, - msdu); + ol_rx_send_pktlog_event(pdev, + peer, head_msdu); } #endif if (status == htt_rx_status_err_inv_peer) { @@ -1332,7 +1351,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev, /* Pktlog */ #ifdef WDI_EVENT_ENABLE - wdi_event_handler(WDI_EVENT_RX_DESC_REMOTE, pdev, head_msdu); + ol_rx_send_pktlog_event(pdev, peer, head_msdu); #endif /* if this is an offload indication, peer id is carried in the diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 09c85ac0c8..435f3a98e5 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -3783,6 +3783,25 @@ void ol_vdev_rx_set_intrabss_fwd(ol_txrx_vdev_handle vdev, bool val) vdev->disable_intrabss_fwd = val; } +/** + * ol_txrx_update_mac_id() - update mac_id for vdev + * @vdev_id: vdev id + * @mac_id: mac id + * + * Return: none + */ +void ol_txrx_update_mac_id(uint8_t vdev_id, uint8_t mac_id) +{ + ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_vdev_id(vdev_id); + + if (NULL == vdev) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "%s: Invalid vdev_id %d", __func__, vdev_id); + return; + } + vdev->mac_id = mac_id; +} + #ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL /** diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h index e02647e091..e4d463db0e 100644 --- a/core/dp/txrx/ol_txrx.h +++ b/core/dp/txrx/ol_txrx.h @@ -133,4 +133,5 @@ ol_txrx_vdev_handle ol_txrx_get_vdev_from_vdev_id(uint8_t vdev_id); void htt_pkt_log_init(struct ol_txrx_pdev_t *handle, void *scn); QDF_STATUS ol_txrx_set_wisa_mode(ol_txrx_vdev_handle vdev, bool enable); +void ol_txrx_update_mac_id(uint8_t vdev_id, uint8_t mac_id); #endif /* _OL_TXRX__H_ */ diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 78e16c2414..ea1ccc6a38 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -1060,6 +1060,7 @@ struct ol_txrx_vdev_t { uint64_t fwd_tx_packets; uint64_t fwd_rx_packets; bool is_wisa_mode_enable; + uint8_t mac_id; }; struct ol_rx_reorder_array_elem_t { @@ -1253,4 +1254,10 @@ struct ol_error_info { struct ol_mic_error_info mic_err; } u; }; + +struct ol_rx_remote_data { + qdf_nbuf_t msdu; + uint8_t mac_id; +}; + #endif /* _OL_TXRX_TYPES__H_ */ diff --git a/core/utils/pktlog/include/pktlog_ac_i.h b/core/utils/pktlog/include/pktlog_ac_i.h index 7dbf443a69..5c4e9d6a92 100644 --- a/core/utils/pktlog/include/pktlog_ac_i.h +++ b/core/utils/pktlog/include/pktlog_ac_i.h @@ -43,7 +43,12 @@ struct ath_pktlog_arg { struct ath_pktlog_info *pl_info; uint32_t flags; uint16_t missed_cnt; +#ifdef HELIUMPLUS + uint8_t log_type; + uint8_t macId; +#else uint16_t log_type; +#endif size_t log_size; uint16_t timestamp; #ifdef HELIUMPLUS @@ -59,7 +64,7 @@ char *pktlog_getbuf(struct ol_pktlog_dev_t *pl_dev, A_STATUS process_tx_info(struct ol_txrx_pdev_t *pdev, void *data); A_STATUS process_rx_info(void *pdev, void *data); -A_STATUS process_rx_info_remote(void *pdev, qdf_nbuf_t amsdu); +A_STATUS process_rx_info_remote(void *pdev, void *data); A_STATUS process_rate_find(void *pdev, void *data); A_STATUS process_rate_update(void *pdev, void *data); diff --git a/core/utils/pktlog/pktlog_internal.c b/core/utils/pktlog/pktlog_internal.c index 5d70836103..0519d17e08 100644 --- a/core/utils/pktlog/pktlog_internal.c +++ b/core/utils/pktlog/pktlog_internal.c @@ -69,6 +69,9 @@ void pktlog_getbuf_intsafe(struct ath_pktlog_arg *plarg) uint16_t log_type; size_t log_size; uint32_t flags; +#ifdef HELIUMPLUS + uint8_t mac_id; +#endif if (!plarg) { printk("Invalid parg in %s\n", __func__); @@ -76,7 +79,12 @@ void pktlog_getbuf_intsafe(struct ath_pktlog_arg *plarg) } pl_info = plarg->pl_info; +#ifdef HELIUMPLUS + mac_id = plarg->macId; log_type = plarg->log_type; +#else + log_type = plarg->log_type; +#endif log_size = plarg->log_size; log_buf = pl_info->buf; flags = plarg->flags; @@ -100,8 +108,14 @@ void pktlog_getbuf_intsafe(struct ath_pktlog_arg *plarg) } log_hdr = (struct ath_pktlog_hdr *)(log_buf->log_data + cur_wr_offset); - log_hdr->log_type = log_type; + log_hdr->flags = flags; +#ifdef HELIUMPLUS + log_hdr->macId = mac_id; + log_hdr->log_type = log_type; +#else + log_hdr->log_type = log_type; +#endif log_hdr->size = (uint16_t) log_size; log_hdr->missed_cnt = plarg->missed_cnt; log_hdr->timestamp = plarg->timestamp; @@ -167,7 +181,12 @@ char *pktlog_getbuf(struct ol_pktlog_dev_t *pl_dev, uint8_t flags = 0; plarg.pl_info = pl_info; +#ifdef HELIUMPLUS + plarg.macId = pl_hdr->macId; plarg.log_type = pl_hdr->log_type; +#else + plarg.log_type = pl_hdr->log_type; +#endif plarg.log_size = log_size; plarg.flags = pl_hdr->flags; plarg.missed_cnt = pl_hdr->missed_cnt; @@ -379,9 +398,18 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) 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; +#ifdef HELIUMPLUS + 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.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) & + ATH_PKTLOG_HDR_MAC_ID_MASK) >> + ATH_PKTLOG_HDR_MAC_ID_SHIFT; +#else 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; +#endif 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); @@ -501,7 +529,7 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) return A_OK; } -A_STATUS process_rx_info_remote(void *pdev, qdf_nbuf_t amsdu) +A_STATUS process_rx_info_remote(void *pdev, void *data) { struct ol_pktlog_dev_t *pl_dev; struct ath_pktlog_info *pl_info; @@ -509,19 +537,20 @@ A_STATUS process_rx_info_remote(void *pdev, qdf_nbuf_t amsdu) struct ath_pktlog_hdr pl_hdr; struct ath_pktlog_rx_info rxstat_log; size_t log_size; + struct ol_rx_remote_data *r_data = (struct ol_rx_remote_data *)data; qdf_nbuf_t msdu; if (!pdev) { printk("Invalid pdev in %s\n", __func__); return A_ERROR; } - if (!amsdu) { + if (!r_data) { printk("Invalid data in %s\n", __func__); return A_ERROR; } pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev; pl_info = pl_dev->pl_info; - msdu = amsdu; + msdu = r_data->msdu; while (msdu) { rx_desc = @@ -535,7 +564,12 @@ A_STATUS process_rx_info_remote(void *pdev, qdf_nbuf_t amsdu) */ pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S); pl_hdr.missed_cnt = 0; +#if defined(HELIUMPLUS) + pl_hdr.macId = r_data->mac_id; pl_hdr.log_type = PKTLOG_TYPE_RX_STAT; +#else + pl_hdr.log_type = PKTLOG_TYPE_RX_STAT; +#endif pl_hdr.size = sizeof(*rx_desc) - sizeof(struct htt_host_fw_desc_base); #if defined(HELIUMPLUS) @@ -576,9 +610,19 @@ A_STATUS process_rx_info(void *pdev, void *data) 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; +#ifdef HELIUMPLUS 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.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) & + ATH_PKTLOG_HDR_MAC_ID_MASK) >> + ATH_PKTLOG_HDR_MAC_ID_SHIFT; +#else + 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; +#endif + 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); @@ -627,9 +671,19 @@ A_STATUS process_rate_find(void *pdev, void *data) 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; +#ifdef HELIUMPLUS 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.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) & + ATH_PKTLOG_HDR_MAC_ID_MASK) >> + ATH_PKTLOG_HDR_MAC_ID_SHIFT; +#else + 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; +#endif + 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); @@ -674,9 +728,19 @@ A_STATUS process_rate_update(void *pdev, void *data) 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; +#ifdef HELIUMPLUS 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.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) & + ATH_PKTLOG_HDR_MAC_ID_MASK) >> + ATH_PKTLOG_HDR_MAC_ID_SHIFT; +#else + 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; +#endif + 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); diff --git a/uapi/linux/pktlog_ac_fmt.h b/uapi/linux/pktlog_ac_fmt.h index bde0d3e6fe..27cd5497f8 100644 --- a/uapi/linux/pktlog_ac_fmt.h +++ b/uapi/linux/pktlog_ac_fmt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -57,7 +57,12 @@ struct ath_pktlog_hdr { uint16_t flags; uint16_t missed_cnt; +#ifdef HELIUMPLUS + uint8_t log_type; + uint8_t macId; +#else uint16_t log_type; +#endif uint16_t size; uint32_t timestamp; #ifdef HELIUMPLUS @@ -71,9 +76,19 @@ struct ath_pktlog_hdr { #define ATH_PKTLOG_HDR_MISSED_CNT_MASK 0xffff0000 #define ATH_PKTLOG_HDR_MISSED_CNT_SHIFT 16 #define ATH_PKTLOG_HDR_MISSED_CNT_OFFSET 0 +#ifdef HELIUMPLUS +#define ATH_PKTLOG_HDR_LOG_TYPE_MASK 0x00ff +#define ATH_PKTLOG_HDR_LOG_TYPE_SHIFT 0 +#define ATH_PKTLOG_HDR_LOG_TYPE_OFFSET 1 +#define ATH_PKTLOG_HDR_MAC_ID_MASK 0xff00 +#define ATH_PKTLOG_HDR_MAC_ID_SHIFT 8 +#define ATH_PKTLOG_HDR_MAC_ID_OFFSET 1 +#else #define ATH_PKTLOG_HDR_LOG_TYPE_MASK 0xffff #define ATH_PKTLOG_HDR_LOG_TYPE_SHIFT 0 #define ATH_PKTLOG_HDR_LOG_TYPE_OFFSET 1 +#endif + #define ATH_PKTLOG_HDR_SIZE_MASK 0xffff0000 #define ATH_PKTLOG_HDR_SIZE_SHIFT 16 #define ATH_PKTLOG_HDR_SIZE_OFFSET 1