Browse Source

qcacld-3.0: remove references to datapath structures from other modules

Core datapath structures should be opaque to non-datapath modules,
remove the references to them.

Change-Id: I3618253566a971c27f16b14923d1ff8028718918
CRs-Fixed: 994638
Manjunathappa Prakash 9 years ago
parent
commit
10d357a17c

+ 1 - 0
core/dp/ol/inc/ol_txrx_ctrl_api.h

@@ -40,6 +40,7 @@
 #include <ol_txrx_api.h>        /* ol_sec_type */
 #include <wlan_defs.h>          /* MAX_SPATIAL_STREAM */
 #include <cdp_txrx_cmn.h>       /* ol_pdev_handle, ol_vdev_handle, etc */
+#include <cdp_txrx_cfg.h>
 
 #define OL_ATH_TX_DRAIN_WAIT_DELAY 50
 

+ 274 - 0
core/dp/txrx/ol_txrx.c

@@ -49,6 +49,7 @@
 /* header files for our own APIs */
 #include <ol_txrx_api.h>
 #include <ol_txrx_dbg.h>
+#include <cdp_txrx_ocb.h>
 /* header files for our internal definitions */
 #include <ol_txrx_internal.h>   /* TXRX_ASSERT, etc. */
 #include <wdi_event.h>          /* WDI events */
@@ -1586,6 +1587,279 @@ static A_STATUS ol_tx_filter_pass_thru(struct ol_txrx_msdu_info_t *tx_msdu_info)
 	return A_OK;
 }
 
