diff options
author | Thomson Kang <thomson.kang@broadcom.com> | 2021-01-11 05:23:30 -0800 |
---|---|---|
committer | Ahmed ElArabawy <arabawy@google.com> | 2021-01-28 00:24:14 +0000 |
commit | 14295c01689f4e9942e6a14d0bddc4655cce50c6 (patch) | |
tree | 4533ca6307b87082a2f0cb5c37ae9573c44bea64 | |
parent | c0c1633870dd7fa70c66844696e2fb40c4bce194 (diff) | |
download | wlan-14295c01689f4e9942e6a14d0bddc4655cce50c6.tar.gz |
hal: Adding wifi_set_dtim_config (DTIM config with IPv6 and IPv4 networks when the screen is off)
issue)
1. This issue happened due to bcn_li_dtim set to 9 after screen off.
2. Disconnected the network because STA missed RA by the large bcn_li_dtim in IPv6 only networks.
Conclusion of this issue)
Added the DTIM multiplier config code for setting the different dtim config between IPv4 and IPv6 network.
Bug: 170678227
Test: Verified with halutil command
Change-Id: I8625d2448e64ceaedeb42aa2aa18c98b724dd3e9
-rwxr-xr-x | bcmdhd/wifi_hal/common.h | 2 | ||||
-rwxr-xr-x | bcmdhd/wifi_hal/wifi_hal.cpp | 41 |
2 files changed, 43 insertions, 0 deletions
diff --git a/bcmdhd/wifi_hal/common.h b/bcmdhd/wifi_hal/common.h index c7f86a2..e83f6be 100755 --- a/bcmdhd/wifi_hal/common.h +++ b/bcmdhd/wifi_hal/common.h @@ -175,6 +175,7 @@ typedef enum { WIFI_SUBCMD_SET_LATENCY_MODE, /* 0x101b */ WIFI_SUBCMD_SET_MULTISTA_PRIMARY_CONNECTION, /* 0x101c */ WIFI_SUBCMD_SET_MULTISTA_USE_CASE, /* 0x101d */ + WIFI_SUBCMD_SET_DTIM_CONFIG, /* 0x101e */ GSCAN_SUBCMD_MAX, @@ -442,6 +443,7 @@ wifi_error wifi_virtual_interface_delete(wifi_handle handle, const char* ifname) wifi_error wifi_set_coex_unsafe_channels(wifi_handle handle, u32 num_channels, wifi_coex_unsafe_channel channels[], u32 restrictions); wifi_error wifi_set_voip_mode(wifi_interface_handle handle, wifi_voip_mode mode); +wifi_error wifi_set_dtim_config(wifi_interface_handle handle, u32 multiplier); void set_hautil_mode(bool halutil_mode); bool get_halutil_mode(); diff --git a/bcmdhd/wifi_hal/wifi_hal.cpp b/bcmdhd/wifi_hal/wifi_hal.cpp index 54ed37e..5cf0fcc 100755 --- a/bcmdhd/wifi_hal/wifi_hal.cpp +++ b/bcmdhd/wifi_hal/wifi_hal.cpp @@ -108,6 +108,7 @@ typedef enum wifi_attr { ANDR_WIFI_ATTRIBUTE_THERMAL_MITIGATION = 11, ANDR_WIFI_ATTRIBUTE_THERMAL_COMPLETION_WINDOW = 12, ANDR_WIFI_ATTRIBUTE_VOIP_MODE = 13, + ANDR_WIFI_ATTRIBUTE_DTIM_MULTIPLIER = 14, // Add more attribute here ANDR_WIFI_ATTRIBUTE_MAX } wifi_attr_t; @@ -313,6 +314,7 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn) fn->wifi_multi_sta_set_primary_connection = wifi_multi_sta_set_primary_connection; fn->wifi_multi_sta_set_use_case = wifi_multi_sta_set_use_case; fn->wifi_set_voip_mode = wifi_set_voip_mode; + fn->wifi_set_dtim_config = wifi_set_dtim_config; return WIFI_SUCCESS; } @@ -2667,3 +2669,42 @@ wifi_error wifi_set_voip_mode(wifi_interface_handle handle, wifi_voip_mode mode) SetVoipModeCommand command(handle, mode); return (wifi_error) command.requestResponse(); } + +///////////////////////////////////////////////////////////////////////////////////////////////// +class SetDtimConfigCommand : public WifiCommand { + +private: + uint32_t multiplier; +public: + SetDtimConfigCommand(wifi_interface_handle handle, u32 dtim_multiplier) + : WifiCommand("SetDtimConfigCommand", handle, 0) { + multiplier = dtim_multiplier; + } + virtual int create() { + int ret; + + ret = mMsg.create(GOOGLE_OUI, WIFI_SUBCMD_SET_DTIM_CONFIG); + if (ret < 0) { + ALOGE("Can't create message to send to driver - %d", ret); + return ret; + } + + nlattr *data = mMsg.attr_start(NL80211_ATTR_VENDOR_DATA); + ret = mMsg.put_u32(ANDR_WIFI_ATTRIBUTE_DTIM_MULTIPLIER, multiplier); + if (ret < 0) { + ALOGE("Failed to set dtim mutiplier %d\n", multiplier); + return ret; + } + + ALOGI("Successfully configured dtim multiplier %d\n", multiplier); + mMsg.attr_end(data); + return WIFI_SUCCESS; + } +}; + +wifi_error wifi_set_dtim_config(wifi_interface_handle handle, u32 multiplier) +{ + ALOGD("Setting DTIM config , halHandle = %p Multiplier = %d\n", handle, multiplier); + SetDtimConfigCommand command(handle, multiplier); + return (wifi_error) command.requestResponse(); +} |