qcacmn: Add change to avoid sending wmi cmd

Add change to avoid send wmi command in case
of vdev start, multi vdev restart, stop and delete
when vdev_mlme object is NULL.

Change-Id: Iaa3d3f56fb9caf37b933f029c57311edef0281b4
CRs-Fixed: 2443599
这个提交包含在:
Naga
2019-04-29 12:33:57 +05:30
提交者 nshrivas
父节点 71371bc4ad
当前提交 f1313ba77e

查看文件

@@ -387,20 +387,21 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
}
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (vdev_rsp) {
vdev_rsp->expire_time = START_RESPONSE_TIMER;
if (param->is_restart)
target_if_vdev_mgr_rsp_timer_start(
vdev, vdev_rsp,
RESTART_RESPONSE_BIT);
else
target_if_vdev_mgr_rsp_timer_start(
vdev, vdev_rsp,
START_RESPONSE_BIT);
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
}
vdev_rsp->expire_time = START_RESPONSE_TIMER;
if (param->is_restart)
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
RESTART_RESPONSE_BIT);
else
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
START_RESPONSE_BIT);
status = wmi_unified_vdev_start_send(wmi_handle, param);
if (QDF_IS_STATUS_ERROR(status) && vdev_rsp) {
if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
vdev_rsp->expire_time = 0;
if (param->is_restart)
@@ -459,12 +460,15 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
}
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (vdev_rsp) {
vdev_rsp->expire_time = DELETE_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
DELETE_RESPONSE_BIT);
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
}
vdev_rsp->expire_time = DELETE_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
DELETE_RESPONSE_BIT);
status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id);
if (QDF_IS_STATUS_SUCCESS(status)) {
/*
@@ -476,12 +480,10 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
WLAN_SOC_F_TESTMODE_ENABLE))
target_if_vdev_mgr_delete_response_send(vdev, rx_ops);
} else {
if (vdev_rsp) {
vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
DELETE_RESPONSE_BIT);
}
vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
DELETE_RESPONSE_BIT);
}
return status;
@@ -519,14 +521,16 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
}
vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (vdev_rsp) {
vdev_rsp->expire_time = STOP_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
STOP_RESPONSE_BIT);
if (!vdev_rsp) {
mlme_err("VDEV_%d: Invalid response structure", vdev_id);
return QDF_STATUS_E_FAILURE;
}
vdev_rsp->expire_time = STOP_RESPONSE_TIMER;
target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, STOP_RESPONSE_BIT);
status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id);
if (QDF_IS_STATUS_ERROR(status) && vdev_rsp) {
if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp->expire_time = 0;
vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
@@ -762,17 +766,95 @@ static QDF_STATUS target_if_vdev_mgr_peer_flush_tids_send(
return status;
}
static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_restart_params *param,
struct wlan_objmgr_vdev **vdev_list,
bool *vdev_timer_started)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *tvdev;
struct vdev_response_timer *vdev_rsp = NULL;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
uint32_t vdev_idx;
int32_t last_vdev_idx = -1;
psoc = wlan_pdev_get_psoc(pdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
return last_vdev_idx;
}
for (vdev_idx = 0; vdev_idx < param->num_vdevs ; vdev_idx++) {
vdev_list[vdev_idx] = wlan_objmgr_get_vdev_by_id_from_pdev(
pdev,
param->vdev_ids[vdev_idx],
WLAN_VDEV_TARGET_IF_ID);
tvdev = vdev_list[vdev_idx];
if (!tvdev) {
mlme_err("VDEV_%d is NULL", vdev_idx);
return last_vdev_idx;
}
last_vdev_idx = vdev_idx;
vdev_rsp =
rx_ops->vdev_mgr_get_response_timer_info(tvdev);
if (!vdev_rsp) {
mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
return last_vdev_idx;
}
target_if_vdev_mgr_rsp_timer_start(tvdev, vdev_rsp,
RESTART_RESPONSE_BIT);
vdev_timer_started[vdev_idx] = true;
}
return last_vdev_idx;
}
static void target_if_vdev_mgr_multi_vdev_restart_rel_ref(
struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev **vdev_list,
bool *vdev_timer_started,
int32_t last_vdev_idx,
QDF_STATUS status)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *tvdev;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
struct vdev_response_timer *vdev_rsp = NULL;
uint32_t vdev_idx;
psoc = wlan_pdev_get_psoc(pdev);
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) {
tvdev = vdev_list[vdev_idx];
if (QDF_IS_STATUS_ERROR(status)) {
vdev_rsp =
rx_ops->vdev_mgr_get_response_timer_info(tvdev);
if (vdev_rsp && vdev_timer_started[vdev_idx]) {
target_if_vdev_mgr_rsp_timer_stop(
tvdev, vdev_rsp,
RESTART_RESPONSE_BIT);
vdev_timer_started[vdev_idx] = false;
}
}
wlan_objmgr_vdev_release_ref(tvdev,
WLAN_VDEV_TARGET_IF_ID);
}
}
static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_restart_params *param)
{
QDF_STATUS status;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct wmi_unified *wmi_handle;
struct wlan_objmgr_psoc *psoc;
struct vdev_response_timer *vdev_rsp = NULL;
struct wlan_objmgr_vdev *vdev;
struct wlan_lmac_if_mlme_rx_ops *rx_ops;
uint32_t vdev_id;
struct wlan_objmgr_vdev *vdev_list[WLAN_UMAC_PDEV_MAX_VDEVS] = {NULL};
bool vdev_timer_started[WLAN_UMAC_PDEV_MAX_VDEVS] = {false};
int32_t last_vdev_idx = -1;
if (!pdev || !param) {
mlme_err("Invalid input");
@@ -791,50 +873,26 @@ static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd(
return QDF_STATUS_E_INVAL;
}
rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
mlme_err("VDEV_%d: No Rx Ops", vdev_id);
last_vdev_idx = target_if_vdev_mgr_multi_vdev_restart_get_ref(
pdev, param,
vdev_list,
vdev_timer_started);
if (last_vdev_idx < 0 || (last_vdev_idx != (param->num_vdevs - 1))) {
target_if_vdev_mgr_multi_vdev_restart_rel_ref(
pdev, vdev_list,
vdev_timer_started,
last_vdev_idx,
QDF_STATUS_E_FAILURE);
return QDF_STATUS_E_INVAL;
}
for (vdev_id = 0; vdev_id < param->num_vdevs ; vdev_id++) {
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(
pdev,
param->vdev_ids[vdev_id],
WLAN_VDEV_TARGET_IF_ID);
if (vdev) {
vdev_rsp =
rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (vdev_rsp)
target_if_vdev_mgr_rsp_timer_start(
vdev, vdev_rsp,
RESTART_RESPONSE_BIT);
wlan_objmgr_vdev_release_ref(vdev,
WLAN_VDEV_TARGET_IF_ID);
}
}
status = wmi_unified_send_multiple_vdev_restart_req_cmd(wmi_handle,
param);
if (QDF_IS_STATUS_ERROR(status)) {
for (vdev_id = 0; vdev_id < param->num_vdevs ; vdev_id++) {
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(
pdev,
param->vdev_ids[vdev_id],
WLAN_VDEV_TARGET_IF_ID);
if (vdev) {
vdev_rsp =
rx_ops->vdev_mgr_get_response_timer_info(vdev);
if (vdev_rsp)
target_if_vdev_mgr_rsp_timer_stop(
vdev, vdev_rsp,
RESTART_RESPONSE_BIT);
wlan_objmgr_vdev_release_ref(
vdev,
WLAN_VDEV_TARGET_IF_ID);
}
}
}
target_if_vdev_mgr_multi_vdev_restart_rel_ref(
pdev, vdev_list,
vdev_timer_started,
last_vdev_idx, status);
return status;
}