diff --git a/core/hdd/src/wlan_hdd_twt.c b/core/hdd/src/wlan_hdd_twt.c index 4ee15adf1bba..b23e69fbeb82 100644 --- a/core/hdd/src/wlan_hdd_twt.c +++ b/core/hdd/src/wlan_hdd_twt.c @@ -66,6 +66,7 @@ qca_wlan_vendor_twt_add_dialog_policy[QCA_WLAN_VENDOR_ATTR_TWT_SETUP_MAX + 1] = [QCA_WLAN_VENDOR_ATTR_TWT_SETUP_MAX_WAKE_DURATION] = {.type = NLA_U32 }, [QCA_WLAN_VENDOR_ATTR_TWT_SETUP_MIN_WAKE_INTVL] = {.type = NLA_U32 }, [QCA_WLAN_VENDOR_ATTR_TWT_SETUP_MAX_WAKE_INTVL] = {.type = NLA_U32 }, + [QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL2_MANTISSA] = {.type = NLA_U32 }, }; static const struct nla_policy @@ -231,6 +232,16 @@ int hdd_twt_get_add_dialog_values(struct nlattr **tb, return -EINVAL; } params->wake_intvl_mantis = nla_get_u32(tb[cmd_id]); + + /* + * If mantissa in microsecond is present then take precedence over + * mantissa in TU. And send mantissa in microsecond to firmware. + */ + cmd_id = QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL2_MANTISSA; + if (tb[cmd_id]) { + params->wake_intvl_mantis = nla_get_u32(tb[cmd_id]); + } + if (params->wake_intvl_mantis > TWT_SETUP_WAKE_INTVL_MANTISSA_MAX) { hdd_err_rl("Invalid wake_intvl_mantis %u", @@ -497,7 +508,7 @@ hdd_twt_pack_get_params_resp_nlmsg(struct wlan_objmgr_psoc *psoc, enum qca_wlan_twt_setup_state converted_state; uint64_t tsf_val; uint32_t wake_duration; - uint32_t wake_intvl_mantis_tu; + uint32_t wake_intvl_mantis_us, wake_intvl_mantis_tu; int i, attr; config_attr = nla_nest_start(reply_skb, @@ -581,6 +592,12 @@ hdd_twt_pack_get_params_resp_nlmsg(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_INVAL; } + wake_intvl_mantis_us = params[i].wake_intvl_us; + attr = QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL2_MANTISSA; + if (nla_put_u32(reply_skb, attr, wake_intvl_mantis_us)) { + hdd_err("TWT: get_params failed to put Wake Interval in us"); + return QDF_STATUS_E_INVAL; + } wake_intvl_mantis_tu = params[i].wake_intvl_us / TWT_WAKE_INTVL_MULTIPLICATION_FACTOR; attr = QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL_MANTISSA; @@ -589,6 +606,9 @@ hdd_twt_pack_get_params_resp_nlmsg(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_E_INVAL; } + hdd_debug("TWT: Send mantissa_us:%d, mantissa_tu:%d to userspace", + wake_intvl_mantis_us, wake_intvl_mantis_tu); + attr = QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL_EXP; if (nla_put_u8(reply_skb, attr, 0)) { hdd_err("TWT: get_params put Wake Interval Exp failed"); @@ -1063,7 +1083,7 @@ hdd_twt_setup_pack_resp_nlmsg(struct sk_buff *reply_skb, enum qca_wlan_vendor_twt_status vendor_status; int response_type; uint32_t wake_duration; - uint32_t wake_intvl_mantissa_tu; + uint32_t wake_intvl_mantis_us, wake_intvl_mantis_tu; hdd_enter(); @@ -1128,15 +1148,24 @@ hdd_twt_setup_pack_resp_nlmsg(struct sk_buff *reply_skb, return QDF_STATUS_E_FAILURE; } - wake_intvl_mantissa_tu = (event->additional_params.wake_intvl_us / + wake_intvl_mantis_us = event->additional_params.wake_intvl_us; + if (nla_put_u32(reply_skb, + QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL2_MANTISSA, + wake_intvl_mantis_us)) { + hdd_err("TWT: Failed to put wake interval mantissa in us"); + return QDF_STATUS_E_FAILURE; + } + + wake_intvl_mantis_tu = (event->additional_params.wake_intvl_us / TWT_WAKE_INTVL_MULTIPLICATION_FACTOR); if (nla_put_u32(reply_skb, QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL_MANTISSA, - wake_intvl_mantissa_tu)) { - hdd_err("TWT: Failed to put wake interval us"); + wake_intvl_mantis_tu)) { + hdd_err("TWT: Failed to put wake interval mantissa in tu"); return QDF_STATUS_E_FAILURE; } - hdd_debug("wake_intvl_mantissa in TU %d", wake_intvl_mantissa_tu); + hdd_debug("TWT: Send mantissa_us:%d, mantissa_tu:%d to userspace", + wake_intvl_mantis_us, wake_intvl_mantis_tu); if (nla_put_u8(reply_skb, QCA_WLAN_VENDOR_ATTR_TWT_SETUP_WAKE_INTVL_EXP, 0)) {