diff options
| -rw-r--r-- | core/dp/ol/inc/ol_txrx_stats.h | 3 | ||||
| -rw-r--r-- | core/dp/txrx/ol_tx.c | 105 | ||||
| -rw-r--r-- | core/dp/txrx/ol_tx_desc.c | 1 | ||||
| -rw-r--r-- | core/dp/txrx/ol_txrx.c | 187 | ||||
| -rw-r--r-- | core/dp/txrx/ol_txrx_internal.h | 85 |
5 files changed, 230 insertions, 151 deletions
diff --git a/core/dp/ol/inc/ol_txrx_stats.h b/core/dp/ol/inc/ol_txrx_stats.h index 842924e1c861..c143ae34f9b4 100644 --- a/core/dp/ol/inc/ol_txrx_stats.h +++ b/core/dp/ol/inc/ol_txrx_stats.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2014-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2012, 2014-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -108,6 +108,7 @@ struct ol_txrx_stats_tx_tso { #if defined(FEATURE_TSO) struct ol_txrx_stats_tso_info tso_info; struct ol_txrx_tso_histogram tso_hist; + qdf_spinlock_t tso_stats_lock; #endif }; diff --git a/core/dp/txrx/ol_tx.c b/core/dp/txrx/ol_tx.c index db0e2a8aa096..005a33707c8f 100644 --- a/core/dp/txrx/ol_tx.c +++ b/core/dp/txrx/ol_tx.c @@ -239,12 +239,64 @@ qdf_nbuf_t ol_tx_send_ipa_data_frame(void *vdev, } #endif +#if defined(FEATURE_TSO) +/** + * ol_tx_tso_update_stats() - update TSO stats + * @pdev: pointer to ol_txrx_pdev_t structure + * @msdu_info: tso msdu_info for the msdu + * @msdu: tso mdsu for which stats are updated + * @tso_msdu_idx: stats index in the global TSO stats array where stats will be + * updated + * + * Return: None + */ +static inline void ol_tx_tso_update_stats(struct ol_txrx_pdev_t *pdev , + struct qdf_tso_info_t *tso_info, + qdf_nbuf_t msdu, + uint32_t tso_msdu_idx) +{ + TXRX_STATS_TSO_HISTOGRAM(pdev, tso_info->num_segs); + TXRX_STATS_TSO_GSO_SIZE_UPDATE(pdev, tso_msdu_idx, + qdf_nbuf_tcp_tso_size(msdu)); + TXRX_STATS_TSO_TOTAL_LEN_UPDATE(pdev, + tso_msdu_idx, qdf_nbuf_len(msdu)); + TXRX_STATS_TSO_NUM_FRAGS_UPDATE(pdev, tso_msdu_idx, + qdf_nbuf_get_nr_frags(msdu)); +} + +/** + * ol_tx_tso_get_stats_idx() - retrieve global TSO stats index and increment it + * @pdev: pointer to ol_txrx_pdev_t structure + * + * Retreive the current value of the global variable and increment it. This is + * done in a spinlock as the global TSO stats may be accessed in parallel by + * multiple TX streams. + * + * Return: The current value of TSO stats index. + */ +static uint32_t ol_tx_tso_get_stats_idx(struct ol_txrx_pdev_t *pdev) +{ + uint32_t msdu_stats_idx = 0; + + qdf_spin_lock_bh(&pdev->stats.pub.tx.tso.tso_stats_lock); + msdu_stats_idx = pdev->stats.pub.tx.tso.tso_info.tso_msdu_idx; + pdev->stats.pub.tx.tso.tso_info.tso_msdu_idx++; + pdev->stats.pub.tx.tso.tso_info.tso_msdu_idx &= + NUM_MAX_TSO_MSDUS_MASK; + qdf_spin_unlock_bh(&pdev->stats.pub.tx.tso.tso_stats_lock); + + TXRX_STATS_TSO_RESET_MSDU(pdev, msdu_stats_idx); + + return msdu_stats_idx; +} +#endif #if defined(FEATURE_TSO) qdf_nbuf_t ol_tx_ll(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) { qdf_nbuf_t msdu = msdu_list; struct ol_txrx_msdu_info_t msdu_info; + uint32_t tso_msdu_stats_idx = 0; msdu_info.htt.info.l2_hdr_type = vdev->pdev->htt_pkt_type; msdu_info.htt.action.tx_comp_req = 0; @@ -270,14 +322,15 @@ qdf_nbuf_t ol_tx_ll(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) } segments = msdu_info.tso_info.num_segs; - TXRX_STATS_TSO_HISTOGRAM(vdev->pdev, segments); - TXRX_STATS_TSO_GSO_SIZE_UPDATE(vdev->pdev, - qdf_nbuf_tcp_tso_size(msdu)); - TXRX_STATS_TSO_TOTAL_LEN_UPDATE(vdev->pdev, - qdf_nbuf_len(msdu)); - TXRX_STATS_TSO_NUM_FRAGS_UPDATE(vdev->pdev, - qdf_nbuf_get_nr_frags(msdu)); + if (msdu_info.tso_info.is_tso) { + tso_msdu_stats_idx = + ol_tx_tso_get_stats_idx(vdev->pdev); + msdu_info.tso_info.msdu_stats_idx = tso_msdu_stats_idx; + ol_tx_tso_update_stats(vdev->pdev, + &(msdu_info.tso_info), + msdu, tso_msdu_stats_idx); + } /* * The netbuf may get linked into a different list inside the @@ -324,16 +377,14 @@ qdf_nbuf_t ol_tx_ll(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) qdf_nbuf_reset_num_frags(msdu); if (msdu_info.tso_info.is_tso) { - TXRX_STATS_TSO_INC_SEG(vdev->pdev); - TXRX_STATS_TSO_INC_SEG_IDX(vdev->pdev); + TXRX_STATS_TSO_INC_SEG(vdev->pdev, + tso_msdu_stats_idx); + TXRX_STATS_TSO_INC_SEG_IDX(vdev->pdev, + tso_msdu_stats_idx); } } /* while segments */ msdu = next; - if (msdu_info.tso_info.is_tso) { - TXRX_STATS_TSO_INC_MSDU_IDX(vdev->pdev); - TXRX_STATS_TSO_RESET_MSDU(vdev->pdev); - } } /* while msdus */ return NULL; /* all MSDUs were accepted */ } @@ -466,6 +517,7 @@ ol_tx_prepare_ll_fast(struct ol_txrx_pdev_t *pdev, htt_tx_desc_fill_tso_info(pdev->htt_pdev, tx_desc->htt_frag_desc, &msdu_info->tso_info); TXRX_STATS_TSO_SEG_UPDATE(pdev, + msdu_info->tso_info.msdu_stats_idx, msdu_info->tso_info.curr_seg->seg); } else { for (i = 1; i < num_frags; i++) { @@ -542,6 +594,7 @@ ol_tx_ll_fast(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) ((struct htt_pdev_t *)(pdev->htt_pdev))->download_len; uint32_t ep_id = HTT_EPID_GET(pdev->htt_pdev); struct ol_txrx_msdu_info_t msdu_info; + uint32_t tso_msdu_stats_idx = 0; msdu_info.htt.info.l2_hdr_type = vdev->pdev->htt_pkt_type; msdu_info.htt.action.tx_comp_req = 0; @@ -567,13 +620,15 @@ ol_tx_ll_fast(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) } segments = msdu_info.tso_info.num_segs; - TXRX_STATS_TSO_HISTOGRAM(vdev->pdev, segments); - TXRX_STATS_TSO_GSO_SIZE_UPDATE(vdev->pdev, - qdf_nbuf_tcp_tso_size(msdu)); - TXRX_STATS_TSO_TOTAL_LEN_UPDATE(vdev->pdev, - qdf_nbuf_len(msdu)); - TXRX_STATS_TSO_NUM_FRAGS_UPDATE(vdev->pdev, - qdf_nbuf_get_nr_frags(msdu)); + + if (msdu_info.tso_info.is_tso) { + tso_msdu_stats_idx = + ol_tx_tso_get_stats_idx(vdev->pdev); + msdu_info.tso_info.msdu_stats_idx = tso_msdu_stats_idx; + ol_tx_tso_update_stats(vdev->pdev, + &(msdu_info.tso_info), + msdu, tso_msdu_stats_idx); + } /* * The netbuf may get linked into a different list @@ -660,8 +715,10 @@ ol_tx_ll_fast(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) if (msdu_info.tso_info.is_tso) { qdf_nbuf_reset_num_frags(msdu); - TXRX_STATS_TSO_INC_SEG(vdev->pdev); - TXRX_STATS_TSO_INC_SEG_IDX(vdev->pdev); + TXRX_STATS_TSO_INC_SEG(vdev->pdev, + tso_msdu_stats_idx); + TXRX_STATS_TSO_INC_SEG_IDX(vdev->pdev, + tso_msdu_stats_idx); } } else { TXRX_STATS_MSDU_LIST_INCR( @@ -672,10 +729,6 @@ ol_tx_ll_fast(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) } /* while segments */ msdu = next; - if (msdu_info.tso_info.is_tso) { - TXRX_STATS_TSO_INC_MSDU_IDX(vdev->pdev); - TXRX_STATS_TSO_RESET_MSDU(vdev->pdev); - } } /* while msdus */ return NULL; /* all MSDUs were accepted */ } diff --git a/core/dp/txrx/ol_tx_desc.c b/core/dp/txrx/ol_tx_desc.c index a0f2ddc5fb5f..a1a2c3bf57f5 100644 --- a/core/dp/txrx/ol_tx_desc.c +++ b/core/dp/txrx/ol_tx_desc.c @@ -561,6 +561,7 @@ struct ol_tx_desc_t *ol_tx_desc_ll(struct ol_txrx_pdev_t *pdev, htt_tx_desc_fill_tso_info(pdev->htt_pdev, tx_desc->htt_frag_desc, &msdu_info->tso_info); TXRX_STATS_TSO_SEG_UPDATE(pdev, + msdu_info->tso_info.msdu_stats_idx, msdu_info->tso_info.curr_seg->seg); } else { for (i = 1; i < num_frags; i++) { diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 206033a0f622..fdd64b5f8bb1 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -960,6 +960,111 @@ ol_txrx_peer_tx_queue_free(struct ol_txrx_pdev_t *pdev, } #endif +#if defined(FEATURE_TSO) && defined(FEATURE_TSO_DEBUG) +static void ol_txrx_tso_stats_init(ol_txrx_pdev_handle pdev) +{ + qdf_spinlock_create(&pdev->stats.pub.tx.tso.tso_stats_lock); +} + +static void ol_txrx_tso_stats_deinit(ol_txrx_pdev_handle pdev) +{ + qdf_spinlock_destroy(&pdev->stats.pub.tx.tso.tso_stats_lock); +} + +static void ol_txrx_stats_display_tso(ol_txrx_pdev_handle pdev) +{ + int msdu_idx; + int seg_idx; + + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "TSO Statistics:"); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "TSO pkts %lld, bytes %lld\n", + pdev->stats.pub.tx.tso.tso_pkts.pkts, + pdev->stats.pub.tx.tso.tso_pkts.bytes); + + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "TSO Histogram for numbers of segments:\n" + "Single segment %d\n" + " 2-5 segments %d\n" + " 6-10 segments %d\n" + "11-15 segments %d\n" + "16-20 segments %d\n" + " 20+ segments %d\n", + pdev->stats.pub.tx.tso.tso_hist.pkts_1, + pdev->stats.pub.tx.tso.tso_hist.pkts_2_5, + pdev->stats.pub.tx.tso.tso_hist.pkts_6_10, + pdev->stats.pub.tx.tso.tso_hist.pkts_11_15, + pdev->stats.pub.tx.tso.tso_hist.pkts_16_20, + pdev->stats.pub.tx.tso.tso_hist.pkts_20_plus); + + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "TSO History Buffer: Total size %d, current_index %d", + NUM_MAX_TSO_MSDUS, + TXRX_STATS_TSO_MSDU_IDX(pdev)); + + for (msdu_idx = 0; msdu_idx < NUM_MAX_TSO_MSDUS; msdu_idx++) { + if (TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx) == 0) + continue; + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "jumbo pkt idx: %d num segs %d gso_len %d total_len %d nr_frags %d", + msdu_idx, + TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, msdu_idx), + TXRX_STATS_TSO_MSDU_GSO_SIZE(pdev, msdu_idx), + TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx), + TXRX_STATS_TSO_MSDU_NR_FRAGS(pdev, msdu_idx)); + + for (seg_idx = 0; + ((seg_idx < TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, msdu_idx)) && + (seg_idx < NUM_MAX_TSO_SEGS)); + seg_idx++) { + struct qdf_tso_seg_t tso_seg = + TXRX_STATS_TSO_SEG(pdev, msdu_idx, seg_idx); + + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "seg idx: %d", seg_idx); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "tso_enable: %d", + tso_seg.tso_flags.tso_enable); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "fin %d syn %d rst %d psh %d ack %d urg %d ece %d cwr %d ns %d", + tso_seg.tso_flags.fin, tso_seg.tso_flags.syn, + tso_seg.tso_flags.rst, tso_seg.tso_flags.psh, + tso_seg.tso_flags.ack, tso_seg.tso_flags.urg, + tso_seg.tso_flags.ece, tso_seg.tso_flags.cwr, + tso_seg.tso_flags.ns); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "tcp_seq_num: 0x%x ip_id: %d", + tso_seg.tso_flags.tcp_seq_num, + tso_seg.tso_flags.ip_id); + } + } +} +#else +static void ol_txrx_stats_display_tso(ol_txrx_pdev_handle pdev) +{ + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "TSO is not supported\n"); +} + +static void ol_txrx_tso_stats_init(ol_txrx_pdev_handle pdev) +{ + /* + * keeping the body empty and not keeping an error print as print will + * will show up everytime during driver load if TSO is not enabled. + */ +} + +static void ol_txrx_tso_stats_deinit(ol_txrx_pdev_handle pdev) +{ + /* + * keeping the body empty and not keeping an error print as print will + * will show up everytime during driver unload if TSO is not enabled. + */ +} + +#endif /* defined(FEATURE_TSO) && defined(FEATURE_TSO_DEBUG) */ + /** * ol_txrx_pdev_attach() - allocate txrx pdev * @ctrl_pdev: cfg pdev @@ -992,6 +1097,7 @@ ol_txrx_pdev_attach(ol_pdev_handle ctrl_pdev, pdev->sec_types[i] = (enum ol_sec_type)i; TXRX_STATS_INIT(pdev); + ol_txrx_tso_stats_init(pdev); TAILQ_INIT(&pdev->vdev_list); @@ -1029,6 +1135,7 @@ fail2: qdf_spinlock_destroy(&pdev->tx_queue_spinlock); fail1: + ol_txrx_tso_stats_deinit(pdev); qdf_mem_free(pdev); fail0: @@ -1696,6 +1803,8 @@ void ol_txrx_pdev_detach(ol_txrx_pdev_handle pdev, int force) ol_txrx_peer_find_detach(pdev); + ol_txrx_tso_stats_deinit(pdev); + qdf_spinlock_destroy(&pdev->tx_mutex); qdf_spinlock_destroy(&pdev->peer_ref_mutex); qdf_spinlock_destroy(&pdev->last_real_peer_mutex); @@ -3709,84 +3818,6 @@ void ol_txrx_peer_display(ol_txrx_peer_handle peer, int indent) } #endif /* TXRX_DEBUG_LEVEL */ -#if defined(FEATURE_TSO) && defined(FEATURE_TSO_DEBUG) -static void ol_txrx_stats_display_tso(ol_txrx_pdev_handle pdev) -{ - int msdu_idx; - int seg_idx; - - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "TSO Statistics:"); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "TSO pkts %lld, bytes %lld\n", - pdev->stats.pub.tx.tso.tso_pkts.pkts, - pdev->stats.pub.tx.tso.tso_pkts.bytes); - - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "TSO Histogram for numbers of segments:\n" - "Single segment %d\n" - " 2-5 segments %d\n" - " 6-10 segments %d\n" - "11-15 segments %d\n" - "16-20 segments %d\n" - " 20+ segments %d\n", - pdev->stats.pub.tx.tso.tso_hist.pkts_1, - pdev->stats.pub.tx.tso.tso_hist.pkts_2_5, - pdev->stats.pub.tx.tso.tso_hist.pkts_6_10, - pdev->stats.pub.tx.tso.tso_hist.pkts_11_15, - pdev->stats.pub.tx.tso.tso_hist.pkts_16_20, - pdev->stats.pub.tx.tso.tso_hist.pkts_20_plus); - - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "TSO History Buffer: Total size %d, current_index %d", - NUM_MAX_TSO_MSDUS, - TXRX_STATS_TSO_MSDU_IDX(pdev)); - - for (msdu_idx = 0; msdu_idx < NUM_MAX_TSO_MSDUS; msdu_idx++) { - if (TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx) == 0) - continue; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "jumbo pkt idx: %d num segs %d gso_len %d total_len %d nr_frags %d", - msdu_idx, - TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, msdu_idx), - TXRX_STATS_TSO_MSDU_GSO_SIZE(pdev, msdu_idx), - TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx), - TXRX_STATS_TSO_MSDU_NR_FRAGS(pdev, msdu_idx)); - - for (seg_idx = 0; - ((seg_idx < TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, msdu_idx)) && - (seg_idx < NUM_MAX_TSO_SEGS)); - seg_idx++) { - struct qdf_tso_seg_t tso_seg = - TXRX_STATS_TSO_SEG(pdev, msdu_idx, seg_idx); - - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "seg idx: %d", seg_idx); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "tso_enable: %d", - tso_seg.tso_flags.tso_enable); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "fin %d syn %d rst %d psh %d ack %d urg %d ece %d cwr %d ns %d", - tso_seg.tso_flags.fin, tso_seg.tso_flags.syn, - tso_seg.tso_flags.rst, tso_seg.tso_flags.psh, - tso_seg.tso_flags.ack, tso_seg.tso_flags.urg, - tso_seg.tso_flags.ece, tso_seg.tso_flags.cwr, - tso_seg.tso_flags.ns); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "tcp_seq_num: 0x%x ip_id: %d", - tso_seg.tso_flags.tcp_seq_num, - tso_seg.tso_flags.ip_id); - } - } -} -#else -static void ol_txrx_stats_display_tso(ol_txrx_pdev_handle pdev) -{ - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "TSO is not supported\n"); -} -#endif - /** * ol_txrx_stats() - update ol layer stats * @vdev_id: vdev_id diff --git a/core/dp/txrx/ol_txrx_internal.h b/core/dp/txrx/ol_txrx_internal.h index 0f6021013e41..4c9a6c70ea90 100644 --- a/core/dp/txrx/ol_txrx_internal.h +++ b/core/dp/txrx/ol_txrx_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -711,9 +711,8 @@ NOT_IP_TCP: } \ } while (0) -#define TXRX_STATS_TSO_RESET_MSDU(pdev) \ +#define TXRX_STATS_TSO_RESET_MSDU(pdev, idx) \ do { \ - int idx = TXRX_STATS_TSO_MSDU_IDX(pdev);\ pdev->stats.pub.tx.tso.tso_info.tso_msdu_info[idx].num_seg = 0; \ pdev->stats.pub.tx.tso.tso_info.tso_msdu_info[idx].tso_seg_idx = 0; \ } while (0) @@ -736,75 +735,69 @@ NOT_IP_TCP: #define TXRX_STATS_TSO_MSDU_NR_FRAGS(pdev, idx) \ pdev->stats.pub.tx.tso.tso_info.tso_msdu_info[idx].nr_frags -#define TXRX_STATS_TSO_CURR_MSDU(pdev) \ - TXRX_STATS_TSO_MSDU(pdev, TXRX_STATS_TSO_MSDU_IDX(pdev)) +#define TXRX_STATS_TSO_CURR_MSDU(pdev, idx) \ + TXRX_STATS_TSO_MSDU(pdev, idx) -#define TXRX_STATS_TSO_INC_MSDU_IDX(pdev) \ - do { \ - TXRX_STATS_TSO_MSDU_IDX(pdev)++; \ - TXRX_STATS_TSO_MSDU_IDX(pdev) &= NUM_MAX_TSO_MSDUS_MASK; \ - } while (0) - -#define TXRX_STATS_TSO_SEG_IDX(pdev) \ - TXRX_STATS_TSO_CURR_MSDU(pdev).tso_seg_idx +#define TXRX_STATS_TSO_SEG_IDX(pdev, idx) \ + TXRX_STATS_TSO_CURR_MSDU(pdev, idx).tso_seg_idx -#define TXRX_STATS_TSO_INC_SEG(pdev) \ +#define TXRX_STATS_TSO_INC_SEG(pdev, idx) \ do { \ - TXRX_STATS_TSO_CURR_MSDU(pdev).num_seg++; \ - TXRX_STATS_TSO_CURR_MSDU(pdev).num_seg &= \ + TXRX_STATS_TSO_CURR_MSDU(pdev, idx).num_seg++; \ + TXRX_STATS_TSO_CURR_MSDU(pdev, idx).num_seg &= \ NUM_MAX_TSO_SEGS_MASK; \ } while (0) -#define TXRX_STATS_TSO_RST_SEG(pdev) \ - TXRX_STATS_TSO_CURR_MSDU(pdev).num_seg = 0 +#define TXRX_STATS_TSO_RST_SEG(pdev, idx) \ + TXRX_STATS_TSO_CURR_MSDU(pdev, idx).num_seg = 0 -#define TXRX_STATS_TSO_RST_SEG_IDX(pdev) \ - TXRX_STATS_TSO_CURR_MSDU(pdev).tso_seg_idx = 0 +#define TXRX_STATS_TSO_RST_SEG_IDX(pdev, idx) \ + TXRX_STATS_TSO_CURR_MSDU(pdev, idx).tso_seg_idx = 0 #define TXRX_STATS_TSO_SEG(pdev, msdu_idx, seg_idx) \ TXRX_STATS_TSO_MSDU(pdev, msdu_idx).tso_segs[seg_idx] -#define TXRX_STATS_TSO_CURR_SEG(pdev) \ - TXRX_STATS_TSO_SEG(pdev, TXRX_STATS_TSO_MSDU_IDX(pdev), \ - TXRX_STATS_TSO_SEG_IDX(pdev)) \ +#define TXRX_STATS_TSO_CURR_SEG(pdev, idx) \ + TXRX_STATS_TSO_SEG(pdev, idx, \ + TXRX_STATS_TSO_SEG_IDX(pdev, idx)) \ -#define TXRX_STATS_TSO_INC_SEG_IDX(pdev) \ +#define TXRX_STATS_TSO_INC_SEG_IDX(pdev, idx) \ do { \ - TXRX_STATS_TSO_SEG_IDX(pdev)++; \ - TXRX_STATS_TSO_SEG_IDX(pdev) &= NUM_MAX_TSO_SEGS_MASK; \ + TXRX_STATS_TSO_SEG_IDX(pdev, idx)++; \ + TXRX_STATS_TSO_SEG_IDX(pdev, idx) &= NUM_MAX_TSO_SEGS_MASK; \ } while (0) -#define TXRX_STATS_TSO_SEG_UPDATE(pdev, tso_seg) \ - (TXRX_STATS_TSO_CURR_SEG(pdev) = tso_seg) +#define TXRX_STATS_TSO_SEG_UPDATE(pdev, idx, tso_seg) \ + (TXRX_STATS_TSO_CURR_SEG(pdev, idx) = tso_seg) -#define TXRX_STATS_TSO_GSO_SIZE_UPDATE(pdev, size) \ - (TXRX_STATS_TSO_CURR_MSDU(pdev).gso_size = size) +#define TXRX_STATS_TSO_GSO_SIZE_UPDATE(pdev, idx, size) \ + (TXRX_STATS_TSO_CURR_MSDU(pdev, idx).gso_size = size) -#define TXRX_STATS_TSO_TOTAL_LEN_UPDATE(pdev, len) \ - (TXRX_STATS_TSO_CURR_MSDU(pdev).total_len = len) +#define TXRX_STATS_TSO_TOTAL_LEN_UPDATE(pdev, idx, len) \ + (TXRX_STATS_TSO_CURR_MSDU(pdev, idx).total_len = len) -#define TXRX_STATS_TSO_NUM_FRAGS_UPDATE(pdev, frags) \ - (TXRX_STATS_TSO_CURR_MSDU(pdev).nr_frags = frags) +#define TXRX_STATS_TSO_NUM_FRAGS_UPDATE(pdev, idx, frags) \ + (TXRX_STATS_TSO_CURR_MSDU(pdev, idx).nr_frags = frags) #else #define TXRX_STATS_TSO_HISTOGRAM(_pdev, _p_cntrs) /* no-op */ -#define TXRX_STATS_TSO_RESET_MSDU(pdev) /* no-op */ +#define TXRX_STATS_TSO_RESET_MSDU(pdev, idx) /* no-op */ #define TXRX_STATS_TSO_MSDU_IDX(pdev) /* no-op */ #define TXRX_STATS_TSO_MSDU(pdev, idx) /* no-op */ #define TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, idx) /* no-op */ -#define TXRX_STATS_TSO_CURR_MSDU(pdev) /* no-op */ +#define TXRX_STATS_TSO_CURR_MSDU(pdev, idx) /* no-op */ #define TXRX_STATS_TSO_INC_MSDU_IDX(pdev) /* no-op */ -#define TXRX_STATS_TSO_SEG_IDX(pdev) /* no-op */ +#define TXRX_STATS_TSO_SEG_IDX(pdev, idx) /* no-op */ #define TXRX_STATS_TSO_SEG(pdev, msdu_idx, seg_idx) /* no-op */ -#define TXRX_STATS_TSO_CURR_SEG(pdev) /* no-op */ -#define TXRX_STATS_TSO_INC_SEG_IDX(pdev) /* no-op */ -#define TXRX_STATS_TSO_SEG_UPDATE(pdev, tso_seg) /* no-op */ -#define TXRX_STATS_TSO_INC_SEG(pdev) /* no-op */ -#define TXRX_STATS_TSO_RST_SEG(pdev) /* no-op */ -#define TXRX_STATS_TSO_RST_SEG_IDX(pdev) /* no-op */ -#define TXRX_STATS_TSO_GSO_SIZE_UPDATE(pdev, size) /* no-op */ -#define TXRX_STATS_TSO_TOTAL_LEN_UPDATE(pdev, len) /* no-op */ -#define TXRX_STATS_TSO_NUM_FRAGS_UPDATE(pdev, frags) /* no-op */ +#define TXRX_STATS_TSO_CURR_SEG(pdev, idx) /* no-op */ +#define TXRX_STATS_TSO_INC_SEG_IDX(pdev, idx) /* no-op */ +#define TXRX_STATS_TSO_SEG_UPDATE(pdev, idx, tso_seg) /* no-op */ +#define TXRX_STATS_TSO_INC_SEG(pdev, idx) /* no-op */ +#define TXRX_STATS_TSO_RST_SEG(pdev, idx) /* no-op */ +#define TXRX_STATS_TSO_RST_SEG_IDX(pdev, idx) /* no-op */ +#define TXRX_STATS_TSO_GSO_SIZE_UPDATE(pdev, idx, size) /* no-op */ +#define TXRX_STATS_TSO_TOTAL_LEN_UPDATE(pdev, idx, len) /* no-op */ +#define TXRX_STATS_TSO_NUM_FRAGS_UPDATE(pdev, idx, frags) /* no-op */ #define TXRX_STATS_TSO_MSDU_GSO_SIZE(pdev, idx) /* no-op */ #define TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, idx) /* no-op */ #define TXRX_STATS_TSO_MSDU_NR_FRAGS(pdev, idx) /* no-op */ |
