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:
@@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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) ||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user