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
This commit is contained in:
Mainak Sen
2020-08-06 13:20:12 +05:30
committed by snandini
parent 6510531b81
commit 60cdb2185c
5 changed files with 113 additions and 10 deletions

View File

@@ -1095,6 +1095,7 @@ enum cdp_pdev_param_type {
* @cdp_vdev_param_mesh_mode: set mesh mode * @cdp_vdev_param_mesh_mode: set mesh mode
* @cdp_vdev_param_safe_mode: set safe mode * @cdp_vdev_param_safe_mode: set safe mode
* @cdp_vdev_param_drop_unenc: set drop unencrypted flag * @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_dbg_snf: Enable debug sniffer feature
* @cdp_pdev_param_bpr_enable: Enable bcast probe 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_mesh_mode;
uint32_t cdp_vdev_param_safe_mode; uint32_t cdp_vdev_param_safe_mode;
uint32_t cdp_vdev_param_drop_unenc; uint32_t cdp_vdev_param_drop_unenc;
uint8_t cdp_vdev_param_hlos_tid_override;
/* pdev params */ /* pdev params */
bool cdp_pdev_param_cptr_latcy; bool cdp_pdev_param_cptr_latcy;
@@ -1268,6 +1270,7 @@ enum cdp_pdev_bpr_param {
* @CDP_SAFEMODE: set safe mode * @CDP_SAFEMODE: set safe mode
* @CDP_DROP_UNENC: set drop unencrypted flag * @CDP_DROP_UNENC: set drop unencrypted flag
* @CDP_ENABLE_IGMP_MCAST_EN: enable/disable igmp multicast enhancement * @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 { enum cdp_vdev_param_type {
CDP_ENABLE_NAWDS, CDP_ENABLE_NAWDS,
@@ -1294,6 +1297,7 @@ enum cdp_vdev_param_type {
CDP_DROP_UNENC, CDP_DROP_UNENC,
CDP_ENABLE_CSUM, CDP_ENABLE_CSUM,
CDP_ENABLE_IGMP_MCAST_EN, CDP_ENABLE_IGMP_MCAST_EN,
CDP_ENABLE_HLOS_TID_OVERRIDE,
}; };
/* /*

View File

@@ -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->raw_mode_war = wlan_cfg_get_raw_mode_war(soc->wlan_cfg_ctx);
vdev->prev_tx_enq_tstamp = 0; vdev->prev_tx_enq_tstamp = 0;
vdev->prev_rx_deliver_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); dp_vdev_pdev_list_add(soc, pdev, vdev);
pdev->vdev_count++; 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, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
FL("val %d"), val); FL("val %d"), val);
vdev->mesh_vdev = 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 #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 #ifdef VDEV_PEER_PROTOCOL_COUNT
static void dp_enable_vdev_peer_protocol_count(struct cdp_soc_t *soc_hdl, static void dp_enable_vdev_peer_protocol_count(struct cdp_soc_t *soc_hdl,
int8_t vdev_id, 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; break;
case CDP_ENABLE_MCAST_EN: case CDP_ENABLE_MCAST_EN:
val->cdp_vdev_param_mcast_en = vdev->mcast_enhancement_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; break;
default: default:
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 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); val.cdp_enable_tx_checksum);
vdev->csum_enabled = val.cdp_enable_tx_checksum; vdev->csum_enabled = val.cdp_enable_tx_checksum;
break; 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: default:
break; 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); DP_MOD_ID_CDP);
if (vdev) { if (vdev) {
vdev->dscp_tid_map_id = map_id; 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); dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -2474,6 +2474,13 @@ done:
continue; 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; rx_pdev = vdev->pdev;
DP_RX_TID_SAVE(nbuf, tid); DP_RX_TID_SAVE(nbuf, tid);
if (qdf_unlikely(rx_pdev->delay_stats_flag) || if (qdf_unlikely(rx_pdev->delay_stats_flag) ||

View File

@@ -42,6 +42,9 @@
#endif #endif
#include "dp_hist.h" #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 */ /* TODO Add support in TSO */
#define DP_DESC_NUM_FRAG(x) 0 #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_nbuf_t nbuf_clone = NULL;
qdf_dot3_qosframe_t *qos_wh = NULL; qdf_dot3_qosframe_t *qos_wh = NULL;
/* for mesh packets don't do any classification */ if (qdf_likely(vdev->skip_sw_tid_classification)) {
if (qdf_unlikely(vdev->mesh_vdev)) /*
* 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; return false;
}
if (qdf_likely(vdev->tx_encap_type != htt_cmn_pkt_type_raw)) { if (qdf_likely(vdev->tx_encap_type != htt_cmn_pkt_type_raw)) {
eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf); 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, 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_tx_msdu_info_s *msdu_info)
{ {
struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
DP_TX_TID_OVERRIDE(msdu_info, nbuf); DP_TX_TID_OVERRIDE(msdu_info, nbuf);
if (pdev->soc && vdev->dscp_tid_map_id < pdev->soc->num_hw_dscp_tid_map) /*
* 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;
}
/* for mesh packets don't do any classification */
if (qdf_unlikely(vdev->mesh_vdev))
return; return;
}
dp_tx_get_tid(vdev, nbuf, msdu_info); dp_tx_get_tid(vdev, nbuf, msdu_info);
} }

View File

@@ -122,6 +122,11 @@
#define PHYB_2G_LMAC_ID 2 #define PHYB_2G_LMAC_ID 2
#define PHYB_2G_TARGET_PDEV_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 { enum rx_pktlog_mode {
DP_RX_PKTLOG_DISABLED = 0, DP_RX_PKTLOG_DISABLED = 0,
DP_RX_PKTLOG_FULL, DP_RX_PKTLOG_FULL,
@@ -2199,6 +2204,12 @@ struct dp_vdev {
/* Address search type to be set in TX descriptor */ /* Address search type to be set in TX descriptor */
uint8_t search_type; 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*/ /* AST hash value for BSS peer in HW valid for STA VAP*/
uint16_t bss_ast_hash; uint16_t bss_ast_hash;