qcacmn: changes to support lithium nss offload
Changes include 1. nss_cfg parameter to dp_soc. 2. nss_enabled field for pdev. 3. cdp api to enabled nss offload config. 4. skip rx ring configuration when nss enabled. 5. skip timter /interrupt configuration if nss is enabled. 6. peer map/unmap event hander. Change-Id: Ic4a919b6b7e846e18cb15ebcb94f8736a751ecb5
This commit is contained in:
@@ -51,6 +51,21 @@ cdp_soc_attach_target(ol_txrx_soc_handle soc)
|
|||||||
return 0;
|
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 *
|
static inline struct cdp_vdev *
|
||||||
cdp_vdev_attach(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
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)
|
uint8_t *vdev_mac_addr, uint8_t vdev_id, enum wlan_op_mode op_mode)
|
||||||
|
@@ -203,6 +203,10 @@ struct cdp_cmn_ops {
|
|||||||
struct ol_txrx_stats_req *req, enum cdp_stats stats);
|
struct ol_txrx_stats_req *req, enum cdp_stats stats);
|
||||||
|
|
||||||
QDF_STATUS (*display_stats)(void *psoc, uint16_t value);
|
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 {
|
struct cdp_ctrl_ops {
|
||||||
@@ -601,6 +605,11 @@ struct ol_if_ops {
|
|||||||
uint8_t type);
|
uint8_t type);
|
||||||
uint8_t (*rx_invalid_peer)(void *osif_pdev, void *msg);
|
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 */
|
/* TODO: Add any other control path calls required to OL_IF/WMA layer */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1138,6 +1138,12 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
|
|||||||
goto fail0;
|
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->soc = soc;
|
||||||
pdev->osif_pdev = ctrl_pdev;
|
pdev->osif_pdev = ctrl_pdev;
|
||||||
pdev->pdev_id = pdev_id;
|
pdev->pdev_id = pdev_id;
|
||||||
@@ -1590,6 +1596,35 @@ static int dp_soc_attach_target_wifi3(struct cdp_soc_t *cdp_soc)
|
|||||||
return 0;
|
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
|
* dp_vdev_attach_wifi3() - attach txrx vdev
|
||||||
* @txrx_pdev: Datapath PDEV handle
|
* @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);
|
dp_tx_vdev_attach(vdev);
|
||||||
|
|
||||||
#ifdef DP_INTR_POLL_BASED
|
#ifdef DP_INTR_POLL_BASED
|
||||||
if (pdev->vdev_count == 1)
|
if (wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx) != 0) {
|
||||||
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
|
if (pdev->vdev_count == 1)
|
||||||
|
qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dp_lro_hash_setup(soc);
|
dp_lro_hash_setup(soc);
|
||||||
@@ -3670,6 +3707,8 @@ static struct cdp_cmn_ops dp_ops_cmn = {
|
|||||||
.txrx_stats = dp_txrx_stats,
|
.txrx_stats = dp_txrx_stats,
|
||||||
.txrx_set_monitor_mode = dp_vdev_set_monitor_mode,
|
.txrx_set_monitor_mode = dp_vdev_set_monitor_mode,
|
||||||
.display_stats = dp_txrx_dump_stats,
|
.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 */
|
/* 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);
|
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_spinlock_create(&soc->reo_desc_freelist_lock);
|
||||||
qdf_list_create(&soc->reo_desc_freelist, REO_DESC_FREELIST_SIZE);
|
qdf_list_create(&soc->reo_desc_freelist, REO_DESC_FREELIST_SIZE);
|
||||||
|
|
||||||
|
@@ -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
|
* in this case just add the ast entry to the existing
|
||||||
* peer ast_list.
|
* peer ast_list.
|
||||||
*/
|
*/
|
||||||
if (!peer)
|
if (!peer) {
|
||||||
dp_peer_find_add_id(soc, peer_mac_addr, peer_id,
|
dp_peer_find_add_id(soc, peer_mac_addr, peer_id,
|
||||||
hw_peer_id, vdev_id);
|
hw_peer_id, vdev_id);
|
||||||
else
|
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,
|
dp_peer_add_ast(soc, peer, peer_mac_addr,
|
||||||
hw_peer_id, vdev_id);
|
hw_peer_id, vdev_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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.
|
* Remove a reference to the peer.
|
||||||
* If there are no more references, delete the peer object.
|
* If there are no more references, delete the peer object.
|
||||||
|
@@ -1188,6 +1188,12 @@ dp_rx_pdev_attach(struct dp_pdev *pdev)
|
|||||||
struct dp_srng *dp_rxdma_srng;
|
struct dp_srng *dp_rxdma_srng;
|
||||||
struct rx_desc_pool *rx_desc_pool;
|
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]);
|
qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]);
|
||||||
pdev = soc->pdev_list[pdev_id];
|
pdev = soc->pdev_list[pdev_id];
|
||||||
rxdma_srng = pdev->rx_refill_buf_ring;
|
rxdma_srng = pdev->rx_refill_buf_ring;
|
||||||
|
@@ -157,6 +157,7 @@ struct wlan_cfg_dp_soc_ctxt {
|
|||||||
int int_ce_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS];
|
int int_ce_ring_mask[WLAN_CFG_INT_NUM_CONTEXTS];
|
||||||
bool lro_enabled;
|
bool lro_enabled;
|
||||||
bool rx_hash;
|
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_dest_ring_size;
|
||||||
int dma_mon_status_ring_size;
|
int dma_mon_status_ring_size;
|
||||||
int num_mac_rings;
|
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;
|
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;
|
||||||
|
}
|
||||||
|
@@ -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);
|
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
|
#endif
|
||||||
|
Reference in New Issue
Block a user