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_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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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) ||
|
||||||
|
@@ -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))
|
/*
|
||||||
return false;
|
* 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)) {
|
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)
|
/*
|
||||||
return;
|
* skip_sw_tid_classification flag will set in below cases-
|
||||||
|
* 1. vdev->dscp_tid_map_id < pdev->soc->num_hw_dscp_tid_map
|
||||||
/* for mesh packets don't do any classification */
|
* 2. hlos_tid_override enabled for vdev
|
||||||
if (qdf_unlikely(vdev->mesh_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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
dp_tx_get_tid(vdev, nbuf, msdu_info);
|
dp_tx_get_tid(vdev, nbuf, msdu_info);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user