From 60cdb2185c95e7a09f2b66dba2b4618c0eb9dda6 Mon Sep 17 00:00:00 2001 From: Mainak Sen Date: Thu, 6 Aug 2020 13:20:12 +0530 Subject: [PATCH] qcacmn: Hlos tid override support in dp vdev 1. Add flag to support hlos id override feature in dp vdev 2. Update tid from nbuf->priority in dp_tx_send 3. Update tid to nbuf->priority in dp_rx_process Change-Id: I66e8d77733a667f3f60b77e0d7bb444f7c5ad93d --- dp/inc/cdp_txrx_cmn_struct.h | 4 +++ dp/wifi3.0/dp_main.c | 65 ++++++++++++++++++++++++++++++++++++ dp/wifi3.0/dp_rx.c | 7 ++++ dp/wifi3.0/dp_tx.c | 36 ++++++++++++++------ dp/wifi3.0/dp_types.h | 11 ++++++ 5 files changed, 113 insertions(+), 10 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 396995d83f..6497483fb0 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1095,6 +1095,7 @@ enum cdp_pdev_param_type { * @cdp_vdev_param_mesh_mode: set mesh mode * @cdp_vdev_param_safe_mode: set safe mode * @cdp_vdev_param_drop_unenc: set drop unencrypted flag + * @cdp_vdev_param_hlos_tid_override: set hlos tid override * * @cdp_pdev_param_dbg_snf: Enable debug sniffer feature * @cdp_pdev_param_bpr_enable: Enable bcast probe feature @@ -1159,6 +1160,7 @@ typedef union cdp_config_param_t { uint32_t cdp_vdev_param_mesh_mode; uint32_t cdp_vdev_param_safe_mode; uint32_t cdp_vdev_param_drop_unenc; + uint8_t cdp_vdev_param_hlos_tid_override; /* pdev params */ bool cdp_pdev_param_cptr_latcy; @@ -1268,6 +1270,7 @@ enum cdp_pdev_bpr_param { * @CDP_SAFEMODE: set safe mode * @CDP_DROP_UNENC: set drop unencrypted flag * @CDP_ENABLE_IGMP_MCAST_EN: enable/disable igmp multicast enhancement + * @CDP_ENABLE_HLOS_TID_OVERRIDE: set hlos tid override flag */ enum cdp_vdev_param_type { CDP_ENABLE_NAWDS, @@ -1294,6 +1297,7 @@ enum cdp_vdev_param_type { CDP_DROP_UNENC, CDP_ENABLE_CSUM, CDP_ENABLE_IGMP_MCAST_EN, + CDP_ENABLE_HLOS_TID_OVERRIDE, }; /* diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 773f543db9..a64d0ae3be 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5315,6 +5315,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, vdev->raw_mode_war = wlan_cfg_get_raw_mode_war(soc->wlan_cfg_ctx); vdev->prev_tx_enq_tstamp = 0; vdev->prev_rx_deliver_tstamp = 0; + vdev->skip_sw_tid_classification = DP_TX_HW_DSCP_TID_MAP_VALID; dp_vdev_pdev_list_add(soc, pdev, vdev); pdev->vdev_count++; @@ -7221,6 +7222,12 @@ void dp_vdev_set_mesh_mode(struct cdp_vdev *vdev_hdl, uint32_t val) QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, FL("val %d"), val); vdev->mesh_vdev = val; + if (val) + vdev->skip_sw_tid_classification |= + DP_TX_MESH_ENABLED; + else + vdev->skip_sw_tid_classification &= + ~DP_TX_MESH_ENABLED; } /* @@ -7241,6 +7248,44 @@ void dp_vdev_set_mesh_rx_filter(struct cdp_vdev *vdev_hdl, uint32_t val) } #endif +/* + * dp_peer_set_hlos_tid_override() - to set hlos tid override + * @vdev_hdl: virtual device object + * @val: value to be set + * + * Return: void + */ +static +void dp_vdev_set_hlos_tid_override(struct cdp_vdev *vdev_hdl, uint32_t val) +{ + struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; + + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, + FL("val %d"), val); + if (val) + vdev->skip_sw_tid_classification |= + DP_TXRX_HLOS_TID_OVERRIDE_ENABLED; + else + vdev->skip_sw_tid_classification &= + ~DP_TXRX_HLOS_TID_OVERRIDE_ENABLED; +} + +/* + * dp_peer_get_hlos_tid_override() - to get hlos tid override flag + * @vdev_hdl: virtual device object + * @val: value to be set + * + * Return: 1 if this flag is set + */ +static +uint8_t dp_vdev_get_hlos_tid_override(struct cdp_vdev *vdev_hdl) +{ + struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; + + return !!(vdev->skip_sw_tid_classification & + DP_TXRX_HLOS_TID_OVERRIDE_ENABLED); +} + #ifdef VDEV_PEER_PROTOCOL_COUNT static void dp_enable_vdev_peer_protocol_count(struct cdp_soc_t *soc_hdl, int8_t vdev_id, @@ -8577,6 +8622,9 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, break; case CDP_ENABLE_MCAST_EN: val->cdp_vdev_param_mcast_en = vdev->mcast_enhancement_en; + case CDP_ENABLE_HLOS_TID_OVERRIDE: + val->cdp_vdev_param_hlos_tid_override = + dp_vdev_get_hlos_tid_override((struct cdp_vdev *)vdev); break; default: QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -8698,6 +8746,16 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, val.cdp_enable_tx_checksum); vdev->csum_enabled = val.cdp_enable_tx_checksum; break; + case CDP_ENABLE_HLOS_TID_OVERRIDE: + dp_info("vdev_id %d enable hlod tid override %d", vdev_id, + val.cdp_vdev_param_hlos_tid_override); + if (vdev->opmode == wlan_op_mode_ap) + dp_vdev_set_hlos_tid_override((struct cdp_vdev *)vdev, + val.cdp_vdev_param_hlos_tid_override); + else + dp_vdev_set_hlos_tid_override((struct cdp_vdev *)vdev, + false); + break; default: break; } @@ -8859,6 +8917,13 @@ static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle cdp_soc, DP_MOD_ID_CDP); if (vdev) { vdev->dscp_tid_map_id = map_id; + /* Updatr flag for transmit tid classification */ + if (vdev->dscp_tid_map_id < soc->num_hw_dscp_tid_map) + vdev->skip_sw_tid_classification |= + DP_TX_HW_DSCP_TID_MAP_VALID; + else + vdev->skip_sw_tid_classification &= + ~DP_TX_HW_DSCP_TID_MAP_VALID; dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return QDF_STATUS_SUCCESS; } diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index ae789fc0e0..af1b429f13 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -2474,6 +2474,13 @@ done: continue; } + /* when hlos tid override is enabled, save tid in + * skb->priority + */ + if (qdf_unlikely(vdev->skip_sw_tid_classification & + DP_TXRX_HLOS_TID_OVERRIDE_ENABLED)) + qdf_nbuf_set_priority(nbuf, tid); + rx_pdev = vdev->pdev; DP_RX_TID_SAVE(nbuf, tid); if (qdf_unlikely(rx_pdev->delay_stats_flag) || diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 4c9be42051..12bc815fc7 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -42,6 +42,9 @@ #endif #include "dp_hist.h" +/* Flag to skip CCE classify when mesh or tid override enabled */ +#define DP_TX_SKIP_CCE_CLASSIFY \ + (DP_TXRX_HLOS_TID_OVERRIDE_ENABLED | DP_TX_MESH_ENABLED) /* TODO Add support in TSO */ #define DP_DESC_NUM_FRAG(x) 0 @@ -1305,9 +1308,15 @@ static bool dp_cce_classify(struct dp_vdev *vdev, qdf_nbuf_t nbuf) qdf_nbuf_t nbuf_clone = NULL; qdf_dot3_qosframe_t *qos_wh = NULL; - /* for mesh packets don't do any classification */ - if (qdf_unlikely(vdev->mesh_vdev)) - return false; + if (qdf_likely(vdev->skip_sw_tid_classification)) { + /* + * In case of mesh packets or hlos tid override enabled, + * don't do any classification + */ + if (qdf_unlikely(vdev->skip_sw_tid_classification + & DP_TX_SKIP_CCE_CLASSIFY)) + return false; + } if (qdf_likely(vdev->tx_encap_type != htt_cmn_pkt_type_raw)) { eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf); @@ -1537,16 +1546,23 @@ static void dp_tx_get_tid(struct dp_vdev *vdev, qdf_nbuf_t nbuf, static inline void dp_tx_classify_tid(struct dp_vdev *vdev, qdf_nbuf_t nbuf, struct dp_tx_msdu_info_s *msdu_info) { - struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; - DP_TX_TID_OVERRIDE(msdu_info, nbuf); - if (pdev->soc && vdev->dscp_tid_map_id < pdev->soc->num_hw_dscp_tid_map) - return; - - /* for mesh packets don't do any classification */ - if (qdf_unlikely(vdev->mesh_vdev)) + /* + * skip_sw_tid_classification flag will set in below cases- + * 1. vdev->dscp_tid_map_id < pdev->soc->num_hw_dscp_tid_map + * 2. hlos_tid_override enabled for vdev + * 3. mesh mode enabled for vdev + */ + if (qdf_likely(vdev->skip_sw_tid_classification)) { + /* Update tid in msdu_info from skb priority */ + if (qdf_unlikely(vdev->skip_sw_tid_classification + & DP_TXRX_HLOS_TID_OVERRIDE_ENABLED)) { + msdu_info->tid = qdf_nbuf_get_priority(nbuf); + return; + } return; + } dp_tx_get_tid(vdev, nbuf, msdu_info); } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index f19c884ec5..79b4ced68c 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -122,6 +122,11 @@ #define PHYB_2G_LMAC_ID 2 #define PHYB_2G_TARGET_PDEV_ID 2 +/* Flags for skippig s/w tid classification */ +#define DP_TX_HW_DSCP_TID_MAP_VALID 0x1 +#define DP_TXRX_HLOS_TID_OVERRIDE_ENABLED 0x2 +#define DP_TX_MESH_ENABLED 0x4 + enum rx_pktlog_mode { DP_RX_PKTLOG_DISABLED = 0, DP_RX_PKTLOG_FULL, @@ -2199,6 +2204,12 @@ struct dp_vdev { /* Address search type to be set in TX descriptor */ uint8_t search_type; + /* + * Flag to indicate if s/w tid classification should be + * skipped + */ + uint8_t skip_sw_tid_classification; + /* AST hash value for BSS peer in HW valid for STA VAP*/ uint16_t bss_ast_hash;