diff mbox series

[v2,2/2] rtw88: add a debugfs entry to enable/disable coex mechanism

Message ID 20200309075852.11454-3-yhchuang@realtek.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show
Series rtw88: add coex related debugfs | expand

Commit Message

Tony Chuang March 9, 2020, 7:58 a.m. UTC
From: Yan-Hsuan Chuang <yhchuang@realtek.com>

Sometimes we need to stop the coex mechanism to debug, so that we
can manually control the device through various outer commands.
Hence, add a new debugfs coex_enable to allow us to enable/disable
the coex mechanism when driver is running.

To disable coex
echo 0 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable

To enable coex
echo 1 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable

To check coex dm is enabled or not
cat /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
---

v1 -> v2
 * no change

 drivers/net/wireless/realtek/rtw88/debug.c | 46 ++++++++++++++++++++++
 1 file changed, 46 insertions(+)

Comments

Kalle Valo March 12, 2020, 1:25 p.m. UTC | #1
<yhchuang@realtek.com> writes:

> From: Yan-Hsuan Chuang <yhchuang@realtek.com>
>
> Sometimes we need to stop the coex mechanism to debug, so that we
> can manually control the device through various outer commands.
> Hence, add a new debugfs coex_enable to allow us to enable/disable
> the coex mechanism when driver is running.
>
> To disable coex
> echo 0 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
>
> To enable coex
> echo 1 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
>
> To check coex dm is enabled or not
> cat /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable

I forgot, did we add a command to nl80211 for managing btcoex? At least
we have talking about that for years. Please check that first before
adding a debugfs interface for this.
Tony Chuang March 13, 2020, 2:23 a.m. UTC | #2
Kalle Valo <kvalo@codeaurora.org> :

> <yhchuang@realtek.com> writes:
> 
> > From: Yan-Hsuan Chuang <yhchuang@realtek.com>
> >
> > Sometimes we need to stop the coex mechanism to debug, so that we
> > can manually control the device through various outer commands.
> > Hence, add a new debugfs coex_enable to allow us to enable/disable
> > the coex mechanism when driver is running.
> >
> > To disable coex
> > echo 0 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >
> > To enable coex
> > echo 1 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >
> > To check coex dm is enabled or not
> > cat /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> 
> I forgot, did we add a command to nl80211 for managing btcoex? At least
> we have talking about that for years. Please check that first before
> adding a debugfs interface for this.
> 

Yes, I found there was a thread [1] talking about adding a callback to
enable/disable btcoex, but it seems not get applied eventually.

And there's another thread [2] talking about add a btcoex subsystem.
But seems like nobody can implement it cleanly in the host.

I think adding btcoex subsystem could have a lot of pain since each
vendor is using different mechanism controlling the btcoex, and it
usually comes with RF related design which is difficult to write a common
function to deal with all kinds of them.

Yen-Hsuan

[1] https://patchwork.kernel.org/patch/10252135/
[2] https://www.spinics.net/lists/linux-wireless/msg133333.html
Kalle Valo March 13, 2020, 11:17 a.m. UTC | #3
Tony Chuang <yhchuang@realtek.com> writes:

> Kalle Valo <kvalo@codeaurora.org> :
>
>> <yhchuang@realtek.com> writes:
>> 
>> > From: Yan-Hsuan Chuang <yhchuang@realtek.com>
>> >
>> > Sometimes we need to stop the coex mechanism to debug, so that we
>> > can manually control the device through various outer commands.
>> > Hence, add a new debugfs coex_enable to allow us to enable/disable
>> > the coex mechanism when driver is running.
>> >
>> > To disable coex
>> > echo 0 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
>> >
>> > To enable coex
>> > echo 1 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
>> >
>> > To check coex dm is enabled or not
>> > cat /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
>> 
>> I forgot, did we add a command to nl80211 for managing btcoex? At least
>> we have talking about that for years. Please check that first before
>> adding a debugfs interface for this.
>> 
>
> Yes, I found there was a thread [1] talking about adding a callback to
> enable/disable btcoex, but it seems not get applied eventually.

Too bad, I really think we should have at least enable/disable
functionality in nl80211. But if it's not there, I guess it's ok to have
yet another driver custom debugfs file :/

> And there's another thread [2] talking about add a btcoex subsystem.
> But seems like nobody can implement it cleanly in the host.
>
> I think adding btcoex subsystem could have a lot of pain since each
> vendor is using different mechanism controlling the btcoex, and it
> usually comes with RF related design which is difficult to write a common
> function to deal with all kinds of them.

Yeah, btcoex subsystem is a big challenge.
Tony Chuang March 16, 2020, 2:13 a.m. UTC | #4
Kalle Valo <kvalo@codeaurora.org> writes:

