qcacld-3.0: cdp: Converge cdp_cmn_ops

Currently cdp ops are given pdev/vdev/peer
handle as its arguments which is directly
accessed in those APIs. This can cause a
race-condition in access of the respective
handles if it has been deleted in parallel.

Hence as a part of cdp convergence, pass only
the pdev_id or vdev_id or peer mac address,
which will be used to get the respective handles,
and hence avoiding the unwanted access of the
handles if it has been deleted.

- txrx_data_tx_cb_set
- txrx_mgmt_tx_cb_set
- txrx_mgmt_send_ext
- txrx_pdev_attach_target
- txrx_pdev_detach
- txrx_vdev_attach
- txrx_vdev_register
- txrx_vdev_detach
- txrx_peer_create
- txrx_peer_delete
- txrx_peer_delete_sync
- txrx_fw_stats_get
- txrx_get_vdev_from_vdev_id
- txrx_pdev_set_ctrl_pdev
- txrx_pdev_attach
- txrx_get_vdev_mac_addr
- txrx_pdev_post_attach
- txrx_pdev_pre_detach
- txrx_get_ctrl_pdev_from_vdev
- txrx_get_mon_vdev_from_pdev

Change-Id: Ib8b0b1edd63e7c3f8813b11ca26b50ec121fe255
CRs-Fixed: 2541459
This commit is contained in:
Vevek Venkatesan
2019-10-03 04:14:29 +05:30
committed by nshrivas
parent f1cab52a92
commit 0ac759fc1c
27 changed files with 375 additions and 607 deletions

View File

@@ -74,7 +74,6 @@ static QDF_STATUS ocb_set_chan_info(void *dp_soc,
uint32_t vdev_id, uint32_t vdev_id,
struct ocb_config *config) struct ocb_config *config)
{ {
struct cdp_vdev *dp_vdev;
struct ol_txrx_ocb_set_chan ocb_set_chan; struct ol_txrx_ocb_set_chan ocb_set_chan;
struct ol_txrx_ocb_chan_info *ocb_channel_info; struct ol_txrx_ocb_chan_info *ocb_channel_info;
@@ -83,12 +82,6 @@ static QDF_STATUS ocb_set_chan_info(void *dp_soc,
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
dp_vdev = cdp_get_vdev_from_vdev_id(dp_soc, dp_pdev, vdev_id);
if (!dp_vdev) {
ocb_err("DP vdev handle is NULL");
return QDF_STATUS_E_FAILURE;
}
ocb_set_chan.ocb_channel_count = config->channel_count; ocb_set_chan.ocb_channel_count = config->channel_count;
/* release old settings */ /* release old settings */

View File

@@ -250,24 +250,6 @@ pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
QDF_STATUS QDF_STATUS
pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc); pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
/**
* pmo_register_get_vdev_dp_handle(): API to register get vdev datapath handle
* @psoc: objmgr psoc handle
* @handler: get vdev datapath handle callback
*
* Return QDF_STATUS status - in case of success else return error
*/
QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
pmo_get_vdev_dp_handle handler);
/**
* pmo_unregister_get_vdev_dp_handle(): API to unregister get vdev dp handle
* @psoc: objmgr psoc handle
*
* Return QDF_STATUS status - in case of success else return error
*/
QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc);
/** /**
* pmo_register_is_device_in_low_pwr_mode(): API to get register device power * pmo_register_is_device_in_low_pwr_mode(): API to get register device power
* save check notifier. * save check notifier.
@@ -401,19 +383,6 @@ pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
static inline QDF_STATUS
pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
pmo_get_vdev_dp_handle handler)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS
QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
{
return QDF_STATUS_SUCCESS;
}
static inline QDF_STATUS static inline QDF_STATUS
pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc, pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
pmo_is_device_in_low_pwr_mode handler) pmo_is_device_in_low_pwr_mode handler)

View File

@@ -740,47 +740,6 @@ pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc)
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
pmo_get_vdev_dp_handle handler)
{
struct pmo_psoc_priv_obj *psoc_ctx;
if (!psoc) {
QDF_BUG(psoc);
pmo_err("psoc is null");
return QDF_STATUS_E_NULL_VALUE;
}
if (!handler) {
QDF_BUG(handler);
pmo_err("pmo_get_vdev_dp_handle is null");
return QDF_STATUS_E_NULL_VALUE;
}
pmo_psoc_with_ctx(psoc, psoc_ctx) {
psoc_ctx->get_vdev_dp_handle = handler;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
{
struct pmo_psoc_priv_obj *psoc_ctx;
if (!psoc) {
QDF_BUG(psoc);
pmo_err("psoc is null");
return QDF_STATUS_E_NULL_VALUE;
}
pmo_psoc_with_ctx(psoc, psoc_ctx) {
psoc_ctx->get_vdev_dp_handle = NULL;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc, QDF_STATUS pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc,
pmo_get_dtim_period handler) pmo_get_dtim_period handler)
{ {

View File

@@ -327,8 +327,6 @@ QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc);
void *cds_get_context(QDF_MODULE_ID module_id); void *cds_get_context(QDF_MODULE_ID module_id);
uint8_t cds_get_datapath_handles(void **soc, struct cdp_pdev **pdev,
struct cdp_vdev **vdev, uint8_t sessionId);
void *cds_get_global_context(void); void *cds_get_global_context(void);
QDF_STATUS cds_alloc_context(QDF_MODULE_ID module_id, void **module_context, QDF_STATUS cds_alloc_context(QDF_MODULE_ID module_id, void **module_context,

View File

@@ -146,39 +146,6 @@ static void cds_recovery_work_deinit(void)
} }
} }
/** cds_get_datapath_handles - Initialize pdev, vdev and soc
* @soc - soc handle
* @vdev - virtual handle
* @pdev - physical handle
*/
uint8_t cds_get_datapath_handles(void **soc, struct cdp_pdev **pdev,
struct cdp_vdev **vdev, uint8_t sessionId)
{
(*soc) = cds_get_context(QDF_MODULE_ID_SOC);
if (!(*soc)) {
cds_err("soc handle is invalid");
return -EINVAL;
}
(*pdev) = cds_get_context(QDF_MODULE_ID_TXRX);
if (!(*pdev)) {
cds_err("pdev handle is invalid");
return -EINVAL;
}
(*vdev) = cdp_get_vdev_from_vdev_id((*soc), (*pdev),
sessionId);
if (!(*vdev)) {
cds_err("vdev handle is invalid");
return -EINVAL;
}
return 0;
}
static bool cds_is_drv_connected(void) static bool cds_is_drv_connected(void)
{ {
int ret; int ret;
@@ -705,12 +672,12 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
TARGET_TYPE_QCA6390 == hdd_ctx->target_type || TARGET_TYPE_QCA6390 == hdd_ctx->target_type ||
TARGET_TYPE_QCA6490 == hdd_ctx->target_type) TARGET_TYPE_QCA6490 == hdd_ctx->target_type)
gp_cds_context->dp_soc = cdp_soc_attach(LITHIUM_DP, gp_cds_context->dp_soc = cdp_soc_attach(LITHIUM_DP,
gp_cds_context->hif_context, psoc, gp_cds_context->hif_context, htcInfo.target_psoc,
gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx, gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx,
&dp_ol_if_ops); &dp_ol_if_ops);
else else
gp_cds_context->dp_soc = cdp_soc_attach(MOB_DRV_LEGACY_DP, gp_cds_context->dp_soc = cdp_soc_attach(MOB_DRV_LEGACY_DP,
gp_cds_context->hif_context, psoc, gp_cds_context->hif_context, htcInfo.target_psoc,
gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx, gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx,
&dp_ol_if_ops); &dp_ol_if_ops);
@@ -849,7 +816,7 @@ intr_close:
pdev_detach: pdev_detach:
cdp_pdev_detach(gp_cds_context->dp_soc, cdp_pdev_detach(gp_cds_context->dp_soc,
cds_get_context(QDF_MODULE_ID_TXRX), false); OL_TXRX_PDEV_ID, false);
close: close:
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
@@ -917,7 +884,7 @@ QDF_STATUS cds_pre_enable(void)
goto stop_wmi; goto stop_wmi;
} }
errno = cdp_pdev_post_attach(soc, gp_cds_context->pdev_txrx_ctx); errno = cdp_pdev_post_attach(soc, OL_TXRX_PDEV_ID);
if (errno) { if (errno) {
cds_err("Failed to attach pdev"); cds_err("Failed to attach pdev");
status = qdf_status_from_os_return(errno); status = qdf_status_from_os_return(errno);
@@ -998,7 +965,7 @@ QDF_STATUS cds_enable(struct wlan_objmgr_psoc *psoc)
} }
errno = cdp_pdev_attach_target(cds_get_context(QDF_MODULE_ID_SOC), errno = cdp_pdev_attach_target(cds_get_context(QDF_MODULE_ID_SOC),
cds_get_context(QDF_MODULE_ID_TXRX)); OL_TXRX_PDEV_ID);
if (errno) { if (errno) {
cds_err("Failed to attach pdev target; errno:%d", errno); cds_err("Failed to attach pdev target; errno:%d", errno);
goto err_soc_target_detach; goto err_soc_target_detach;
@@ -1121,7 +1088,6 @@ QDF_STATUS cds_post_disable(void)
{ {
tp_wma_handle wma_handle; tp_wma_handle wma_handle;
struct hif_opaque_softc *hif_ctx; struct hif_opaque_softc *hif_ctx;
struct cdp_pdev *txrx_pdev;
struct scheduler_ctx *sched_ctx; struct scheduler_ctx *sched_ctx;
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
@@ -1137,12 +1103,6 @@ QDF_STATUS cds_post_disable(void)
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!txrx_pdev) {
cds_err("Failed to get txrx pdev!");
return QDF_STATUS_E_INVAL;
}
/* flush any unprocessed scheduler messages */ /* flush any unprocessed scheduler messages */
sched_ctx = scheduler_get_context(); sched_ctx = scheduler_get_context();
if (sched_ctx) if (sched_ctx)
@@ -1175,7 +1135,7 @@ QDF_STATUS cds_post_disable(void)
} }
cdp_pdev_pre_detach(cds_get_context(QDF_MODULE_ID_SOC), cdp_pdev_pre_detach(cds_get_context(QDF_MODULE_ID_SOC),
(struct cdp_pdev *)txrx_pdev, 1); OL_TXRX_PDEV_ID, 1);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -1278,8 +1238,7 @@ QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc)
dp_txrx_deinit(cds_get_context(QDF_MODULE_ID_SOC)); dp_txrx_deinit(cds_get_context(QDF_MODULE_ID_SOC));
cdp_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC), cdp_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC), OL_TXRX_PDEV_ID, 1);
(struct cdp_pdev *)ctx, 1);
cds_set_context(QDF_MODULE_ID_TXRX, NULL); cds_set_context(QDF_MODULE_ID_TXRX, NULL);
ucfg_pmo_psoc_set_txrx_pdev_id(psoc, OL_TXRX_INVALID_PDEV_ID); ucfg_pmo_psoc_set_txrx_pdev_id(psoc, OL_TXRX_INVALID_PDEV_ID);

View File