+/**
+ * ol_txrx_peer_get_peer_mac_addr() - return mac_addr from peer handle.
+ * @peer: handle to peer
+ *
+ * returns mac addrs for module which do not know peer type
+ *
+ * Return: the mac_addr from peer
+ */
+uint8_t *
+ol_txrx_peer_get_peer_mac_addr(ol_txrx_peer_handle peer)
+{
+	if (!peer)
+		return NULL;
+
+	return peer->mac_addr.raw;
+}
+
+/**
+ * ol_txrx_get_pn_info() - Returns pn info from peer
+ * @peer: handle to peer
+ * @last_pn_valid: return last_rmf_pn_valid value from peer.
+ * @last_pn: return last_rmf_pn value from peer.
+ * @rmf_pn_replays: return rmf_pn_replays value from peer.
+ *
+ * Return: NONE
+ */
+void
+ol_txrx_get_pn_info(ol_txrx_peer_handle peer, uint8_t **last_pn_valid,
+		    uint64_t **last_pn, uint32_t **rmf_pn_replays)
+{
+	*last_pn_valid = &peer->last_rmf_pn_valid;
+	*last_pn = &peer->last_rmf_pn;
+	*rmf_pn_replays = &peer->rmf_pn_replays;
+}
+
+/**
+ * ol_txrx_get_opmode() - Return operation mode of vdev
+ * @vdev: vdev handle
+ *
+ * Return: operation mode.
+ */
+int ol_txrx_get_opmode(ol_txrx_vdev_handle vdev)
+{
+	return vdev->opmode;
+}
+
+/**
+ * ol_txrx_get_peer_state() - Return peer state of peer
+ * @peer: peer handle
+ *
+ * Return: return peer state
+ */
+int ol_txrx_get_peer_state(ol_txrx_peer_handle peer)
+{
+	return peer->state;
+}
+
+/**
+ * ol_txrx_get_vdev_for_peer() - Return vdev from peer handle
+ * @peer: peer handle
+ *
+ * Return: vdev handle from peer
+ */
+ol_txrx_vdev_handle
+ol_txrx_get_vdev_for_peer(ol_txrx_peer_handle peer)
+{
+	return peer->vdev;
+}
+
+/**
+ * ol_txrx_get_vdev_mac_addr() - Return mac addr of vdev
+ * @vdev: vdev handle
+ *
+ * Return: vdev mac address
+ */
+uint8_t *
+ol_txrx_get_vdev_mac_addr(ol_txrx_vdev_handle vdev)
+{
+	if (!vdev)
+		return NULL;
+
+	return vdev->mac_addr.raw;
+}
+
+/**
+ * ol_txrx_get_vdev_struct_mac_addr() - Return handle to struct cdf_mac_addr of
+ * vdev
+ * @vdev: vdev handle
+ *
+ * Return: Handle to struct cdf_mac_addr
+ */
+struct cdf_mac_addr *
+ol_txrx_get_vdev_struct_mac_addr(ol_txrx_vdev_handle vdev)
+{
+	return (struct cdf_mac_addr *)&(vdev->mac_addr);
+}
+
+/**
+ * ol_txrx_get_pdev_from_vdev() - Return handle to pdev of vdev
+ * @vdev: vdev handle
+ *
+ * Return: Handle to pdev
+ */
+ol_txrx_pdev_handle ol_txrx_get_pdev_from_vdev(ol_txrx_vdev_handle vdev)
+{
+	return vdev->pdev;
+}
+
+/**
+ * ol_txrx_get_ctrl_pdev_from_vdev() - Return control pdev of vdev
+ * @vdev: vdev handle
+ *
+ * Return: Handle to control pdev
+ */
+ol_pdev_handle
+ol_txrx_get_ctrl_pdev_from_vdev(ol_txrx_vdev_handle vdev)
+{
+	return vdev->pdev->ctrl_pdev;
+}
+
+/**
+ * ol_txrx_is_rx_fwd_disabled() - returns the rx_fwd_disabled status on vdev
+ * @vdev: vdev handle
+ *
+ * Return: Rx Fwd disabled status
+ */
+uint8_t
+ol_txrx_is_rx_fwd_disabled(ol_txrx_vdev_handle vdev)
+{
+	struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)
+					vdev->pdev->ctrl_pdev;
+	return cfg->rx_fwd_disabled;
+}
+
+/**
+ * ol_txrx_update_ibss_add_peer_num_of_vdev() - update and return peer num
+ * @vdev: vdev handle
+ * @peer_num_delta: peer nums to be adjusted
+ *
+ * Return: -1 for failure or total peer nums after adjustment.
+ */
+int16_t
+ol_txrx_update_ibss_add_peer_num_of_vdev(ol_txrx_vdev_handle vdev,
+					 int16_t peer_num_delta)
+{
+	int16_t new_peer_num;
+
+	new_peer_num = vdev->ibss_peer_num + peer_num_delta;
+	if (new_peer_num > MAX_IBSS_PEERS || new_peer_num < 0)
+		return OL_TXRX_INVALID_NUM_PEERS;
+
+	vdev->ibss_peer_num = new_peer_num;
+
+	return new_peer_num;
+}
+
+/**
+ * ol_txrx_set_ibss_vdev_heart_beat_timer() - Update ibss vdev heart
+ * beat timer
+ * @vdev: vdev handle
+ * @timer_value_sec: new heart beat timer value
+ *
+ * Return: Old timer value set in vdev.
+ */
+uint16_t ol_txrx_set_ibss_vdev_heart_beat_timer(ol_txrx_vdev_handle vdev,
+						uint16_t timer_value_sec)
+{
+	uint16_t old_timer_value = vdev->ibss_peer_heart_beat_timer;
+
+	vdev->ibss_peer_heart_beat_timer = timer_value_sec;
+
+	return old_timer_value;
+}
+
+/**
+ * ol_txrx_remove_peers_for_vdev() - remove all vdev peers with lock held
+ * @vdev: vdev handle
+ * @callback: callback function to remove the peer.
+ * @callback_context: handle for callback function
+ * @remove_last_peer: Does it required to last peer.
+ *
+ * Return: NONE
+ */
+void
+ol_txrx_remove_peers_for_vdev(ol_txrx_vdev_handle vdev,
+			      ol_txrx_vdev_peer_remove_cb callback,
+			      void *callback_context, bool remove_last_peer)
+{
+	ol_txrx_peer_handle peer, temp;
+	/* remove all remote peers for vdev */
+	cdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex);
+
+	temp = NULL;
+	TAILQ_FOREACH_REVERSE(peer, &vdev->peer_list, peer_list_t,
+			      peer_list_elem) {
+		if (temp) {
+			cdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex);
+			if (cdf_atomic_read(&temp->delete_in_progress) == 0) {
+				callback(callback_context, temp->mac_addr.raw,
+					vdev->vdev_id, temp, false);
+			}
+			cdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex);
+		}
+		/* self peer is deleted last */
+		if (peer == TAILQ_FIRST(&vdev->peer_list)) {
+			TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+				   "%s: self peer removed by caller ",
+				   __func__);
+			break;
+		} else
+			temp = peer;
+	}
+
+	if (remove_last_peer) {
+		/* remove IBSS bss peer last */
+		peer = TAILQ_FIRST(&vdev->peer_list);
+		callback(callback_context, (uint8_t *) &vdev->mac_addr,
+			 vdev->vdev_id, peer, false);
+	}
+
+	cdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex);
+}
+
+/**
+ * ol_txrx_remove_peers_for_vdev_no_lock() - remove vdev peers with no lock.
+ * @vdev: vdev handle
+ * @callback: callback function to remove the peer.
+ * @callback_context: handle for callback function
+ *
+ * Return: NONE
+ */
+void
+ol_txrx_remove_peers_for_vdev_no_lock(ol_txrx_vdev_handle vdev,
+			      ol_txrx_vdev_peer_remove_cb callback,
+			      void *callback_context)
+{
+	ol_txrx_peer_handle peer = NULL;
+
+	TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
+		TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+			   "%s: peer found for vdev id %d. deleting the peer",
+			   __func__, vdev->vdev_id);
+		callback(callback_context, (uint8_t *)&vdev->mac_addr,
+				vdev->vdev_id, peer, false);
+	}
+}
+
+/**
+ * ol_txrx_set_ocb_chan_info() - set OCB channel info to vdev.
+ * @vdev: vdev handle
+ * @ocb_set_chan: OCB channel information to be set in vdev.
+ *
+ * Return: NONE
+ */
+void ol_txrx_set_ocb_chan_info(ol_txrx_vdev_handle vdev,
+			  struct ol_txrx_ocb_set_chan ocb_set_chan)
+{
+	vdev->ocb_channel_info = ocb_set_chan.ocb_channel_info;
+	vdev->ocb_channel_count = ocb_set_chan.ocb_channel_count;
+}
+
+/**
+ * ol_txrx_get_ocb_chan_info() - return handle to vdev ocb_channel_info
+ * @vdev: vdev handle
+ *
+ * Return: handle to struct ol_txrx_ocb_chan_info
+ */
+struct ol_txrx_ocb_chan_info *
+ol_txrx_get_ocb_chan_info(ol_txrx_vdev_handle vdev)
+{
+	return vdev->ocb_channel_info;
+}
+
 QDF_STATUS
 ol_txrx_peer_state_update(struct ol_txrx_pdev_t *pdev, uint8_t *peer_mac,
 			  enum ol_txrx_peer_state state)

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

@@ -60,6 +60,8 @@
  */
 #define MAX_NUM_PEER_ID_PER_PEER 8
 
