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:
Naga
2019-06-24 17:02:31 +05:30
committed by nshrivas
parent 866a668f99
commit 3998909959
8 changed files with 164 additions and 17 deletions

View File

@@ -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

View File

@@ -526,3 +526,41 @@ QDF_STATUS vdev_mgr_set_custom_aggr_size_send(
return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, &param);
}
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, &param);
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, &param);
return status;
}

View File

@@ -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__ */

View File

@@ -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__ */

View File

@@ -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__ */

View File

@@ -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__ */

View File

@@ -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;

View File

@@ -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;
}