@@ -54,11 +54,12 @@
* to the target has to be done in the separate pdev_attach_target call * to the target has to be done in the separate pdev_attach_target call
* that is invoked after HTC setup is complete. * that is invoked after HTC setup is complete.
* *
* @param pdev - txrx_pdev handle * @param soc - datapath soc handle
* @param pdev_id - physical device instance id
* @return 0 for success or error code * @return 0 for success or error code
*/ */
int int
ol_txrx_pdev_post_attach(struct cdp_pdev *pdev); ol_txrx_pdev_post_attach(struct cdp_soc_t *soc, uint8_t pdev_id);
/** /**
* @brief Parameter type to be input to ol_txrx_peer_update * @brief Parameter type to be input to ol_txrx_peer_update
@@ -280,14 +281,15 @@ void ol_txrx_tx_sync(ol_txrx_pdev_handle data_pdev, uint8_t sync_cnt);
* when transmission completes. Rather, these specially-marked frames * when transmission completes. Rather, these specially-marked frames
* are provided to the callback registered with this function. * are provided to the callback registered with this function.
* *
* @param data_vdev - which vdev the callback is being registered with * @param soc - datapath soc handle
* @param vdev_id - id of which vdev the callback is being registered with
* (Currently the callback is stored in the pdev rather than the vdev.) * (Currently the callback is stored in the pdev rather than the vdev.)
* @param callback - the function to call when tx frames marked as "no free" * @param callback - the function to call when tx frames marked as "no free"
* are done being transmitted * are done being transmitted
* @param ctxt - the context argument provided to the callback function * @param ctxt - the context argument provided to the callback function
*/ */
void void
ol_txrx_data_tx_cb_set(struct cdp_vdev *data_vdev, ol_txrx_data_tx_cb_set(struct cdp_soc_t *soc, uint8_t vdev_id,
ol_txrx_data_tx_cb callback, void *ctxt); ol_txrx_data_tx_cb callback, void *ctxt);
/** /**

View File

@@ -129,41 +129,59 @@ qdf_nbuf_t ol_tx_send_ipa_data_frame(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
#endif #endif
void void
ol_txrx_data_tx_cb_set(struct cdp_vdev *pvdev, ol_txrx_data_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
ol_txrx_data_tx_cb callback, void *ctxt) ol_txrx_data_tx_cb callback, void *ctxt)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = vdev->pdev; ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
struct ol_txrx_pdev_t *pdev;
if (!vdev || !vdev->pdev)
return;
pdev = vdev->pdev;
pdev->tx_data_callback.func = callback; pdev->tx_data_callback.func = callback;
pdev->tx_data_callback.ctxt = ctxt; pdev->tx_data_callback.ctxt = ctxt;
} }
void QDF_STATUS
ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev, uint8_t type, ol_txrx_mgmt_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, uint8_t type,
ol_txrx_mgmt_tx_cb download_cb, ol_txrx_mgmt_tx_cb download_cb,
ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt) ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt)
{ {
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
pdev_id);
if (!pdev)
return QDF_STATUS_E_FAILURE;
TXRX_ASSERT1(type < OL_TXRX_MGMT_NUM_TYPES); TXRX_ASSERT1(type < OL_TXRX_MGMT_NUM_TYPES);
pdev->tx_mgmt_cb.download_cb = download_cb; pdev->tx_mgmt_cb.download_cb = download_cb;
pdev->tx_mgmt_cb.ota_ack_cb = ota_ack_cb; pdev->tx_mgmt_cb.ota_ack_cb = ota_ack_cb;
pdev->tx_mgmt_cb.ctxt = ctxt; pdev->tx_mgmt_cb.ctxt = ctxt;
return QDF_STATUS_SUCCESS;
} }
int int
ol_txrx_mgmt_send_ext(struct cdp_vdev *pvdev, ol_txrx_mgmt_send_ext(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
qdf_nbuf_t tx_mgmt_frm, qdf_nbuf_t tx_mgmt_frm, uint8_t type,
uint8_t type, uint8_t use_6mbps, uint16_t chanfreq) uint8_t use_6mbps, uint16_t chanfreq)
{ {
struct ol_txrx_vdev_t *vdev = struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
(struct ol_txrx_vdev_t *)pvdev; ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
struct ol_txrx_pdev_t *pdev = vdev->pdev; vdev_id);
struct ol_txrx_pdev_t *pdev;
struct ol_tx_desc_t *tx_desc; struct ol_tx_desc_t *tx_desc;
struct ol_txrx_msdu_info_t tx_msdu_info; struct ol_txrx_msdu_info_t tx_msdu_info;
int result = 0; int result = 0;
if (!vdev || !vdev->pdev)
return QDF_STATUS_E_FAULT;
pdev = vdev->pdev;
tx_msdu_info.tso_info.is_tso = 0; tx_msdu_info.tso_info.is_tso = 0;
tx_msdu_info.htt.action.use_6mbps = use_6mbps; tx_msdu_info.htt.action.use_6mbps = use_6mbps;

View File

@@ -208,7 +208,8 @@ void ol_txrx_mgmt_tx_complete(void *ctxt, qdf_nbuf_t netbuf, int err);
/** /**
* ol_txrx_mgmt_tx_cb_set() - Store a callback for delivery * ol_txrx_mgmt_tx_cb_set() - Store a callback for delivery
* notifications for management frames. * notifications for management frames.
* @ppdev: the data physical device object * @soc: Datapath soc handle
* @pdev_id: Physical device instance id
* @type: the type of mgmt frame the callback is used for * @type: the type of mgmt frame the callback is used for
* @download_cb: the callback for notification of delivery to the target * @download_cb: the callback for notification of delivery to the target
* @ota_ack_cb: the callback for notification of delivery to the peer * @ota_ack_cb: the callback for notification of delivery to the peer
@@ -224,14 +225,15 @@ void ol_txrx_mgmt_tx_complete(void *ctxt, qdf_nbuf_t netbuf, int err);
* This function is used by the control SW to store a callback pointer * This function is used by the control SW to store a callback pointer
* for a given type of management frame. * for a given type of management frame.
*/ */
void QDF_STATUS
ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev, uint8_t type, ol_txrx_mgmt_tx_cb_set(struct cdp_soc_t *soc, uint8_t pdev_id, uint8_t type,
ol_txrx_mgmt_tx_cb download_cb, ol_txrx_mgmt_tx_cb download_cb,
ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt); ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt);
/** /**
* ol_txrx_mgmt_send_ext() - Transmit a management frame * ol_txrx_mgmt_send_ext() - Transmit a management frame
* @pvdev: virtual device transmitting the frame * @soc: Datapath soc handle
* @vdev_id: virtual interface id
* @tx_mgmt_frm: management frame to transmit * @tx_mgmt_frm: management frame to transmit
* @type: the type of management frame (determines what callback to use) * @type: the type of management frame (determines what callback to use)
* @use_6mbps: specify whether management frame to transmit should * @use_6mbps: specify whether management frame to transmit should
@@ -247,7 +249,7 @@ ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev, uint8_t type,
* 1 - the frame was not accepted * 1 - the frame was not accepted
*/ */
int int
ol_txrx_mgmt_send_ext(struct cdp_vdev *pvdev, ol_txrx_mgmt_send_ext(struct cdp_soc_t *soc, uint8_t vdev_id,
qdf_nbuf_t tx_mgmt_frm, qdf_nbuf_t tx_mgmt_frm,
uint8_t type, uint8_t use_6mbps, uint16_t chanfreq); uint8_t type, uint8_t use_6mbps, uint16_t chanfreq);

View File

@@ -673,6 +673,9 @@ void ol_txrx_vdev_flush(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
return; return;
} }
if (!vdev)
return;
ol_tx_queue_vdev_flush(vdev->pdev, vdev); ol_tx_queue_vdev_flush(vdev->pdev, vdev);
} }

View File