+#define OL_TXRX_INVALID_NUM_PEERS (-1)
+
 #define OL_TXRX_MAC_ADDR_LEN 6
 
 /* OL_TXRX_NUM_EXT_TIDS -

+ 15 - 7
core/hdd/src/wlan_hdd_assoc.c

@@ -1189,9 +1189,11 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
 				 enum ol_txrx_peer_state sta_state,
 				 bool roam_synch_in_progress)
 {
-	struct ol_txrx_peer_t *peer;
 	QDF_STATUS err;
-	struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	uint8_t *peer_mac_addr;
+	struct ol_txrx_pdev_t *pdev = cds_get_context(CDF_MODULE_ID_TXRX);
+	ol_txrx_vdev_handle vdev;
+	ol_txrx_peer_handle peer;
 
 	if (!pdev) {
 		hdd_err("Failed to get txrx context");
@@ -1207,8 +1209,13 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
 	if (!peer)
 		return QDF_STATUS_E_FAULT;
 
-	err = ol_txrx_peer_state_update(pdev,
-			(u_int8_t *) peer->mac_addr.raw, sta_state);
+	peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer);
+	if (peer_mac_addr == NULL) {
+		hddLog(LOGE, "peer mac addr is NULL");
+		return QDF_STATUS_E_FAULT;
+	}
+
+	err = ol_txrx_peer_state_update(pdev, peer_mac_addr, sta_state);
 	if (err != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, "peer state update failed");
 		return QDF_STATUS_E_FAULT;
@@ -1224,7 +1231,7 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
 		INIT_COMPLETION(pAdapter->sta_authorized_event);
 #endif
 
-		err = sme_set_peer_authorized(peer->mac_addr.raw,
+		err = sme_set_peer_authorized(peer_mac_addr,
 				hdd_set_peer_authorized_event,
 				pAdapter->sessionId);
 		if (err != QDF_STATUS_SUCCESS) {
@@ -1245,8 +1252,9 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
 				hddLog(LOG1, "%s: timeout waiting for sta_authorized_event",
 					__func__);
 			}
-			ol_txrx_vdev_unpause(peer->vdev,
-				OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
+			vdev = ol_txrx_get_vdev_for_peer(peer);
+			ol_txrx_vdev_unpause(vdev,
+					OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
 #endif
 		}
 	}

+ 11 - 4
core/wma/src/wma_data.c

@@ -68,6 +68,8 @@
 #include "cdp_txrx_flow_ctrl_legacy.h"
 #include "cdp_txrx_cmn.h"
 #include "cdp_txrx_misc.h"
+#include <cdp_txrx_peer_ops.h>
+#include <cdp_txrx_cfg.h>
 
 typedef struct {
 	int32_t rate;
@@ -964,7 +966,7 @@ int wma_peer_state_change_event_handler(void *handle,
 		return -EINVAL;
 	}
 
-	if (vdev->opmode == wlan_op_mode_sta
+	if (ol_txrx_get_opmode(vdev) == wlan_op_mode_sta
 	    && event->state == WMI_PEER_STATE_AUTHORIZED) {
 		/*
 		 * set event so that hdd
@@ -976,7 +978,7 @@ int wma_peer_state_change_event_handler(void *handle,
 				 __func__);
 			return -EINVAL;
 		}
-		wma_handle->peer_authorized_cb(vdev->vdev_id);
+		wma_handle->peer_authorized_cb(event->vdev_id);
 #endif
 	}
 
@@ -2227,6 +2229,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 	uint8_t proto_type = 0;
 #endif /* QCA_PKT_PROTO_TRACE */
 	struct wmi_mgmt_params mgmt_param = {0};
+	ol_pdev_handle ctrl_pdev;
 
 	if (NULL == wma_handle) {
 		WMA_LOGE("wma_handle is NULL");
@@ -2457,8 +2460,12 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 		return QDF_STATUS_SUCCESS;
 	}
 
-	is_high_latency =
-		ol_cfg_is_high_latency(txrx_vdev->pdev->ctrl_pdev);
+	ctrl_pdev = ol_txrx_get_ctrl_pdev_from_vdev(txrx_vdev);
+	if (ctrl_pdev == NULL) {
+		WMA_LOGE("ol_pdev_handle is NULL\n");
+		return QDF_STATUS_E_FAILURE;
+	}
+	is_high_latency = ol_cfg_is_high_latency(ctrl_pdev);
 
 	downld_comp_required = tx_frm_download_comp_cb && is_high_latency;
 

+ 68 - 100
core/wma/src/wma_dev_if.c

@@ -69,6 +69,9 @@
 #include "wma_ocb.h"
 #include "cdp_txrx_cfg.h"
 #include "cdp_txrx_flow_ctrl_legacy.h"
