diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 6bc209cb77..01b9ec57f7 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -51,6 +51,21 @@ cdp_soc_attach_target(ol_txrx_soc_handle soc) return 0; } +static inline int +cdp_soc_get_nss_cfg(ol_txrx_soc_handle soc) +{ + if (soc->ops->cmn_drv_ops->txrx_soc_get_nss_cfg) + return soc->ops->cmn_drv_ops->txrx_soc_get_nss_cfg(soc); + return 0; +} + +static inline void +cdp_soc_set_nss_cfg(ol_txrx_soc_handle soc, uint32_t config) +{ + if (soc->ops->cmn_drv_ops->txrx_soc_set_nss_cfg) + soc->ops->cmn_drv_ops->txrx_soc_set_nss_cfg(soc, config); +} + static inline struct cdp_vdev * cdp_vdev_attach(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, uint8_t *vdev_mac_addr, uint8_t vdev_id, enum wlan_op_mode op_mode) diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 96525cd390..c230673950 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -203,6 +203,10 @@ struct cdp_cmn_ops { struct ol_txrx_stats_req *req, enum cdp_stats stats); QDF_STATUS (*display_stats)(void *psoc, uint16_t value); + + void (*txrx_soc_set_nss_cfg)(ol_txrx_soc_handle soc, int config); + + int(*txrx_soc_get_nss_cfg)(ol_txrx_soc_handle soc); }; struct cdp_ctrl_ops { @@ -601,6 +605,11 @@ struct ol_if_ops { uint8_t type); uint8_t (*rx_invalid_peer)(void *osif_pdev, void *msg); + int (*peer_map_event)(void *ol_soc_handle, uint16_t peer_id, uint16_t hw_peer_id, + uint8_t vdev_id, uint8_t *peer_mac_addr); + int (*peer_unmap_event)(void *ol_soc_handle, uint16_t peer_id); + + /* TODO: Add any other control path calls required to OL_IF/WMA layer */ }; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 617a924216..c80fb766c7 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1138,6 +1138,12 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, goto fail0; } + /* + * set nss pdev config based on soc config + */ + wlan_cfg_set_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx, + (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx) & (1 << pdev->pdev_id))); + pdev->soc = soc; pdev->osif_pdev = ctrl_pdev; pdev->pdev_id = pdev_id; @@ -1590,6 +1596,35 @@ static int dp_soc_attach_target_wifi3(struct cdp_soc_t *cdp_soc) return 0; } +/* + * dp_soc_get_nss_cfg_wifi3() - SOC get nss config + * @txrx_soc: Datapath SOC handle + */ +static int dp_soc_get_nss_cfg_wifi3(struct cdp_soc_t *cdp_soc) +{ + struct dp_soc *dsoc = (struct dp_soc *)cdp_soc; + return wlan_cfg_get_dp_soc_nss_cfg(dsoc->wlan_cfg_ctx); +} +/* + * dp_soc_set_nss_cfg_wifi3() - SOC set nss config + * @txrx_soc: Datapath SOC handle + * @nss_cfg: nss config + */ +static void dp_soc_set_nss_cfg_wifi3(struct cdp_soc_t *cdp_soc, int config) +{ + struct dp_soc *dsoc = (struct dp_soc *)cdp_soc; + wlan_cfg_set_dp_soc_nss_cfg(dsoc->wlan_cfg_ctx, config); + if (config) { + /* + * disable dp interrupt if nss enabled + */ + wlan_cfg_set_num_contexts(dsoc->wlan_cfg_ctx, 0); + } + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("nss-wifi<0> nss config is enabled")); +} + + /* * dp_vdev_attach_wifi3() - attach txrx vdev * @txrx_pdev: Datapath PDEV handle @@ -1651,8 +1686,10 @@ static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_pdev *txrx_pdev, dp_tx_vdev_attach(vdev); #ifdef DP_INTR_POLL_BASED - if (pdev->vdev_count == 1) - qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS); + if (wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx) != 0) { + if (pdev->vdev_count == 1) + qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS); + } #endif dp_lro_hash_setup(soc); @@ -3670,6 +3707,8 @@ static struct cdp_cmn_ops dp_ops_cmn = { .txrx_stats = dp_txrx_stats, .txrx_set_monitor_mode = dp_vdev_set_monitor_mode, .display_stats = dp_txrx_dump_stats, + .txrx_soc_set_nss_cfg = dp_soc_set_nss_cfg_wifi3, + .txrx_soc_get_nss_cfg = dp_soc_get_nss_cfg_wifi3, /* TODO: Add other functions */ }; @@ -3890,10 +3929,6 @@ void *dp_soc_attach_wifi3(void *osif_soc, void *hif_handle, } qdf_spinlock_create(&soc->peer_ref_mutex); - if (dp_soc_interrupt_attach(soc) != QDF_STATUS_SUCCESS) { - goto fail2; - } - qdf_spinlock_create(&soc->reo_desc_freelist_lock); qdf_list_create(&soc->reo_desc_freelist, REO_DESC_FREELIST_SIZE); diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index e823039f81..646a809809 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -441,12 +441,18 @@ dp_rx_peer_map_handler(void *soc_handle, uint16_t peer_id, uint16_t hw_peer_id, * in this case just add the ast entry to the existing * peer ast_list. */ - if (!peer) + if (!peer) { dp_peer_find_add_id(soc, peer_mac_addr, peer_id, - hw_peer_id, vdev_id); - else + hw_peer_id, vdev_id); + if (soc->cdp_soc.ol_ops->peer_map_event) { + soc->cdp_soc.ol_ops->peer_map_event(soc->osif_soc, + peer_id, hw_peer_id, vdev_id, peer_mac_addr); + } + + } else { dp_peer_add_ast(soc, peer, peer_mac_addr, - hw_peer_id, vdev_id); + hw_peer_id, vdev_id); + } } void @@ -477,6 +483,11 @@ dp_rx_peer_unmap_handler(void *soc_handle, uint16_t peer_id) } } + if (soc->cdp_soc.ol_ops->peer_unmap_event) { + soc->cdp_soc.ol_ops->peer_unmap_event(soc->osif_soc, + peer_id); + } + /* * Remove a reference to the peer. * If there are no more references, delete the peer object. diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 9ac7964e35..bdb51550a6 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1188,6 +1188,12 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; + if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "nss-wifi<4> skip Rx refil %d", pdev_id); + return QDF_STATUS_SUCCESS; + } + qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]); pdev = soc->pdev_list[pdev_id]; rxdma_srng = pdev->rx_refill_buf_ring; diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 038ae2b7d7..e0bebce9a4 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -157,6 +157,7 @@ struct wlan_cfg_dp_soc_ctxt { int int_ce_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS]; bool lro_enabled; bool rx_hash; + int nss_cfg; }; /** @@ -172,6 +173,7 @@ struct wlan_cfg_dp_pdev_ctxt { int dma_mon_dest_ring_size; int dma_mon_status_ring_size; int num_mac_rings; + int nss_enabled; }; /** @@ -396,3 +398,23 @@ bool wlan_cfg_is_rx_hash_enabled(struct wlan_cfg_dp_soc_ctxt *cfg) { return cfg->rx_hash; } + +int wlan_cfg_get_dp_pdev_nss_enabled(struct wlan_cfg_dp_pdev_ctxt *cfg) +{ + return cfg->nss_enabled; +} + +void wlan_cfg_set_dp_pdev_nss_enabled(struct wlan_cfg_dp_pdev_ctxt *cfg, int nss_enabled) +{ + cfg->nss_enabled = nss_enabled; +} + +int wlan_cfg_get_dp_soc_nss_cfg(struct wlan_cfg_dp_soc_ctxt *cfg) +{ + return cfg->nss_cfg; +} + +void wlan_cfg_set_dp_soc_nss_cfg(struct wlan_cfg_dp_soc_ctxt *cfg, int nss_cfg) +{ + cfg->nss_cfg = nss_cfg; +} diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 2b08ecf805..a497843753 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -329,4 +329,32 @@ bool wlan_cfg_is_lro_enabled(struct wlan_cfg_dp_soc_ctxt *cfg); */ bool wlan_cfg_is_rx_hash_enabled(struct wlan_cfg_dp_soc_ctxt *cfg); +/* + * wlan_cfg_get_dp_pdev_nss_enabled - Return pdev nss enabled/disabled + * @wlan_cfg_pdev_ctx + * + * Return: 1 - enabled 0 - disabled + */ +int wlan_cfg_get_dp_pdev_nss_enabled(struct wlan_cfg_dp_pdev_ctxt *cfg); + +/* + * wlan_cfg_set_dp_pdev_nss_enabled - set pdev nss enabled/disabled + * @wlan_cfg_pdev_ctx + */ +void wlan_cfg_set_dp_pdev_nss_enabled(struct wlan_cfg_dp_pdev_ctxt *cfg, int nss_enabled); + +/* + * wlan_cfg_get_dp_soc_nss_cfg - Return soc nss config + * @wlan_cfg_pdev_ctx + * + * Return: nss_cfg + */ +int wlan_cfg_get_dp_soc_nss_cfg(struct wlan_cfg_dp_soc_ctxt *cfg); + +/* + * wlan_cfg_set_dp_soc_nss_cfg - set soc nss config + * @wlan_cfg_pdev_ctx + * + */ +void wlan_cfg_set_dp_soc_nss_cfg(struct wlan_cfg_dp_soc_ctxt *cfg, int nss_cfg); #endif