@@ -76,6 +76,7 @@
#include "epping_main.h" #include "epping_main.h"
#include <a_types.h> #include <a_types.h>
#include <cdp_txrx_handle.h> #include <cdp_txrx_handle.h>
#include <cdp_txrx_cmn_reg.h>
#include "wlan_qct_sys.h" #include "wlan_qct_sys.h"
#include <htt_internal.h> #include <htt_internal.h>
@@ -107,8 +108,8 @@ enum dpt_set_param_debugfs {
QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *pdev, QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *pdev,
uint8_t *peer_mac, uint8_t *peer_mac,
enum ol_txrx_peer_state state); enum ol_txrx_peer_state state);
static void ol_vdev_rx_set_intrabss_fwd(struct cdp_vdev *vdev, static void ol_vdev_rx_set_intrabss_fwd(struct cdp_soc_t *soc_hdl,
bool val); uint8_t vdev_id, bool val);
int ol_txrx_get_tx_pending(struct cdp_pdev *pdev_handle); int ol_txrx_get_tx_pending(struct cdp_pdev *pdev_handle);
extern void extern void
ol_txrx_set_wmm_param(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, ol_txrx_set_wmm_param(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
@@ -673,7 +674,7 @@ static inline void ol_txrx_debugfs_exit(ol_txrx_pdev_handle pdev)
/** /**
* ol_txrx_pdev_attach() - allocate txrx pdev * ol_txrx_pdev_attach() - allocate txrx pdev
* @soc: datapath soc handle * @soc_hdl: datapath soc handle
* @htc_pdev: HTC pdev * @htc_pdev: HTC pdev
* @osdev: os dev * @osdev: os dev
* @pdev_id: pdev identifier for pdev attach * @pdev_id: pdev identifier for pdev attach
@@ -898,26 +899,28 @@ static inline void ol_txrx_pdev_set_threshold(struct ol_txrx_pdev_t *pdev)
/** /**
* ol_txrx_pdev_post_attach() - attach txrx pdev * ol_txrx_pdev_post_attach() - attach txrx pdev
* @pdev: txrx pdev * @soc_hdl: datapath soc handle
* @pdev_id: physical device instance id
* *
* Return: 0 for success * Return: 0 for success
*/ */
int int
ol_txrx_pdev_post_attach(struct cdp_pdev *ppdev) ol_txrx_pdev_post_attach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
{ {
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
uint16_t i; uint16_t i;
uint16_t fail_idx = 0; uint16_t fail_idx = 0;
int ret = 0; int ret = 0;
uint16_t desc_pool_size; uint16_t desc_pool_size;
struct hif_opaque_softc *osc = cds_get_context(QDF_MODULE_ID_HIF); struct hif_opaque_softc *osc = cds_get_context(QDF_MODULE_ID_HIF);
struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(soc, pdev_id);
uint16_t desc_element_size = sizeof(union ol_tx_desc_list_elem_t); uint16_t desc_element_size = sizeof(union ol_tx_desc_list_elem_t);
union ol_tx_desc_list_elem_t *c_element; union ol_tx_desc_list_elem_t *c_element;
unsigned int sig_bit; unsigned int sig_bit;
uint16_t desc_per_page; uint16_t desc_per_page;
if (!osc) { if (!osc || !pdev) {
ret = -EINVAL; ret = -EINVAL;
goto ol_attach_fail; goto ol_attach_fail;
} }
@@ -1382,7 +1385,8 @@ ol_attach_fail:
/** /**
* ol_txrx_pdev_attach_target() - send target configuration * ol_txrx_pdev_attach_target() - send target configuration
* *
* @pdev - the physical device being initialized * @soc_hdl - data path soc handle
* @pdev_id - device instance id
* *
* The majority of the data SW setup are done by the pdev_attach * The majority of the data SW setup are done by the pdev_attach
* functions, but this function completes the data SW setup by * functions, but this function completes the data SW setup by
@@ -1390,9 +1394,14 @@ ol_attach_fail:
* *
* Return: 0 - success 1 - failure * Return: 0 - success 1 - failure
*/ */
static int ol_txrx_pdev_attach_target(struct cdp_pdev *ppdev) static int ol_txrx_pdev_attach_target(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id)
{ {
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(soc, pdev_id);
if (!pdev)
return QDF_STATUS_E_FAULT;
return htt_attach_target(pdev->htt_pdev) == QDF_STATUS_SUCCESS ? 0:1; return htt_attach_target(pdev->htt_pdev) == QDF_STATUS_SUCCESS ? 0:1;
} }
@@ -1443,7 +1452,8 @@ static void ol_tx_free_descs_inuse(ol_txrx_pdev_handle pdev)
/** /**
* ol_txrx_pdev_pre_detach() - detach the data SW state * ol_txrx_pdev_pre_detach() - detach the data SW state
* @pdev - the data physical device object being removed * @soc_hdl - datapath soc handle
* @pdev_id - the data physical device id being removed
* @force - delete the pdev (and its vdevs and peers) even if * @force - delete the pdev (and its vdevs and peers) even if
* there are outstanding references by the target to the vdevs * there are outstanding references by the target to the vdevs
* and peers within the pdev * and peers within the pdev
@@ -1451,11 +1461,14 @@ static void ol_tx_free_descs_inuse(ol_txrx_pdev_handle pdev)
* This function is used when the WLAN driver is being removed to * This function is used when the WLAN driver is being removed to
* detach the host data component within the driver. * detach the host data component within the driver.
* *
* Return: None * Return: none
*/ */
static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force) static void ol_txrx_pdev_pre_detach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
int force)
{ {
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
pdev_id);
/* preconditions */ /* preconditions */
TXRX_ASSERT2(pdev); TXRX_ASSERT2(pdev);
@@ -1547,11 +1560,14 @@ static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force)
#ifdef QCA_COMPUTE_TX_DELAY #ifdef QCA_COMPUTE_TX_DELAY
qdf_spinlock_destroy(&pdev->tx_delay.mutex); qdf_spinlock_destroy(&pdev->tx_delay.mutex);
#endif #endif
return;
} }
/** /**
* ol_txrx_pdev_detach() - delete the data SW state * ol_txrx_pdev_detach() - delete the data SW state
* @ppdev - the data physical device object being removed * @soc_hdl - data path soc handle
* @pdev_id - device instance id
* @force - delete the pdev (and its vdevs and peers) even if * @force - delete the pdev (and its vdevs and peers) even if
* there are outstanding references by the target to the vdevs * there are outstanding references by the target to the vdevs
* and peers within the pdev * and peers within the pdev
@@ -1561,24 +1577,26 @@ static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force)
* All virtual devices within the physical device need to be deleted * All virtual devices within the physical device need to be deleted
* (ol_txrx_vdev_detach) before the physical device itself is deleted. * (ol_txrx_vdev_detach) before the physical device itself is deleted.
* *
* Return: None * Return: Success or Failure
*/ */
static void ol_txrx_pdev_detach(struct cdp_pdev *ppdev, int force) static QDF_STATUS ol_txrx_pdev_detach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
int force)
{ {
struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC); struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
pdev_id);
struct ol_txrx_stats_req_internal *req, *temp_req; struct ol_txrx_stats_req_internal *req, *temp_req;
int i = 0; int i = 0;
if (!soc) { if (!soc) {
ol_txrx_err("soc is NULL"); ol_txrx_err("soc is NULL");
return; return QDF_STATUS_E_FAILURE;
} }
/*checking to ensure txrx pdev structure is not NULL */ /*checking to ensure txrx pdev structure is not NULL */
if (!pdev) { if (!pdev) {
ol_txrx_err("pdev is NULL"); ol_txrx_err("pdev is NULL");
return; return QDF_STATUS_E_FAILURE;
} }
qdf_spin_lock_bh(&pdev->req_list_spinlock); qdf_spin_lock_bh(&pdev->req_list_spinlock);
@@ -1625,6 +1643,8 @@ static void ol_txrx_pdev_detach(struct cdp_pdev *ppdev, int force)
soc->pdev_list[pdev->id] = NULL; soc->pdev_list[pdev->id] = NULL;
qdf_mem_free(pdev); qdf_mem_free(pdev);
return QDF_STATUS_SUCCESS;
} }
#if defined(QCA_HL_NETDEV_FLOW_CONTROL) #if defined(QCA_HL_NETDEV_FLOW_CONTROL)
@@ -1657,7 +1677,8 @@ ol_txrx_vdev_per_vdev_tx_desc_init(struct ol_txrx_vdev_t *vdev)
* ol_txrx_vdev_attach - Allocate and initialize the data object * ol_txrx_vdev_attach - Allocate and initialize the data object
* for a new virtual device. * for a new virtual device.
* *
* @data_pdev - the physical device the virtual device belongs to * @@soc_hdl - data path soc handle
* @pdev_id - physical device instance id
* @vdev_mac_addr - the MAC address of the virtual device * @vdev_mac_addr - the MAC address of the virtual device
* @vdev_id - the ID used to identify the virtual device to the target * @vdev_id - the ID used to identify the virtual device to the target
* @op_mode - whether this virtual device is operating as an AP, * @op_mode - whether this virtual device is operating as an AP,
@@ -1667,13 +1688,15 @@ ol_txrx_vdev_per_vdev_tx_desc_init(struct ol_txrx_vdev_t *vdev)
* Return: success: handle to new data vdev object, failure: NULL * Return: success: handle to new data vdev object, failure: NULL
*/ */
static struct cdp_vdev * static struct cdp_vdev *
ol_txrx_vdev_attach(struct cdp_pdev *ppdev, ol_txrx_vdev_attach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
uint8_t *vdev_mac_addr, uint8_t *vdev_mac_addr,
uint8_t vdev_id, enum wlan_op_mode op_mode, uint8_t vdev_id, enum wlan_op_mode op_mode,
enum wlan_op_subtype subtype) enum wlan_op_subtype subtype)
{ {
struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC); struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
pdev_id);
struct ol_txrx_vdev_t *vdev; struct ol_txrx_vdev_t *vdev;
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
@@ -1711,8 +1734,7 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
TAILQ_INIT(&vdev->peer_list); TAILQ_INIT(&vdev->peer_list);
vdev->last_real_peer = NULL; vdev->last_real_peer = NULL;
ol_txrx_hl_tdls_flag_reset(ol_txrx_soc_t_to_cdp_soc_t(soc), ol_txrx_hl_tdls_flag_reset(soc_hdl, vdev_id, false);
vdev_id, false);
#ifdef QCA_IBSS_SUPPORT #ifdef QCA_IBSS_SUPPORT
vdev->ibss_peer_num = 0; vdev->ibss_peer_num = 0;
@@ -1787,7 +1809,8 @@ 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. * matching OS shim vdev object.
* *
* @pvdev: the virtual device's data object * @soc_hdl: datapath soc handle
* @vdev_id: the virtual device's id
* @osif_vdev: the virtual device's OS shim object * @osif_vdev: the virtual device's OS shim object
* @txrx_ops: (pointers to)functions used for tx and rx data xfer * @txrx_ops: (pointers to)functions used for tx and rx data xfer
* *
@@ -1802,15 +1825,19 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
* vdev objects, so the data SW can use the OS shim vdev handle * vdev objects, so the data SW can use the OS shim vdev handle
* when passing rx data received by a vdev up to the OS shim. * 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, static QDF_STATUS ol_txrx_vdev_register(struct cdp_soc_t *soc_hdl,
uint8_t vdev_id,
ol_osif_vdev_handle osif_vdev,
struct ol_txrx_ops *txrx_ops) struct ol_txrx_ops *txrx_ops)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
if (qdf_unlikely(!vdev) || qdf_unlikely(!txrx_ops)) { if (qdf_unlikely(!vdev) || qdf_unlikely(!txrx_ops)) {
qdf_print("vdev/txrx_ops is NULL!"); qdf_print("vdev/txrx_ops is NULL!");
qdf_assert(0); qdf_assert(0);
return; return QDF_STATUS_E_FAILURE;
} }
vdev->osif_dev = osif_vdev; vdev->osif_dev = osif_vdev;
@@ -1818,6 +1845,8 @@ static void ol_txrx_vdev_register(struct cdp_vdev *pvdev, void *osif_vdev,
vdev->stats_rx = txrx_ops->rx.stats_rx; vdev->stats_rx = txrx_ops->rx.stats_rx;
vdev->tx_comp = txrx_ops->tx.tx_comp; vdev->tx_comp = txrx_ops->tx.tx_comp;
txrx_ops->tx.tx = ol_tx_data; txrx_ops->tx.tx = ol_tx_data;
return QDF_STATUS_SUCCESS;
} }
void ol_txrx_set_safemode(ol_txrx_vdev_handle vdev, uint32_t val) void ol_txrx_set_safemode(ol_txrx_vdev_handle vdev, uint32_t val)
@@ -1903,7 +1932,8 @@ ol_txrx_tx_desc_reset_vdev(ol_txrx_vdev_handle vdev)
/** /**
* ol_txrx_vdev_detach - Deallocate the specified data virtual * ol_txrx_vdev_detach - Deallocate the specified data virtual
* device object. * device object.
* @data_vdev: data object for the virtual device in question * @soc_hdl - data path soc handle
* @vdev_id: vdev id
* @callback: function to call (if non-NULL) once the vdev has * @callback: function to call (if non-NULL) once the vdev has
* been wholly deleted * been wholly deleted
* @callback_context: context to provide in the callback * @callback_context: context to provide in the callback
@@ -1923,13 +1953,18 @@ ol_txrx_tx_desc_reset_vdev(ol_txrx_vdev_handle vdev)
* vdev_detach call, or if it's deferred until all in-progress peer * vdev_detach call, or if it's deferred until all in-progress peer
* deletions have completed. * deletions have completed.
*/ */
static void static QDF_STATUS
ol_txrx_vdev_detach(struct cdp_vdev *pvdev, ol_txrx_vdev_detach(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
ol_txrx_vdev_delete_cb callback, void *context) ol_txrx_vdev_delete_cb callback, void *context)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
struct ol_txrx_pdev_t *pdev; struct ol_txrx_pdev_t *pdev;
if (qdf_unlikely(!vdev))
return QDF_STATUS_E_FAILURE;
/* preconditions */ /* preconditions */
TXRX_ASSERT2(vdev); TXRX_ASSERT2(vdev);
pdev = vdev->pdev; pdev = vdev->pdev;
@@ -1988,7 +2023,7 @@ ol_txrx_vdev_detach(struct cdp_vdev *pvdev,
vdev->delete.callback = callback; vdev->delete.callback = callback;
vdev->delete.context = context; vdev->delete.context = context;
qdf_spin_unlock_bh(&pdev->peer_ref_mutex); qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
return; return QDF_STATUS_E_FAILURE;
} }
qdf_spin_unlock_bh(&pdev->peer_ref_mutex); qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
qdf_event_destroy(&vdev->wait_delete_comp); qdf_event_destroy(&vdev->wait_delete_comp);
@@ -2020,6 +2055,8 @@ ol_txrx_vdev_detach(struct cdp_vdev *pvdev,
qdf_mem_free(vdev); qdf_mem_free(vdev);
if (callback) if (callback)
callback(context); callback(context);
return QDF_STATUS_SUCCESS;
} }
/** /**
@@ -2128,8 +2165,8 @@ static void ol_txrx_dump_peer_access_list(ol_txrx_peer_handle peer)
/** /**
* ol_txrx_peer_attach - Allocate and set up references for a * ol_txrx_peer_attach - Allocate and set up references for a
* data peer object. * data peer object.
* @pvdev - data virtual device object that will directly * @soc_hdl - data path soc handle
* own the data_peer object * @vdev_id - virtual device instance id
* @peer_mac_addr - MAC address of the new peer * @peer_mac_addr - MAC address of the new peer
* *
* When an association with a peer starts, the host's control SW * When an association with a peer starts, the host's control SW
@@ -2143,13 +2180,15 @@ static void ol_txrx_dump_peer_access_list(ol_txrx_peer_handle peer)
* so a reference within the control peer object can be set to the * so a reference within the control peer object can be set to the
* data peer object. * data peer object.
* *
* Return: handle to new data peer object, or NULL if the attach * Return: 0 on success, -1 on failure
* fails
*/ */
static void * static void *
ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr) ol_txrx_peer_attach(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
uint8_t *peer_mac_addr)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
struct ol_txrx_peer_t *peer; struct ol_txrx_peer_t *peer;
struct ol_txrx_peer_t *temp_peer; struct ol_txrx_peer_t *temp_peer;
uint8_t i; uint8_t i;
@@ -2237,7 +2276,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
peer = qdf_mem_malloc(sizeof(*peer)); peer = qdf_mem_malloc(sizeof(*peer));
if (!peer) if (!peer)
return NULL; /* failure */ return NULL;
/* store provided params */ /* store provided params */
peer->vdev = vdev; peer->vdev = vdev;
@@ -2323,7 +2362,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
* No Tx in monitor mode, otherwise results in target assert. * No Tx in monitor mode, otherwise results in target assert.
* Setting disable_intrabss_fwd to true * Setting disable_intrabss_fwd to true
*/ */
ol_vdev_rx_set_intrabss_fwd((struct cdp_vdev *)vdev, true); ol_vdev_rx_set_intrabss_fwd(soc_hdl, vdev_id, true);
} }
ol_txrx_local_peer_id_alloc(pdev, peer); ol_txrx_local_peer_id_alloc(pdev, peer);
@@ -2475,14 +2514,17 @@ static struct cdp_vdev *ol_txrx_get_vdev_for_peer(void *ppeer)
/** /**
* ol_txrx_get_vdev_mac_addr() - Return mac addr of vdev * ol_txrx_get_vdev_mac_addr() - Return mac addr of vdev
* @vdev: vdev handle * @soc_hdl: datapath soc handle
x @vdev_id: virtual interface id
* *
* Return: vdev mac address * Return: vdev mac address
*/ */
static uint8_t * static uint8_t *
ol_txrx_get_vdev_mac_addr(struct cdp_vdev *pvdev) ol_txrx_get_vdev_mac_addr(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
if (!vdev) if (!vdev)
return NULL; return NULL;
@@ -2520,14 +2562,20 @@ ol_txrx_pdev_handle ol_txrx_get_pdev_from_vdev(ol_txrx_vdev_handle vdev)
/** /**
* ol_txrx_get_ctrl_pdev_from_vdev() - Return control pdev of vdev * ol_txrx_get_ctrl_pdev_from_vdev() - Return control pdev of vdev
* @vdev: vdev handle * @soc_hdl: datapath soc handle
* @vdev_id: virtual interface id
* *
* Return: Handle to control pdev * Return: Handle to control pdev
*/ */
static struct cdp_cfg * static struct cdp_cfg *
ol_txrx_get_ctrl_pdev_from_vdev(struct cdp_vdev *pvdev) ol_txrx_get_ctrl_pdev_from_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
if (!vdev)
return NULL;
return vdev->pdev->ctrl_pdev; return vdev->pdev->ctrl_pdev;
} }
@@ -3274,20 +3322,36 @@ void peer_unmap_timer_handler(void *data)
/** /**
* ol_txrx_peer_detach() - Delete a peer's data object. * ol_txrx_peer_detach() - Delete a peer's data object.
* @peer - the object to detach
* @soc_hdl: datapath soc handle
* @vdev_id: virtual interface id
* @peer_mac: peer MAC address
* @bitmap - bitmap indicating special handling of request. * @bitmap - bitmap indicating special handling of request.
*
* When the host's control SW disassociates a peer, it calls * When the host's control SW disassociates a peer, it calls
* this function to detach and delete the peer. The reference * this function to detach and delete the peer. The reference
* stored in the control peer object to the data peer * stored in the control peer object to the data peer
* object (set up by a call to ol_peer_store()) is provided. * object (set up by a call to ol_peer_store()) is provided.
* *
* Return: None * Return: SUCCESS or Failure
*/ */
static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap) static QDF_STATUS ol_txrx_peer_detach(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
uint8_t *peer_mac, uint32_t bitmap)
{ {
ol_txrx_peer_handle peer = ppeer; ol_txrx_peer_handle peer;
struct ol_txrx_vdev_t *vdev = peer->vdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
if (!vdev)
return QDF_STATUS_E_FAILURE;
peer = ol_txrx_find_peer_by_addr((struct cdp_pdev *)vdev->pdev,
peer_mac);
if (!peer)
return QDF_STATUS_E_FAILURE;
ol_txrx_info_high("%s peer %pK, peer->ref_cnt %d", __func__,
peer, qdf_atomic_read(&peer->ref_cnt));
/* redirect peer's rx delivery function to point to a discard func */ /* redirect peer's rx delivery function to point to a discard func */
peer->rx_opt_proc = ol_rx_discard; peer->rx_opt_proc = ol_rx_discard;
@@ -3342,6 +3406,8 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
* reference, added by the PEER_MAP message. * reference, added by the PEER_MAP message.
*/ */
ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_PEER_ATTACH); ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_PEER_ATTACH);
return QDF_STATUS_SUCCESS;
} }
/** /**
@@ -3357,6 +3423,7 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
*/ */
static void ol_txrx_peer_detach_force_delete(void *ppeer) static void ol_txrx_peer_detach_force_delete(void *ppeer)
{ {
struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC);
ol_txrx_peer_handle peer = ppeer; ol_txrx_peer_handle peer = ppeer;
ol_txrx_pdev_handle pdev = peer->vdev->pdev; ol_txrx_pdev_handle pdev = peer->vdev->pdev;
@@ -3365,7 +3432,9 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer)
/* Clear the peer_id_to_obj map entries */ /* Clear the peer_id_to_obj map entries */
ol_txrx_peer_remove_obj_map_entries(pdev, peer); ol_txrx_peer_remove_obj_map_entries(pdev, peer);
ol_txrx_peer_detach(peer, 1 << CDP_PEER_DELETE_NO_SPECIAL); ol_txrx_peer_detach((struct cdp_soc_t *)soc, peer->vdev->vdev_id,
peer->mac_addr.raw,
1 << CDP_PEER_DELETE_NO_SPECIAL);
} }
/** /**
@@ -3376,34 +3445,45 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer)
* *
* Return: None * Return: None
*/ */
static void ol_txrx_peer_detach_sync(void *ppeer, static void ol_txrx_peer_detach_sync(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
uint8_t *peer_mac,
ol_txrx_peer_unmap_sync_cb peer_unmap_sync, ol_txrx_peer_unmap_sync_cb peer_unmap_sync,
uint32_t bitmap) uint32_t bitmap)
{ {
ol_txrx_peer_handle peer = ppeer; struct ol_txrx_pdev_t *pdev;
ol_txrx_pdev_handle pdev = peer->vdev->pdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
ol_txrx_info_high("%s peer %pK, peer->ref_cnt %d", __func__, if (!vdev || !vdev->pdev)
peer, qdf_atomic_read(&peer->ref_cnt)); return;
pdev = vdev->pdev;
if (!pdev->peer_unmap_sync_cb) if (!pdev->peer_unmap_sync_cb)
pdev->peer_unmap_sync_cb = peer_unmap_sync; pdev->peer_unmap_sync_cb = peer_unmap_sync;
ol_txrx_peer_detach(peer, bitmap); ol_txrx_peer_detach(soc_hdl, vdev_id, peer_mac, bitmap);
} }
/** /**
* ol_txrx_peer_unmap_sync_cb_set() - set peer unmap sync callback * ol_txrx_peer_unmap_sync_cb_set() - set peer unmap sync callback
* @ppdev - TXRX pdev context * @soc_hdl - datapath soc handle
* pdev_id - physical device instance id
* @peer_unmap_sync - peer unmap sync callback * @peer_unmap_sync - peer unmap sync callback
* *
* Return: None * Return: None
*/ */
static void ol_txrx_peer_unmap_sync_cb_set( static void ol_txrx_peer_unmap_sync_cb_set(
struct cdp_pdev *ppdev, struct cdp_soc_t *soc_hdl,
uint8_t pdev_id,
ol_txrx_peer_unmap_sync_cb peer_unmap_sync) ol_txrx_peer_unmap_sync_cb peer_unmap_sync)
{ {
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
pdev_id);
if (!pdev)
return;
if (!pdev->peer_unmap_sync_cb) if (!pdev->peer_unmap_sync_cb)
pdev->peer_unmap_sync_cb = peer_unmap_sync; pdev->peer_unmap_sync_cb = peer_unmap_sync;
@@ -3750,21 +3830,39 @@ struct ol_txrx_stats_req_internal
return req; return req;
} }
/**
* ol_txrx_fw_stats_get() - Get fw stats
*
* @soc_hdl: datapath soc handle
* @vdev_id: virtual interface id
* @req: specifications of stats request
* @per_vdev: bool input whether stats requested per vdev or not
* @response_expected: bool input whether expecting response or not
*
* Return: success or failure
*/
static A_STATUS static A_STATUS
ol_txrx_fw_stats_get(struct cdp_vdev *pvdev, struct ol_txrx_stats_req *req, ol_txrx_fw_stats_get(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
bool per_vdev, bool response_expected) struct ol_txrx_stats_req *req, bool per_vdev,
bool response_expected)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
struct ol_txrx_pdev_t *pdev = vdev->pdev; ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
struct ol_txrx_pdev_t *pdev;
uint8_t cookie = FW_STATS_DESC_POOL_SIZE; uint8_t cookie = FW_STATS_DESC_POOL_SIZE;
struct ol_txrx_stats_req_internal *non_volatile_req; struct ol_txrx_stats_req_internal *non_volatile_req;
struct ol_txrx_fw_stats_desc_t *desc = NULL; struct ol_txrx_fw_stats_desc_t *desc = NULL;
struct ol_txrx_fw_stats_desc_elem_t *elem = NULL; struct ol_txrx_fw_stats_desc_elem_t *elem = NULL;
if (!vdev)
return A_EINVAL;
pdev = vdev->pdev;
if (!pdev || if (!pdev ||
req->stats_type_upload_mask >= 1 << HTT_DBG_NUM_STATS || req->stats_type_upload_mask >= 1 << HTT_DBG_NUM_STATS ||
req->stats_type_reset_mask >= 1 << HTT_DBG_NUM_STATS) { req->stats_type_reset_mask >= 1 << HTT_DBG_NUM_STATS) {
return A_ERROR; return A_EINVAL;
} }
/* /*
@@ -3783,7 +3881,7 @@ ol_txrx_fw_stats_get(struct cdp_vdev *pvdev, struct ol_txrx_stats_req *req,
desc = ol_txrx_fw_stats_desc_alloc(pdev); desc = ol_txrx_fw_stats_desc_alloc(pdev);
if (!desc) { if (!desc) {
qdf_mem_free(non_volatile_req); qdf_mem_free(non_volatile_req);
return A_ERROR; return A_NO_MEMORY;
} }
/* use the desc id as the cookie */ /* use the desc id as the cookie */
@@ -4423,9 +4521,21 @@ ol_txrx_peer_stats_copy(ol_txrx_pdev_handle pdev,
} }
#endif /* QCA_ENABLE_OL_TXRX_PEER_STATS */ #endif /* QCA_ENABLE_OL_TXRX_PEER_STATS */
static void ol_vdev_rx_set_intrabss_fwd(struct cdp_vdev *pvdev, bool val) /**
* ol_vdev_rx_set_intrabss_fwd() - Get fw stats
*
* @soc_hdl: datapath soc handle
* @vdev_id: virtual interface id
* @val: enable or disable
*
* Return: void
*/
static void ol_vdev_rx_set_intrabss_fwd(struct cdp_soc_t *soc_hdl,
uint8_t vdev_id, bool val)
{ {
struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
vdev_id);
if (!vdev) if (!vdev)
return; return;
@@ -4480,18 +4590,22 @@ static uint32_t ol_txrx_get_tx_ack_stats(struct cdp_soc_t *soc_hdl,
/** /**
* ol_txrx_display_stats() - Display OL TXRX display stats * ol_txrx_display_stats() - Display OL TXRX display stats
* @soc_hdl: Datapath soc handle
* @value: Module id for which stats needs to be displayed * @value: Module id for which stats needs to be displayed
* @verb_level: verbose level of stats to be displayed
* *
* Return: status * Return: status
*/ */
static QDF_STATUS static QDF_STATUS
ol_txrx_display_stats(void *soc, uint16_t value, ol_txrx_display_stats(struct cdp_soc_t *soc_hdl, uint16_t value,
enum qdf_stats_verbosity_level verb_level) enum qdf_stats_verbosity_level verb_level)
{ {
ol_txrx_pdev_handle pdev; struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(
soc,
OL_TXRX_PDEV_ID);
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) { if (!pdev) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
"%s: pdev is NULL", __func__); "%s: pdev is NULL", __func__);
@@ -4509,7 +4623,7 @@ ol_txrx_display_stats(void *soc, uint16_t value,
if (verb_level == QDF_STATS_VERBOSITY_LEVEL_LOW) if (verb_level == QDF_STATS_VERBOSITY_LEVEL_LOW)
ol_tx_dump_flow_pool_info_compact((void *)pdev); ol_tx_dump_flow_pool_info_compact((void *)pdev);
else else
ol_tx_dump_flow_pool_info(soc); ol_tx_dump_flow_pool_info(soc_hdl);
break; break;
case CDP_TXRX_DESC_STATS: case CDP_TXRX_DESC_STATS:
qdf_nbuf_tx_desc_count_display(); qdf_nbuf_tx_desc_count_display();
@@ -5353,19 +5467,22 @@ struct ol_txrx_vdev_t *ol_txrx_get_vdev_from_soc_vdev_id(
/** /**
* ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev * ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev
* @ppdev: the physical device the virtual device belongs to * @soc_hdl: datapath soc handle
* @pdev_id: the physical device id the virtual device belongs to
* *
* Return: vdev handle * Return: vdev id
* NULL if not found. * error if not found.
*/ */
struct cdp_vdev *ol_txrx_get_mon_vdev_from_pdev(struct cdp_pdev *ppdev) uint8_t ol_txrx_get_mon_vdev_from_pdev(struct cdp_soc_t *soc_hdl,
uint8_t pdev_id)
{ {
struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; struct ol_txrx_soc_t *soc = (struct ol_txrx_soc_t *)soc_hdl;
ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(soc, pdev_id);
if (qdf_unlikely(!pdev)) if (qdf_unlikely(!pdev))
return NULL; return -EINVAL;
return (struct cdp_vdev *)pdev->monitor_vdev; return pdev->monitor_vdev->vdev_id;
} }
/** /**
@@ -5422,9 +5539,9 @@ static QDF_STATUS ol_txrx_soc_attach_target(ol_txrx_soc_handle soc)
* *
* MCL legacy OL do nothing here * MCL legacy OL do nothing here
* *
* Return: noe * Return: none
*/ */
static void ol_txrx_soc_detach(void *soc) static void ol_txrx_soc_detach(struct cdp_soc_t *soc)
{ {
qdf_mem_free(soc); qdf_mem_free(soc);
} }
@@ -5484,20 +5601,6 @@ static void ol_txrx_wrapper_flush_rx_frames(struct cdp_soc_t *soc_hdl,
ol_txrx_flush_rx_frames(peer, drop); ol_txrx_flush_rx_frames(peer, drop);
} }
/**
* ol_txrx_wrapper_get_vdev_from_vdev_id() - get vdev instance from vdev id
* @ppdev: pdev handle
* @vdev_id: interface id
*
* Return: virtual interface instance
*/
static
struct cdp_vdev *ol_txrx_wrapper_get_vdev_from_vdev_id(struct cdp_pdev *ppdev,
uint8_t vdev_id)
{
return ol_txrx_get_vdev_from_vdev_id(vdev_id);
}
/** /**
* ol_txrx_wrapper_register_peer() - register peer * ol_txrx_wrapper_register_peer() - register peer
* @pdev: pdev handle * @pdev: pdev handle
@@ -5609,15 +5712,18 @@ ol_txrx_wrapper_set_flow_control_parameters(struct cdp_cfg *cfg_pdev,
/** /**
* ol_txrx_get_cfg() - get ini/cgf values in legacy dp * ol_txrx_get_cfg() - get ini/cgf values in legacy dp
* @soc: soc context * @soc_hdl: soc context
* @cfg_param: cfg parameters * @cfg_param: cfg parameters
* *
* Return: none * Return: none
*/ */
static uint32_t ol_txrx_get_cfg(void *soc, enum cdp_dp_cfg cfg) static uint32_t ol_txrx_get_cfg(struct cdp_soc_t *soc_hdl, enum cdp_dp_cfg cfg)
{ {
struct txrx_pdev_cfg_t *cfg_ctx; struct txrx_pdev_cfg_t *cfg_ctx;
ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(
soc,
OL_TXRX_PDEV_ID);
uint32_t value = 0; uint32_t value = 0;
if (!pdev) { if (!pdev) {
@@ -5770,7 +5876,6 @@ static struct cdp_cmn_ops ol_ops_cmn = {
.txrx_vdev_register = ol_txrx_vdev_register, .txrx_vdev_register = ol_txrx_vdev_register,
.txrx_soc_detach = ol_txrx_soc_detach, .txrx_soc_detach = ol_txrx_soc_detach,
.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr, .txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,
.txrx_get_vdev_from_vdev_id = ol_txrx_wrapper_get_vdev_from_vdev_id,
.txrx_get_ctrl_pdev_from_vdev = ol_txrx_get_ctrl_pdev_from_vdev, .txrx_get_ctrl_pdev_from_vdev = ol_txrx_get_ctrl_pdev_from_vdev,
.txrx_get_mon_vdev_from_pdev = ol_txrx_get_mon_vdev_from_pdev, .txrx_get_mon_vdev_from_pdev = ol_txrx_get_mon_vdev_from_pdev,
.txrx_mgmt_send_ext = ol_txrx_mgmt_send_ext, .txrx_mgmt_send_ext = ol_txrx_mgmt_send_ext,

View File

@@ -195,12 +195,14 @@ struct ol_txrx_vdev_t *ol_txrx_get_vdev_from_soc_vdev_id(
/** /**
* ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev * ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev
* @ppdev: the physical device the virtual device belongs to * @soc: datapath soc handle
* @pdev_id: the physical device id the virtual device belongs to
* *
* Return: vdev handle * Return: vdev id
* NULL if not found. * error if not found.
*/ */
struct cdp_vdev *ol_txrx_get_mon_vdev_from_pdev(struct cdp_pdev *ppdev); uint8_t ol_txrx_get_mon_vdev_from_pdev(struct cdp_soc_t *soc,
uint8_t pdev_id);
/** /**
* ol_txrx_get_vdev_by_peer_addr() - Get vdev handle by peer mac address * ol_txrx_get_vdev_by_peer_addr() - Get vdev handle by peer mac address

View File

@@ -133,6 +133,9 @@ static void ol_tx_vdev_ll_pause_queue_send_base(struct ol_txrx_vdev_t *vdev)
{ {
int max_to_accept; int max_to_accept;
if (!vdev)
return;
qdf_spin_lock_bh(&vdev->ll_pause.mutex); qdf_spin_lock_bh(&vdev->ll_pause.mutex);
if (vdev->ll_pause.paused_reason) { if (vdev->ll_pause.paused_reason) {
qdf_spin_unlock_bh(&vdev->ll_pause.mutex); qdf_spin_unlock_bh(&vdev->ll_pause.mutex);

View File

@@ -17,6 +17,8 @@
*/ */
#include <dp_txrx.h> #include <dp_txrx.h>
#include "dp_peer.h"
#include "dp_internal.h"
#include <cdp_txrx_cmn_struct.h> #include <cdp_txrx_cmn_struct.h>
#include <cdp_txrx_peer_ops.h> #include <cdp_txrx_peer_ops.h>
#include <cds_sched.h> #include <cds_sched.h>
@@ -275,41 +277,6 @@ static qdf_nbuf_t dp_rx_tm_thread_dequeue(struct dp_rx_thread *rx_thread)
return head; return head;
} }
/**
* dp_rx_thread_get_nbuf_vdev_handle() - get vdev handle from nbuf
* dequeued from rx thread
* @soc: soc handle
* @pdev: pdev handle
* @rx_thread: rx_thread whose nbuf was dequeued
* @nbuf_list: nbuf list dequeued from rx_thread
*
* Returns: vdev handle on Success, NULL on failure
*/
static struct cdp_vdev *
dp_rx_thread_get_nbuf_vdev_handle(ol_txrx_soc_handle soc,
struct cdp_pdev *pdev,
struct dp_rx_thread *rx_thread,
qdf_nbuf_t nbuf_list)
{
uint32_t num_list_elements = 0;
struct cdp_vdev *vdev;
uint8_t vdev_id;
vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf_list);
vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
if (!vdev) {
num_list_elements =
QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf_list);
rx_thread->stats.dropped_invalid_vdev +=
num_list_elements;
dp_err("vdev not found for vdev_id %u!, pkt dropped",
vdev_id);
return NULL;
}
return vdev;
}
/** /**
* dp_rx_thread_process_nbufq() - process nbuf queue of a thread * dp_rx_thread_process_nbufq() - process nbuf queue of a thread
* @rx_thread - rx_thread whose nbuf queue needs to be processed * @rx_thread - rx_thread whose nbuf queue needs to be processed
@@ -319,12 +286,11 @@ dp_rx_thread_get_nbuf_vdev_handle(ol_txrx_soc_handle soc,
static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread) static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread)
{ {
qdf_nbuf_t nbuf_list; qdf_nbuf_t nbuf_list;
struct cdp_vdev *vdev; uint8_t vdev_id;
ol_txrx_rx_fp stack_fn; ol_txrx_rx_fp stack_fn;
ol_osif_vdev_handle osif_vdev; ol_osif_vdev_handle osif_vdev;
ol_txrx_soc_handle soc; ol_txrx_soc_handle soc;
uint32_t num_list_elements = 0; uint32_t num_list_elements = 0;
struct cdp_pdev *pdev;
struct dp_txrx_handle_cmn *txrx_handle_cmn; struct dp_txrx_handle_cmn *txrx_handle_cmn;
@@ -332,10 +298,8 @@ static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread)
dp_rx_thread_get_txrx_handle(rx_thread->rtm_handle_cmn); dp_rx_thread_get_txrx_handle(rx_thread->rtm_handle_cmn);
soc = dp_txrx_get_soc_from_ext_handle(txrx_handle_cmn); soc = dp_txrx_get_soc_from_ext_handle(txrx_handle_cmn);
pdev = dp_txrx_get_pdev_from_ext_handle(txrx_handle_cmn); if (!soc) {
dp_err("invalid soc!");
if (!soc || !pdev) {
dp_err("invalid soc or pdev!");
QDF_BUG(0); QDF_BUG(0);
return -EFAULT; return -EFAULT;
} }
@@ -349,13 +313,8 @@ static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread)
QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf_list); QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf_list);
rx_thread->stats.nbuf_dequeued += num_list_elements; rx_thread->stats.nbuf_dequeued += num_list_elements;
vdev = dp_rx_thread_get_nbuf_vdev_handle(soc, pdev, rx_thread, vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf_list);
nbuf_list); cdp_get_os_rx_handles_from_vdev(soc, vdev_id, &stack_fn,
if (!vdev) {
qdf_nbuf_list_free(nbuf_list);
goto dequeue_rx_thread;
}
cdp_get_os_rx_handles_from_vdev(soc, vdev, &stack_fn,
&osif_vdev); &osif_vdev);
if (!stack_fn || !osif_vdev) { if (!stack_fn || !osif_vdev) {
rx_thread->stats.dropped_invalid_os_rx_handles += rx_thread->stats.dropped_invalid_os_rx_handles +=

View File

@@ -2152,7 +2152,8 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
} }
txrx_ops.tx.tx = NULL; txrx_ops.tx.tx = NULL;
cdp_vdev_register(soc, adapter->txrx_vdev, adapter, &txrx_ops); cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
&txrx_ops);
if (!txrx_ops.tx.tx) { if (!txrx_ops.tx.tx) {
hdd_err("%s vdev register fail", __func__); hdd_err("%s vdev register fail", __func__);
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
@@ -4079,7 +4080,6 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
struct ol_txrx_ops txrx_ops; struct ol_txrx_ops txrx_ops;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *txrx_vdev;
/* /*
* TDLS sta in BSS should be set as STA type TDLS and STA MAC should * TDLS sta in BSS should be set as STA type TDLS and STA MAC should
@@ -4102,14 +4102,7 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
txrx_ops.rx.rx_stack = NULL; txrx_ops.rx.rx_stack = NULL;
txrx_ops.rx.rx_flush = NULL; txrx_ops.rx.rx_flush = NULL;
} }
txrx_vdev = cdp_get_vdev_from_vdev_id(soc, cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!txrx_vdev)
return QDF_STATUS_E_FAILURE;
cdp_vdev_register(soc, txrx_vdev,
adapter,
&txrx_ops); &txrx_ops);
adapter->tx_fn = txrx_ops.tx.tx; adapter->tx_fn = txrx_ops.tx.tx;
txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info; txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;

View File

@@ -2348,7 +2348,7 @@ bool hdd_dfs_indicate_radar(struct hdd_context *hdd_ctx)
true; true;
hdd_info("tx blocked for vdev: %d", hdd_info("tx blocked for vdev: %d",
adapter->vdev_id); adapter->vdev_id);
if (adapter->txrx_vdev) if (adapter->vdev_id != WLAN_UMAC_VDEV_ID_MAX)
cdp_fc_vdev_flush( cdp_fc_vdev_flush(
cds_get_context(QDF_MODULE_ID_SOC), cds_get_context(QDF_MODULE_ID_SOC),
adapter->vdev_id); adapter->vdev_id);
@@ -8078,7 +8078,6 @@ static void hdd_display_periodic_stats(struct hdd_context *hdd_ctx,
{ {
static uint32_t counter; static uint32_t counter;
static bool data_in_time_period; static bool data_in_time_period;
ol_txrx_pdev_handle pdev;
ol_txrx_soc_handle soc; ol_txrx_soc_handle soc;
uint32_t periodic_stats_disp_time = 0; uint32_t periodic_stats_disp_time = 0;
@@ -8093,12 +8092,6 @@ static void hdd_display_periodic_stats(struct hdd_context *hdd_ctx,
return; return;
} }
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) {
hdd_err("pdev is NULL");
return;
}
counter++; counter++;
if (data_in_interval) if (data_in_interval)
data_in_time_period = data_in_interval; data_in_time_period = data_in_interval;

View File

@@ -220,8 +220,6 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
struct ol_txrx_ops txrx_ops; struct ol_txrx_ops txrx_ops;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *vdev;
qdf_status = cdp_peer_register_ocb_peer(soc, qdf_status = cdp_peer_register_ocb_peer(soc,
adapter->mac_addr.bytes); adapter->mac_addr.bytes);
@@ -236,13 +234,8 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
/* Register the vdev transmit and receive functions */ /* Register the vdev transmit and receive functions */
qdf_mem_zero(&txrx_ops, sizeof(txrx_ops)); qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
txrx_ops.rx.rx = hdd_rx_packet_cbk; txrx_ops.rx.rx = hdd_rx_packet_cbk;
vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!vdev)
return -EINVAL;
cdp_vdev_register(soc, vdev, adapter, cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
&txrx_ops); &txrx_ops);
txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info; txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
adapter->tx_fn = txrx_ops.tx.tx; adapter->tx_fn = txrx_ops.tx.tx;

View File

@@ -24,6 +24,7 @@
#include <cds_sched.h> #include <cds_sched.h>
#include <cds_utils.h> #include <cds_utils.h>
#include "wlan_hdd_rx_monitor.h" #include "wlan_hdd_rx_monitor.h"
#include "ol_txrx.h"
/** /**
* hdd_rx_monitor_callback(): Callback function for receive monitor mode * hdd_rx_monitor_callback(): Callback function for receive monitor mode
@@ -120,11 +121,13 @@ void hdd_monitor_set_rx_monitor_cb(struct ol_txrx_ops *txrx,
int hdd_enable_monitor_mode(struct net_device *dev) int hdd_enable_monitor_mode(struct net_device *dev)
{ {
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); uint8_t vdev_id;
hdd_enter_dev(dev); hdd_enter_dev(dev);
return cdp_set_monitor_mode(soc, vdev_id = cdp_get_mon_vdev_from_pdev(soc, OL_TXRX_PDEV_ID);
(struct cdp_vdev *)cdp_get_mon_vdev_from_pdev(soc, if (vdev_id < 0)
(struct cdp_pdev *)pdev), false); return -EINVAL;
return cdp_set_monitor_mode(soc, vdev_id, false);
} }

View File

@@ -1020,7 +1020,6 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
struct ol_txrx_ops txrx_ops; struct ol_txrx_ops txrx_ops;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *txrx_vdev = NULL;
struct hdd_ap_ctx *ap_ctx; struct hdd_ap_ctx *ap_ctx;
struct hdd_station_info *sta_info; struct hdd_station_info *sta_info;
@@ -1076,15 +1075,9 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
txrx_ops.rx.rx_flush = NULL; txrx_ops.rx.rx_flush = NULL;
} }
txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!txrx_vdev)
return QDF_STATUS_E_FAILURE;
cdp_vdev_register(soc, cdp_vdev_register(soc,
txrx_vdev, adapter->vdev_id,
adapter, (ol_osif_vdev_handle)adapter,
&txrx_ops); &txrx_ops);
adapter->txrx_vdev = cdp_get_vdev_from_vdev_id(soc, adapter->txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev, (struct cdp_pdev *)pdev,

View File

@@ -2733,9 +2733,9 @@ int hdd_set_mon_rx_cb(struct net_device *dev)
qdf_mem_zero(&txrx_ops, sizeof(txrx_ops)); qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
txrx_ops.rx.rx = hdd_mon_rx_packet_cbk; txrx_ops.rx.rx = hdd_mon_rx_packet_cbk;
hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback); hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback);
cdp_vdev_register(soc, cdp_vdev_register(soc, adapter->vdev_id,
cdp_get_mon_vdev_from_pdev(soc, pdev), (ol_osif_vdev_handle)adapter,
adapter, &txrx_ops); &txrx_ops);
/* peer is created wma_vdev_attach->wma_create_peer */ /* peer is created wma_vdev_attach->wma_create_peer */
qdf_status = cdp_peer_register(soc, qdf_status = cdp_peer_register(soc,
(struct cdp_pdev *)pdev, &sta_desc); (struct cdp_pdev *)pdev, &sta_desc);

View File

@@ -1636,13 +1636,6 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
uint32_t frame_len, status; uint32_t frame_len, status;
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *peer, *pdev;
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) {
pe_err("pdev is NULL");
return;
}
mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info); body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@@ -1668,14 +1661,9 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
status, frame_len); status, frame_len);
} }
peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->sa, qdf_status = cdp_addba_requestprocess(
PEER_DEBUG_ID_WMA_ADDBA_REQ); soc, mac_hdr->sa,
if (!peer) { session->vdev_id,
pe_err("PEER [%pM] not found", mac_hdr->sa);
goto error;
}
qdf_status = cdp_addba_requestprocess(soc, peer,
addba_req->DialogToken.token, addba_req->DialogToken.token,
addba_req->addba_param_set.tid, addba_req->addba_param_set.tid,
addba_req->ba_timeout.timeout, addba_req->ba_timeout.timeout,
@@ -1691,7 +1679,8 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
addba_req->addba_param_set.amsdu_supp); addba_req->addba_param_set.amsdu_supp);
if (qdf_status != QDF_STATUS_SUCCESS) { if (qdf_status != QDF_STATUS_SUCCESS) {
pe_err("Failed to send addba response frame"); pe_err("Failed to send addba response frame");
cdp_addba_resp_tx_completion(soc, peer, cdp_addba_resp_tx_completion(
soc, mac_hdr->sa, session->vdev_id,
addba_req->addba_param_set.tid, addba_req->addba_param_set.tid,
WMI_MGMT_TX_COMP_TYPE_DISCARD); WMI_MGMT_TX_COMP_TYPE_DISCARD);
} }
@@ -1699,8 +1688,6 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
pe_err_rl("Failed to process addba request"); pe_err_rl("Failed to process addba request");
} }
cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_ADDBA_REQ);
error: error:
qdf_mem_free(addba_req); qdf_mem_free(addba_req);
return; return;
@@ -1725,13 +1712,6 @@ static void lim_process_delba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
uint32_t frame_len, status; uint32_t frame_len, status;
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *peer, *pdev;
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) {
pe_err("pdev is NULL");
return;
}
mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info); body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@@ -1757,18 +1737,9 @@ static void lim_process_delba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
status, frame_len); status, frame_len);
} }
peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->sa, qdf_status = cdp_delba_process(soc, mac_hdr->sa, session->vdev_id,
PEER_DEBUG_ID_WMA_DELBA_REQ);
if (!peer) {
pe_err("PEER [%pM] not found", mac_hdr->sa);
goto error;
}
qdf_status = cdp_delba_process(soc, peer,
delba_req->delba_param_set.tid, delba_req->Reason.code); delba_req->delba_param_set.tid, delba_req->Reason.code);
cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_DELBA_REQ);
if (QDF_STATUS_SUCCESS != qdf_status) if (QDF_STATUS_SUCCESS != qdf_status)
pe_err("Failed to process delba request"); pe_err("Failed to process delba request");