+#include <cdp_txrx_peer_ops.h>
+#include <cdp_txrx_cfg.h>
+#include <cdp_txrx_cmn.h>
 
 /**
  * wma_find_vdev_by_addr() - find vdev_id from mac address
@@ -1018,6 +1021,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK;
 	uint8_t *peer_addr = bssid;
 	struct peer_flush_params param = {0};
+	uint8_t *peer_mac_addr;
 
 	if (!wma->interfaces[vdev_id].peer_count) {
 		WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
@@ -1028,6 +1032,14 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	if (peer)
 		ol_txrx_peer_detach(peer);
 
+	peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer);
+	if (peer_mac_addr == NULL) {
+		WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
+			 __func__, bssid, vdev_id,
+			 wma->interfaces[vdev_id].peer_count);
+		return;
+	}
+
 	wma->interfaces[vdev_id].peer_count--;
 	WMA_LOGE("%s: Removed peer with peer_addr %pM vdevid %d peer_count %d",
 		 __func__, bssid, vdev_id, wma->interfaces[vdev_id].peer_count);
@@ -1040,10 +1052,10 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid,
 					 &param);
 
-	if ((peer) && (wma_is_vdev_in_ibss_mode(wma, vdev_id))) {
+	if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) {
 		WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__,
-			 bssid, peer->mac_addr.raw);
-		peer_addr = peer->mac_addr.raw;
+			 bssid, peer_mac_addr);
+		peer_addr = peer_mac_addr;
 	}
 
 	wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr, vdev_id);
@@ -1070,6 +1082,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev,
 {
 	ol_txrx_peer_handle peer;
 	struct peer_create_params param = {0};
+	uint8_t *mac_addr_raw;
 
 	if (++wma->interfaces[vdev_id].peer_count >
 	    wma->wlan_resource_config.num_peers) {
@@ -1101,10 +1114,15 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev,
 	WMA_LOGE("%s: Created peer with peer_addr %pM vdev_id %d, peer_count - %d",
 		__func__, peer_addr, vdev_id, wma->interfaces[vdev_id].peer_count);
 
+	mac_addr_raw = ol_txrx_get_vdev_mac_addr(vdev);
+	if (mac_addr_raw == NULL) {
+		WMA_LOGE("%s: peer mac addr is NULL", __func__);
+		return QDF_STATUS_E_FAULT;
+	}
+
 	/* for each remote ibss peer, clear its keys */
 	if (wma_is_vdev_in_ibss_mode(wma, vdev_id) &&
-	    qdf_mem_cmp(peer_addr, vdev->mac_addr.raw,
-				IEEE80211_ADDR_LEN)) {
+	    qdf_mem_cmp(peer_addr, mac_addr_raw, IEEE80211_ADDR_LEN)) {
 
 		tSetStaKeyParams key_info;
 		WMA_LOGD("%s: remote ibss peer %pM key clearing\n", __func__,
@@ -1141,7 +1159,6 @@ err:
 static void wma_delete_all_ibss_peers(tp_wma_handle wma, A_UINT32 vdev_id)
 {
 	ol_txrx_vdev_handle vdev;
-	ol_txrx_peer_handle peer, temp;
 
 	if (!wma || vdev_id > wma->max_bssid)
 		return;
@@ -1151,31 +1168,9 @@ static void wma_delete_all_ibss_peers(tp_wma_handle wma, A_UINT32 vdev_id)
 		return;
 
 	/* remove all remote peers of IBSS */
-	qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex);
-
-	temp = NULL;
-	TAILQ_FOREACH_REVERSE(peer, &vdev->peer_list, peer_list_t, peer_list_elem) {
-		if (temp) {
-			qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex);
-			if (qdf_atomic_read(&temp->delete_in_progress) == 0) {
-				wma_remove_peer(wma, temp->mac_addr.raw,
-					vdev_id, temp, false);
-			}
-			qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex);
-		}
-		/* self peer is deleted last */
-		if (peer == TAILQ_FIRST(&vdev->peer_list)) {
-			WMA_LOGE("%s: self peer removed by caller ", __func__);
-			break;
-		} else
-			temp = peer;
-	}
-	qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex);
-
-	/* remove IBSS bss peer last */
-	peer = TAILQ_FIRST(&vdev->peer_list);
-	wma_remove_peer(wma, wma->interfaces[vdev_id].bssid, vdev_id, peer,
-			false);
+	ol_txrx_remove_peers_for_vdev(vdev,
+			(ol_txrx_vdev_peer_remove_cb)wma_remove_peer, wma,
+			true);
 }
 #else
 /**
@@ -1210,7 +1205,6 @@ static void wma_delete_all_ibss_peers(tp_wma_handle wma, A_UINT32 vdev_id)
 static void wma_delete_all_ap_remote_peers(tp_wma_handle wma, A_UINT32 vdev_id)
 {
 	ol_txrx_vdev_handle vdev;
-	ol_txrx_peer_handle peer, temp;
 
 	if (!wma || vdev_id > wma->max_bssid)
 		return;
@@ -1221,28 +1215,8 @@ static void wma_delete_all_ap_remote_peers(tp_wma_handle wma, A_UINT32 vdev_id)
 
 	WMA_LOGE("%s: vdev_id - %d", __func__, vdev_id);
 	/* remove all remote peers of SAP */
-	qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex);
-
-	temp = NULL;
-	TAILQ_FOREACH_REVERSE(peer, &vdev->peer_list, peer_list_t,
-			      peer_list_elem) {
-		if (temp) {
-			qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex);
-			if (qdf_atomic_read(&temp->delete_in_progress) == 0) {
-				wma_remove_peer(wma, temp->mac_addr.raw,
-						vdev_id, temp, false);
-			}
-			qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex);
-		}
-		/* self peer is deleted by caller */
-		if (peer == TAILQ_FIRST(&vdev->peer_list)) {
-			WMA_LOGE("%s: self peer removed by caller ", __func__);
-			break;
-		} else
-			temp = peer;
-	}
-
-	qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex);
+	ol_txrx_remove_peers_for_vdev(vdev,
+		(ol_txrx_vdev_peer_remove_cb)wma_remove_peer, wma, false);
 }
 
 #ifdef QCA_IBSS_SUPPORT
@@ -1258,9 +1232,12 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma,
 						uint8_t vdev_id)
 {
 	ol_txrx_vdev_handle vdev;
+	ol_txrx_pdev_handle pdev;
 	struct add_sta_self_params add_sta_self_param;
 	struct del_sta_self_params del_sta_param;
 	QDF_STATUS status;
+	struct cdf_mac_addr *mac_addr;
+	uint8_t *mac_addr_raw;
 
 	if (!wma) {
 		WMA_LOGE("%s: Null wma handle", __func__);
@@ -1273,9 +1250,16 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma,
 		return;
 	}
 
+	mac_addr = ol_txrx_get_vdev_struct_mac_addr(vdev);
+	if (mac_addr == NULL) {
+		WMA_LOGE("%s: mac_addr is NULL for vdev with id %d", __func__,
+			 vdev_id);
+		return;
+	}
+
 	qdf_copy_macaddr(
-		(struct qdf_mac_addr *) &(add_sta_self_param.self_mac_addr),
-		(struct qdf_mac_addr *) &(vdev->mac_addr));
+		(struct cdf_mac_addr *) &(add_sta_self_param.self_mac_addr),
+		mac_addr);
 	add_sta_self_param.session_id = vdev_id;
 	add_sta_self_param.type = WMI_VDEV_TYPE_IBSS;
 	add_sta_self_param.sub_type = 0;
