net: wifi_mgmt: Add support for power save timeout configuration

Add support for configuring power save timeout in Wi-Fi chipsets.
Changes to configure power save inactivity timer.

Signed-off-by: Ajay Parida <ajay.parida@nordicsemi.no>
This commit is contained in:
Ajay Parida 2023-01-16 18:17:05 +05:30 committed by Fabio Baltieri
commit ba39235275
3 changed files with 70 additions and 0 deletions

View file

@ -41,6 +41,7 @@ enum net_request_wifi_cmd {
NET_REQUEST_WIFI_CMD_TWT, NET_REQUEST_WIFI_CMD_TWT,
NET_REQUEST_WIFI_CMD_PS_CONFIG, NET_REQUEST_WIFI_CMD_PS_CONFIG,
NET_REQUEST_WIFI_CMD_REG_DOMAIN, NET_REQUEST_WIFI_CMD_REG_DOMAIN,
NET_REQUEST_WIFI_CMD_PS_TIMEOUT,
}; };
#define NET_REQUEST_WIFI_SCAN \ #define NET_REQUEST_WIFI_SCAN \
@ -97,6 +98,11 @@ NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_WIFI_PS_CONFIG);
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_WIFI_REG_DOMAIN); NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_WIFI_REG_DOMAIN);
#define NET_REQUEST_WIFI_PS_TIMEOUT \
(_NET_WIFI_BASE | NET_REQUEST_WIFI_CMD_PS_TIMEOUT)
NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_WIFI_PS_TIMEOUT);
enum net_event_wifi_cmd { enum net_event_wifi_cmd {
NET_EVENT_WIFI_CMD_SCAN_RESULT = 1, NET_EVENT_WIFI_CMD_SCAN_RESULT = 1,
NET_EVENT_WIFI_CMD_SCAN_DONE, NET_EVENT_WIFI_CMD_SCAN_DONE,
@ -184,6 +190,10 @@ struct wifi_ps_mode_params {
enum wifi_ps_mode mode; enum wifi_ps_mode mode;
}; };
struct wifi_ps_timeout_params {
int timeout_ms;
};
struct wifi_twt_params { struct wifi_twt_params {
enum wifi_twt_operation operation; enum wifi_twt_operation operation;
enum wifi_twt_negotiation_type negotiation_type; enum wifi_twt_negotiation_type negotiation_type;
@ -287,6 +297,8 @@ struct net_wifi_mgmt_offload {
int (*set_twt)(const struct device *dev, struct wifi_twt_params *params); int (*set_twt)(const struct device *dev, struct wifi_twt_params *params);
int (*get_power_save_config)(const struct device *dev, struct wifi_ps_config *config); int (*get_power_save_config)(const struct device *dev, struct wifi_ps_config *config);
int (*reg_domain)(const struct device *dev, struct wifi_reg_domain *reg_domain); int (*reg_domain)(const struct device *dev, struct wifi_reg_domain *reg_domain);
int (*set_power_save_timeout)(const struct device *dev,
struct wifi_ps_timeout_params *ps_timeout);
}; };
/* Make sure that the network interface API is properly setup inside /* Make sure that the network interface API is properly setup inside

View file

@ -314,3 +314,24 @@ static int wifi_reg_domain(uint32_t mgmt_request, struct net_if *iface,
} }
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_REG_DOMAIN, wifi_reg_domain); NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_REG_DOMAIN, wifi_reg_domain);
static int wifi_set_power_save_timeout(uint32_t mgmt_request, struct net_if *iface,
void *data, size_t len)
{
const struct device *dev = net_if_get_device(iface);
struct net_wifi_mgmt_offload *off_api =
(struct net_wifi_mgmt_offload *) dev->api;
struct wifi_ps_timeout_params *ps_timeout = data;
if (off_api == NULL || off_api->set_power_save_timeout == NULL) {
return -ENOTSUP;
}
if (!data || len != sizeof(*ps_timeout)) {
return -EINVAL;
}
return off_api->set_power_save_timeout(dev, ps_timeout);
}
NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_WIFI_PS_TIMEOUT, wifi_set_power_save_timeout);

View file

@ -531,6 +531,40 @@ static int cmd_wifi_ps_mode(const struct shell *sh, size_t argc, char *argv[])
return 0; return 0;
} }
static int cmd_wifi_ps_timeout(const struct shell *sh, size_t argc, char *argv[])
{
struct net_if *iface = net_if_get_default();
struct wifi_ps_timeout_params params = { 0 };
long timeout_ms = 0;
int err = 0;
context.sh = sh;
if (argc != 2) {
shell_fprintf(sh, SHELL_WARNING, "Invalid number of arguments\n");
return -ENOEXEC;
}
timeout_ms = shell_strtol(argv[1], 10, &err);
if (err) {
shell_error(sh, "Unable to parse input (err %d)", err);
return err;
}
params.timeout_ms = timeout_ms;
if (net_mgmt(NET_REQUEST_WIFI_PS_TIMEOUT, iface, &params, sizeof(params))) {
shell_fprintf(sh, SHELL_WARNING, "Setting power save timeout failed\n");
return -ENOEXEC;
}
shell_fprintf(sh, SHELL_NORMAL,
"Power save timeout %d ms\n", params.timeout_ms);
return 0;
}
static int cmd_wifi_twt_setup_quick(const struct shell *sh, size_t argc, static int cmd_wifi_twt_setup_quick(const struct shell *sh, size_t argc,
char *argv[]) char *argv[])
{ {
@ -853,6 +887,9 @@ SHELL_STATIC_SUBCMD_SET_CREATE(wifi_commands,
"-f: Force to use this regulatory hint over any other regulatory hints\n" "-f: Force to use this regulatory hint over any other regulatory hints\n"
"Note: This may cause regulatory compliance issues, use it at your own risk.", "Note: This may cause regulatory compliance issues, use it at your own risk.",
cmd_wifi_reg_domain), cmd_wifi_reg_domain),
SHELL_CMD(ps_timeout, NULL,
"Configure Wi-Fi power save inactivity timer(in ms)",
cmd_wifi_ps_timeout),
SHELL_SUBCMD_SET_END SHELL_SUBCMD_SET_END
); );