View File

@@ -2482,11 +2482,10 @@ static QDF_STATUS lim_addba_rsp_tx_complete_cnf(void *context,
tSirMacMgmtHdr *mac_hdr; tSirMacMgmtHdr *mac_hdr;
tDot11faddba_rsp rsp; tDot11faddba_rsp rsp;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
void *peer;
uint32_t frame_len; uint32_t frame_len;
QDF_STATUS status; QDF_STATUS status;
uint8_t *data; uint8_t *data;
struct wmi_mgmt_params *mgmt_params = (struct wmi_mgmt_params *)params;
if (tx_complete == WMI_MGMT_TX_COMP_TYPE_COMPLETE_OK) if (tx_complete == WMI_MGMT_TX_COMP_TYPE_COMPLETE_OK)
pe_debug("Add ba response successfully sent"); pe_debug("Add ba response successfully sent");
@@ -2518,15 +2517,8 @@ static QDF_STATUS lim_addba_rsp_tx_complete_cnf(void *context,
goto error; goto error;
} }
peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->da, cdp_addba_resp_tx_completion(soc, mac_hdr->da, mgmt_params->vdev_id,
PEER_DEBUG_ID_WMA_ADDBA_REQ); rsp.addba_param_set.tid, tx_complete);
if (!peer) {
pe_debug("no PEER found for mac_addr:%pM", mac_hdr->da);
goto error;
}
cdp_addba_resp_tx_completion(soc, peer, rsp.addba_param_set.tid,
tx_complete);
cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_ADDBA_REQ);
error: error:
if (buf) if (buf)
qdf_nbuf_free(buf); qdf_nbuf_free(buf);
@@ -4996,7 +4988,6 @@ QDF_STATUS lim_send_addba_response_frame(struct mac_context *mac_ctx,
uint16_t buff_size, status_code, batimeout; uint16_t buff_size, status_code, batimeout;
uint8_t dialog_token; uint8_t dialog_token;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *peer, *pdev;
uint8_t he_frag = 0; uint8_t he_frag = 0;
tpDphHashNode sta_ds; tpDphHashNode sta_ds;
uint16_t aid; uint16_t aid;
@@ -5004,23 +4995,10 @@ QDF_STATUS lim_send_addba_response_frame(struct mac_context *mac_ctx,
vdev_id = session->vdev_id; vdev_id = session->vdev_id;
pdev = cds_get_context(QDF_MODULE_ID_TXRX); cdp_addba_responsesetup(soc, peer_mac, vdev_id, tid,
if (!pdev) { &dialog_token, &status_code, &buff_size,
pe_err("pdev is NULL"); &batimeout);
return QDF_STATUS_E_FAILURE;
}
peer = cdp_peer_get_ref_by_addr(soc, pdev, peer_mac,
PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP);
if (!peer) {
pe_err("PEER [%pM] not found", peer_mac);
return QDF_STATUS_E_FAILURE;
}
cdp_addba_responsesetup(soc, peer, tid, &dialog_token,
&status_code, &buff_size, &batimeout);
cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP);
qdf_mem_zero((uint8_t *) &frm, sizeof(frm)); qdf_mem_zero((uint8_t *) &frm, sizeof(frm));
frm.Category.category = ACTION_CATEGORY_BACK; frm.Category.category = ACTION_CATEGORY_BACK;
frm.Action.action = ADDBA_RESPONSE; frm.Action.action = ADDBA_RESPONSE;

View File

@@ -1952,36 +1952,6 @@ uint16_t wma_vdev_get_pause_bitmap(uint8_t vdev_id)
return iface->pause_bitmap; return iface->pause_bitmap;
} }
/**
* wma_vdev_get_dp_handle() - Get vdev datapth handle
* @vdev_id: the Id of the vdev to configure
*
* Return: Vdev datapath handle else NULL on error
*/
static inline
struct cdp_vdev *wma_vdev_get_vdev_dp_handle(uint8_t vdev_id)
{
tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
struct wma_txrx_node *iface;
if (!wma) {
WMA_LOGE("%s: WMA context is invald!", __func__);
return NULL;
}
if (vdev_id >= wma->max_bssid)
return NULL;
iface = &wma->interfaces[vdev_id];
if (!iface || !iface->vdev) {
WMA_LOGE("%s: Vdev is NULL", __func__);
return NULL;
}
return wlan_vdev_get_dp_handle(iface->vdev);
}
/** /**
* wma_vdev_is_device_in_low_pwr_mode - is device in power save mode * wma_vdev_is_device_in_low_pwr_mode - is device in power save mode
* @vdev_id: the Id of the vdev to configure * @vdev_id: the Id of the vdev to configure

View File

@@ -1031,8 +1031,9 @@ int wma_peer_state_change_event_handler(void *handle,
{ {
WMI_PEER_STATE_EVENTID_param_tlvs *param_buf; WMI_PEER_STATE_EVENTID_param_tlvs *param_buf;
wmi_peer_state_event_fixed_param *event; wmi_peer_state_event_fixed_param *event;
struct cdp_vdev *vdev; #ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
tp_wma_handle wma_handle = (tp_wma_handle) handle; tp_wma_handle wma_handle = (tp_wma_handle) handle;
#endif
if (!event_buff) { if (!event_buff) {
WMA_LOGE("%s: Received NULL event ptr from FW", __func__); WMA_LOGE("%s: Received NULL event ptr from FW", __func__);
@@ -1045,12 +1046,6 @@ int wma_peer_state_change_event_handler(void *handle,
} }
event = param_buf->fixed_param; event = param_buf->fixed_param;
vdev = wma_find_vdev_by_id(wma_handle, event->vdev_id);
if (!vdev) {
WMA_LOGD("%s: Couldn't find vdev for vdev_id: %d",
__func__, event->vdev_id);
return -EINVAL;
}
if ((cdp_get_opmode(cds_get_context(QDF_MODULE_ID_SOC), if ((cdp_get_opmode(cds_get_context(QDF_MODULE_ID_SOC),
event->vdev_id) == wlan_op_mode_sta) && event->vdev_id) == wlan_op_mode_sta) &&
@@ -1335,11 +1330,15 @@ wma_mgmt_tx_ack_comp_hdlr(void *wma_context, qdf_nbuf_t netbuf, int32_t status)
tp_wma_handle wma_handle = (tp_wma_handle) wma_context; tp_wma_handle wma_handle = (tp_wma_handle) wma_context;
struct wlan_objmgr_pdev *pdev = (struct wlan_objmgr_pdev *) struct wlan_objmgr_pdev *pdev = (struct wlan_objmgr_pdev *)
wma_handle->pdev; wma_handle->pdev;
struct wmi_mgmt_params mgmt_params = {};
uint16_t desc_id; uint16_t desc_id;
uint8_t vdev_id;
desc_id = QDF_NBUF_CB_MGMT_TXRX_DESC_ID(netbuf); desc_id = QDF_NBUF_CB_MGMT_TXRX_DESC_ID(netbuf);
vdev_id = mgmt_txrx_get_vdev_id(pdev, desc_id);
mgmt_txrx_tx_completion_handler(pdev, desc_id, status, NULL); mgmt_params.vdev_id = vdev_id;
mgmt_txrx_tx_completion_handler(pdev, desc_id, status, &mgmt_params);
} }
/** /**
@@ -1394,18 +1393,18 @@ QDF_STATUS wma_tx_attach(tp_wma_handle wma_handle)
struct cds_context *cds_handle = struct cds_context *cds_handle =
(struct cds_context *) (wma_handle->cds_context); (struct cds_context *) (wma_handle->cds_context);
/* Get the txRx Pdev handle */ /* Get the txRx Pdev ID */
struct cdp_pdev *txrx_pdev = cds_handle->pdev_txrx_ctx; uint8_t pdev_id = WMI_PDEV_ID_SOC;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
/* Register for Tx Management Frames */ /* Register for Tx Management Frames */
cdp_mgmt_tx_cb_set(soc, txrx_pdev, 0, cdp_mgmt_tx_cb_set(soc, pdev_id, 0,
wma_mgmt_tx_dload_comp_hldr, wma_mgmt_tx_dload_comp_hldr,
wma_mgmt_tx_ack_comp_hdlr, wma_handle); wma_mgmt_tx_ack_comp_hdlr, wma_handle);
/* Register callback to send PEER_UNMAP_RESPONSE cmd*/ /* Register callback to send PEER_UNMAP_RESPONSE cmd*/
if (cdp_cfg_get_peer_unmap_conf_support(soc)) if (cdp_cfg_get_peer_unmap_conf_support(soc))
cdp_peer_unmap_sync_cb_set(soc, txrx_pdev, cdp_peer_unmap_sync_cb_set(soc, pdev_id,
wma_peer_unmap_conf_cb); wma_peer_unmap_conf_cb);
/* Store the Mac Context */ /* Store the Mac Context */
@@ -1426,21 +1425,17 @@ QDF_STATUS wma_tx_detach(tp_wma_handle wma_handle)
{ {
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
/* Get the Vos Context */ /* Get the txRx Pdev ID */
struct cds_context *cds_handle = uint8_t pdev_id = WMI_PDEV_ID_SOC;
(struct cds_context *) (wma_handle->cds_context);
/* Get the txRx Pdev handle */
struct cdp_pdev *txrx_pdev = cds_handle->pdev_txrx_ctx;
if (!soc) { if (!soc) {
WMA_LOGE("%s:SOC context is NULL", __func__); WMA_LOGE("%s:SOC context is NULL", __func__);
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
if (txrx_pdev) { if (pdev_id != OL_TXRX_INVALID_PDEV_ID) {
/* Deregister with TxRx for Tx Mgmt completion call back */ /* Deregister with TxRx for Tx Mgmt completion call back */
cdp_mgmt_tx_cb_set(soc, txrx_pdev, 0, NULL, NULL, txrx_pdev); cdp_mgmt_tx_cb_set(soc, pdev_id, 0, NULL, NULL, NULL);
} }
/* Reset Tx Frm Callbacks */ /* Reset Tx Frm Callbacks */
@@ -2415,7 +2410,6 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
int32_t is_high_latency; int32_t is_high_latency;
bool is_wmi_mgmt_tx = false; bool is_wmi_mgmt_tx = false;
struct cdp_vdev *txrx_vdev;
enum frame_index tx_frm_index = GENERIC_NODOWNLD_NOACK_COMP_INDEX; enum frame_index tx_frm_index = GENERIC_NODOWNLD_NOACK_COMP_INDEX;
tpSirMacFrameCtl pFc = (tpSirMacFrameCtl) (qdf_nbuf_data(tx_frame)); tpSirMacFrameCtl pFc = (tpSirMacFrameCtl) (qdf_nbuf_data(tx_frame));
uint8_t use_6mbps = 0; uint8_t use_6mbps = 0;
@@ -2447,19 +2441,6 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
iface = &wma_handle->interfaces[vdev_id]; iface = &wma_handle->interfaces[vdev_id];
if (!iface->vdev) {
WMA_LOGE("iface->vdev is NULL");
cds_packet_free((void *)tx_frame);
return QDF_STATUS_E_FAILURE;
}
/* Get the vdev handle from vdev id */
txrx_vdev = wlan_vdev_get_dp_handle(iface->vdev);
if (!txrx_vdev) {
WMA_LOGE("TxRx Vdev Handle is NULL");
cds_packet_free((void *)tx_frame);
return QDF_STATUS_E_FAILURE;
}
if (!soc) { if (!soc) {
WMA_LOGE("%s:SOC context is NULL", __func__); WMA_LOGE("%s:SOC context is NULL", __func__);
@@ -2622,18 +2603,12 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
if (frmType == TXRX_FRM_802_11_DATA) { if (frmType == TXRX_FRM_802_11_DATA) {
qdf_nbuf_t ret; qdf_nbuf_t ret;
qdf_nbuf_t skb = (qdf_nbuf_t) tx_frame; qdf_nbuf_t skb = (qdf_nbuf_t) tx_frame;
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct wma_decap_info_t decap_info; struct wma_decap_info_t decap_info;
struct ieee80211_frame *wh = struct ieee80211_frame *wh =
(struct ieee80211_frame *)qdf_nbuf_data(skb); (struct ieee80211_frame *)qdf_nbuf_data(skb);
unsigned long curr_timestamp = qdf_mc_timer_get_system_ticks(); unsigned long curr_timestamp = qdf_mc_timer_get_system_ticks();
if (!pdev) {
cds_packet_free((void *)tx_frame);
return QDF_STATUS_E_FAULT;
}
/* /*
* 1) TxRx Module expects data input to be 802.3 format * 1) TxRx Module expects data input to be 802.3 format
* So Decapsulation has to be done. * So Decapsulation has to be done.
@@ -2721,8 +2696,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
ctrl_pdev = cdp_get_ctrl_pdev_from_vdev(soc, ctrl_pdev = cdp_get_ctrl_pdev_from_vdev(soc, vdev_id);
txrx_vdev);
if (!ctrl_pdev) { if (!ctrl_pdev) {
WMA_LOGE("ol_pdev_handle is NULL\n"); WMA_LOGE("ol_pdev_handle is NULL\n");
cds_packet_free((void *)tx_frame); cds_packet_free((void *)tx_frame);

View File

@@ -495,17 +495,15 @@ wma_cdp_vdev_detach(ol_txrx_soc_handle soc, tp_wma_handle wma_handle,
{ {
struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id]; struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
struct wlan_objmgr_vdev *vdev = iface->vdev; struct wlan_objmgr_vdev *vdev = iface->vdev;
struct cdp_vdev *cdp_vdev;
if (!vdev) { if (!vdev) {
WMA_LOGE(FL("vdev is NULL")); WMA_LOGE(FL("vdev is NULL"));
return; return;
} }
cdp_vdev = wlan_vdev_get_dp_handle(vdev); if (soc && wlan_vdev_get_id(vdev) != WLAN_INVALID_VDEV_ID) {
if (soc && cdp_vdev) {
wlan_vdev_set_dp_handle(vdev, NULL); wlan_vdev_set_dp_handle(vdev, NULL);
cdp_vdev_detach(soc, cdp_vdev, NULL, NULL); cdp_vdev_detach(soc, vdev_id, NULL, NULL);
} }
} }
@@ -525,6 +523,7 @@ wma_release_vdev_ref(struct wma_txrx_node *iface)
vdev = iface->vdev; vdev = iface->vdev;
iface->vdev_active = false;
iface->vdev = NULL; iface->vdev = NULL;
if (vdev) if (vdev)
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
@@ -1496,8 +1495,6 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
struct peer_flush_params param = {0}; struct peer_flush_params param = {0};
uint8_t *peer_mac_addr; uint8_t *peer_mac_addr;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
void *vdev;
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL; uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL;
bool peer_unmap_conf_support_enabled; bool peer_unmap_conf_support_enabled;
@@ -1532,18 +1529,8 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
QDF_BUG(0); QDF_BUG(0);
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
vdev = cdp_get_mon_vdev_from_pdev(soc, pdev);
else
vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
if (!vdev) {
WMA_LOGE("%s vdev is null for peer peer->mac_addr %pM",
__func__, peer_mac_addr);
QDF_BUG(0);
return QDF_STATUS_E_INVAL;
}
cdp_peer_teardown(soc, vdev, peer); cdp_peer_teardown(soc, vdev_id, peer);
if (roam_synch_in_progress) if (roam_synch_in_progress)
goto peer_detach; goto peer_detach;
@@ -1575,8 +1562,8 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
} }
peer_detach: peer_detach:
WMA_LOGD("%s: vdev %pK is detaching %pK with peer_addr %pM vdevid %d peer_count %d", WMA_LOGD("%s: vdevid %d is detaching with peer_addr %pM peer_count %d",
__func__, vdev, peer, peer_mac_addr, vdev_id, __func__, vdev_id, peer_mac_addr,
wma->interfaces[vdev_id].peer_count); wma->interfaces[vdev_id].peer_count);
/* Copy peer mac to find and delete objmgr peer */ /* Copy peer mac to find and delete objmgr peer */
qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE); qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE);
@@ -1587,7 +1574,7 @@ peer_detach:
__func__, peer_mac_addr); __func__, peer_mac_addr);
cdp_peer_detach_force_delete(soc, peer); cdp_peer_detach_force_delete(soc, peer);
} else { } else {
cdp_peer_delete_sync(soc, peer, cdp_peer_delete_sync(soc, vdev_id, peer_mac_addr,
wma_peer_unmap_conf_cb, wma_peer_unmap_conf_cb,
bitmap); bitmap);
} }
@@ -1597,11 +1584,11 @@ peer_detach:
__func__, peer_mac_addr); __func__, peer_mac_addr);
} }
if (peer_unmap_conf_support_enabled) if (peer_unmap_conf_support_enabled)
cdp_peer_delete_sync(soc, peer, cdp_peer_delete_sync(soc, vdev_id, peer_mac_addr,
wma_peer_unmap_conf_cb, wma_peer_unmap_conf_cb,
bitmap); bitmap);
else else
cdp_peer_delete(soc, peer, bitmap); cdp_peer_delete(soc, vdev_id, peer_mac_addr, bitmap);
} }
wma_remove_objmgr_peer(wma, vdev_id, peer_mac); wma_remove_objmgr_peer(wma, vdev_id, peer_mac);
@@ -1830,7 +1817,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 * where the HTT peer map event is received before the peer object
* is created in the data path * is created in the data path
*/ */
peer = cdp_peer_create(dp_soc, vdev, peer_addr); peer = cdp_peer_create(dp_soc, vdev_id, peer_addr);
if (!peer) { if (!peer) {
WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr); WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
wlan_objmgr_peer_obj_delete(obj_peer); wlan_objmgr_peer_obj_delete(obj_peer);
@@ -1848,7 +1835,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
WMA_LOGD("%s: LFR3: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d", WMA_LOGD("%s: LFR3: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
__func__, peer, peer_addr, vdev_id, __func__, peer, peer_addr, vdev_id,
wma->interfaces[vdev_id].peer_count); wma->interfaces[vdev_id].peer_count);
cdp_peer_setup(dp_soc, vdev, peer); cdp_peer_setup(dp_soc, vdev_id, peer_addr);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
param.peer_addr = peer_addr; param.peer_addr = peer_addr;
@@ -1859,12 +1846,12 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
WMA_LOGE("%s : Unable to create peer in Target", __func__); WMA_LOGE("%s : Unable to create peer in Target", __func__);
if (cdp_cfg_get_peer_unmap_conf_support(dp_soc)) if (cdp_cfg_get_peer_unmap_conf_support(dp_soc))
cdp_peer_delete_sync( cdp_peer_delete_sync(
dp_soc, peer, dp_soc, vdev_id, peer_addr,
wma_peer_unmap_conf_cb, wma_peer_unmap_conf_cb,
1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER); 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
else else
cdp_peer_delete( cdp_peer_delete(
dp_soc, peer, dp_soc, vdev_id, peer_addr,
1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER); 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
wlan_objmgr_peer_obj_delete(obj_peer); wlan_objmgr_peer_obj_delete(obj_peer);
goto err; goto err;
@@ -1876,12 +1863,12 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND, wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND,
DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0); DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0);
cdp_peer_setup(dp_soc, vdev, peer); cdp_peer_setup(dp_soc, vdev_id, peer_addr);
WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d", WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
__func__, peer_addr, vdev_id); __func__, peer_addr, vdev_id);
mac_addr_raw = cdp_get_vdev_mac_addr(dp_soc, vdev); mac_addr_raw = cdp_get_vdev_mac_addr(dp_soc, vdev_id);
if (!mac_addr_raw) { if (!mac_addr_raw) {
WMA_LOGE("%s: peer mac addr is NULL", __func__); WMA_LOGE("%s: peer mac addr is NULL", __func__);
return QDF_STATUS_E_FAULT; return QDF_STATUS_E_FAULT;
@@ -1931,7 +1918,7 @@ static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev, uint32_t vdev_id,
struct del_bss_resp *vdev_stop_resp, struct del_bss_resp *vdev_stop_resp,
uint8_t type) uint8_t type)
{ {
void *peer, *vdev; void *peer;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
uint8_t *mac_addr = NULL; uint8_t *mac_addr = NULL;
struct wma_target_req *del_req; struct wma_target_req *del_req;
@@ -1939,15 +1926,9 @@ static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev, uint32_t vdev_id,
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
struct qdf_mac_addr bssid; struct qdf_mac_addr bssid;
vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
if (!vdev) {
WMA_LOGE(FL("vdev is NULL for vdev_id = %d"), vdev_id);
return -EINVAL;
}
if (wma_is_vdev_in_ibss_mode(wma, vdev_id) || if (wma_is_vdev_in_ibss_mode(wma, vdev_id) ||
WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) { WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) {
mac_addr = cdp_get_vdev_mac_addr(soc, vdev); mac_addr = cdp_get_vdev_mac_addr(soc, vdev_id);
if (!mac_addr) { if (!mac_addr) {
WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"), WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"),
vdev_id); vdev_id);
@@ -2293,11 +2274,13 @@ __wma_handle_vdev_stop_rsp(struct vdev_stop_response *resp_event)
__func__, peer, bssid.bytes, __func__, peer, bssid.bytes,
resp_event->vdev_id, iface->peer_count); resp_event->vdev_id, iface->peer_count);
if (cdp_cfg_get_peer_unmap_conf_support(soc)) if (cdp_cfg_get_peer_unmap_conf_support(soc))
cdp_peer_delete_sync(soc, peer, cdp_peer_delete_sync(soc, resp_event->vdev_id,
bssid.bytes,
wma_peer_unmap_conf_cb, wma_peer_unmap_conf_cb,
1 << CDP_PEER_DELETE_NO_SPECIAL); 1 << CDP_PEER_DELETE_NO_SPECIAL);
else else
cdp_peer_delete(soc, peer, cdp_peer_delete(soc, resp_event->vdev_id,
bssid.bytes,
1 << CDP_PEER_DELETE_NO_SPECIAL); 1 << CDP_PEER_DELETE_NO_SPECIAL);
wma_remove_objmgr_peer(wma, resp_event->vdev_id, wma_remove_objmgr_peer(wma, resp_event->vdev_id,
bssid.bytes); bssid.bytes);
@@ -2765,7 +2748,7 @@ QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
WMA_LOGE("Failed to configure active APF mode"); WMA_LOGE("Failed to configure active APF mode");
} }
cdp_data_tx_cb_set(soc, txrx_vdev_handle, cdp_data_tx_cb_set(soc, vdev_id,
wma_data_tx_ack_comp_hdlr, wma_data_tx_ack_comp_hdlr,
wma_handle); wma_handle);
@@ -5204,7 +5187,6 @@ int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type)
void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle, void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
tpDisableIntraBssFwd pdis_intra_fwd) tpDisableIntraBssFwd pdis_intra_fwd)
{ {
struct cdp_vdev *txrx_vdev;
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s", WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
@@ -5212,9 +5194,8 @@ void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
(pdis_intra_fwd->disableintrabssfwd ? "true" : "false")); (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].vdev; vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].vdev;
txrx_vdev = wlan_vdev_get_dp_handle(vdev);
cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC), cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC),
txrx_vdev, pdis_intra_fwd->sessionId,
pdis_intra_fwd->disableintrabssfwd); pdis_intra_fwd->disableintrabssfwd);
} }

