Commit bdef1bad authored by Ajay Parida's avatar Ajay Parida Committed by Carles Cufi
Browse files

net: wifi_mgmt: Configure ps wakeup mode



'ps_wakeup_mode' is used to set the wake up interval
to either 'dtim or 'listen_interval'. By default the
sta wakes up every dtim interval.
With 'ps_wakeup_mode' set to 'listen_interval' sta
will wake up for every listen interval period configured.

Signed-off-by: default avatarAjay Parida <ajay.parida@nordicsemi.no>
parent 68403669
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -380,5 +380,16 @@ static inline const char *get_twt_err_code_str(int16_t err_no)
enum ps_param_type {
        WIFI_PS_PARAM_STATE,
	WIFI_PS_PARAM_LISTEN_INTERVAL,
	WIFI_PS_PARAM_WAKEUP_MODE,
};

enum wifi_ps_wakeup_mode {
	WIFI_PS_WAKEUP_MODE_DTIM = 0,
	WIFI_PS_WAKEUP_MODE_LISTEN_INTERVAL,
};

static const char * const wifi_ps_wakeup_mode2str[] = {
	[WIFI_PS_WAKEUP_MODE_DTIM] = "PS wakeup mode DTIM",
	[WIFI_PS_WAKEUP_MODE_LISTEN_INTERVAL] = "PS wakeup mode listen interval",
};
#endif /* ZEPHYR_INCLUDE_NET_WIFI_H_ */
+1 −0
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ struct wifi_iface_status {
struct wifi_ps_params {
	enum wifi_ps enabled;
	unsigned short listen_interval;
	enum wifi_ps_wakeup_mode wakeup_mode;
	enum ps_param_type type;
};

+1 −0
Original line number Diff line number Diff line
@@ -240,6 +240,7 @@ static int wifi_set_power_save(uint32_t mgmt_request, struct net_if *iface,
		}
                break;
        case WIFI_PS_PARAM_STATE:
        case WIFI_PS_PARAM_WAKEUP_MODE:
        default:
                break;
        }
+41 −0
Original line number Diff line number Diff line
@@ -491,6 +491,9 @@ static int cmd_wifi_ps(const struct shell *sh, size_t argc, char *argv[])
		shell_fprintf(sh, SHELL_NORMAL, "PS listen_interval: %d\n",
				config.ps_params.listen_interval);

		shell_fprintf(sh, SHELL_NORMAL, "PS wake up mode: %s\n",
				config.ps_params.wakeup_mode ? "Listen interval" : "DTIM");

		if (config.num_twt_flows == 0) {
			shell_fprintf(sh, SHELL_NORMAL, "No TWT flows\n");
		} else {
@@ -905,6 +908,37 @@ static int cmd_wifi_listen_interval(const struct shell *sh, size_t argc, char *a
	return 0;
}

static int cmd_wifi_ps_wakeup_mode(const struct shell *sh, size_t argc, char *argv[])
{
	struct net_if *iface = net_if_get_default();
	struct wifi_ps_params params = { 0 };

	context.sh = sh;

	if (!strncmp(argv[1], "dtim", 4)) {
		params.wakeup_mode = WIFI_PS_WAKEUP_MODE_DTIM;
	} else if (!strncmp(argv[1], "listen_interval", 15)) {
		params.wakeup_mode = WIFI_PS_WAKEUP_MODE_LISTEN_INTERVAL;
	} else {
		shell_fprintf(sh, SHELL_WARNING, "Invalid argument\n");
		shell_fprintf(sh, SHELL_INFO,
			      "Valid argument : <dtim> / <listen_interval>\n");
		return -ENOEXEC;
	}

	params.type = WIFI_PS_PARAM_WAKEUP_MODE;

	if (net_mgmt(NET_REQUEST_WIFI_PS, iface, &params, sizeof(params))) {
		shell_fprintf(sh, SHELL_WARNING, "Setting PS wake up mode to %s failed\n",
			params.wakeup_mode ? "Listen interval" : "DTIM interval");
		return -ENOEXEC;
	}

	shell_fprintf(sh, SHELL_NORMAL, "%s\n",
		      wifi_ps_wakeup_mode2str[params.wakeup_mode]);

	return 0;
}

SHELL_STATIC_SUBCMD_SET_CREATE(wifi_cmd_ap,
	SHELL_CMD(disable, NULL,
@@ -972,6 +1006,13 @@ SHELL_STATIC_SUBCMD_SET_CREATE(wifi_commands,
		      cmd_wifi_listen_interval,
		      2,
		      0),
	SHELL_CMD_ARG(ps_wakeup_mode,
		     NULL,
		     "<dtim> : Set PS wake up mode to DTIM interval\n"
		     "<listen_interval> : Set PS wake up mode to listen interval",
		     cmd_wifi_ps_wakeup_mode,
		     2,
		     0),
	SHELL_SUBCMD_SET_END
);