qcacld-3.0: Add support for SAP TWT teardown event

Firmare sends SAP TWT teardown event to host. Host handle
the event and send values to userspace via nl layer

Change-Id: I714c6a18399c1e0d8b79d31af984037f2f5e2024
CRs-Fixed: 2938332
This commit is contained in:
Deeksha Gupta 2021-05-04 16:41:29 +05:30 • committed by Gerrit - the friendly Code Review server
commit b2eec6938c
3 changed files with 92 additions and 26 deletions

View file

@ -558,6 +558,16 @@ void mlme_set_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, bool from_ap,
uint32_t reason_code);
/**
* wlan_get_opmode_from_vdev_id() - Get opmode from vdevid
* @psoc: PSOC pointer
* @vdev_id: vdev id
*
* Return: opmode
*/
enum QDF_OPMODE wlan_get_opmode_from_vdev_id(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id);
/**
* mlme_get_discon_reason_n_from_ap() - Get disconnect reason and from ap flag
* @psoc: PSOC pointer

View file

@ -2704,6 +2704,26 @@ void mlme_set_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
}
enum QDF_OPMODE wlan_get_opmode_from_vdev_id(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id)
{
struct wlan_objmgr_vdev *vdev;
enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE;
if (!pdev)
return opmode;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
WLAN_LEGACY_MAC_ID);
if (!vdev)
return opmode;
opmode = wlan_vdev_mlme_get_opmode(vdev);
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
return opmode;
}
void mlme_get_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, bool *from_ap,
uint32_t *reason_code)

View file

@ -2179,25 +2179,20 @@ sme_is_twt_teardown_failed(enum WMI_HOST_DEL_TWT_STATUS teardown_status)
return false;
}
/**
* sme_process_twt_del_dialog_event() - Process twt del dialog event
* response from firmware
* @mac: Global MAC pointer
* @param: pointer to wmi_twt_del_dialog_complete_event_param buffer
*
* Return: None
*/
static void
sme_process_twt_del_dialog_event(struct mac_context *mac,
struct wmi_twt_del_dialog_complete_event_param *param)
sme_process_sta_twt_del_dialog_event(
struct mac_context *mac,
struct wmi_twt_del_dialog_complete_event_param *param)
{
twt_del_dialog_cb callback;
bool is_evt_allowed;
enum wlan_twt_commands active_cmd = WLAN_TWT_NONE;
is_evt_allowed = mlme_twt_is_command_in_progress(
mac->psoc, (struct qdf_mac_addr *)param->peer_macaddr,
param->dialog_id, WLAN_TWT_TERMINATE, &active_cmd);
mac->psoc, (struct qdf_mac_addr *)
param->peer_macaddr, param->dialog_id,
WLAN_TWT_TERMINATE, &active_cmd);
if (!is_evt_allowed &&
param->dialog_id != WLAN_ALL_SESSIONS_DIALOG_ID &&
param->status != WMI_HOST_DEL_TWT_STATUS_ROAMING &&
@ -2205,6 +2200,7 @@ sme_process_twt_del_dialog_event(struct mac_context *mac,
param->status != WMI_HOST_DEL_TWT_STATUS_CONCURRENCY) {
sme_debug("Drop TWT Del dialog event for dialog_id:%d status:%d active_cmd:%d",
param->dialog_id, param->status, active_cmd);
return;
}
@ -2214,28 +2210,67 @@ sme_process_twt_del_dialog_event(struct mac_context *mac,
if (param->status == WMI_HOST_DEL_TWT_STATUS_ROAMING ||
param->status == WMI_HOST_DEL_TWT_STATUS_CONCURRENCY)
mlme_twt_set_wait_for_notify(
mac->psoc, param->vdev_id, true);
mlme_twt_set_wait_for_notify(mac->psoc, param->vdev_id, true);
/* Reset the active TWT command to none */
mlme_set_twt_command_in_progress(
mac->psoc, (struct qdf_mac_addr *)param->peer_macaddr,
param->dialog_id, WLAN_TWT_NONE);
mlme_set_twt_command_in_progress(mac->psoc, (struct qdf_mac_addr *)
param->peer_macaddr, param->dialog_id,
WLAN_TWT_NONE);
if (sme_is_twt_teardown_failed(param->status))
return;
ucfg_mlme_set_twt_setup_done(mac->psoc, (struct qdf_mac_addr *)
param->peer_macaddr,
param->dialog_id, false);
param->peer_macaddr, param->dialog_id,
false);
ucfg_mlme_set_twt_session_state(
mac->psoc, (struct qdf_mac_addr *)param->peer_macaddr,
param->dialog_id, WLAN_TWT_SETUP_STATE_NOT_ESTABLISHED);
ucfg_mlme_set_twt_session_state(mac->psoc, (struct qdf_mac_addr *)
param->peer_macaddr, param->dialog_id,
WLAN_TWT_SETUP_STATE_NOT_ESTABLISHED);
mlme_init_twt_context(mac->psoc, (struct qdf_mac_addr *)
param->peer_macaddr,
param->dialog_id);
param->peer_macaddr, param->dialog_id);
}
/**
* sme_process_twt_del_dialog_event() - Process twt del dialog event
* response from firmware
* @mac: Global MAC pointer
* @param: pointer to wmi_twt_del_dialog_complete_event_param buffer
*
* Return: None
*/
static void
sme_process_twt_del_dialog_event(
struct mac_context *mac,
struct wmi_twt_del_dialog_complete_event_param *param)
{
twt_del_dialog_cb callback;
enum QDF_OPMODE opmode;
QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
opmode = wlan_get_opmode_from_vdev_id(mac->pdev, param->vdev_id);
qdf_status = sme_acquire_global_lock(&mac->sme);
if (QDF_IS_STATUS_ERROR(qdf_status))
return;
switch (opmode) {
case QDF_SAP_MODE:
callback = mac->sme.twt_del_dialog_cb;
if (callback)
callback(mac->psoc, param);
break;
case QDF_STA_MODE:
sme_process_sta_twt_del_dialog_event(mac, param);
break;
default:
sme_debug("TWT Teardown is not supported on %s",
qdf_opmode_str(opmode));
}
sme_release_global_lock(&mac->sme);
return;
}
/**
@ -2355,8 +2390,9 @@ sme_process_twt_add_dialog_event(struct mac_context *mac,
}
static void
sme_process_twt_del_dialog_event(struct mac_context *mac,
struct wmi_twt_del_dialog_complete_event_param *param)
sme_process_twt_del_dialog_event(
struct mac_context *mac,
struct wmi_twt_del_dialog_complete_event_param *param)
{
}