Commit 01d2ffa4 authored by Jérôme Pouiller's avatar Jérôme Pouiller Committed by Greg Kroah-Hartman
Browse files

staging: wfx: add a debugfs entry to force ps_timeout



In some advanced usage or debug scenarios, it could interesting to
change the value of ps_timeout or eventually to force use of PS-Poll
frames.

The wext API (used by iwconfig) provide a way to change ps_timeout.
However, this API is obsolete and it seems a little weird to use (it
seems it does apply the change, so the user have to disable then
re-enable de power save)

On side of nl80211, there is no way to change the ps_timeout.

This patch provides a file in debugfs to change the value of ps_timeout.

Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200701150707.222985-13-Jerome.Pouiller@silabs.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e5da5fbd
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -334,6 +334,28 @@ static const struct file_operations wfx_send_hif_msg_fops = {
	.read = wfx_send_hif_msg_read,
};

static int wfx_ps_timeout_set(void *data, u64 val)
{
	struct wfx_dev *wdev = (struct wfx_dev *)data;
	struct wfx_vif *wvif;

	wdev->force_ps_timeout = val;
	wvif = NULL;
	while ((wvif = wvif_iterate(wdev, wvif)) != NULL)
		wfx_update_pm(wvif);
	return 0;
}

static int wfx_ps_timeout_get(void *data, u64 *val)
{
	struct wfx_dev *wdev = (struct wfx_dev *)data;

	*val = wdev->force_ps_timeout;
	return 0;
}

DEFINE_DEBUGFS_ATTRIBUTE(wfx_ps_timeout_fops, wfx_ps_timeout_get, wfx_ps_timeout_set, "%lld\n");

int wfx_debug_init(struct wfx_dev *wdev)
{
	struct dentry *d;
@@ -348,6 +370,7 @@ int wfx_debug_init(struct wfx_dev *wdev)
			    &wfx_burn_slk_key_fops);
	debugfs_create_file("send_hif_msg", 0600, d, wdev,
			    &wfx_send_hif_msg_fops);
	debugfs_create_file("ps_timeout", 0600, d, wdev, &wfx_ps_timeout_fops);

	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -352,6 +352,7 @@ struct wfx_dev *wfx_init_common(struct device *dev,
	skb_queue_head_init(&wdev->tx_pending);
	init_waitqueue_head(&wdev->tx_dequeue);
	wfx_init_hif_cmd(&wdev->hif_cmd);
	wdev->force_ps_timeout = -1;

	if (devm_add_action_or_reset(dev, wfx_free_common, wdev))
		return NULL;
+7 −3
Original line number Diff line number Diff line
@@ -217,20 +217,24 @@ static int wfx_get_ps_timeout(struct wfx_vif *wvif, bool *enable_ps)
		// are differents.
		if (enable_ps)
			*enable_ps = true;
		if (wvif->bss_not_support_ps_poll)
		if (wvif->wdev->force_ps_timeout > -1)
			return wvif->wdev->force_ps_timeout;
		else if (wvif->bss_not_support_ps_poll)
			return 30;
		else
			return 0;
	}
	if (enable_ps)
		*enable_ps = wvif->vif->bss_conf.ps;
	if (wvif->vif->bss_conf.assoc && wvif->vif->bss_conf.ps)
	if (wvif->wdev->force_ps_timeout > -1)
		return wvif->wdev->force_ps_timeout;
	else if (wvif->vif->bss_conf.assoc && wvif->vif->bss_conf.ps)
		return conf->dynamic_ps_timeout;
	else
		return -1;
}

static int wfx_update_pm(struct wfx_vif *wvif)
int wfx_update_pm(struct wfx_vif *wvif)
{
	int ps_timeout;
	bool ps;
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ void wfx_cooling_timeout_work(struct work_struct *work);
void wfx_suspend_hot_dev(struct wfx_dev *wdev, enum sta_notify_cmd cmd);
void wfx_suspend_resume_mc(struct wfx_vif *wvif, enum sta_notify_cmd cmd);
void wfx_event_report_rssi(struct wfx_vif *wvif, u8 raw_rcpi_rssi);
int wfx_update_pm(struct wfx_vif *wvif);

// Other Helpers
void wfx_reset(struct wfx_vif *wvif);
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ struct wfx_dev {
	struct mutex		rx_stats_lock;
	struct hif_tx_power_loop_info tx_power_loop_info;
	struct mutex		tx_power_loop_info_lock;
	int			force_ps_timeout;
};

struct wfx_vif {