> Tony Chuang <yhchuang@realtek.com> writes:
> 
> > Kalle Valo <kvalo@codeaurora.org> :
> >
> >> <yhchuang@realtek.com> writes:
> >>
> >> > From: Yan-Hsuan Chuang <yhchuang@realtek.com>
> >> >
> >> > Sometimes we need to stop the coex mechanism to debug, so that we
> >> > can manually control the device through various outer commands.
> >> > Hence, add a new debugfs coex_enable to allow us to enable/disable
> >> > the coex mechanism when driver is running.
> >> >
> >> > To disable coex
> >> > echo 0 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >> >
> >> > To enable coex
> >> > echo 1 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >> >
> >> > To check coex dm is enabled or not
> >> > cat /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >>
> >> I forgot, did we add a command to nl80211 for managing btcoex? At least
> >> we have talking about that for years. Please check that first before
> >> adding a debugfs interface for this.
> >>
> >
> > Yes, I found there was a thread [1] talking about adding a callback to
> > enable/disable btcoex, but it seems not get applied eventually.
> 
> Too bad, I really think we should have at least enable/disable
> functionality in nl80211. But if it's not there, I guess it's ok to have
> yet another driver custom debugfs file :/
> 

Yes, so please take this ;)

Thanks
Yen-Hsuan
Tony Chuang March 24, 2020, 7:05 a.m. UTC | #5
> Tony Chuang <yhchuang@realtek.com> writes:
> 
> > Kalle Valo <kvalo@codeaurora.org> :
> >
> >> <yhchuang@realtek.com> writes:
> >>
> >> > From: Yan-Hsuan Chuang <yhchuang@realtek.com>
> >> >
> >> > Sometimes we need to stop the coex mechanism to debug, so that we
> >> > can manually control the device through various outer commands.
> >> > Hence, add a new debugfs coex_enable to allow us to enable/disable
> >> > the coex mechanism when driver is running.
> >> >
> >> > To disable coex
> >> > echo 0 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >> >
> >> > To enable coex
> >> > echo 1 > /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >> >
> >> > To check coex dm is enabled or not
> >> > cat /sys/kernel/debug/ieee80211/phyX/rtw88/coex_enable
> >>
> >> I forgot, did we add a command to nl80211 for managing btcoex? At least
> >> we have talking about that for years. Please check that first before
> >> adding a debugfs interface for this.
> >>
> >
> > Yes, I found there was a thread [1] talking about adding a callback to
> > enable/disable btcoex, but it seems not get applied eventually.
> 
> Too bad, I really think we should have at least enable/disable
> functionality in nl80211. But if it's not there, I guess it's ok to have
> yet another driver custom debugfs file :/
> 
> > And there's another thread [2] talking about add a btcoex subsystem.
> > But seems like nobody can implement it cleanly in the host.
> >
> > I think adding btcoex subsystem could have a lot of pain since each
> > vendor is using different mechanism controlling the btcoex, and it
> > usually comes with RF related design which is difficult to write a common
> > function to deal with all kinds of them.
> 
> Yeah, btcoex subsystem is a big challenge.
> 

So I think we can take this patch set.
It is really useful to debug on coex's issues.

Yen-Hsuan
diff mbox series

Patch

diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
index b2d264270752..b00eee68b3fb 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.c
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
@@ -706,6 +706,46 @@  static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v)
 	return 0;
 }
 
+static ssize_t rtw_debugfs_set_coex_enable(struct file *filp,
+					   const char __user *buffer,
+					   size_t count, loff_t *loff)
+{
+	struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
+	struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
+	struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+	struct rtw_coex *coex = &rtwdev->coex;
+	char tmp[32 + 1];
+	u32 enable;
+	int num;
+
+	rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
+
+	num = sscanf(tmp, "%d", &enable);
+
+	if (num != 1) {
+		rtw_warn(rtwdev, "invalid arguments\n");
+		return num;
+	}
+
+	mutex_lock(&rtwdev->mutex);
+	coex->stop_dm = enable == 0;
+	mutex_unlock(&rtwdev->mutex);
+
+	return count;
+}
+
+static int rtw_debugfs_get_coex_enable(struct seq_file *m, void *v)
+{
+	struct rtw_debugfs_priv *debugfs_priv = m->private;
+	struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+	struct rtw_coex *coex = &rtwdev->coex;
+
+	seq_printf(m, "coex mechanism %s\n",
+		   coex->stop_dm ? "disabled" : "enabled");
+
+	return 0;
+}
+
 #define rtw_debug_impl_mac(page, addr)				\
 static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = {	\
 	.cb_read = rtw_debug_get_mac_page,			\
@@ -796,6 +836,11 @@  static struct rtw_debugfs_priv rtw_debug_priv_phy_info = {
 	.cb_read = rtw_debugfs_get_phy_info,
 };
 
+static struct rtw_debugfs_priv rtw_debug_priv_coex_enable = {
+	.cb_write = rtw_debugfs_set_coex_enable,
+	.cb_read = rtw_debugfs_get_coex_enable,
+};
+
 static struct rtw_debugfs_priv rtw_debug_priv_coex_info = {
 	.cb_read = rtw_debugfs_get_coex_info,
 };
@@ -831,6 +876,7 @@  void rtw_debugfs_init(struct rtw_dev *rtwdev)
 	rtw_debugfs_add_rw(rsvd_page);
 	rtw_debugfs_add_r(phy_info);
 	rtw_debugfs_add_r(coex_info);
+	rtw_debugfs_add_rw(coex_enable);
 	rtw_debugfs_add_r(mac_0);
 	rtw_debugfs_add_r(mac_1);
 	rtw_debugfs_add_r(mac_2);