Jelajahi Sumber

qcacld-3.0: remove control path handles from cdp ops

Currently control path handles of pdev/vdev/peer
are given as arguments to cdp ops, which are
directly accessed by dp layer. This can cause a
race-condition in access of the handle if it
has been deleted in parallel.

Hence as a part of cdp convergence, pass only
the psoc handle which can be accessed all over
to retrieve objmgr_pdev from psoc.

- rx_mic_error
- txrx_pdev_attach
- txrx_vdev_attach
- txrx_peer_create

Change-Id: Iaec8b913810f9035faa0010117cdff19bdded37f
CRs-Fixed: 2541431
Vevek Venkatesan 5 tahun lalu
induk
melakukan
b4016095ae

+ 2 - 3
core/cds/src/cds_api.c

@@ -810,9 +810,8 @@ QDF_STATUS cds_dp_open(struct wlan_objmgr_psoc *psoc)
 
 	cds_set_context(QDF_MODULE_ID_TXRX,
 		cdp_pdev_attach(cds_get_context(QDF_MODULE_ID_SOC),
-			(struct cdp_ctrl_objmgr_pdev *)gp_cds_context->cfg_ctx,
-			gp_cds_context->htc_ctx,
-			gp_cds_context->qdf_ctx, 0));
+				gp_cds_context->htc_ctx,
+				gp_cds_context->qdf_ctx, 0));
 	if (!gp_cds_context->pdev_txrx_ctx) {
 		/* Critical Error ...  Cannot proceed further */
 		cds_alert("Failed to open TXRX");

+ 3 - 2
core/dp/txrx/ol_rx.c

@@ -963,7 +963,8 @@ ol_rx_send_mic_err_ind(struct ol_txrx_pdev_t *pdev, uint8_t vdev_id,
 	struct cdp_rx_mic_err_info mic_failure_info;
 	qdf_ether_header_t *eth_hdr;
 	struct ol_if_ops *tops = NULL;
-	ol_txrx_soc_handle ol_txrx_soc = cds_get_context(QDF_MODULE_ID_SOC);
+	struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC);
+	ol_txrx_soc_handle ol_txrx_soc = &soc->cdp_soc;
 
 	if (err_type != OL_RX_ERR_TKIP_MIC)
 		return;
@@ -987,7 +988,7 @@ ol_rx_send_mic_err_ind(struct ol_txrx_pdev_t *pdev, uint8_t vdev_id,
 
 	tops = ol_txrx_soc->ol_ops;
 	if (tops->rx_mic_error)
-		tops->rx_mic_error(pdev->control_pdev, &mic_failure_info);
+		tops->rx_mic_error(soc->psoc, pdev->id, &mic_failure_info);
 }
 
 void

+ 6 - 32
core/dp/txrx/ol_txrx.c

@@ -719,8 +719,7 @@ static inline void ol_txrx_debugfs_exit(ol_txrx_pdev_handle pdev)
 
 /**
  * ol_txrx_pdev_attach() - allocate txrx pdev
- * @soc: soc handle
- * @ctrl_pdev: cfg pdev
+ * @soc: datapath soc handle
  * @htc_pdev: HTC pdev
  * @osdev: os dev
  * @pdev_id: pdev identifier for pdev attach
@@ -730,12 +729,11 @@ static inline void ol_txrx_debugfs_exit(ol_txrx_pdev_handle pdev)
  */
 static struct cdp_pdev *
 ol_txrx_pdev_attach(ol_txrx_soc_handle soc,
-		    struct cdp_ctrl_objmgr_pdev *ctrl_pdev,
 		    HTC_HANDLE htc_pdev, qdf_device_t osdev, uint8_t pdev_id)
 {
 	struct ol_txrx_soc_t *ol_soc = cdp_soc_t_to_ol_txrx_soc_t(soc);
 	struct ol_txrx_pdev_t *pdev;
-	struct cdp_cfg *cfg_pdev = (struct cdp_cfg *)ctrl_pdev;
+	struct cdp_cfg *cfg_pdev = cds_get_context(QDF_MODULE_ID_CFG);
 	int i, tid;
 
 	if (pdev_id == OL_TXRX_INVALID_PDEV_ID)
@@ -1832,12 +1830,11 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
 }
 
 /**
- *ol_txrx_vdev_register - Link a vdev's data object with the
+ * ol_txrx_vdev_register - Link a vdev's data object with the
  * matching OS shim vdev object.
  *
- * @txrx_vdev: the virtual device's data object
+ * @pvdev: the virtual device's data object
  * @osif_vdev: the virtual device's OS shim object
- * @ctrl_vdev: UMAC vdev objmgr handle
  * @txrx_ops: (pointers to)functions used for tx and rx data xfer
  *
  *  The data object for a virtual device is created by the
@@ -1852,7 +1849,6 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
  *  when passing rx data received by a vdev up to the OS shim.
  */
 static void ol_txrx_vdev_register(struct cdp_vdev *pvdev, void *osif_vdev,
-				  struct cdp_ctrl_objmgr_vdev *ctrl_vdev,
 				  struct ol_txrx_ops *txrx_ops)
 {
 	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
@@ -1864,7 +1860,6 @@ static void ol_txrx_vdev_register(struct cdp_vdev *pvdev, void *osif_vdev,
 	}
 
 	vdev->osif_dev = osif_vdev;
-	vdev->ctrl_vdev = ctrl_vdev;
 	vdev->rx = txrx_ops->rx.rx;
 	vdev->stats_rx = txrx_ops->rx.stats_rx;
 	vdev->tx_comp = txrx_ops->tx.tx_comp;
@@ -2179,9 +2174,7 @@ static void ol_txrx_dump_peer_access_list(ol_txrx_peer_handle peer)
 /**
  * ol_txrx_peer_attach - Allocate and set up references for a
  * data peer object.
- * @data_pdev: data physical device object that will indirectly
- * own the data_peer object
- * @data_vdev - data virtual device object that will directly
+ * @pvdev - data virtual device object that will directly
  * own the data_peer object
  * @peer_mac_addr - MAC address of the new peer
  *
@@ -2200,8 +2193,7 @@ static void ol_txrx_dump_peer_access_list(ol_txrx_peer_handle peer)
  * fails
  */
 static void *
-ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr,
-		    struct cdp_ctrl_objmgr_peer *ctrl_peer)
+ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
 {
 	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
 	struct ol_txrx_peer_t *peer;
@@ -2295,7 +2287,6 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr,
 
 	/* store provided params */
 	peer->vdev = vdev;
-	peer->ctrl_peer = ctrl_peer;
 	qdf_mem_copy(&peer->mac_addr.raw[0], peer_mac_addr,
 		     QDF_MAC_ADDR_SIZE);
 
@@ -5559,22 +5550,6 @@ struct cdp_vdev *ol_txrx_wrapper_get_vdev_from_vdev_id(struct cdp_pdev *ppdev,
 	return ol_txrx_get_vdev_from_vdev_id(vdev_id);
 }
 
-/**
- * ol_txrx_pdev_set_ctrl_pdev() - set ctrl pdev handle in txrx pdev
- * @txrx_pdev: txrx pdev handle
- * @ctrl_pdev: UMAC ctrl pdev handle
- *
- * Return: void
- */
-static void
-ol_txrx_pdev_set_ctrl_pdev(struct cdp_pdev *txrx_pdev,
-			   struct cdp_ctrl_objmgr_pdev *ctrl_pdev)
-{
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)txrx_pdev;
-
-	pdev->control_pdev = ctrl_pdev;
-}
-
 /**
  * ol_txrx_wrapper_register_peer() - register peer
  * @pdev: pdev handle
@@ -5882,7 +5857,6 @@ static struct cdp_cmn_ops ol_ops_cmn = {
 	.txrx_fw_stats_get = ol_txrx_fw_stats_get,
 	.display_stats = ol_txrx_display_stats,
 	.txrx_get_cfg = ol_txrx_get_cfg,
-	.txrx_pdev_set_ctrl_pdev = ol_txrx_pdev_set_ctrl_pdev,
 	/* TODO: Add other functions */
 };
 

