瀏覽代碼

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
Bharat Kumar M 8 年之前
父節點
當前提交
9a5d537249
共有 7 個文件被更改,包括 136 次插入10 次删除
  1. 15 0
      dp/inc/cdp_txrx_cmn.h
  2. 9 0
      dp/inc/cdp_txrx_ops.h
  3. 41 6
      dp/wifi3.0/dp_main.c
  4. 15 4
      dp/wifi3.0/dp_peer.c
  5. 6 0
      dp/wifi3.0/dp_rx.c
  6. 22 0
      wlan_cfg/wlan_cfg.c
  7. 28 0
      wlan_cfg/wlan_cfg.h

+ 15 - 0
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)

+ 9 - 0
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 */
 };
 

+ 41 - 6
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);
 

+ 15 - 4
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.

+ 6 - 0
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;

+ 22 - 0
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;
+}

+ 28 - 0
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