View File

@@ -915,17 +915,10 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
break; break;
case GEN_CMD: case GEN_CMD:
{ {
struct cdp_vdev *vdev = NULL;
struct wma_txrx_node *intr = wma->interfaces; struct wma_txrx_node *intr = wma->interfaces;
wmi_vdev_custom_aggr_type_t aggr_type = wmi_vdev_custom_aggr_type_t aggr_type =
WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU; WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
if (!vdev) {
WMA_LOGE("%s:Invalid vdev handle", __func__);
return;
}
WMA_LOGD("gen pid %d pval %d", privcmd->param_id, WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
privcmd->param_value); privcmd->param_value);
@@ -938,7 +931,7 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
} }
if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) { if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) {
ret = cdp_aggr_cfg(soc, vdev, ret = cdp_aggr_cfg(soc, privcmd->param_vdev_id,
privcmd->param_value, 0); privcmd->param_value, 0);
if (ret) if (ret)
WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d", WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
@@ -2608,6 +2601,9 @@ void wma_vdev_deinit(struct wma_txrx_node *vdev)
vdev->beacon = NULL; vdev->beacon = NULL;
} }
if (vdev->vdev_active == true)
vdev->vdev_active = false;
if (vdev->addBssStaContext) { if (vdev->addBssStaContext) {
qdf_mem_free(vdev->addBssStaContext); qdf_mem_free(vdev->addBssStaContext);
vdev->addBssStaContext = NULL; vdev->addBssStaContext = NULL;
@@ -3320,8 +3316,6 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
wma_vdev_update_pause_bitmap); wma_vdev_update_pause_bitmap);
pmo_register_get_pause_bitmap(wma_handle->psoc, pmo_register_get_pause_bitmap(wma_handle->psoc,
wma_vdev_get_pause_bitmap); wma_vdev_get_pause_bitmap);
pmo_register_get_vdev_dp_handle(wma_handle->psoc,
wma_vdev_get_vdev_dp_handle);
pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc, pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
wma_vdev_is_device_in_low_pwr_mode); wma_vdev_is_device_in_low_pwr_mode);
pmo_register_get_dtim_period_callback(wma_handle->psoc, pmo_register_get_dtim_period_callback(wma_handle->psoc,
@@ -4467,7 +4461,6 @@ QDF_STATUS wma_close(void)
pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc); pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
pmo_unregister_get_pause_bitmap(wma_handle->psoc); pmo_unregister_get_pause_bitmap(wma_handle->psoc);
pmo_unregister_pause_bitmap_notifier(wma_handle->psoc); pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
pmo_unregister_get_vdev_dp_handle(wma_handle->psoc);
tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc); tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info); init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info);