@@ -1284,7 +1268,7 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma,
 	/* delete old ibss vdev */
 	del_sta_param.session_id = vdev_id;
 	qdf_mem_copy((void *)del_sta_param.self_mac_addr,
-		     (void *)&(vdev->mac_addr), QDF_MAC_ADDR_SIZE);
+		     (void *)mac_addr, CDF_MAC_ADDR_SIZE);
 	wma_vdev_detach(wma, &del_sta_param, 0);
 
 	/* create new vdev for ibss */
@@ -1294,19 +1278,22 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma,
 		return;
 	}
 
+	mac_addr_raw = ol_txrx_get_vdev_mac_addr(vdev);
 	/* Register with TxRx Module for Data Ack Complete Cb */
 	ol_txrx_data_tx_cb_set(vdev, wma_data_tx_ack_comp_hdlr, wma);
 	WMA_LOGA("new IBSS vdev created with mac %pM",
 		 add_sta_self_param.self_mac_addr);
 
+	pdev = ol_txrx_get_pdev_from_vdev(vdev);
+
 	/* create ibss bss peer */
-	status = wma_create_peer(wma, vdev->pdev, vdev, vdev->mac_addr.raw,
+	status = wma_create_peer(wma, pdev, vdev, mac_addr_raw,
 				 WMI_PEER_TYPE_DEFAULT, vdev_id, false);
 	if (status != QDF_STATUS_SUCCESS)
 		WMA_LOGE("%s: Failed to create IBSS bss peer", __func__);
 	else
 		WMA_LOGA("IBSS BSS peer created with mac %pM",
-			 vdev->mac_addr.raw);
+			 mac_addr_raw);
 }
 #else
 /**
@@ -2901,6 +2888,7 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
 	struct del_sta_self_params del_sta_param;
 	tSetBssKeyParams key_info;
 	struct sir_hw_mode_params hw_mode = {0};
+	struct cdf_mac_addr *mac_addr;
 
 	vdev = wma_find_vdev_by_addr(wma, add_bss->selfMacAddr, &vdev_id);
 	if (!vdev) {
@@ -2925,17 +2913,19 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
 			 __func__, vdev_id);
 
 		/* remove peers on the existing non-ibss vdev */
-		TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
-			WMA_LOGE("%s: peer found for vdev id %d. deleting the peer",
-				__func__, vdev_id);
-			wma_remove_peer(wma, (uint8_t *) &vdev->mac_addr,
-					vdev_id, peer, false);
+		ol_txrx_remove_peers_for_vdev_no_lock(vdev,
+			(ol_txrx_vdev_peer_remove_cb)wma_remove_peer, wma);
+		mac_addr = ol_txrx_get_vdev_struct_mac_addr(vdev);
+		if (mac_addr == NULL) {
+			WMA_LOGE("%s: mac_addr is NULL for vdev with id %d",
+				 __func__, vdev_id);
+			goto send_fail_resp;
 		}
 
 		/* remove the non-ibss vdev */
 		qdf_copy_macaddr(
-			(struct qdf_mac_addr *) &(del_sta_param.self_mac_addr),
-			(struct qdf_mac_addr *) &(vdev->mac_addr));
+			(struct cdf_mac_addr *) &(del_sta_param.self_mac_addr),
+			mac_addr);
 		del_sta_param.session_id = vdev_id;
 		del_sta_param.status = 0;
 
@@ -3473,7 +3463,7 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
 		goto send_rsp;
 	}
 
-	iface = &wma->interfaces[vdev->vdev_id];
+	iface = &wma->interfaces[add_sta->smesessionId];
 	peer = ol_txrx_find_peer_by_addr_and_vdev(pdev,
 						  vdev,
 						  add_sta->staMac, &peer_id);
@@ -3706,7 +3696,7 @@ static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta)
 
 		qdf_mem_zero(peerStateParams, sizeof(*peerStateParams));
 		peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING;
-		peerStateParams->vdevId = vdev->vdev_id;
+		peerStateParams->vdevId = add_sta->smesessionId;
 		qdf_mem_copy(&peerStateParams->peerMacAddr,
 			     &add_sta->staMac, sizeof(tSirMacAddr));
 		wma_update_tdls_peer_state(wma, peerStateParams);
@@ -3826,7 +3816,9 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
 		status = QDF_STATUS_E_FAILURE;
 		goto out;
 	}
