qcacmn: Add MLME support for vdev delete all peer
Add umac/mlme support for vdev delete all peer request which will replace individual peer delete of peers under a vdev during vdev down. Change-Id: I6afdfae619fce361acd60705fe2d7ad888a8e33e CRs-Fixed: 2456858
This commit is contained in:
@@ -438,6 +438,8 @@ enum vdev_start_resp_type {
|
||||
* @mlme_vdev_notify_start_state_exit: callback to notify on vdev start
|
||||
* start state exit
|
||||
* @mlme_vdev_is_newchan_no_cac: callback to check CAC is required
|
||||
* @mlme_vdev_ext_peer_delete_all_rsp: callback to initiate actions for
|
||||
* vdev mlme peer delete all response
|
||||
*/
|
||||
struct vdev_mlme_ops {
|
||||
QDF_STATUS (*mlme_vdev_validate_basic_params)(
|
||||
@@ -509,6 +511,9 @@ struct vdev_mlme_ops {
|
||||
struct vdev_mlme_obj *vdev_mlme);
|
||||
QDF_STATUS (*mlme_vdev_is_newchan_no_cac)(
|
||||
struct vdev_mlme_obj *vdev_mlme);
|
||||
QDF_STATUS (*mlme_vdev_ext_peer_delete_all_rsp)(
|
||||
struct vdev_mlme_obj *vdev_mlme,
|
||||
struct peer_delete_all_response *rsp);
|
||||
};
|
||||
|
||||
#ifdef FEATURE_VDEV_RSP_WAKELOCK
|
||||
|
@@ -526,3 +526,41 @@ QDF_STATUS vdev_mgr_set_custom_aggr_size_send(
|
||||
|
||||
return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, ¶m);
|
||||
}
|
||||
|
||||
static QDF_STATUS vdev_mgr_peer_delete_all_param_update(
|
||||
struct vdev_mlme_obj *mlme_obj,
|
||||
struct peer_delete_all_params *param)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
|
||||
vdev = mlme_obj->vdev;
|
||||
if (!vdev) {
|
||||
mlme_err("VDEV is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
param->vdev_id = wlan_vdev_get_id(vdev);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
struct peer_delete_all_params param = {0};
|
||||
|
||||
if (!mlme_obj) {
|
||||
mlme_err("Invalid input");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
status = vdev_mgr_peer_delete_all_param_update(mlme_obj, ¶m);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err("Param Update Error: %d", status);
|
||||
return status;
|
||||
}
|
||||
|
||||
status = tgt_vdev_mgr_peer_delete_all_send(mlme_obj, ¶m);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@@ -229,5 +229,13 @@ QDF_STATUS vdev_mlme_multiple_restart_send(struct wlan_objmgr_pdev *pdev,
|
||||
uint32_t *vdev_ids,
|
||||
uint32_t num_vdevs);
|
||||
|
||||
/**
|
||||
* vdev_mgr_peer_delete_all_send() – MLME API to send peer delete all request
|
||||
* @mlme_obj: pointer to vdev_mlme_obj
|
||||
*
|
||||
* Return: QDF_STATUS - Success or Failure
|
||||
*/
|
||||
QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj);
|
||||
|
||||
#endif /* CMN_VDEV_MGR_TGT_IF_ENABLE */
|
||||
#endif /* __VDEV_MGR_OPS_H__ */
|
||||
|
@@ -32,11 +32,13 @@
|
||||
#define RESTART_RESPONSE_BIT 0x2
|
||||
#define STOP_RESPONSE_BIT 0x3
|
||||
#define DELETE_RESPONSE_BIT 0x4
|
||||
#define RESPONSE_BIT_MAX DELETE_RESPONSE_BIT
|
||||
#define PEER_DELETE_ALL_RESPONSE_BIT 0x5
|
||||
#define RESPONSE_BIT_MAX PEER_DELETE_ALL_RESPONSE_BIT
|
||||
|
||||
#define START_RESPONSE_TIMER 6000 /* 6 seconds */
|
||||
#define STOP_RESPONSE_TIMER 3000 /* 3 seconds */
|
||||
#define DELETE_RESPONSE_TIMER 3000 /* 3 seconds */
|
||||
#define PEER_DELETE_ALL_RESPONSE_TIMER 6000 /* 6 seconds */
|
||||
|
||||
/**
|
||||
* struct vdev_response_timer - vdev mgmt response ops timer
|
||||
@@ -92,4 +94,14 @@ struct vdev_delete_response {
|
||||
uint8_t vdev_id;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct peer_delete_all_response - peer delete all response structure
|
||||
* @vdev_id: vdev id
|
||||
* @status: FW status for vdev delete all peer request
|
||||
*/
|
||||
struct peer_delete_all_response {
|
||||
uint8_t vdev_id;
|
||||
uint8_t status;
|
||||
};
|
||||
|
||||
#endif /* __WLAN_VDEV_MGR_TGT_IF_RX_DEFS_H__ */
|
||||
|
@@ -253,5 +253,16 @@ QDF_STATUS tgt_vdev_mgr_set_param_send(
|
||||
*/
|
||||
QDF_STATUS tgt_vdev_mgr_bcn_miss_offload_send(struct vdev_mlme_obj *mlme_obj);
|
||||
|
||||
/**
|
||||
* tgt_vdev_mgr_peer_delete_all_send() – API to send peer delete all request
|
||||
* @mlme_obj: pointer to vdev_mlme_obj
|
||||
* @param: pointer to peer_delete_all_params
|
||||
*
|
||||
* Return: QDF_STATUS - Success or Failure
|
||||
*/
|
||||
QDF_STATUS tgt_vdev_mgr_peer_delete_all_send(
|
||||
struct vdev_mlme_obj *mlme_obj,
|
||||
struct peer_delete_all_params *param);
|
||||
|
||||
#endif /* CMN_VDEV_MGR_TGT_IF_ENABLE */
|
||||
#endif /* __WLAN_VDEV_MGR_TX_OPS_API_H__ */
|
||||
|
@@ -442,5 +442,13 @@ struct vdev_down_params {
|
||||
uint8_t vdev_id;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct peer_delete_all_params - peer delete all request parameter
|
||||
* @vdev_id: vdev id
|
||||
*/
|
||||
struct peer_delete_all_params {
|
||||
uint8_t vdev_id;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif /* __WLAN_VDEV_MGR_TX_OPS_DEFS_H__ */
|
||||
|
@@ -72,11 +72,6 @@ static QDF_STATUS tgt_vdev_mgr_start_response_handler(
|
||||
}
|
||||
|
||||
vdev_rsp = &vdev_mlme->vdev_rt;
|
||||
if (!vdev_rsp) {
|
||||
mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
|
||||
goto tgt_vdev_mgr_start_response_handler_end;
|
||||
}
|
||||
|
||||
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
|
||||
if (rsp->resp_type == RESTART_RESPONSE)
|
||||
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
|
||||
@@ -127,11 +122,6 @@ static QDF_STATUS tgt_vdev_mgr_stop_response_handler(
|
||||
}
|
||||
|
||||
vdev_rsp = &vdev_mlme->vdev_rt;
|
||||
if (!vdev_rsp) {
|
||||
mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
|
||||
goto tgt_vdev_mgr_stop_response_handler_end;
|
||||
}
|
||||
|
||||
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
|
||||
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
|
||||
STOP_RESPONSE_BIT);
|
||||
@@ -149,7 +139,7 @@ tgt_vdev_mgr_stop_response_handler_end:
|
||||
return status;
|
||||
}
|
||||
|
||||
QDF_STATUS tgt_vdev_mgr_delete_response_handler(
|
||||
static QDF_STATUS tgt_vdev_mgr_delete_response_handler(
|
||||
struct wlan_objmgr_psoc *psoc,
|
||||
struct vdev_delete_response *rsp)
|
||||
{
|
||||
@@ -179,11 +169,6 @@ QDF_STATUS tgt_vdev_mgr_delete_response_handler(
|
||||
}
|
||||
|
||||
vdev_rsp = &vdev_mlme->vdev_rt;
|
||||
if (!vdev_rsp) {
|
||||
mlme_err("VDEV_%d: Invalid response", rsp->vdev_id);
|
||||
goto tgt_vdev_mgr_delete_response_handler_end;
|
||||
}
|
||||
|
||||
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
|
||||
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
|
||||
DELETE_RESPONSE_BIT);
|
||||
@@ -203,6 +188,55 @@ tgt_vdev_mgr_delete_response_handler_end:
|
||||
return status;
|
||||
}
|
||||
|
||||
static QDF_STATUS tgt_vdev_mgr_peer_delete_all_response_handler(
|
||||
struct wlan_objmgr_psoc *psoc,
|
||||
struct peer_delete_all_response *rsp)
|
||||
{
|
||||
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
||||
struct vdev_mlme_obj *vdev_mlme;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct vdev_response_timer *vdev_rsp;
|
||||
struct wlan_lmac_if_mlme_tx_ops *tx_ops;
|
||||
|
||||
if (!rsp || !psoc) {
|
||||
mlme_err("Invalid input");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
|
||||
rsp->vdev_id,
|
||||
WLAN_VDEV_TARGET_IF_ID);
|
||||
if (!vdev) {
|
||||
mlme_err("VDEV is NULL");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
|
||||
if (!vdev_mlme) {
|
||||
mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
|
||||
goto tgt_vdev_mgr_peer_delete_all_response_handler_end;
|
||||
}
|
||||
|
||||
vdev_rsp = &vdev_mlme->vdev_rt;
|
||||
tx_ops = target_if_vdev_mgr_get_tx_ops(psoc);
|
||||
status = tx_ops->vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
|
||||
PEER_DELETE_ALL_RESPONSE_BIT);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err("VDEV_%d: Unexpected response", rsp->vdev_id);
|
||||
goto tgt_vdev_mgr_peer_delete_all_response_handler_end;
|
||||
}
|
||||
|
||||
if ((vdev_mlme->ops) &&
|
||||
vdev_mlme->ops->mlme_vdev_ext_peer_delete_all_rsp)
|
||||
status = vdev_mlme->ops->mlme_vdev_ext_peer_delete_all_rsp(
|
||||
vdev_mlme,
|
||||
rsp);
|
||||
|
||||
tgt_vdev_mgr_peer_delete_all_response_handler_end:
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
|
||||
return status;
|
||||
}
|
||||
|
||||
static QDF_STATUS
|
||||
tgt_vdev_mgr_offload_bcn_tx_status_event_handler(uint32_t vdev_id,
|
||||
uint32_t tx_status)
|
||||
@@ -272,6 +306,8 @@ void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
|
||||
tgt_vdev_mgr_stop_response_handler;
|
||||
mlme_rx_ops->vdev_mgr_delete_response =
|
||||
tgt_vdev_mgr_delete_response_handler;
|
||||
mlme_rx_ops->vdev_mgr_peer_delete_all_response =
|
||||
tgt_vdev_mgr_peer_delete_all_response_handler;
|
||||
mlme_rx_ops->vdev_mgr_get_response_timer_info =
|
||||
tgt_vdev_mgr_get_response_timer_info;
|
||||
|
||||
|
@@ -575,3 +575,32 @@ QDF_STATUS tgt_vdev_mgr_sta_ps_param_send(
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
QDF_STATUS tgt_vdev_mgr_peer_delete_all_send(
|
||||
struct vdev_mlme_obj *mlme_obj,
|
||||
struct peer_delete_all_params *param)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
struct wlan_lmac_if_mlme_tx_ops *txops;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
uint8_t vdev_id;
|
||||
|
||||
if (!param) {
|
||||
mlme_err("Invalid input");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
vdev = mlme_obj->vdev;
|
||||
vdev_id = wlan_vdev_get_id(vdev);
|
||||
txops = wlan_vdev_mlme_get_lmac_txops(vdev);
|
||||
if (!txops || !txops->peer_delete_all_send) {
|
||||
mlme_err("VDEV_%d: No Tx Ops", vdev_id);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
status = txops->peer_delete_all_send(vdev, param);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
Reference in New Issue
Block a user