View File

@@ -2093,8 +2093,7 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
struct wma_txrx_node *iface = NULL; struct wma_txrx_node *iface = NULL;
enum cdp_sec_type sec_type = cdp_sec_type_none; enum cdp_sec_type sec_type = cdp_sec_type_none;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX); void *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *txrx_vdev;
uint32_t pn[4] = {0, 0, 0, 0}; uint32_t pn[4] = {0, 0, 0, 0};
struct cdp_peer *peer; struct cdp_peer *peer;
bool skip_set_key; bool skip_set_key;
@@ -2118,7 +2117,6 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
txrx_vdev = wma_find_vdev_by_id(wma_handle, key_params->vdev_id);
peer = cdp_peer_find_by_addr(soc, txrx_pdev, key_params->peer_mac); peer = cdp_peer_find_by_addr(soc, txrx_pdev, key_params->peer_mac);
iface = &wma_handle->interfaces[key_params->vdev_id]; iface = &wma_handle->interfaces[key_params->vdev_id];
@@ -2282,7 +2280,8 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
(key_params->unicast) ? "unicast" : "group", (key_params->unicast) ? "unicast" : "group",
key_params->key_rsc[3], key_params->key_rsc[2], key_params->key_rsc[3], key_params->key_rsc[2],
key_params->key_rsc[1], key_params->key_rsc[0]); key_params->key_rsc[1], key_params->key_rsc[0]);
cdp_set_pn_check(soc, txrx_vdev, peer, sec_type, pn); cdp_set_pn_check(soc, key_params->vdev_id, key_params->peer_mac,
sec_type, pn);
cdp_set_key(soc, peer, key_params->unicast, cdp_set_key(soc, peer, key_params->unicast,
(uint32_t *)(key_params->key_data + (uint32_t *)(key_params->key_data +
WMA_IV_KEY_LEN + WMA_IV_KEY_LEN +
@@ -2423,18 +2422,11 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle,
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
uint32_t i; uint32_t i;
uint32_t def_key_idx = 0; uint32_t def_key_idx = 0;
struct cdp_vdev *txrx_vdev;
int opmode; int opmode;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
WMA_LOGD("BSS key setup for peer"); WMA_LOGD("BSS key setup for peer");
txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->vdev_id);
if (!txrx_vdev) {
WMA_LOGE("%s:Invalid vdev handle", __func__);
key_info->status = QDF_STATUS_E_FAILURE;
return;
}
qdf_mem_zero(&key_params, sizeof(key_params)); qdf_mem_zero(&key_params, sizeof(key_params));
opmode = cdp_get_opmode(soc, key_info->vdev_id); opmode = cdp_get_opmode(soc, key_info->vdev_id);
@@ -2514,18 +2506,11 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
uint32_t i; uint32_t i;
uint32_t def_key_idx = 0; uint32_t def_key_idx = 0;
uint32_t wlan_opmode; uint32_t wlan_opmode;
struct cdp_vdev *txrx_vdev;
uint8_t *mac_addr, *bssid; uint8_t *mac_addr, *bssid;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
WMA_LOGD("BSS key setup"); WMA_LOGD("BSS key setup");
txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->vdev_id);
if (!txrx_vdev) {
WMA_LOGE("%s:Invalid vdev handle", __func__);
key_info->status = QDF_STATUS_E_FAILURE;
goto out;
}
wlan_opmode = cdp_get_opmode(soc, key_info->vdev_id); wlan_opmode = cdp_get_opmode(soc, key_info->vdev_id);
/* /*
@@ -2558,7 +2543,7 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
} }
qdf_mem_copy(key_params.peer_mac, bssid, QDF_MAC_ADDR_SIZE); qdf_mem_copy(key_params.peer_mac, bssid, QDF_MAC_ADDR_SIZE);
} else { } else {
mac_addr = cdp_get_vdev_mac_addr(soc, txrx_vdev); mac_addr = cdp_get_vdev_mac_addr(soc, key_params.vdev_id);
if (!mac_addr) { if (!mac_addr) {
WMA_LOGE("%s: mac_addr is NULL for vdev with id %d", WMA_LOGE("%s: mac_addr is NULL for vdev with id %d",
__func__, key_info->vdev_id); __func__, key_info->vdev_id);
@@ -2649,7 +2634,6 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
int32_t i; int32_t i;
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
struct cdp_pdev *txrx_pdev; struct cdp_pdev *txrx_pdev;
struct cdp_vdev *txrx_vdev;
void *peer; void *peer;
uint8_t num_keys = 0; uint8_t num_keys = 0;
struct wma_set_key_params key_params; struct wma_set_key_params key_params;
@@ -2676,12 +2660,6 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
goto out; goto out;
} }
txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->vdev_id);
if (!txrx_vdev) {
WMA_LOGE("%s:TxRx Vdev Handle is NULL", __func__);
key_info->status = QDF_STATUS_E_FAILURE;
goto out;
}
opmode = cdp_get_opmode(soc, key_info->vdev_id); opmode = cdp_get_opmode(soc, key_info->vdev_id);
if (key_info->defWEPIdx == WMA_INVALID_KEY_IDX && if (key_info->defWEPIdx == WMA_INVALID_KEY_IDX &&
@@ -3396,11 +3374,11 @@ static int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle,
QDF_STATUS ret; QDF_STATUS ret;
#if !defined(REMOVE_PKT_LOG) #if !defined(REMOVE_PKT_LOG)
uint8_t vdev_id = 0; uint8_t vdev_id = 0;
struct cdp_vdev *txrx_vdev;
ol_txrx_pktdump_cb packetdump_cb; ol_txrx_pktdump_cb packetdump_cb;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
enum tx_status pktdump_status; enum tx_status pktdump_status;
#endif #endif
struct wmi_mgmt_params mgmt_params = {};
if (!wma_handle) { if (!wma_handle) {
WMA_LOGE("%s: wma handle is NULL", __func__); WMA_LOGE("%s: wma handle is NULL", __func__);
@@ -3424,7 +3402,7 @@ static int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle,
#if !defined(REMOVE_PKT_LOG) #if !defined(REMOVE_PKT_LOG)
vdev_id = mgmt_txrx_get_vdev_id(pdev, desc_id); vdev_id = mgmt_txrx_get_vdev_id(pdev, desc_id);
txrx_vdev = wma_find_vdev_by_id(wma_handle, vdev_id); mgmt_params.vdev_id = vdev_id;
packetdump_cb = wma_handle->wma_mgmt_tx_packetdump_cb; packetdump_cb = wma_handle->wma_mgmt_tx_packetdump_cb;
pktdump_status = wma_mgmt_pktdump_status_map(status); pktdump_status = wma_mgmt_pktdump_status_map(status);
if (packetdump_cb) if (packetdump_cb)
@@ -3432,7 +3410,8 @@ static int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle,
buf, pktdump_status, TX_MGMT_PKT); buf, pktdump_status, TX_MGMT_PKT);
#endif #endif
ret = mgmt_txrx_tx_completion_handler(pdev, desc_id, status, NULL); ret = mgmt_txrx_tx_completion_handler(pdev, desc_id, status,
&mgmt_params);
if (ret != QDF_STATUS_SUCCESS) { if (ret != QDF_STATUS_SUCCESS) {
WMA_LOGE("%s: Failed to process mgmt tx completion", __func__); WMA_LOGE("%s: Failed to process mgmt tx completion", __func__);
@@ -4198,7 +4177,6 @@ int wma_form_rx_packet(qdf_nbuf_t buf,
#if !defined(REMOVE_PKT_LOG) #if !defined(REMOVE_PKT_LOG)
ol_txrx_pktdump_cb packetdump_cb; ol_txrx_pktdump_cb packetdump_cb;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct cdp_vdev *txrx_vdev;
#endif #endif
static uint8_t limit_prints_invalid_len = RATE_LIMIT - 1; static uint8_t limit_prints_invalid_len = RATE_LIMIT - 1;
static uint8_t limit_prints_load_unload = RATE_LIMIT - 1; static uint8_t limit_prints_load_unload = RATE_LIMIT - 1;
@@ -4366,8 +4344,6 @@ int wma_form_rx_packet(qdf_nbuf_t buf,
#if !defined(REMOVE_PKT_LOG) #if !defined(REMOVE_PKT_LOG)
packetdump_cb = wma_handle->wma_mgmt_rx_packetdump_cb; packetdump_cb = wma_handle->wma_mgmt_rx_packetdump_cb;
txrx_vdev = wma_find_vdev_by_id(wma_handle,
rx_pkt->pkt_meta.session_id);
if ((mgt_type == IEEE80211_FC0_TYPE_MGT && if ((mgt_type == IEEE80211_FC0_TYPE_MGT &&
mgt_subtype != MGMT_SUBTYPE_BEACON) && mgt_subtype != MGMT_SUBTYPE_BEACON) &&
packetdump_cb) packetdump_cb)
@@ -4701,7 +4677,6 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev,
struct wmi_mgmt_params *mgmt_params = struct wmi_mgmt_params *mgmt_params =
(struct wmi_mgmt_params *)mgmt_tx_params; (struct wmi_mgmt_params *)mgmt_tx_params;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct cdp_vdev *txrx_vdev;
if (!mgmt_params) { if (!mgmt_params) {
WMA_LOGE("%s: mgmt_params ptr passed is NULL", __func__); WMA_LOGE("%s: mgmt_params ptr passed is NULL", __func__);
@@ -4720,23 +4695,15 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
if (!wma_handle->interfaces[mgmt_params->vdev_id].vdev) {
WMA_LOGE("%s: vdev is NULL for vdev_%d",
__func__, mgmt_params->vdev_id);
return QDF_STATUS_E_INVAL;
}
txrx_vdev = wlan_vdev_get_dp_handle
(wma_handle->interfaces[mgmt_params->vdev_id].vdev);
if (wmi_service_enabled(wma_handle->wmi_handle, if (wmi_service_enabled(wma_handle->wmi_handle,
wmi_service_mgmt_tx_wmi)) { wmi_service_mgmt_tx_wmi)) {
status = wmi_mgmt_unified_cmd_send(wma_handle->wmi_handle, status = wmi_mgmt_unified_cmd_send(wma_handle->wmi_handle,
mgmt_params); mgmt_params);
} else if (txrx_vdev) { } else {
QDF_NBUF_CB_MGMT_TXRX_DESC_ID(buf) QDF_NBUF_CB_MGMT_TXRX_DESC_ID(buf)
= mgmt_params->desc_id; = mgmt_params->desc_id;
ret = cdp_mgmt_send_ext(soc, txrx_vdev, buf, ret = cdp_mgmt_send_ext(soc, mgmt_params->vdev_id, buf,
mgmt_params->tx_type, mgmt_params->tx_type,
mgmt_params->use_6mbps, mgmt_params->use_6mbps,
mgmt_params->chanfreq); mgmt_params->chanfreq);

View File

@@ -3273,7 +3273,6 @@ int32_t wma_txrx_fw_stats_reset(tp_wma_handle wma_handle,
uint8_t vdev_id, uint32_t value) uint8_t vdev_id, uint32_t value)
{ {
struct ol_txrx_stats_req req; struct ol_txrx_stats_req req;
struct cdp_vdev *vdev;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
if (!soc) { if (!soc) {
@@ -3281,14 +3280,9 @@ int32_t wma_txrx_fw_stats_reset(tp_wma_handle wma_handle,
return -EINVAL; return -EINVAL;
} }
vdev = wma_find_vdev_by_id(wma_handle, vdev_id);
if (!vdev) {
WMA_LOGE("%s:Invalid vdev handle", __func__);
return -EINVAL;
}
qdf_mem_zero(&req, sizeof(req)); qdf_mem_zero(&req, sizeof(req));
req.stats_type_reset_mask = value; req.stats_type_reset_mask = value;
cdp_fw_stats_get(soc, vdev, &req, false, false); cdp_fw_stats_get(soc, vdev_id, &req, false, false);
return 0; return 0;
} }
@@ -3339,7 +3333,6 @@ int32_t wma_set_txrx_fw_stats_level(tp_wma_handle wma_handle,
uint8_t vdev_id, uint32_t value) uint8_t vdev_id, uint32_t value)
{ {
struct ol_txrx_stats_req req; struct ol_txrx_stats_req req;
struct cdp_vdev *vdev;
uint32_t l_up_mask; uint32_t l_up_mask;
void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *soc = cds_get_context(QDF_MODULE_ID_SOC);
@@ -3348,12 +3341,6 @@ int32_t wma_set_txrx_fw_stats_level(tp_wma_handle wma_handle,
return -EINVAL; return -EINVAL;
} }
vdev = wma_find_vdev_by_id(wma_handle, vdev_id);
if (!vdev) {
WMA_LOGE("%s:Invalid vdev handle", __func__);
return -EINVAL;
}
if (wma_is_valid_fw_stats_cmd(value) == false) if (wma_is_valid_fw_stats_cmd(value) == false)
return -EINVAL; return -EINVAL;
@@ -3364,7 +3351,7 @@ int32_t wma_set_txrx_fw_stats_level(tp_wma_handle wma_handle,
l_up_mask = 1 << (value - 1); l_up_mask = 1 << (value - 1);
req.stats_type_upload_mask = l_up_mask; req.stats_type_upload_mask = l_up_mask;
cdp_fw_stats_get(soc, vdev, &req, false, true); cdp_fw_stats_get(soc, vdev_id, &req, false, true);
return 0; return 0;
} }