qcacld-3.0: Update peer twt required bit based on TWT notify

when firmware sends TWT notify event with status
HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR or
HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET.
Host will check the peer TWT required bit and take the
following action:
1. If fw sends HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR then
host will dynamically change the peer twt required bit as 0.
2. If fw sends HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET then
host will dynamically change the peer twt required bit as 1.

Change-Id: Ia72aab685adf5b56f674e21ceedc2c498930403c
CRs-Fixed: 3163826
Cette révision appartient à :
Deeksha Gupta
2022-04-13 16:50:39 +05:30
révisé par Madan Koyyalamudi
Parent 134a569261
révision 0cfc1baee3

Voir le fichier

@@ -239,6 +239,55 @@ wlan_twt_set_wait_for_notify(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS
wlan_twt_update_peer_twt_required_bit(struct wlan_objmgr_psoc *psoc,
struct twt_notify_event_param *event)
{
struct wlan_objmgr_vdev *vdev;
struct qdf_mac_addr peer_mac;
uint8_t peer_cap = 0;
QDF_STATUS status;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, event->vdev_id,
WLAN_TWT_ID);
if (!vdev) {
twt_err("vdev object not found");
return QDF_STATUS_E_INVAL;
}
status = wlan_vdev_get_bss_peer_mac(vdev, &peer_mac);
if (QDF_IS_STATUS_ERROR(status)) {
twt_err("Failed to get bssid");
goto exit;
}
status = wlan_twt_get_peer_capabilities(psoc, &peer_mac, &peer_cap);
if (QDF_IS_STATUS_ERROR(status)) {
twt_err("twt failed to get peer capabilities");
goto exit;
}
if ((peer_cap & WLAN_TWT_CAPA_REQUIRED) &&
event->status == HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_CLEAR) {
/* set TWT required bit as 0 */
peer_cap &= ~WLAN_TWT_CAPA_REQUIRED;
} else if (!(peer_cap & WLAN_TWT_CAPA_REQUIRED) &&
event->status == HOST_TWT_NOTIFY_EVENT_AP_TWT_REQ_BIT_SET) {
/* set TWT required bit as 1 */
peer_cap |= WLAN_TWT_CAPA_REQUIRED;
}
status = wlan_twt_set_peer_capabilities(psoc, &peer_mac, peer_cap);
twt_debug("Update Peer TWT capabilities: %d", peer_cap);
exit:
wlan_objmgr_vdev_release_ref(vdev, WLAN_TWT_ID);
return status;
}
/**
* wlan_twt_util_cmd_in_progress() - for a given peer_priv, check if the
* given command is in progress
@@ -2067,8 +2116,18 @@ QDF_STATUS
wlan_twt_notify_event_handler(struct wlan_objmgr_psoc *psoc,
struct twt_notify_event_param *event)
{
QDF_STATUS status;
if (event->status == HOST_TWT_NOTIFY_EVENT_READY)
wlan_twt_set_wait_for_notify(psoc, event->vdev_id, false);
status = wlan_twt_set_wait_for_notify(psoc, event->vdev_id,
false);
else
status = wlan_twt_update_peer_twt_required_bit(psoc, event);
if (QDF_IS_STATUS_ERROR(status)) {
twt_err("failed to get status");
return status;
}
mlme_twt_osif_notify_complete_ind(psoc, event);