-	if (peer != NULL && peer->state == OL_TXRX_PEER_STATE_DISC) {
+
+	if (peer != NULL &&
+	    (ol_txrx_get_peer_state(peer) == OL_TXRX_PEER_STATE_DISC)) {
 		/*
 		 * This is the case for reassociation.
 		 * peer state update and peer_assoc is required since it
@@ -4014,8 +4006,9 @@ static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
 				       tpDeleteStaParams del_sta)
 {
 	ol_txrx_pdev_handle pdev;
-	struct ol_txrx_peer_t *peer;
+	ol_txrx_peer_handle peer;
 	struct wma_target_req *msg;
+	uint8_t *peer_mac_addr;
 
 	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 
@@ -4032,8 +4025,9 @@ static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
 		del_sta->status = QDF_STATUS_E_FAILURE;
 		goto send_del_rsp;
 	}
+	peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer);
 
-	wma_remove_peer(wma, peer->mac_addr.raw, del_sta->smesessionId, peer,
+	wma_remove_peer(wma, peer_mac_addr, del_sta->smesessionId, peer,
 			false);
 	del_sta->status = QDF_STATUS_SUCCESS;
 
@@ -4080,34 +4074,8 @@ send_del_rsp:
  */
 static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
 {
-	ol_txrx_pdev_handle pdev;
-	ol_txrx_vdev_handle vdev;
-	struct ol_txrx_peer_t *peer;
 	tTdlsPeerStateParams *peerStateParams;
 
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-
-	if (NULL == pdev) {
-		WMA_LOGE("%s: Failed to find pdev", __func__);
-		del_sta->status = QDF_STATUS_E_FAILURE;
-		goto send_del_rsp;
-	}
-
-	vdev = wma_find_vdev_by_id(wma, del_sta->smesessionId);
-	if (!vdev) {
-		WMA_LOGE("%s: Failed to find vdev", __func__);
-		del_sta->status = QDF_STATUS_E_FAILURE;
-		goto send_del_rsp;
-	}
-
-	peer = ol_txrx_peer_find_by_local_id(pdev, del_sta->staIdx);
-	if (!peer) {
-		WMA_LOGE("%s: Failed to get peer handle using peer id %d",
-			 __func__, del_sta->staIdx);
-		del_sta->status = QDF_STATUS_E_FAILURE;
-		goto send_del_rsp;
-	}
-
 	peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
 	if (!peerStateParams) {
 		WMA_LOGE("%s: Failed to allocate memory for peerStateParams for: %pM",
@@ -4118,7 +4086,7 @@ static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
 
 	qdf_mem_zero(peerStateParams, sizeof(*peerStateParams));
 	peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN;
-	peerStateParams->vdevId = vdev->vdev_id;
+	peerStateParams->vdevId = del_sta->smesessionId;
 	qdf_mem_copy(&peerStateParams->peerMacAddr,
 		     &del_sta->staMac, sizeof(tSirMacAddr));
 
@@ -4322,9 +4290,9 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params)
 		wma->interfaces[params->smesessionId].psnr_req = NULL;
 	}
 
-	if (wlan_op_mode_ibss == txrx_vdev->opmode) {
+	if (wlan_op_mode_ibss == ol_txrx_get_opmode(txrx_vdev))
 		wma->ibss_started = 0;
-	}
+
 	if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
 		roam_synch_in_progress = true;
 		WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d",

+ 5 - 3
core/wma/src/wma_features.c

@@ -5468,7 +5468,8 @@ int wma_update_tdls_peer_state(WMA_HANDLE handle,
 	uint32_t i;
 	ol_txrx_pdev_handle pdev;
 	uint8_t peer_id;
-	struct ol_txrx_peer_t *peer;
+	ol_txrx_peer_handle peer;
+	uint8_t *peer_mac_addr;
 	int ret = 0;
 	uint32_t *ch_mhz;
 
@@ -5521,12 +5522,13 @@ int wma_update_tdls_peer_state(WMA_HANDLE handle,
 			ret = -EIO;
 			goto end_tdls_peer_state;
 		}
+		peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer);
 
 		WMA_LOGD("%s: calling wma_remove_peer for peer " MAC_ADDRESS_STR
 			 " vdevId: %d", __func__,
-			 MAC_ADDR_ARRAY(peer->mac_addr.raw),
+			 MAC_ADDR_ARRAY(peer_mac_addr),
 			 peerStateParams->vdevId);
-		wma_remove_peer(wma_handle, peer->mac_addr.raw,
+		wma_remove_peer(wma_handle, peer_mac_addr,
 				peerStateParams->vdevId, peer, false);
 	}
 

+ 38 - 24
core/wma/src/wma_mgmt.c

@@ -67,6 +67,11 @@
 #include "wma_internal.h"
 #include "cds_concurrency.h"
 #include "cdp_txrx_flow_ctrl_legacy.h"
+#include <cdp_txrx_peer_ops.h>
+#include <cdp_txrx_pmf.h>
+#include <cdp_txrx_cfg.h>
+#include <cdp_txrx_cmn.h>
+#include <cdp_txrx_misc.h>
 
 /**
  * wma_send_bcn_buf_ll() - prepare and send beacon buffer to fw for LL
@@ -1455,7 +1460,9 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	uint32_t i;
 	uint32_t def_key_idx = 0;
+	uint32_t wlan_opmode;
 	ol_txrx_vdev_handle txrx_vdev;
+	uint8_t *mac_addr;
 
 	WMA_LOGD("BSS key setup");
 	txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->smesessionId);
@@ -1464,13 +1471,14 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
 		key_info->status = QDF_STATUS_E_FAILURE;
 		goto out;
 	}
+	wlan_opmode = ol_txrx_get_opmode(txrx_vdev);
 
 	/*
 	 * For IBSS, WMI expects the BSS key to be set per peer key
 	 * So cache the BSS key in the wma_handle and re-use it when the
 	 * STA key is been setup for a peer
 	 */
-	if (wlan_op_mode_ibss == txrx_vdev->opmode) {
+	if (wlan_op_mode_ibss == wlan_opmode) {
 		key_info->status = QDF_STATUS_SUCCESS;
 		if (wma_handle->ibss_started > 0)
 			goto out;
@@ -1484,16 +1492,22 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
 	key_params.key_type = key_info->encType;
 	key_params.singl_tid_rc = key_info->singleTidRc;
 	key_params.unicast = false;
-	if (txrx_vdev->opmode == wlan_op_mode_sta) {
+	if (wlan_opmode == wlan_op_mode_sta) {
 		qdf_mem_copy(key_params.peer_mac,
 			wma_handle->interfaces[key_info->smesessionId].bssid,
 			IEEE80211_ADDR_LEN);
 	} else {
+		mac_addr = ol_txrx_get_vdev_mac_addr(txrx_vdev);
+		if (mac_addr == NULL) {
+			WMA_LOGE("%s: mac_addr is NULL for vdev with id %d",
+				 __func__, key_info->smesessionId);
+			goto out;
+		}
 		/* vdev mac address will be passed for all other modes */
-		qdf_mem_copy(key_params.peer_mac, txrx_vdev->mac_addr.raw,
+		qdf_mem_copy(key_params.peer_mac, mac_addr,
 			     IEEE80211_ADDR_LEN);
 		WMA_LOGA("BSS Key setup with vdev_mac %pM\n",
-			 txrx_vdev->mac_addr.raw);
+			 mac_addr);
 	}
 
 	if (key_info->numKeys == 0 &&
@@ -1530,7 +1544,7 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
 			 key_info->key[i].keyLength);
 
 		status = wma_setup_install_key_cmd(wma_handle, &key_params,
-						txrx_vdev->opmode);
+						   wlan_opmode);
 		if (status == QDF_STATUS_E_NOMEM) {
 			WMA_LOGE("%s:Failed to setup install key buf",
 				 __func__);
@@ -1608,18 +1622,17 @@ void wma_adjust_ibss_heart_beat_timer(tp_wma_handle wma,
 		return;
 	}
 
-	new_peer_num = vdev->ibss_peer_num + peer_num_delta;
-	if (new_peer_num > MAX_IBSS_PEERS || new_peer_num < 0) {
+	/* adjust peer numbers */
+	new_peer_num = ol_txrx_update_ibss_add_peer_num_of_vdev(vdev,
+								peer_num_delta);
+	if (OL_TXRX_INVALID_NUM_PEERS == new_peer_num) {
 		WMA_LOGE("new peer num %d out of valid boundary", new_peer_num);
 		return;
 	}
 
-	/* adjust peer numbers */
-	vdev->ibss_peer_num = new_peer_num;
-
 	/* reset timer value if all peers departed */
 	if (new_peer_num == 0) {
-		vdev->ibss_peer_heart_beat_timer = 0;
+		ol_txrx_set_ibss_vdev_heart_beat_timer(vdev, 0);
 		return;
 	}
 
@@ -1630,15 +1643,13 @@ void wma_adjust_ibss_heart_beat_timer(tp_wma_handle wma,
 			 new_timer_value_sec, new_peer_num);
 		return;
 	}
-	if (new_timer_value_sec == vdev->ibss_peer_heart_beat_timer) {
+	if (new_timer_value_sec ==
+	    ol_txrx_set_ibss_vdev_heart_beat_timer(vdev, new_timer_value_sec)) {
 		WMA_LOGD("timer value %d stays same, no need to notify target",
 			 new_timer_value_sec);
 		return;
 	}
 
-	/* send new timer value to target */
-	vdev->ibss_peer_heart_beat_timer = new_timer_value_sec;
-
 	new_timer_value_ms = ((uint32_t) new_timer_value_sec) * 1000;
 
 	status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
@@ -1671,6 +1682,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle,
 	uint32_t i;
 	uint32_t def_key_idx = 0;
 	ol_txrx_vdev_handle txrx_vdev;
+	int opmode;
 
 	WMA_LOGD("BSS key setup for peer");
 	txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->smesessionId);
@@ -1680,12 +1692,14 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle,
 		return;
 	}
 
+	qdf_mem_set(&key_params, sizeof(key_params), 0);
+	opmode = ol_txrx_get_opmode(txrx_vdev);
 	qdf_mem_set(&key_params, sizeof(key_params), 0);
 	key_params.vdev_id = key_info->smesessionId;
 	key_params.key_type = key_info->encType;
 	key_params.singl_tid_rc = key_info->singleTidRc;
 	key_params.unicast = false;
-	ASSERT(wlan_op_mode_ibss == txrx_vdev->opmode);
+	ASSERT(wlan_op_mode_ibss == opmode);
 
 	qdf_mem_copy(key_params.peer_mac, peer_macaddr.bytes,
 			IEEE80211_ADDR_LEN);
@@ -1719,7 +1733,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle,
 			 key_info->key[i].keyLength);
 
 		status = wma_setup_install_key_cmd(wma_handle, &key_params,
-						txrx_vdev->opmode);
+						   opmode);
 		if (status == QDF_STATUS_E_NOMEM) {
 			WMA_LOGE("%s:Failed to setup install key buf",
 				 __func__);
@@ -1747,10 +1761,11 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	ol_txrx_pdev_handle txrx_pdev;
 	ol_txrx_vdev_handle txrx_vdev;
-	struct ol_txrx_peer_t *peer;
+	ol_txrx_peer_handle peer;
 	uint8_t num_keys = 0, peer_id;
 	struct wma_set_key_params key_params;
 	uint32_t def_key_idx = 0;
+	int opmode;
 
 	WMA_LOGD("STA key setup");
 
@@ -1777,11 +1792,12 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
 		key_info->status = QDF_STATUS_E_FAILURE;
 		goto out;
 	}
+	opmode = ol_txrx_get_opmode(txrx_vdev);
 
 	if (key_info->defWEPIdx == WMA_INVALID_KEY_IDX &&
 	    (key_info->encType == eSIR_ED_WEP40 ||
 	     key_info->encType == eSIR_ED_WEP104) &&
-	    txrx_vdev->opmode != wlan_op_mode_ap) {
+	    opmode != wlan_op_mode_ap) {
 		wma_read_cfg_wepkey(wma_handle, key_info->key,
 				    &def_key_idx, &num_keys);
 		key_info->defWEPIdx = def_key_idx;
@@ -1828,7 +1844,7 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
 
 		key_params.key_len = key_info->key[i].keyLength;
 		status = wma_setup_install_key_cmd(wma_handle, &key_params,
-						txrx_vdev->opmode);
+						   opmode);
 		if (status == QDF_STATUS_E_NOMEM) {
 			WMA_LOGE("%s:Failed to setup install key buf",
 				 __func__);
@@ -1850,7 +1866,7 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
 	/* In IBSS mode, set the BSS KEY for this peer
 	 * BSS key is supposed to be cache into wma_handle
 	 */
-	if (wlan_op_mode_ibss == txrx_vdev->opmode) {
+	if (wlan_op_mode_ibss == opmode) {
 		wma_set_ibsskey_helper(wma_handle, &wma_handle->ibsskey_info,
 				       key_info->peer_macaddr);
 	}
@@ -2691,9 +2707,7 @@ wma_is_ccmp_pn_replay_attack(void *cds_ctx, struct ieee80211_frame *wh,
 	}
 
 	new_pn = wma_extract_ccmp_pn(ccmp_ptr);
-	last_pn_valid = &peer->last_rmf_pn_valid;
-	last_pn = &peer->last_rmf_pn;
-	rmf_pn_replays = &peer->rmf_pn_replays;
+	ol_txrx_get_pn_info(peer, &last_pn_valid, &last_pn, &rmf_pn_replays);
 
 	if (*last_pn_valid) {
 		if (new_pn > *last_pn) {

+ 15 - 10
core/wma/src/wma_ocb.c

@@ -34,6 +34,7 @@
 #include "wma_ocb.h"
 #include "wmi_unified_api.h"
 #include "cds_utils.h"
+#include <cdp_txrx_ocb.h>
 
 /**
  * wma_ocb_resp() - send the OCB set config response via callback
@@ -48,36 +49,40 @@ int wma_ocb_set_config_resp(tp_wma_handle wma_handle, uint8_t status)
 	struct sir_ocb_config *req = wma_handle->ocb_config_req;
 	ol_txrx_vdev_handle vdev = (req ?
 		wma_handle->interfaces[req->session_id].handle : NULL);
+	struct ol_txrx_ocb_set_chan ocb_set_chan;
 
 	/*
 	 * If the command was successful, save the channel information in the
 	 * vdev.
 	 */
 	if (status == QDF_STATUS_SUCCESS && vdev && req) {
-		if (vdev->ocb_channel_info)
-			qdf_mem_free(vdev->ocb_channel_info);
-		vdev->ocb_channel_count =
+		ocb_set_chan.ocb_channel_info = ol_txrx_get_ocb_chan_info(vdev);
+		if (ocb_set_chan.ocb_channel_info)
+			qdf_mem_free(ocb_set_chan.ocb_channel_info);
+		ocb_set_chan.ocb_channel_count =
 			req->channel_count;
 		if (req->channel_count) {
 			int i;
-			int buf_size = sizeof(*vdev->ocb_channel_info) *
+			int buf_size = sizeof(*ocb_set_chan.ocb_channel_info) *
 			    req->channel_count;
-			vdev->ocb_channel_info =
+			ocb_set_chan.ocb_channel_info =
 				qdf_mem_malloc(buf_size);
-			if (!vdev->ocb_channel_info)
+			if (!ocb_set_chan.ocb_channel_info)
 				return -ENOMEM;
-			qdf_mem_zero(vdev->ocb_channel_info, buf_size);
+			qdf_mem_zero(ocb_set_chan.ocb_channel_info, buf_size);
 			for (i = 0; i < req->channel_count; i++) {
-				vdev->ocb_channel_info[i].chan_freq =
+				ocb_set_chan.ocb_channel_info[i].chan_freq =
 					req->channels[i].chan_freq;
 				if (req->channels[i].flags &
 					OCB_CHANNEL_FLAG_DISABLE_RX_STATS_HDR)
-					vdev->ocb_channel_info[i].
+					ocb_set_chan.ocb_channel_info[i].
 					disable_rx_stats_hdr = 1;
 			}
 		} else {
-			vdev->ocb_channel_info = 0;
+			ocb_set_chan.ocb_channel_info = 0;
+			ocb_set_chan.ocb_channel_count = 0;
 		}
+		ol_txrx_set_ocb_chan_info(vdev, ocb_set_chan);
 	}
 
 	/* Free the configuration that was saved in wma_ocb_set_config. */

+ 6 - 4
core/wma/src/wma_scan_roam.c

@@ -44,6 +44,8 @@
 #include "wni_cfg.h"
 #include "cfg_api.h"
 #include "wlan_tgt_def_config.h"
+#include <cdp_txrx_peer_ops.h>
+#include <cdp_txrx_cfg.h>
 
 #include "qdf_nbuf.h"
 #include "qdf_types.h"
@@ -4911,10 +4913,10 @@ QDF_STATUS  wma_ipa_offload_enable_disable(tp_wma_handle wma,
 		struct sir_ipa_offload_enable_disable *ipa_offload)
 {
 	ol_txrx_vdev_handle vdev;
-	struct txrx_pdev_cfg_t *cfg;
 	int32_t intra_bss_fwd = 0;
 	struct ipa_offload_control_params params = {0};
 	QDF_STATUS status;
+	uint8_t rx_fwd_disabled;
 
 	if (!wma || !wma->wmi_handle) {
 		WMA_LOGE("%s: WMA is closed, can not issue  cmd",
@@ -4955,11 +4957,11 @@ QDF_STATUS  wma_ipa_offload_enable_disable(tp_wma_handle wma,
 		return QDF_STATUS_SUCCESS;
 
 	/* Disable Intra-BSS FWD offload when gDisableIntraBssFwd=1 in INI */
-	cfg = (struct txrx_pdev_cfg_t *)vdev->pdev->ctrl_pdev;
-	if (!ipa_offload->enable || cfg->rx_fwd_disabled) {
+	rx_fwd_disabled = ol_txrx_is_rx_fwd_disabled(vdev);
+	if (!ipa_offload->enable || rx_fwd_disabled) {
 		WMA_LOGE("%s: ipa_offload->enable=%d, rx_fwd_disabled=%d",
 				__func__,
-				ipa_offload->enable, cfg->rx_fwd_disabled);
+				ipa_offload->enable, rx_fwd_disabled);
 		intra_bss_fwd = 1;
 	}