diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index e54e7aca57..d3246b2109 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -151,6 +151,15 @@ enum htt_cmn_pkt_type { htt_cmn_pkt_num_types }; + +enum cdp_host_reo_dest_ring { + cdp_host_reo_dest_ring_unknown = 0, + cdp_host_reo_dest_ring_1 = 1, + cdp_host_reo_dest_ring_2 = 2, + cdp_host_reo_dest_ring_3 = 3, + cdp_host_reo_dest_ring_4 = 4, +}; + enum htt_cmn_t2h_en_stats_type { /* keep this alwyas first */ HTT_CMN_T2H_EN_STATS_TYPE_START = 0, diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index f0018cc571..5953f13762 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -154,6 +154,41 @@ cdp_get_vdev_rx_decap_type(ol_txrx_soc_handle soc, struct cdp_vdev *vdev) return 0; } +/** + * @brief set the Reo Destination ring for the pdev + * @details + * This will be used to configure the Reo Destination ring for this pdev. + * + * @param soc - pointer to the soc + * @param pdev - the data physical device object + * @param val - the Reo destination ring index (1 to 4) + * @return - void + */ +static inline void +cdp_set_pdev_reo_dest(ol_txrx_soc_handle soc, + struct cdp_pdev *pdev, enum cdp_host_reo_dest_ring val) +{ + if (soc->ops->ctrl_ops->txrx_set_pdev_reo_dest) + return soc->ops->ctrl_ops->txrx_set_pdev_reo_dest + (pdev, val); + return; +} + +/** + * @brief get the Reo Destination ring for the pdev + * + * @param soc - pointer to the soc + * @param pdev - the data physical device object + * @return - the Reo destination ring index (1 to 4), 0 if not supported. + */ +static inline enum cdp_host_reo_dest_ring +cdp_get_pdev_reo_dest(ol_txrx_soc_handle soc, struct cdp_pdev *pdev) +{ + if (soc->ops->ctrl_ops->txrx_get_pdev_reo_dest) + return soc->ops->ctrl_ops->txrx_get_pdev_reo_dest(pdev); + return cdp_host_reo_dest_ring_unknown; +} + /* Is this similar to ol_txrx_peer_state_update() in MCL */ /** * @brief Update the authorize peer object at association time diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 2eaf5ad364..0ae242c8bf 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -365,6 +365,30 @@ struct cdp_ctrl_ops { enum cdp_vdev_param_type param, uint32_t val); void (*txrx_peer_set_nawds)(void *peer, uint8_t value); + /** + * @brief Set the reo dest ring num of the radio + * @details + * Set the reo destination ring no on which we will receive + * pkts for this radio. + * + * @param pdev - the data physical device object + * @param reo_dest_ring_num - value ranges between 1 - 4 + */ + void (*txrx_set_pdev_reo_dest)( + struct cdp_pdev *pdev, + enum cdp_host_reo_dest_ring reo_dest_ring_num); + + /** + * @brief Get the reo dest ring num of the radio + * @details + * Get the reo destination ring no on which we will receive + * pkts for this radio. + * + * @param pdev - the data physical device object + * @return the reo destination ring number + */ + enum cdp_host_reo_dest_ring (*txrx_get_pdev_reo_dest)( + struct cdp_pdev *pdev); }; struct cdp_me_ops { diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 4c5cac2791..c39441008e 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -474,6 +474,7 @@ typedef enum _ol_ath_param_t { OL_ATH_PARAM_PRECAC_TIMEOUT = 346, OL_ATH_COEX_VER_CFG = 347, OL_ATH_PARAM_DUMP_TARGET = 348, + OL_ATH_PARAM_PDEV_TO_REO_DEST = 349, } ol_ath_param_t; /* diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a94bcbbc98..87ed84b7fa 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1245,6 +1245,8 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, goto fail0; } + /* set the reo destination to 1 during initialization */ + pdev->reo_dest = 1; return (struct cdp_pdev *)pdev; fail1: @@ -1815,6 +1817,7 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) struct dp_pdev *pdev; struct dp_soc *soc; bool hash_based = 0; + enum cdp_host_reo_dest_ring reo_dest; /* preconditions */ qdf_assert(vdev); @@ -1833,11 +1836,16 @@ static void dp_peer_setup_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("hash based steering %d\n"), hash_based); + if (!hash_based) + reo_dest = pdev->reo_dest; + else + reo_dest = 1; + if (soc->cdp_soc.ol_ops->peer_set_default_routing) { /* TODO: Check the destination ring number to be passed to FW */ soc->cdp_soc.ol_ops->peer_set_default_routing( pdev->osif_pdev, peer->mac_addr.raw, - peer->vdev->vdev_id, hash_based, 1); + peer->vdev->vdev_id, hash_based, reo_dest); } return; } @@ -1870,6 +1878,39 @@ static void dp_set_vdev_rx_decap_type(struct cdp_vdev *vdev_handle, vdev->rx_decap_type = val; } +/* + * dp_set_pdev_reo_dest() - set the reo destination ring for this pdev + * @pdev_handle: physical device object + * @val: reo destination ring index (1 - 4) + * + * Return: void + */ +static void dp_set_pdev_reo_dest(struct cdp_pdev *pdev_handle, + enum cdp_host_reo_dest_ring val) +{ + struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + + if (pdev) + pdev->reo_dest = val; +} + +/* + * dp_get_pdev_reo_dest() - get the reo destination for this pdev + * @pdev_handle: physical device object + * + * Return: reo destination ring index + */ +static enum cdp_host_reo_dest_ring +dp_get_pdev_reo_dest(struct cdp_pdev *pdev_handle) +{ + struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + + if (pdev) + return pdev->reo_dest; + else + return cdp_host_reo_dest_ring_unknown; +} + /* * dp_peer_authorize() - authorize txrx peer * @peer_handle: Datapath peer handle @@ -3308,6 +3349,8 @@ static struct cdp_ctrl_ops dp_ops_ctrl = { #endif .txrx_set_vdev_param = dp_set_vdev_param, .txrx_peer_set_nawds = dp_peer_set_nawds, + .txrx_set_pdev_reo_dest = dp_set_pdev_reo_dest, + .txrx_get_pdev_reo_dest = dp_get_pdev_reo_dest, /* TODO: Add other functions */ }; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 252367024e..77964a7a46 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -783,6 +783,9 @@ struct dp_pdev { struct cdp_mon_status rx_mon_recv_status; /* TBD */ + + /* map this pdev to a particular Reo Destination ring */ + enum cdp_host_reo_dest_ring reo_dest; }; struct dp_peer;