+ 0 - 2
core/dp/txrx/ol_txrx_types.h

@@ -648,8 +648,6 @@ struct ol_txrx_pdev_t {
 	/* ctrl_pdev - handle for querying config info */
 	struct cdp_cfg *ctrl_pdev;
 
-	struct cdp_ctrl_objmgr_pdev *control_pdev;
-
 	/* osdev - handle for mem alloc / free, map / unmap */
 	qdf_device_t osdev;
 

+ 1 - 4
core/hdd/src/wlan_hdd_assoc.c

@@ -2144,9 +2144,7 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
 	}
 
 	txrx_ops.tx.tx = NULL;
-	cdp_vdev_register(soc,
-		adapter->txrx_vdev, adapter,
-		(struct cdp_ctrl_objmgr_vdev *)adapter->vdev, &txrx_ops);
+	cdp_vdev_register(soc, adapter->txrx_vdev, adapter, &txrx_ops);
 	if (!txrx_ops.tx.tx) {
 		hdd_err("%s vdev register fail", __func__);
 		return QDF_STATUS_E_FAILURE;
@@ -4105,7 +4103,6 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
 
 	cdp_vdev_register(soc, txrx_vdev,
 			  adapter,
-			  (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
 			  &txrx_ops);
 	adapter->tx_fn = txrx_ops.tx.tx;
 	txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;

+ 12 - 8
core/hdd/src/wlan_hdd_main.c

@@ -2030,10 +2030,6 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg)
 	 */
 	hdd_component_cfg_chan_to_freq(hdd_ctx->pdev);
 
-	cdp_pdev_set_ctrl_pdev(cds_get_context(QDF_MODULE_ID_SOC),
-			cds_get_context(QDF_MODULE_ID_TXRX),
-			(struct cdp_ctrl_objmgr_pdev *)hdd_ctx->pdev);
-
 	wlan_pdev_set_dp_handle(hdd_ctx->pdev,
 				cds_get_context(QDF_MODULE_ID_TXRX));
 
@@ -7941,15 +7937,16 @@ struct hdd_adapter *hdd_get_first_valid_adapter(struct hdd_context *hdd_ctx)
 
 /**
  * hdd_rx_mic_error_ind() - MIC error indication handler
- * @scn_handle: pdev handle from osif layer
- * @info: mic failure information
+ * @psoc: opaque handle for UMAC psoc object
+ * @pdev_id: physical device instance id
+ * @mic_failure_info: mic failure information
  *
  * This function indicates the Mic failure to the supplicant
  *
  * Return: None
  */
 static void
-hdd_rx_mic_error_ind(void *scn_handle,
+hdd_rx_mic_error_ind(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id,
 		     struct cdp_rx_mic_err_info *mic_failure_info)
 {
 	struct wiphy *wiphy;
@@ -7959,7 +7956,14 @@ hdd_rx_mic_error_ind(void *scn_handle,
 	struct hdd_mic_error_info *hdd_mic_info;
 	struct wlan_objmgr_pdev *pdev;
 
-	pdev = (struct wlan_objmgr_pdev *)scn_handle;
+	if (!psoc)
+		return;
+
+	pdev = wlan_objmgr_get_pdev_by_id((struct wlan_objmgr_psoc *)psoc,
+					  pdev_id, WLAN_MLME_SB_ID);
+	if (!pdev)
+		return;
+
 	pdev_priv = wlan_pdev_get_ospriv(pdev);
 	wiphy = pdev_priv->wiphy;
 	hdd_ctx = wiphy_priv(wiphy);

+ 0 - 1
core/hdd/src/wlan_hdd_ocb.c

@@ -253,7 +253,6 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
 		return -EINVAL;
 
 	cdp_vdev_register(soc, vdev, adapter,
-			  (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
 			  &txrx_ops);
 	txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
 	adapter->tx_fn = txrx_ops.tx.tx;

+ 0 - 1
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -1088,7 +1088,6 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
 	cdp_vdev_register(soc,
 			  txrx_vdev,
 			  adapter,
-			  (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
 			  &txrx_ops);
 	adapter->txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
 					(struct cdp_pdev *)pdev,

+ 2 - 4
core/hdd/src/wlan_hdd_tx_rx.c

@@ -2736,10 +2736,8 @@ int hdd_set_mon_rx_cb(struct net_device *dev)
 	txrx_ops.rx.rx = hdd_mon_rx_packet_cbk;
 	hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback);
 	cdp_vdev_register(soc,
-		(struct cdp_vdev *)cdp_get_mon_vdev_from_pdev(soc,
-		(struct cdp_pdev *)pdev),
-		adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
-		&txrx_ops);
+			  cdp_get_mon_vdev_from_pdev(soc, pdev),
+			  adapter, &txrx_ops);
 	/* peer is created wma_vdev_attach->wma_create_peer */
 	qdf_status = cdp_peer_register(soc,
 			(struct cdp_pdev *)pdev, &sta_desc);

+ 1 - 2
core/wma/src/wma_dev_if.c

@@ -1928,8 +1928,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	 * where the HTT peer map event is received before the peer object
 	 * is created in the data path
 	 */
-	peer = cdp_peer_create(dp_soc, vdev, peer_addr,
-			       (struct cdp_ctrl_objmgr_peer *)obj_peer);
+	peer = cdp_peer_create(dp_soc, vdev, peer_addr);
 	if (!peer) {
 		WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
 		wlan_objmgr_peer_obj_delete(obj_peer);