Linux wireless drivers development
 help / color / mirror / Atom feed
* [PATCH] ath10k/ath11k: fix spelling mistake "requed" -> "requeued"
From: Colin King @ 2021-04-23 13:41 UTC (permalink / raw)
  To: Kalle Valo, David S . Miller, Jakub Kicinski, ath10k,
	linux-wireless, netdev, ath11k
  Cc: kernel-janitors, linux-kernel

From: Colin Ian King <colin.king@canonical.com>

There are multiple occurrances of the misspelling of requeued in
the drivers with symbol names and debug text. Fix these.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 drivers/net/wireless/ath/ath10k/core.h              | 2 +-
 drivers/net/wireless/ath/ath10k/debug.c             | 4 ++--
 drivers/net/wireless/ath/ath10k/htt.h               | 4 ++--
 drivers/net/wireless/ath/ath10k/wmi.c               | 6 +++---
 drivers/net/wireless/ath/ath10k/wmi.h               | 8 ++++----
 drivers/net/wireless/ath/ath11k/core.h              | 4 ++--
 drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c | 2 +-
 drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h | 2 +-
 drivers/net/wireless/ath/ath11k/wmi.c               | 4 ++--
 drivers/net/wireless/ath/ath11k/wmi.h               | 4 ++--
 10 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 648ed36f845f..5aeff2d9f6cf 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -301,7 +301,7 @@ struct ath10k_fw_stats_pdev {
 	s32 underrun;
 	u32 hw_paused;
 	s32 tx_abort;
-	s32 mpdus_requed;
+	s32 mpdus_requeued;
 	u32 tx_ko;
 	u32 data_rc;
 	u32 self_triggers;
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index fd052f6ed019..39378e3f9b2b 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -1105,7 +1105,7 @@ static const char ath10k_gstrings_stats[][ETH_GSTRING_LEN] = {
 	"d_tx_ppdu_reaped",
 	"d_tx_fifo_underrun",
 	"d_tx_ppdu_abort",
-	"d_tx_mpdu_requed",
+	"d_tx_mpdu_requeued",
 	"d_tx_excessive_retries",
 	"d_tx_hw_rate",
 	"d_tx_dropped_sw_retries",
@@ -1205,7 +1205,7 @@ void ath10k_debug_get_et_stats(struct ieee80211_hw *hw,
 	data[i++] = pdev_stats->hw_reaped;
 	data[i++] = pdev_stats->underrun;
 	data[i++] = pdev_stats->tx_abort;
-	data[i++] = pdev_stats->mpdus_requed;
+	data[i++] = pdev_stats->mpdus_requeued;
 	data[i++] = pdev_stats->tx_ko;
 	data[i++] = pdev_stats->data_rc;
 	data[i++] = pdev_stats->sw_retry_failure;
diff --git a/drivers/net/wireless/ath/ath10k/htt.h b/drivers/net/wireless/ath/ath10k/htt.h
index 956157946106..4e11ee775b4d 100644
--- a/drivers/net/wireless/ath/ath10k/htt.h
+++ b/drivers/net/wireless/ath/ath10k/htt.h
@@ -1282,8 +1282,8 @@ struct htt_dbg_stats_wal_tx_stats {
 	/* Num PPDUs cleaned up in TX abort */
 	__le32 tx_abort;
 
-	/* Num MPDUs requed by SW */
-	__le32 mpdus_requed;
+	/* Num MPDUs requeued by SW */
+	__le32 mpdus_requeued;
 
 	/* excessive retries */
 	__le32 tx_ko;
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index d48b922215eb..f42bf2c8f9e7 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -2867,7 +2867,7 @@ void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src,
 	dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
 	dst->underrun = __le32_to_cpu(src->underrun);
 	dst->tx_abort = __le32_to_cpu(src->tx_abort);
-	dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
+	dst->mpdus_requeued = __le32_to_cpu(src->mpdus_requeued);
 	dst->tx_ko = __le32_to_cpu(src->tx_ko);
 	dst->data_rc = __le32_to_cpu(src->data_rc);
 	dst->self_triggers = __le32_to_cpu(src->self_triggers);
@@ -2895,7 +2895,7 @@ ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src,
 	dst->hw_reaped = __le32_to_cpu(src->hw_reaped);
 	dst->underrun = __le32_to_cpu(src->underrun);
 	dst->tx_abort = __le32_to_cpu(src->tx_abort);
-	dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed);
+	dst->mpdus_requeued = __le32_to_cpu(src->mpdus_requeued);
 	dst->tx_ko = __le32_to_cpu(src->tx_ko);
 	dst->data_rc = __le32_to_cpu(src->data_rc);
 	dst->self_triggers = __le32_to_cpu(src->self_triggers);
@@ -8270,7 +8270,7 @@ ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev,
 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
 			 "PPDUs cleaned", pdev->tx_abort);
 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
-			 "MPDUs requed", pdev->mpdus_requed);
+			 "MPDUs requeued", pdev->mpdus_requeued);
 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
 			 "Excessive retries", pdev->tx_ko);
 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index d870f7067cb7..dd980c81793e 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -4371,8 +4371,8 @@ struct wmi_pdev_stats_tx {
 	/* Num PPDUs cleaned up in TX abort */
 	__le32 tx_abort;
 
-	/* Num MPDUs requed by SW */
-	__le32 mpdus_requed;
+	/* Num MPDUs requeued by SW */
+	__le32 mpdus_requeued;
 
 	/* excessive retries */
 	__le32 tx_ko;
@@ -4444,8 +4444,8 @@ struct wmi_10_4_pdev_stats_tx {
 	/* Num PPDUs cleaned up in TX abort */
 	__le32 tx_abort;
 
-	/* Num MPDUs requed by SW */
-	__le32 mpdus_requed;
+	/* Num MPDUs requeued by SW */
+	__le32 mpdus_requeued;
 
 	/* excessive retries */
 	__le32 tx_ko;
diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h
index 55af982deca7..382df5318b61 100644
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
@@ -795,8 +795,8 @@ struct ath11k_fw_stats_pdev {
 	s32 underrun;
 	/* Num PPDUs cleaned up in TX abort */
 	s32 tx_abort;
-	/* Num MPDUs requed by SW */
-	s32 mpdus_requed;
+	/* Num MPDUs requeued by SW */
+	s32 mpdus_requeued;
 	/* excessive retries */
 	u32 tx_ko;
 	/* data hw rate code */
diff --git a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c
index ec93f14e6d2a..9e0c90da99d3 100644
--- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c
+++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c
@@ -89,7 +89,7 @@ static inline void htt_print_tx_pdev_stats_cmn_tlv(const void *tag_buf,
 	len += HTT_DBG_OUT(buf + len, buf_len - len, "tx_abort = %u",
 			   htt_stats_buf->tx_abort);
 	len += HTT_DBG_OUT(buf + len, buf_len - len, "mpdu_requeued = %u",
-			   htt_stats_buf->mpdu_requed);
+			   htt_stats_buf->mpdu_requeued);
 	len += HTT_DBG_OUT(buf + len, buf_len - len, "tx_xretry = %u",
 			   htt_stats_buf->tx_xretry);
 	len += HTT_DBG_OUT(buf + len, buf_len - len, "data_rc = %u",
diff --git a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h
index 567a26d485a9..d428f52003a4 100644
--- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h
+++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h
@@ -147,7 +147,7 @@ struct htt_tx_pdev_stats_cmn_tlv {
 	u32 hw_flush;
 	u32 hw_filt;
 	u32 tx_abort;
-	u32 mpdu_requed;
+	u32 mpdu_requeued;
 	u32 tx_xretry;
 	u32 data_rc;
 	u32 mpdu_dropped_xretry;
diff --git a/drivers/net/wireless/ath/ath11k/wmi.c b/drivers/net/wireless/ath/ath11k/wmi.c
index 5ca2d80679b6..6c253eae9d06 100644
--- a/drivers/net/wireless/ath/ath11k/wmi.c
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
@@ -5235,7 +5235,7 @@ ath11k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src,
 	dst->hw_reaped = src->hw_reaped;
 	dst->underrun = src->underrun;
 	dst->tx_abort = src->tx_abort;
-	dst->mpdus_requed = src->mpdus_requed;
+	dst->mpdus_requeued = src->mpdus_requeued;
 	dst->tx_ko = src->tx_ko;
 	dst->data_rc = src->data_rc;
 	dst->self_triggers = src->self_triggers;
@@ -5505,7 +5505,7 @@ ath11k_wmi_fw_pdev_tx_stats_fill(const struct ath11k_fw_stats_pdev *pdev,
 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
 			 "PPDUs cleaned", pdev->tx_abort);
 	len += scnprintf(buf + len, buf_len - len, "%30s %10d\n",
-			 "MPDUs requed", pdev->mpdus_requed);
+			 "MPDUs requeued", pdev->mpdus_requeued);
 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
 			 "Excessive retries", pdev->tx_ko);
 	len += scnprintf(buf + len, buf_len - len, "%30s %10u\n",
diff --git a/drivers/net/wireless/ath/ath11k/wmi.h b/drivers/net/wireless/ath/ath11k/wmi.h
index 3ade1ddd35c9..d35c47e0b19d 100644
--- a/drivers/net/wireless/ath/ath11k/wmi.h
+++ b/drivers/net/wireless/ath/ath11k/wmi.h
@@ -4171,8 +4171,8 @@ struct wmi_pdev_stats_tx {
 	/* Num PPDUs cleaned up in TX abort */
 	s32 tx_abort;
 
-	/* Num MPDUs requed by SW */
-	s32 mpdus_requed;
+	/* Num MPDUs requeued by SW */
+	s32 mpdus_requeued;
 
 	/* excessive retries */
 	u32 tx_ko;
-- 
2.30.2


^ permalink raw reply related

* rtlwifi: potential bugs
From: Inigo Huguet @ 2021-04-23 12:56 UTC (permalink / raw)
  To: pkshih, linux-wireless; +Cc: Ivan Vecera

Hello,

Executing some static analysis on the kernel, we've got this results
affecting rtlwifi drivers:

Error: IDENTICAL_BRANCHES (CWE-398): [#def212]
kernel-5.11.0-0.rc7.151/linux-5.11.0-0.rc7.151.el9.x86_64/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c:2813:
identical_branches: The same code is executed regardless of whether
"bt_rssi_state == BTC_RSSI_STATE_HIGH || bt_rssi_state ==
BTC_RSSI_STATE_STAY_HIGH" is true, because the 'then' and 'else'
branches are identical. Should one of the branches be modified, or the
entire 'if' statement replaced?
# 2811|   }
# 2812|
# 2813|-> if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
# 2814|      (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
# 2815|   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);

Error: IDENTICAL_BRANCHES (CWE-398): [#def213]
kernel-5.11.0-0.rc7.151/linux-5.11.0-0.rc7.151.el9.x86_64/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c:2947:
identical_branches: The same code is executed regardless of whether
"bt_rssi_state == BTC_RSSI_STATE_HIGH || bt_rssi_state ==
BTC_RSSI_STATE_STAY_HIGH" is true, because the 'then' and 'else'
branches are identical. Should one of the branches be modified, or the
entire 'if' statement replaced?
# 2945|   }
# 2946|
# 2947|-> if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
# 2948|      (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
# 2949|   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);

Error: IDENTICAL_BRANCHES (CWE-398): [#def214]
kernel-5.11.0-0.rc7.151/linux-5.11.0-0.rc7.151.el9.x86_64/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c:3135:
identical_branches: The same code is executed regardless of whether
"wifi_bw == BTC_WIFI_BW_LEGACY" is true, because the 'then' and 'else'
branches are identical. Should one of the branches be modified, or the
entire 'if' statement replaced?
# 3133|   btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
# 3134|
# 3135|-> if (wifi_bw == BTC_WIFI_BW_LEGACY) {
# 3136|   /* for HID at 11b/g mode */
# 3137|   btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,

Error: IDENTICAL_BRANCHES (CWE-398): [#def215]
kernel-5.11.0-0.rc7.151/linux-5.11.0-0.rc7.151.el9.x86_64/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c:3324:
identical_branches: The same code is executed regardless of whether
"bt_rssi_state == BTC_RSSI_STATE_HIGH || bt_rssi_state ==
BTC_RSSI_STATE_STAY_HIGH" is true, because the 'then' and 'else'
branches are identical. Should one of the branches be modified, or the
entire 'if' statement replaced?
# 3322|   }
# 3323|
# 3324|-> if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
# 3325|      (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
# 3326|   btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);


In my opinion, they seem to be real bugs. However, it's very difficult
to imagine what actions must be taken on each branch of the if-else
because they strongly depend on magic numbers, which are different
configurations for the hw, I guess.

Can the maintainers confirm if these are real bugs and see how to fix them?

Regards
-- 
Íñigo Huguet


^ permalink raw reply

* Re: [PATCH] brcmfmac: fix a loop exit condition
From: Johannes Berg @ 2021-04-23 12:54 UTC (permalink / raw)
  To: Christophe JAILLET, Dan Carpenter
  Cc: Arend van Spriel, Matthias Brugger, Franky Lin, Hante Meuleman,
	Chi-hsien Lin, Wright Feng, Chung-hsien Hsu, Kalle Valo,
	Hans deGoede, linux-wireless, brcm80211-dev-list.pdl,
	kernel-janitors
In-Reply-To: <bda7ae6b-00f9-ae0e-66d3-413049bc543d@wanadoo.fr>

On Fri, 2021-04-23 at 14:20 +0200, Christophe JAILLET wrote:
> 
> > > > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> > > > @@ -34,7 +34,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
> > > >   		len = strlen(tmp) + 1;
> > > >   		board_type = devm_kzalloc(dev, len, GFP_KERNEL);
> > > >   		strscpy(board_type, tmp, len);
> > > > -		for (i = 0; i < board_type[i]; i++) {
> > > > +		for (i = 0; i < len; i++) {
> > > >   			if (board_type[i] == '/')
> > > >   				board_type[i] = '-';
> > > >   		}
> > > 
> > > It should probably just use strreplace() though :)
> > 
> > Good point.  I'll send a v2.
> > 
> 
> and the 2 lines above look like a devm_kstrdup.
> 
> The (unlikely) malloc failure test is also missing.

How many issues can you have in 6 lines of code ;-)

johannes


^ permalink raw reply

* Re: [PATCH] brcmfmac: fix a loop exit condition
From: Christophe JAILLET @ 2021-04-23 12:20 UTC (permalink / raw)
  To: Dan Carpenter, Johannes Berg
  Cc: Arend van Spriel, Matthias Brugger, Franky Lin, Hante Meuleman,
	Chi-hsien Lin, Wright Feng, Chung-hsien Hsu, Kalle Valo,
	Hans deGoede, linux-wireless, brcm80211-dev-list.pdl,
	kernel-janitors
In-Reply-To: <20210423121110.GO1981@kadam>

Le 23/04/2021 à 14:11, Dan Carpenter a écrit :
> On Fri, Apr 23, 2021 at 01:59:36PM +0200, Johannes Berg wrote:
>> On Fri, 2021-04-23 at 14:46 +0300, Dan Carpenter wrote:
>>> This code is supposed to loop over the whole board_type[] string.  The
>>> current code kind of works just because ascii values start 97 and the
>>> string is likely shorter than that so it will break when we hit the NUL
>>> terminator.  But really the condition should be "i < len" instead of
>>> "i < board_type[i]".
>>>
>>> Fixes: 29e354ebeeec ("brcmfmac: Transform compatible string for FW loading")
>>> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
>>> ---
>>>   drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c | 2 +-
>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>>> index a7554265f95f..9b75e396fc50 100644
>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
>>> @@ -34,7 +34,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>>>   		len = strlen(tmp) + 1;
>>>   		board_type = devm_kzalloc(dev, len, GFP_KERNEL);
>>>   		strscpy(board_type, tmp, len);
>>> -		for (i = 0; i < board_type[i]; i++) {
>>> +		for (i = 0; i < len; i++) {
>>>   			if (board_type[i] == '/')
>>>   				board_type[i] = '-';
>>>   		}
>>
>> It should probably just use strreplace() though :)
> 
> Good point.  I'll send a v2.
> 

and the 2 lines above look like a devm_kstrdup.

The (unlikely) malloc failure test is also missing.

CJ

> regards,
> dan carpenter
> 
> 


^ permalink raw reply

* Re: [PATCH] brcmfmac: fix a loop exit condition
From: Dan Carpenter @ 2021-04-23 12:11 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Arend van Spriel, Matthias Brugger, Franky Lin, Hante Meuleman,
	Chi-hsien Lin, Wright Feng, Chung-hsien Hsu, Kalle Valo,
	Hans deGoede, linux-wireless, brcm80211-dev-list.pdl,
	kernel-janitors
In-Reply-To: <427e33af49758c61bc23cf1eedb6dd6964c40296.camel@sipsolutions.net>

On Fri, Apr 23, 2021 at 01:59:36PM +0200, Johannes Berg wrote:
> On Fri, 2021-04-23 at 14:46 +0300, Dan Carpenter wrote:
> > This code is supposed to loop over the whole board_type[] string.  The
> > current code kind of works just because ascii values start 97 and the
> > string is likely shorter than that so it will break when we hit the NUL
> > terminator.  But really the condition should be "i < len" instead of
> > "i < board_type[i]".
> > 
> > Fixes: 29e354ebeeec ("brcmfmac: Transform compatible string for FW loading")
> > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> > ---
> >  drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> > index a7554265f95f..9b75e396fc50 100644
> > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> > @@ -34,7 +34,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
> >  		len = strlen(tmp) + 1;
> >  		board_type = devm_kzalloc(dev, len, GFP_KERNEL);
> >  		strscpy(board_type, tmp, len);
> > -		for (i = 0; i < board_type[i]; i++) {
> > +		for (i = 0; i < len; i++) {
> >  			if (board_type[i] == '/')
> >  				board_type[i] = '-';
> >  		}
> 
> It should probably just use strreplace() though :)

Good point.  I'll send a v2.

regards,
dan carpenter


^ permalink raw reply

* pull-request: wireless-drivers-next-2021-04-23
From: Kalle Valo @ 2021-04-23 12:02 UTC (permalink / raw)
  To: netdev; +Cc: linux-wireless

Hi,

here's a pull request to net-next tree, more info below. Please let me know if
there are any problems.

Kalle

The following changes since commit a926c025d56bb1acd8a192fca0e307331ee91b30:

  net: wwan: mhi_wwan_ctrl: Fix RX buffer starvation (2021-04-20 17:13:43 -0700)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git tags/wireless-drivers-next-2021-04-23

for you to fetch changes up to 9382531ec63fc123d1d6ff07b0558b6af4ea724b:

  Merge tag 'mt76-for-kvalo-2021-04-21' of https://github.com/nbd168/wireless (2021-04-22 17:41:56 +0300)

----------------------------------------------------------------
wireless-drivers-next patches for v5.13

Third, and final, set of patches for v5.13. We got one more week
before the merge window and this includes from that extra week.
Smaller features to rtw88 and mt76, but mostly this contains fixes.

rtw88

* 8822c: Add gap-k calibration to improve long range performance

mt76

* parse rate power limits from DT

* debugfs file to test firmware crash

* debugfs to disable NAPI threaded mode

----------------------------------------------------------------
Anilkumar Kolli (1):
      ath11k: fix warning in ath11k_mhi_config

Christophe JAILLET (1):
      brcmfmac: Avoid GFP_ATOMIC when GFP_KERNEL is enough

Colin Ian King (3):
      mt76: mt7615: Fix a dereference of pointer sta before it is null checked
      ath11k: qmi: Fix spelling mistake "requeqst" -> "request"
      wlcore: Fix buffer overrun by snprintf due to incorrect buffer size

Dan Carpenter (3):
      mt76: mt7615: fix a precision vs width bug in printk
      mt76: mt7915: fix a precision vs width bug in printk
      mt76: mt7921: fix a precision vs width bug in printk

Felix Fietkau (6):
      mt76: flush tx status queue on DMA reset
      mt76: add functions for parsing rate power limits from DT
      mt76: mt7615: implement support for using DT rate power limits
      mt76: mt7615: fix hardware error recovery for mt7663
      mt76: mt7615: fix entering driver-own state on mt7663
      mt76: mt7615: load ROM patch before checking patch semaphore status

Guo-Feng Fan (4):
      rtw88: 8822c: reorder macro position according to the register number
      rtw88: 8822c: Add gap-k calibration to improve long range performance
      rtw88: 8822c: debug: allow debugfs to enable/disable TXGAPK
      rtw88: 8821c: Don't set RX_FLAG_DECRYPTED if packet has no encryption

Gustavo A. R. Silva (2):
      wl3501_cs: Fix out-of-bounds warnings in wl3501_send_pkt
      wl3501_cs: Fix out-of-bounds warnings in wl3501_mgmt_join

Kalle Valo (1):
      Merge tag 'mt76-for-kvalo-2021-04-21' of https://github.com/nbd168/wireless

Lee Gibson (1):
      qtnfmac: Fix possible buffer overflow in qtnf_event_handle_external_auth

Lorenzo Bianconi (43):
      mt76: mt7921: add mt7921_dma_cleanup in mt7921_unregister_device
      dt-bindings:net:wireless:mediatek,mt76: introduce power-limits node
      mt76: mt7615: do not use mt7615 single-sku values for mt7663
      mt76: introduce single-sku support for mt7663/mt7921
      mt76: mt7921: move hw configuration in mt7921_register_device
      mt76: improve mcu error logging
      mt76: mt7921: run mt7921_mcu_fw_log_2_host holding mt76 mutex
      mt76: mt7921: do not use 0 as NULL pointer
      mt76: connac: move mcu_update_arp_filter in mt76_connac module
      mt76: mt7921: remove leftover function declaration
      mt76: mt7921: fix a race between mt7921_mcu_drv_pmctrl and mt7921_mcu_fw_pmctrl
      mt76: mt7663: fix a race between mt7615_mcu_drv_pmctrl and mt7615_mcu_fw_pmctrl
      mt76: connac: introduce wake counter for fw_pmctrl synchronization
      mt76: mt7921: rely on mt76_connac_pm_ref/mt76_connac_pm_unref in tx path
      mt76: mt7663: rely on mt76_connac_pm_ref/mt76_connac_pm_unref in tx path
      mt76: dma: add the capability to define a custom rx napi poll routine
      mt76: mt7921: rely on mt76_connac_pm_ref/mt76_connac_pm_unref in tx/rx napi
      mt76: mt7663: rely on mt76_connac_pm_ref/mt76_connac_pm_unref in tx/rx napi
      mt76: connac: unschedule ps_work in mt76_connac_pm_wake
      mt76: connac: check wake refcount in mcu_fw_pmctrl
      mt76: connac: remove MT76_STATE_PM in mac_tx_free
      mt76: mt7921: get rid of useless MT76_STATE_PM in mt7921_mac_work
      mt76: connac: alaways wake the device before scanning
      mt76: mt7615: rely on pm refcounting in mt7615_led_set_config
      mt76: connac: do not run mt76_txq_schedule_all directly
      mt76: connac: use waitqueue for runtime-pm
      mt76: remove MT76_STATE_PM in tx path
      mt76: mt7921: add awake and doze time accounting
      mt76: mt7921: enable sw interrupts
      mt76: mt7921: move mt7921_dma_reset in dma.c
      mt76: mt7921: introduce mt7921_wpdma_reset utility routine
      mt76: mt7921: introduce mt7921_dma_{enable,disable} utilities
      mt76: mt7921: introduce mt7921_wpdma_reinit_cond utility routine
      mt76: move token_lock, token and token_count in mt76_dev
      mt76: move token utilities in mt76 common module
      mt76: mt7921: get rid of mcu_reset function pointer
      mt76: mt7921: improve doze opportunity
      mt76: mt7663: add awake and doze time accounting
      mt76: connac: unschedule mac_work before going to sleep
      mt76: mt7921: introduce mt7921_mcu_sta_add routine
      mt76: debugfs: introduce napi_threaded node
      mt76: move mt76_token_init in mt76_alloc_device
      mt76: mt7921: reinit wpdma during drv_own if necessary

Lv Yunlong (1):
      ath10k: Fix a use after free in ath10k_htc_send_bundle

Ping-Ke Shih (1):
      rtlwifi: implement set_tim by update beacon content

Po-Hao Huang (1):
      rtw88: refine napi deinit flow

Ryder Lee (6):
      mt76: mt7615: fix memleak when mt7615_unregister_device()
      mt76: mt7915: fix memleak when mt7915_unregister_device()
      mt76: mt7915: only free skbs after mt7915_dma_reset() when reset happens
      mt76: mt7615: only free skbs after mt7615_dma_reset() when reset happens
      mt76: mt7615: use ieee80211_free_txskb() in mt7615_tx_token_put()
      mt76: mt7915: add support for applying pre-calibration data

Sean Wang (7):
      mt76: mt7921: add dumping Tx power table
      mt76: mt7921: add wifisys reset support in debugfs
      mt76: mt7921: abort uncompleted scan by wifi reset
      mt76: connac: introduce mt76_connac_mcu_set_deep_sleep utility
      mt76: mt7921: enable deep sleep when the device suspends
      mt76: mt7921: fix possible invalid register access
      mt76: mt7921: mt7921_stop should put device in fw_own state

Shayne Chen (8):
      mt76: testmode: add support to send larger packet
      mt76: mt7915: rework mt7915_tm_set_tx_len()
      mt76: mt7915: fix rate setting of tx descriptor in testmode
      mt76: extend DT rate power limits to support 11ax devices
      mt76: mt7915: add support for DT rate power limits
      mt76: mt7915: rework the flow of txpower setting
      mt76: mt7915: directly read per-rate tx power from registers
      mt76: mt7915: do not read rf value from efuse in flash mode

Shuah Khan (1):
      ath10k: Fix ath10k_wmi_tlv_op_pull_peer_stats_info() unlock without lock

Toke Høiland-Jørgensen (1):
      ath9k: Fix error check in ath9k_hw_read_revisions() for PCI devices

Wan Jiabing (1):
      libertas_tf: Remove duplicate struct declaration

Yu-Yen Ting (1):
      rtw88: Fix potential unrecoverable tx queue stop

 .../bindings/net/wireless/mediatek,mt76.yaml       | 107 +++
 drivers/net/wireless/ath/ath10k/htc.c              |   2 +-
 drivers/net/wireless/ath/ath10k/wmi-tlv.c          |   3 +
 drivers/net/wireless/ath/ath11k/mhi.c              |  15 +-
 drivers/net/wireless/ath/ath11k/qmi.c              |   2 +-
 drivers/net/wireless/ath/ath9k/htc_drv_init.c      |   2 +-
 drivers/net/wireless/ath/ath9k/hw.c                |   2 +-
 .../wireless/broadcom/brcm80211/brcmfmac/core.c    |   2 +-
 .../net/wireless/marvell/libertas_tf/libertas_tf.h |   1 -
 drivers/net/wireless/mediatek/mt76/debugfs.c       |  28 +
 drivers/net/wireless/mediatek/mt76/dma.c           |  10 +-
 drivers/net/wireless/mediatek/mt76/dma.h           |   1 +
 drivers/net/wireless/mediatek/mt76/eeprom.c        | 231 ++++++-
 drivers/net/wireless/mediatek/mt76/mac80211.c      |   3 +
 drivers/net/wireless/mediatek/mt76/mcu.c           |   4 -
 drivers/net/wireless/mediatek/mt76/mt76.h          |  77 ++-
 drivers/net/wireless/mediatek/mt76/mt7603/dma.c    |   2 +-
 drivers/net/wireless/mediatek/mt76/mt7603/mac.c    |   2 +
 drivers/net/wireless/mediatek/mt76/mt7603/mcu.c    |   5 +-
 .../net/wireless/mediatek/mt76/mt7615/debugfs.c    |  32 +-
 drivers/net/wireless/mediatek/mt76/mt7615/dma.c    |  47 +-
 drivers/net/wireless/mediatek/mt76/mt7615/init.c   |  22 +-
 drivers/net/wireless/mediatek/mt76/mt7615/mac.c    |  44 +-
 drivers/net/wireless/mediatek/mt76/mt7615/main.c   |  43 +-
 drivers/net/wireless/mediatek/mt76/mt7615/mcu.c    | 198 +++---
 drivers/net/wireless/mediatek/mt76/mt7615/mmio.c   |  24 +-
 drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h |   7 +-
 .../net/wireless/mediatek/mt76/mt7615/pci_init.c   |  16 +-
 .../net/wireless/mediatek/mt76/mt7615/pci_mac.c    |  23 +-
 drivers/net/wireless/mediatek/mt76/mt7615/regs.h   |  11 +
 .../net/wireless/mediatek/mt76/mt7615/usb_sdio.c   |   3 +-
 drivers/net/wireless/mediatek/mt76/mt76_connac.h   |  54 +-
 .../net/wireless/mediatek/mt76/mt76_connac_mac.c   |  23 +-
 .../net/wireless/mediatek/mt76/mt76_connac_mcu.c   | 197 +++++-
 .../net/wireless/mediatek/mt76/mt76_connac_mcu.h   |  37 ++
 drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c   |   5 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c  |   4 +-
 .../net/wireless/mediatek/mt76/mt7915/debugfs.c    |  78 ++-
 drivers/net/wireless/mediatek/mt76/mt7915/dma.c    |   2 +-
 drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c | 165 ++---
 drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h |  51 +-
 drivers/net/wireless/mediatek/mt76/mt7915/init.c   |  85 +--
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c    |  95 +--
 drivers/net/wireless/mediatek/mt76/mt7915/main.c   |   8 +-
 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c    | 185 +++++-
 drivers/net/wireless/mediatek/mt76/mt7915/mcu.h    |   2 +
 drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h |  19 +-
 drivers/net/wireless/mediatek/mt76/mt7915/pci.c    |  26 +-
 drivers/net/wireless/mediatek/mt76/mt7915/regs.h   |   5 +
 .../net/wireless/mediatek/mt76/mt7915/testmode.c   |  22 +-
 .../net/wireless/mediatek/mt76/mt7921/debugfs.c    | 144 +++-
 drivers/net/wireless/mediatek/mt76/mt7921/dma.c    | 240 +++++--
 drivers/net/wireless/mediatek/mt76/mt7921/init.c   |  36 +-
 drivers/net/wireless/mediatek/mt76/mt7921/mac.c    | 193 ++----
 drivers/net/wireless/mediatek/mt76/mt7921/main.c   |  62 +-
 drivers/net/wireless/mediatek/mt76/mt7921/mcu.c    | 126 ++--
 drivers/net/wireless/mediatek/mt76/mt7921/mcu.h    |  17 +
 drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h |  60 +-
 drivers/net/wireless/mediatek/mt76/mt7921/pci.c    |  30 +-
 drivers/net/wireless/mediatek/mt76/mt7921/regs.h   |  17 +-
 drivers/net/wireless/mediatek/mt76/testmode.c      | 159 ++++-
 drivers/net/wireless/mediatek/mt76/testmode.h      |   2 +-
 drivers/net/wireless/mediatek/mt76/tx.c            |  81 ++-
 drivers/net/wireless/quantenna/qtnfmac/event.c     |   6 +-
 drivers/net/wireless/realtek/rtlwifi/core.c        |  32 +
 drivers/net/wireless/realtek/rtlwifi/core.h        |   1 +
 drivers/net/wireless/realtek/rtlwifi/usb.c         |   3 +
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |   1 +
 drivers/net/wireless/realtek/rtw88/debug.c         |  91 +++
 drivers/net/wireless/realtek/rtw88/fw.c            |  12 +
 drivers/net/wireless/realtek/rtw88/fw.h            |   5 +
 drivers/net/wireless/realtek/rtw88/main.h          |  31 +
 drivers/net/wireless/realtek/rtw88/pci.c           |  29 +-
 drivers/net/wireless/realtek/rtw88/pci.h           |   1 +
 drivers/net/wireless/realtek/rtw88/reg.h           |   8 +
 drivers/net/wireless/realtek/rtw88/rtw8821c.c      |   3 +-
 drivers/net/wireless/realtek/rtw88/rtw8822c.c      | 724 ++++++++++++++++++++-
 drivers/net/wireless/realtek/rtw88/rtw8822c.h      | 336 ++++++----
 drivers/net/wireless/ti/wlcore/debugfs.h           |   2 +-
 drivers/net/wireless/wl3501.h                      |  47 +-
 drivers/net/wireless/wl3501_cs.c                   |  54 +-
 81 files changed, 3428 insertions(+), 1157 deletions(-)

^ permalink raw reply

* Re: [PATCH] brcmfmac: fix a loop exit condition
From: Johannes Berg @ 2021-04-23 11:59 UTC (permalink / raw)
  To: Dan Carpenter, Arend van Spriel, Matthias Brugger
  Cc: Franky Lin, Hante Meuleman, Chi-hsien Lin, Wright Feng,
	Chung-hsien Hsu, Kalle Valo, Hans deGoede, linux-wireless,
	brcm80211-dev-list.pdl, kernel-janitors
In-Reply-To: <YIKzmoMiTdToaIyP@mwanda>

On Fri, 2021-04-23 at 14:46 +0300, Dan Carpenter wrote:
> This code is supposed to loop over the whole board_type[] string.  The
> current code kind of works just because ascii values start 97 and the
> string is likely shorter than that so it will break when we hit the NUL
> terminator.  But really the condition should be "i < len" instead of
> "i < board_type[i]".
> 
> Fixes: 29e354ebeeec ("brcmfmac: Transform compatible string for FW loading")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---
>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> index a7554265f95f..9b75e396fc50 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> @@ -34,7 +34,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>  		len = strlen(tmp) + 1;
>  		board_type = devm_kzalloc(dev, len, GFP_KERNEL);
>  		strscpy(board_type, tmp, len);
> -		for (i = 0; i < board_type[i]; i++) {
> +		for (i = 0; i < len; i++) {
>  			if (board_type[i] == '/')
>  				board_type[i] = '-';
>  		}

It should probably just use strreplace() though :)

johannes


^ permalink raw reply

* Re: [PATCH] brcmfmac: fix a loop exit condition
From: Matthias Brugger @ 2021-04-23 11:56 UTC (permalink / raw)
  To: Dan Carpenter, Arend van Spriel
  Cc: Franky Lin, Hante Meuleman, Chi-hsien Lin, Wright Feng,
	Chung-hsien Hsu, Kalle Valo, Hans deGoede, linux-wireless,
	brcm80211-dev-list.pdl, kernel-janitors
In-Reply-To: <YIKzmoMiTdToaIyP@mwanda>



On 23/04/2021 13:46, Dan Carpenter wrote:
> This code is supposed to loop over the whole board_type[] string.  The
> current code kind of works just because ascii values start 97 and the
> string is likely shorter than that so it will break when we hit the NUL
> terminator.  But really the condition should be "i < len" instead of
> "i < board_type[i]".
> 
> Fixes: 29e354ebeeec ("brcmfmac: Transform compatible string for FW loading")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

Good catch, I actually have serious doubts about whatever I was thinking when
writing that line of code.

Reviewed-by: Matthias Brugger <mbrugger@suse.com>

> ---
>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> index a7554265f95f..9b75e396fc50 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
> @@ -34,7 +34,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
>  		len = strlen(tmp) + 1;
>  		board_type = devm_kzalloc(dev, len, GFP_KERNEL);
>  		strscpy(board_type, tmp, len);
> -		for (i = 0; i < board_type[i]; i++) {
> +		for (i = 0; i < len; i++) {
>  			if (board_type[i] == '/')
>  				board_type[i] = '-';
>  		}
> 


^ permalink raw reply

* [PATCH] brcmfmac: fix a loop exit condition
From: Dan Carpenter @ 2021-04-23 11:46 UTC (permalink / raw)
  To: Arend van Spriel, Matthias Brugger
  Cc: Franky Lin, Hante Meuleman, Chi-hsien Lin, Wright Feng,
	Chung-hsien Hsu, Kalle Valo, Hans deGoede, linux-wireless,
	brcm80211-dev-list.pdl, kernel-janitors

This code is supposed to loop over the whole board_type[] string.  The
current code kind of works just because ascii values start 97 and the
string is likely shorter than that so it will break when we hit the NUL
terminator.  But really the condition should be "i < len" instead of
"i < board_type[i]".

Fixes: 29e354ebeeec ("brcmfmac: Transform compatible string for FW loading")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
index a7554265f95f..9b75e396fc50 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
@@ -34,7 +34,7 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
 		len = strlen(tmp) + 1;
 		board_type = devm_kzalloc(dev, len, GFP_KERNEL);
 		strscpy(board_type, tmp, len);
-		for (i = 0; i < board_type[i]; i++) {
+		for (i = 0; i < len; i++) {
 			if (board_type[i] == '/')
 				board_type[i] = '-';
 		}
-- 
2.30.2


^ permalink raw reply related

* [PATCH] wireless: Simplify expression
From: zuoqilin1 @ 2021-04-23  9:49 UTC (permalink / raw)
  To: jussi.kivilinna, kvalo, davem, kuba
  Cc: linux-wireless, netdev, linux-kernel, zuoqilin

From: zuoqilin <zuoqilin@yulong.com>

It is not necessary to define the variable ret to receive
the return value of the get_bssid() method.

Signed-off-by: zuoqilin <zuoqilin@yulong.com>
---
 drivers/net/wireless/rndis_wlan.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index 9fe7755..63ce244 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -1036,14 +1036,11 @@ static bool is_associated(struct usbnet *usbdev)
 {
 	struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev);
 	u8 bssid[ETH_ALEN];
-	int ret;
 
 	if (!priv->radio_on)
 		return false;
 
-	ret = get_bssid(usbdev, bssid);
-
-	return (ret == 0 && !is_zero_ether_addr(bssid));
+	return (get_bssid(usbdev, bssid) == 0 && !is_zero_ether_addr(bssid));
 }
 
 static int disassociate(struct usbnet *usbdev, bool reset_ssid)
-- 
1.9.1


^ permalink raw reply related

* RE: [PATCH] rtw88: 8822c: Update normal firmware to v9.9.8
From: Pkshih @ 2021-04-23  9:40 UTC (permalink / raw)
  To: Pkshih, linux-firmware@kernel.org
  Cc: linux-wireless@vger.kernel.org, Bernie Huang
In-Reply-To: <20210422044733.10554-1-pkshih@realtek.com>



> -----Original Message-----
> From: Ping-Ke Shih [mailto:pkshih@realtek.com]
> Sent: Thursday, April 22, 2021 12:48 PM
> To: linux-firmware@kernel.org
> Cc: linux-wireless@vger.kernel.org; Bernie Huang
> Subject: [PATCH] rtw88: 8822c: Update normal firmware to v9.9.8
> 
> From: Po-Hao Huang <phhuang@realtek.com>
> 
> 1. support beacon filter
> 2. Fixes RA short gi issue
> 
> Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---

Since I have sent v9.9.9, please drop this patch.

Thanks
--
Ping-Ke


^ permalink raw reply

* [PATCH] rtw88: 8822c: Update normal firmware to v9.9.9
From: Ping-Ke Shih @ 2021-04-23  9:38 UTC (permalink / raw)
  To: linux-firmware; +Cc: linux-wireless, phhuang

From: Po-Hao Huang <phhuang@realtek.com>

1. support beacon filter
2. Fixes RA short gi issue

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 rtw88/rtw8822c_fw.bin | Bin 197968 -> 199440 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/rtw88/rtw8822c_fw.bin b/rtw88/rtw8822c_fw.bin
index 326e8b668a6496ad8ff8f727e6202e5fa215dd3e..3acfa807f3d14411a26f9cfdb90124b3f67e9dd9 100644
GIT binary patch
delta 85450
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%0Dw2
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

delta 83669
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
GzyAhp8*;P&

-- 
2.21.0


^ permalink raw reply

* [PATCH v3 3/3] rtw88: 8822c: fix lc calibration timing
From: Ping-Ke Shih @ 2021-04-23  9:26 UTC (permalink / raw)
  To: tony0620emma, kvalo; +Cc: linux-wireless, phhuang
In-Reply-To: <20210423092656.20603-1-pkshih@realtek.com>

From: Po-Hao Huang <phhuang@realtek.com>

Before this patch, we use value from 2 seconds ago to decide
whether we should do lc calibration.
Although this don't happen frequently, fix flow to the way it should be.

Fixes: 7ae7784ec2a8 ("rtw88: 8822c: add LC calibration for RTL8822C")
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v3: no change
v2: no change
---
 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 22 ++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index b6b43654e5c6..436347f3b60f 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -4395,26 +4395,28 @@ static void rtw8822c_pwrtrack_set(struct rtw_dev *rtwdev, u8 rf_path)
 	}
 }
 
-static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev,
-				    struct rtw_swing_table *swing_table,
-				    u8 path)
+static void rtw8822c_pwr_track_stats(struct rtw_dev *rtwdev, u8 path)
 {
-	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-	u8 thermal_value, delta;
+	u8 thermal_value;
 
 	if (rtwdev->efuse.thermal_meter[path] == 0xff)
 		return;
 
 	thermal_value = rtw_read_rf(rtwdev, path, RF_T_METER, 0x7e);
-
 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, path);
+}
 
-	delta = rtw_phy_pwrtrack_get_delta(rtwdev, path);
+static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev,
+				    struct rtw_swing_table *swing_table,
+				    u8 path)
+{
+	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+	u8 delta;
 
+	delta = rtw_phy_pwrtrack_get_delta(rtwdev, path);
 	dm_info->delta_power_index[path] =
 		rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, path, path,
 					    delta);
-
 	rtw8822c_pwrtrack_set(rtwdev, path);
 }
 
@@ -4425,12 +4427,12 @@ static void __rtw8822c_pwr_track(struct rtw_dev *rtwdev)
 
 	rtw_phy_config_swing_table(rtwdev, &swing_table);
 
+	for (i = 0; i < rtwdev->hal.rf_path_num; i++)
+		rtw8822c_pwr_track_stats(rtwdev, i);
 	if (rtw_phy_pwrtrack_need_lck(rtwdev))
 		rtw8822c_do_lck(rtwdev);
-
 	for (i = 0; i < rtwdev->hal.rf_path_num; i++)
 		rtw8822c_pwr_track_path(rtwdev, &swing_table, i);
-
 }
 
 static void rtw8822c_pwr_track(struct rtw_dev *rtwdev)
-- 
2.21.0


^ permalink raw reply related

* [PATCH v3 2/3] rtw88: add path diversity
From: Ping-Ke Shih @ 2021-04-23  9:26 UTC (permalink / raw)
  To: tony0620emma, kvalo; +Cc: linux-wireless, phhuang
In-Reply-To: <20210423092656.20603-1-pkshih@realtek.com>

From: Po-Hao Huang <phhuang@realtek.com>

This feature chooses to transmit with antenna that has better signal
strength periodically under 1ss rate.

It can benefit connection quality in the following cases:
1. User is far away from the AP.
2. The far-field pattern of the antenna showed significant signal
strength difference.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v3: no change
v2: fix access address should be natural alignment
---
 drivers/net/wireless/realtek/rtw88/debug.h    |  1 +
 drivers/net/wireless/realtek/rtw88/main.h     | 15 ++++
 drivers/net/wireless/realtek/rtw88/phy.c      | 81 +++++++++++++++++++
 drivers/net/wireless/realtek/rtw88/phy.h      |  1 +
 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 39 +++++++--
 5 files changed, 131 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h
index c8efd1900a34..0dd3f9a88c8d 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.h
+++ b/drivers/net/wireless/realtek/rtw88/debug.h
@@ -20,6 +20,7 @@ enum rtw_debug_mask {
 	RTW_DBG_BF		= 0x00000800,
 	RTW_DBG_WOW		= 0x00001000,
 	RTW_DBG_CFO		= 0x00002000,
+	RTW_DBG_PATH_DIV	= 0x00004000,
 
 	RTW_DBG_ALL		= 0xffffffff
 };
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index 321667c03b16..02ad175055cb 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -841,6 +841,10 @@ struct rtw_chip_ops {
 			     u8 fixrate_en, u8 *new_rate);
 	void (*cfo_init)(struct rtw_dev *rtwdev);
 	void (*cfo_track)(struct rtw_dev *rtwdev);
+	void (*config_tx_path)(struct rtw_dev *rtwdev, u8 tx_path,
+			       enum rtw_bb_path tx_path_1ss,
+			       enum rtw_bb_path tx_path_cck,
+			       bool is_tx2_path);
 
 	/* for coex */
 	void (*coex_set_init)(struct rtw_dev *rtwdev);
@@ -1136,7 +1140,9 @@ struct rtw_chip_info {
 	u8 max_power_index;
 
 	u16 fw_fifo_addr[RTW_FW_FIFO_MAX];
+	u8 default_1ss_tx_path;
 
+	bool path_div_supported;
 	bool ht_supported;
 	bool vht_supported;
 	u8 lps_deep_mode_supported;
@@ -1781,6 +1787,14 @@ struct rtw_hal {
 		     [DESC_RATE_MAX];
 };
 
+struct rtw_path_div {
+	enum rtw_bb_path current_tx_path;
+	u32 path_a_sum;
+	u32 path_b_sum;
+	u16 path_a_cnt;
+	u16 path_b_cnt;
+};
+
 struct rtw_dev {
 	struct ieee80211_hw *hw;
 	struct device *dev;
@@ -1849,6 +1863,7 @@ struct rtw_dev {
 	DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS);
 
 	u8 mp_mode;
+	struct rtw_path_div dm_path_div;
 
 	struct rtw_fw_state wow_fw;
 	struct rtw_wow_param wow;
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
index 8146acaf1893..569dd3cfde35 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.c
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
@@ -127,6 +127,17 @@ static void rtw_phy_cfo_init(struct rtw_dev *rtwdev)
 		chip->ops->cfo_init(rtwdev);
 }
 
+static void rtw_phy_tx_path_div_init(struct rtw_dev *rtwdev)
+{
+	struct rtw_path_div *path_div = &rtwdev->dm_path_div;
+
+	path_div->current_tx_path = rtwdev->chip->default_1ss_tx_path;
+	path_div->path_a_cnt = 0;
+	path_div->path_a_sum = 0;
+	path_div->path_b_cnt = 0;
+	path_div->path_b_sum = 0;
+}
+
 void rtw_phy_init(struct rtw_dev *rtwdev)
 {
 	struct rtw_chip_info *chip = rtwdev->chip;
@@ -149,6 +160,7 @@ void rtw_phy_init(struct rtw_dev *rtwdev)
 
 	dm_info->iqk.done = false;
 	rtw_phy_cfo_init(rtwdev);
+	rtw_phy_tx_path_div_init(rtwdev);
 }
 EXPORT_SYMBOL(rtw_phy_init);
 
@@ -695,6 +707,7 @@ void rtw_phy_dynamic_mechanism(struct rtw_dev *rtwdev)
 	rtw_phy_dig(rtwdev);
 	rtw_phy_cck_pd(rtwdev);
 	rtw_phy_ra_track(rtwdev);
+	rtw_phy_tx_path_diversity(rtwdev);
 	rtw_phy_cfo_track(rtwdev);
 	rtw_phy_dpk_track(rtwdev);
 	rtw_phy_pwr_track(rtwdev);
@@ -2315,3 +2328,71 @@ bool rtw_phy_pwrtrack_need_iqk(struct rtw_dev *rtwdev)
 	return false;
 }
 EXPORT_SYMBOL(rtw_phy_pwrtrack_need_iqk);
+
+static void rtw_phy_set_tx_path_by_reg(struct rtw_dev *rtwdev,
+				       enum rtw_bb_path tx_path_sel_1ss)
+{
+	struct rtw_path_div *path_div = &rtwdev->dm_path_div;
+	enum rtw_bb_path tx_path_sel_cck = tx_path_sel_1ss;
+	struct rtw_chip_info *chip = rtwdev->chip;
+
+	if (tx_path_sel_1ss == path_div->current_tx_path)
+		return;
+
+	path_div->current_tx_path = tx_path_sel_1ss;
+	rtw_dbg(rtwdev, RTW_DBG_PATH_DIV, "Switch TX path=%s\n",
+		tx_path_sel_1ss == BB_PATH_A ? "A" : "B");
+	chip->ops->config_tx_path(rtwdev, rtwdev->hal.antenna_tx,
+				  tx_path_sel_1ss, tx_path_sel_cck, false);
+}
+
+static void rtw_phy_tx_path_div_select(struct rtw_dev *rtwdev)
+{
+	struct rtw_path_div *path_div = &rtwdev->dm_path_div;
+	enum rtw_bb_path path = path_div->current_tx_path;
+	s32 rssi_a = 0, rssi_b = 0;
+
+	if (path_div->path_a_cnt)
+		rssi_a = path_div->path_a_sum / path_div->path_a_cnt;
+	else
+		rssi_a = 0;
+	if (path_div->path_b_cnt)
+		rssi_b = path_div->path_b_sum / path_div->path_b_cnt;
+	else
+		rssi_b = 0;
+
+	if (rssi_a != rssi_b)
+		path = (rssi_a > rssi_b) ? BB_PATH_A : BB_PATH_B;
+
+	path_div->path_a_cnt = 0;
+	path_div->path_a_sum = 0;
+	path_div->path_b_cnt = 0;
+	path_div->path_b_sum = 0;
+	rtw_phy_set_tx_path_by_reg(rtwdev, path);
+}
+
+static void rtw_phy_tx_path_diversity_2ss(struct rtw_dev *rtwdev)
+{
+	if (rtwdev->hal.antenna_rx != BB_PATH_AB) {
+		rtw_dbg(rtwdev, RTW_DBG_PATH_DIV,
+			"[Return] tx_Path_en=%d, rx_Path_en=%d\n",
+			rtwdev->hal.antenna_tx, rtwdev->hal.antenna_rx);
+		return;
+	}
+	if (rtwdev->sta_cnt == 0) {
+		rtw_dbg(rtwdev, RTW_DBG_PATH_DIV, "No Link\n");
+		return;
+	}
+
+	rtw_phy_tx_path_div_select(rtwdev);
+}
+
+void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev)
+{
+	struct rtw_chip_info *chip = rtwdev->chip;
+
+	if (!chip->path_div_supported)
+		return;
+
+	rtw_phy_tx_path_diversity_2ss(rtwdev);
+}
diff --git a/drivers/net/wireless/realtek/rtw88/phy.h b/drivers/net/wireless/realtek/rtw88/phy.h
index 0b6f2fc8193c..112ed125970a 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.h
+++ b/drivers/net/wireless/realtek/rtw88/phy.h
@@ -61,6 +61,7 @@ void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
 				struct rtw_swing_table *swing_table);
 void rtw_phy_parsing_cfo(struct rtw_dev *rtwdev,
 			 struct rtw_rx_pkt_stat *pkt_stat);
+void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev);
 
 struct rtw_txpwr_lmt_cfg_pair {
 	u8 regd;
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index 6cb593cc33c2..b6b43654e5c6 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -80,6 +80,13 @@ static void rtw8822c_header_file_init(struct rtw_dev *rtwdev, bool pre)
 		rtw_write32_set(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN);
 }
 
+static void rtw8822c_bb_reset(struct rtw_dev *rtwdev)
+{
+	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
+	rtw_write16_clr(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
+	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
+}
+
 static void rtw8822c_dac_backup_reg(struct rtw_dev *rtwdev,
 				    struct rtw_backup_info *backup,
 				    struct rtw_backup_info *backup_rf)
@@ -2424,10 +2431,11 @@ static void rtw8822c_config_cck_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
 		else
 			rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8);
 	}
+	rtw8822c_bb_reset(rtwdev);
 }
 
 static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
-					 bool is_tx2_path)
+					 enum rtw_bb_path tx_path_sel_1ss)
 {
 	if (tx_path == BB_PATH_A) {
 		rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x11);
@@ -2436,21 +2444,28 @@ static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
 		rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x12);
 		rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0);
 	} else {
-		if (is_tx2_path) {
+		if (tx_path_sel_1ss == BB_PATH_AB) {
 			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x33);
 			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0404);
-		} else {
+		} else if (tx_path_sel_1ss == BB_PATH_B) {
+			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x32);
+			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
+		} else if (tx_path_sel_1ss == BB_PATH_A) {
 			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x31);
 			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
 		}
 	}
+	rtw8822c_bb_reset(rtwdev);
 }
 
 static void rtw8822c_config_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
+				    enum rtw_bb_path tx_path_sel_1ss,
+				    enum rtw_bb_path tx_path_cck,
 				    bool is_tx2_path)
 {
-	rtw8822c_config_cck_tx_path(rtwdev, tx_path, is_tx2_path);
-	rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, is_tx2_path);
+	rtw8822c_config_cck_tx_path(rtwdev, tx_path_cck, is_tx2_path);
+	rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, tx_path_sel_1ss);
+	rtw8822c_bb_reset(rtwdev);
 }
 
 static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
@@ -2466,7 +2481,8 @@ static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
 		rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x11111);
 
 	rtw8822c_config_rx_path(rtwdev, rx_path);
-	rtw8822c_config_tx_path(rtwdev, tx_path, is_tx2_path);
+	rtw8822c_config_tx_path(rtwdev, tx_path, BB_PATH_A, BB_PATH_A,
+				is_tx2_path);
 
 	rtw8822c_toggle_igi(rtwdev);
 }
@@ -2517,6 +2533,7 @@ static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
 				   struct rtw_rx_pkt_stat *pkt_stat)
 {
+	struct rtw_path_div *p_div = &rtwdev->dm_path_div;
 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 	u8 rxsc, bw;
 	s8 min_rx_power = -120;
@@ -2559,6 +2576,13 @@ static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
 	for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
 		rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
 		dm_info->rssi[path] = rssi;
+		if (path == RF_PATH_A) {
+			p_div->path_a_sum += rssi;
+			p_div->path_a_cnt++;
+		} else if (path == RF_PATH_B) {
+			p_div->path_b_sum += rssi;
+			p_div->path_b_cnt++;
+		}
 		dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
 		dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
 
@@ -4851,6 +4875,7 @@ static struct rtw_chip_ops rtw8822c_ops = {
 	.cfg_csi_rate		= rtw_bf_cfg_csi_rate,
 	.cfo_init		= rtw8822c_cfo_init,
 	.cfo_track		= rtw8822c_cfo_track,
+	.config_tx_path		= rtw8822c_config_tx_path,
 
 	.coex_set_init		= rtw8822c_coex_cfg_init,
 	.coex_set_ant_switch	= NULL,
@@ -5192,6 +5217,8 @@ struct rtw_chip_info rtw8822c_hw_spec = {
 	.band = RTW_BAND_2G | RTW_BAND_5G,
 	.page_size = 128,
 	.dig_min = 0x20,
+	.default_1ss_tx_path = BB_PATH_A,
+	.path_div_supported = true,
 	.ht_supported = true,
 	.vht_supported = true,
 	.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK) | BIT(LPS_DEEP_MODE_PG),
-- 
2.21.0


^ permalink raw reply related

* [PATCH v3 1/3] rtw88: add beacon filter support
From: Ping-Ke Shih @ 2021-04-23  9:26 UTC (permalink / raw)
  To: tony0620emma, kvalo; +Cc: linux-wireless, phhuang

From: Po-Hao Huang <phhuang@realtek.com>

Adding this supports beacon filter and CQM.
Let firmware perform connection quality monitor and beacon processing.
This make host CPU wakeup less under power save mode.
To make mechanisms work as usual, fw will notify driver events such as
signal change and beacon loss.

This feature needs firmware 9.9.8 or newer to support it, and driver is
compatible with older firmware.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v3: fix C2H format
v2: no change
---
 drivers/net/wireless/realtek/rtw88/fw.c       | 91 +++++++++++++++++++
 drivers/net/wireless/realtek/rtw88/fw.h       | 39 ++++++++
 drivers/net/wireless/realtek/rtw88/mac80211.c |  7 ++
 drivers/net/wireless/realtek/rtw88/main.c     |  4 +-
 drivers/net/wireless/realtek/rtw88/main.h     |  1 +
 5 files changed, 141 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
index ea2cd4db1d3c..797b08b2a494 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.c
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
@@ -127,6 +127,51 @@ static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload,
 	rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data);
 }
 
+struct rtw_beacon_filter_iter_data {
+	struct rtw_dev *rtwdev;
+	u8 *payload;
+};
+
+static void rtw_fw_bcn_filter_notify_vif_iter(void *data, u8 *mac,
+					      struct ieee80211_vif *vif)
+{
+	struct rtw_beacon_filter_iter_data *iter_data = data;
+	struct rtw_dev *rtwdev = iter_data->rtwdev;
+	u8 *payload = iter_data->payload;
+	u8 type = GET_BCN_FILTER_NOTIFY_TYPE(payload);
+	u8 event = GET_BCN_FILTER_NOTIFY_EVENT(payload);
+	s8 sig = (s8)GET_BCN_FILTER_NOTIFY_RSSI(payload);
+
+	switch (type) {
+	case BCN_FILTER_NOTIFY_SIGNAL_CHANGE:
+		event = event ? NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH :
+			NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW;
+		ieee80211_cqm_rssi_notify(vif, event, sig, GFP_KERNEL);
+		break;
+	case BCN_FILTER_CONNECTION_LOSS:
+		ieee80211_connection_loss(vif);
+		break;
+	case BCN_FILTER_CONNECTED:
+		rtwdev->beacon_loss = false;
+		break;
+	case BCN_FILTER_NOTIFY_BEACON_LOSS:
+		rtwdev->beacon_loss = true;
+		rtw_leave_lps(rtwdev);
+		break;
+	}
+}
+
+static void rtw_fw_bcn_filter_notify(struct rtw_dev *rtwdev, u8 *payload,
+				     u8 length)
+{
+	struct rtw_beacon_filter_iter_data dev_iter_data;
+
+	dev_iter_data.rtwdev = rtwdev;
+	dev_iter_data.payload = payload;
+	rtw_iterate_vifs(rtwdev, rtw_fw_bcn_filter_notify_vif_iter,
+			 &dev_iter_data);
+}
+
 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
 {
 	struct rtw_c2h_cmd *c2h;
@@ -152,6 +197,9 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
 	case C2H_WLAN_INFO:
 		rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len);
 		break;
+	case C2H_BCN_FILTER_NOTIFY:
+		rtw_fw_bcn_filter_notify(rtwdev, c2h->payload, len);
+		break;
 	case C2H_HALMAC:
 		rtw_fw_c2h_cmd_handle_ext(rtwdev, skb);
 		break;
@@ -527,6 +575,49 @@ void rtw_fw_update_wl_phy_info(struct rtw_dev *rtwdev)
 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
 }
 
+void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, bool connect,
+				 struct ieee80211_vif *vif)
+{
+	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+	struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid);
+	static const u8 rssi_min = 0, rssi_max = 100, rssi_offset = 100;
+	struct rtw_sta_info *si =
+		sta ? (struct rtw_sta_info *)sta->drv_priv : NULL;
+	s32 threshold = bss_conf->cqm_rssi_thold + rssi_offset;
+	struct rtw_fw_state *fw = &rtwdev->fw;
+	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
+
+	if (!(fw->feature & FW_FEATURE_BCN_FILTER))
+		return;
+
+	if (!connect) {
+		SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P1);
+		SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, connect);
+		rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+
+		return;
+	}
+	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P0);
+	ether_addr_copy(&h2c_pkt[1], bss_conf->bssid);
+	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+
+	memset(h2c_pkt, 0, sizeof(h2c_pkt));
+	threshold = clamp_t(s32, threshold, rssi_min, rssi_max);
+	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P1);
+	SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, connect);
+	SET_BCN_FILTER_OFFLOAD_P1_OFFLOAD_MODE(h2c_pkt,
+					       BCN_FILTER_OFFLOAD_MODE_DEFAULT);
+	SET_BCN_FILTER_OFFLOAD_P1_THRESHOLD(h2c_pkt, (u8)threshold);
+	SET_BCN_FILTER_OFFLOAD_P1_BCN_LOSS_CNT(h2c_pkt, BCN_LOSS_CNT);
+	if (si)
+		SET_BCN_FILTER_OFFLOAD_P1_MACID(h2c_pkt, si->mac_id);
+	else
+		rtw_warn(rtwdev, "CQM config with station not found\n");
+	SET_BCN_FILTER_OFFLOAD_P1_HYST(h2c_pkt, bss_conf->cqm_rssi_hyst);
+	SET_BCN_FILTER_OFFLOAD_P1_BCN_INTERVAL(h2c_pkt, bss_conf->beacon_int);
+	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+}
+
 void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev)
 {
 	struct rtw_lps_conf *conf = &rtwdev->lps_conf;
diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
index 7c5b1d75e26f..2fb064fc4e89 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.h
+++ b/drivers/net/wireless/realtek/rtw88/fw.h
@@ -24,6 +24,12 @@
 #define DLFW_BLK_SIZE_LEGACY		4
 #define FW_START_ADDR_LEGACY		0x1000
 
+#define BCN_LOSS_CNT			7
+#define BCN_FILTER_NOTIFY_SIGNAL_CHANGE	0
+#define BCN_FILTER_CONNECTION_LOSS	1
+#define BCN_FILTER_CONNECTED		2
+#define BCN_FILTER_NOTIFY_BEACON_LOSS	3
+
 enum rtw_c2h_cmd_id {
 	C2H_CCX_TX_RPT = 0x03,
 	C2H_BT_INFO = 0x09,
@@ -32,6 +38,7 @@ enum rtw_c2h_cmd_id {
 	C2H_HW_FEATURE_REPORT = 0x19,
 	C2H_WLAN_INFO = 0x27,
 	C2H_WLAN_RFON = 0x32,
+	C2H_BCN_FILTER_NOTIFY = 0x36,
 	C2H_HW_FEATURE_DUMP = 0xfd,
 	C2H_HALMAC = 0xff,
 };
@@ -78,9 +85,19 @@ enum rtw_fw_feature {
 	FW_FEATURE_LPS_C2H = BIT(1),
 	FW_FEATURE_LCLK = BIT(2),
 	FW_FEATURE_PG = BIT(3),
+	FW_FEATURE_BCN_FILTER = BIT(5),
 	FW_FEATURE_MAX = BIT(31),
 };
 
+enum rtw_beacon_filter_offload_mode {
+	BCN_FILTER_OFFLOAD_MODE_0 = 0,
+	BCN_FILTER_OFFLOAD_MODE_1,
+	BCN_FILTER_OFFLOAD_MODE_2,
+	BCN_FILTER_OFFLOAD_MODE_3,
+
+	BCN_FILTER_OFFLOAD_MODE_DEFAULT = BCN_FILTER_OFFLOAD_MODE_1,
+};
+
 struct rtw_coex_info_req {
 	u8 seq;
 	u8 op_code;
@@ -237,6 +254,10 @@ struct rtw_fw_hdr_legacy {
 #define GET_RA_REPORT_BW(c2h_payload)		(c2h_payload[6])
 #define GET_RA_REPORT_MACID(c2h_payload)	(c2h_payload[1])
 
+#define GET_BCN_FILTER_NOTIFY_TYPE(c2h_payload)	(c2h_payload[1] & 0xf)
+#define GET_BCN_FILTER_NOTIFY_EVENT(c2h_payload)	(c2h_payload[1] & 0x10)
+#define GET_BCN_FILTER_NOTIFY_RSSI(c2h_payload)	(c2h_payload[2] - 100)
+
 /* PKT H2C */
 #define H2C_PKT_CMD_ID 0xFF
 #define H2C_PKT_CATEGORY 0x01
@@ -345,6 +366,8 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
 #define H2C_CMD_LPS_PG_INFO		0x2b
 #define H2C_CMD_RA_INFO			0x40
 #define H2C_CMD_RSSI_MONITOR		0x42
+#define H2C_CMD_BCN_FILTER_OFFLOAD_P0	0x56
+#define H2C_CMD_BCN_FILTER_OFFLOAD_P1	0x57
 #define H2C_CMD_WL_PHY_INFO		0x58
 
 #define H2C_CMD_COEX_TDMA_TYPE		0x60
@@ -381,6 +404,20 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
 	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
 #define SET_WL_PHY_INFO_RX_EVM(h2c_pkt, value)				       \
 	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
+#define SET_BCN_FILTER_OFFLOAD_P1_MACID(h2c_pkt, value)			       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
+#define SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(16))
+#define SET_BCN_FILTER_OFFLOAD_P1_HYST(h2c_pkt, value)			       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(20, 17))
+#define SET_BCN_FILTER_OFFLOAD_P1_OFFLOAD_MODE(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 21))
+#define SET_BCN_FILTER_OFFLOAD_P1_THRESHOLD(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
+#define SET_BCN_FILTER_OFFLOAD_P1_BCN_LOSS_CNT(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(3, 0))
+#define SET_BCN_FILTER_OFFLOAD_P1_BCN_INTERVAL(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(13, 4))
 
 #define SET_PWR_MODE_SET_MODE(h2c_pkt, value)                                  \
 	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(14, 8))
@@ -577,6 +614,8 @@ void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
 void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
 void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool conn);
 void rtw_fw_update_wl_phy_info(struct rtw_dev *rtwdev);
+void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, bool connect,
+				 struct ieee80211_vif *vif);
 int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
 				u8 *buf, u32 size);
 void rtw_remove_rsvd_page(struct rtw_dev *rtwdev,
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
index 333df6b38113..9087c5b1ea80 100644
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -148,11 +148,15 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw,
 {
 	struct rtw_dev *rtwdev = hw->priv;
 	struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
+	struct rtw_fw_state *fw = &rtwdev->fw;
 	enum rtw_net_type net_type;
 	u32 config = 0;
 	u8 port = 0;
 	u8 bcn_ctrl = 0;
 
+	if (fw->feature & FW_FEATURE_BCN_FILTER)
+		vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
+				     IEEE80211_VIF_SUPPORTS_CQM_RSSI;
 	rtwvif->port = port;
 	rtwvif->stats.tx_unicast = 0;
 	rtwvif->stats.rx_unicast = 0;
@@ -399,6 +403,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
 			rtw_write32_clr(rtwdev, REG_FWHW_TXQ_CTRL,
 					BIT_EN_BCNQ_DL);
 	}
+	if (changed & BSS_CHANGED_CQM)
+		rtw_fw_beacon_filter_config(rtwdev, true, vif);
 
 	if (changed & BSS_CHANGED_MU_GROUPS)
 		rtw_chip_set_gid_table(rtwdev, vif, conf);
@@ -450,6 +456,7 @@ static int rtw_ops_sta_remove(struct ieee80211_hw *hw,
 {
 	struct rtw_dev *rtwdev = hw->priv;
 
+	rtw_fw_beacon_filter_config(rtwdev, false, vif);
 	mutex_lock(&rtwdev->mutex);
 	rtw_sta_remove(rtwdev, sta, true);
 	mutex_unlock(&rtwdev->mutex);
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
index f3a3a86fa9b5..94fadef5c131 100644
--- a/drivers/net/wireless/realtek/rtw88/main.c
+++ b/drivers/net/wireless/realtek/rtw88/main.c
@@ -239,7 +239,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
 	 * get that vif and check if device is having traffic more than the
 	 * threshold.
 	 */
-	if (rtwdev->ps_enabled && data.rtwvif && !ps_active)
+	if (rtwdev->ps_enabled && data.rtwvif && !ps_active &&
+	    !rtwdev->beacon_loss)
 		rtw_enter_lps(rtwdev, data.rtwvif->port);
 
 	rtwdev->watch_dog_cnt++;
@@ -292,6 +293,7 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
 	rtw_fw_media_status_report(rtwdev, si->mac_id, true);
 
 	rtwdev->sta_cnt++;
+	rtwdev->beacon_loss = false;
 	rtw_info(rtwdev, "sta %pM joined with macid %d\n",
 		 sta->addr, si->mac_id);
 
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index dc3744847ba9..321667c03b16 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -1837,6 +1837,7 @@ struct rtw_dev {
 	/* lps power state & handler work */
 	struct rtw_lps_conf lps_conf;
 	bool ps_enabled;
+	bool beacon_loss;
 	struct completion lps_leave_check;
 
 	struct dentry *debugfs;
-- 
2.21.0


^ permalink raw reply related

* Re: [PATCHv2] mac80211: increment rx stats according to USES_RSS flag
From: Johannes Berg @ 2021-04-23  7:58 UTC (permalink / raw)
  To: Thiraviyam Mariyappan; +Cc: ath11k, linux-wireless
In-Reply-To: <1ee8d562986128767c037d20aedb96a5@codeaurora.org>

On Wed, 2021-04-21 at 22:18 +0530, Thiraviyam Mariyappan wrote:
> In case of Mesh fast_rx is not applicable, but still USES_RSS can be
> enabled from driver when parallel RX is supported by HW/Driver,
> right? 

Yes, I guess that's true.

> Hence checked for USES_RSS support to update per cpu stats.Please
> correct me if the meaning of USES_RSS is misunderstood and it applies
> only when fast_rx for a STA is enabled.
> 

Well, actually using multi-queue is pointless or even counter-productive
when you don't have fast-RX, since then you'll run into a common lock,
and doing much processing on multiple CPUs but under a common lock might
well be worse than doing it on a single CPU in the first place, since
you'll bounce the lock around all the time.

However, you're right that the driver might generally advertise
USES_RSS, but then not do it for mesh, but that throws off some
statistics.

Something like this might then be a much better fix though?


diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index ec6973ee88ef..f87e883862d9 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -2092,7 +2092,7 @@ sta_get_last_rx_stats(struct sta_info *sta)
 	struct ieee80211_local *local = sta->local;
 	int cpu;
 
-	if (!ieee80211_hw_check(&local->hw, USES_RSS))
+	if (!sta->pcpu_rx_stats)
 		return stats;
 
 	for_each_possible_cpu(cpu) {
@@ -2192,9 +2192,7 @@ static void sta_set_tidstats(struct sta_info *sta,
 	int cpu;
 
 	if (!(tidstats->filled & BIT(NL80211_TID_STATS_RX_MSDU))) {
-		if (!ieee80211_hw_check(&local->hw, USES_RSS))
-			tidstats->rx_msdu +=
-				sta_get_tidstats_msdu(&sta->rx_stats, tid);
+		tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->rx_stats, tid);
 
 		if (sta->pcpu_rx_stats) {
 			for_each_possible_cpu(cpu) {
@@ -2308,8 +2306,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
 
 	if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
 			       BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
-		if (!ieee80211_hw_check(&local->hw, USES_RSS))
-			sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
+		sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
 
 		if (sta->pcpu_rx_stats) {
 			for_each_possible_cpu(cpu) {


johannes


^ permalink raw reply related

* [PATCH v2 3/3] rtw88: 8822c: fix lc calibration timing
From: Ping-Ke Shih @ 2021-04-23  7:54 UTC (permalink / raw)
  To: tony0620emma, kvalo; +Cc: linux-wireless, phhuang
In-Reply-To: <20210423075442.17498-1-pkshih@realtek.com>

From: Po-Hao Huang <phhuang@realtek.com>

Before this patch, we use value from 2 seconds ago to decide
whether we should do lc calibration.
Although this don't happen frequently, fix flow to the way it should be.

Fixes: 7ae7784ec2a8 ("rtw88: 8822c: add LC calibration for RTL8822C")
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2: no change
---
 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 22 ++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index b6b43654e5c6..436347f3b60f 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -4395,26 +4395,28 @@ static void rtw8822c_pwrtrack_set(struct rtw_dev *rtwdev, u8 rf_path)
 	}
 }
 
-static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev,
-				    struct rtw_swing_table *swing_table,
-				    u8 path)
+static void rtw8822c_pwr_track_stats(struct rtw_dev *rtwdev, u8 path)
 {
-	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-	u8 thermal_value, delta;
+	u8 thermal_value;
 
 	if (rtwdev->efuse.thermal_meter[path] == 0xff)
 		return;
 
 	thermal_value = rtw_read_rf(rtwdev, path, RF_T_METER, 0x7e);
-
 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, path);
+}
 
-	delta = rtw_phy_pwrtrack_get_delta(rtwdev, path);
+static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev,
+				    struct rtw_swing_table *swing_table,
+				    u8 path)
+{
+	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+	u8 delta;
 
+	delta = rtw_phy_pwrtrack_get_delta(rtwdev, path);
 	dm_info->delta_power_index[path] =
 		rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, path, path,
 					    delta);
-
 	rtw8822c_pwrtrack_set(rtwdev, path);
 }
 
@@ -4425,12 +4427,12 @@ static void __rtw8822c_pwr_track(struct rtw_dev *rtwdev)
 
 	rtw_phy_config_swing_table(rtwdev, &swing_table);
 
+	for (i = 0; i < rtwdev->hal.rf_path_num; i++)
+		rtw8822c_pwr_track_stats(rtwdev, i);
 	if (rtw_phy_pwrtrack_need_lck(rtwdev))
 		rtw8822c_do_lck(rtwdev);
-
 	for (i = 0; i < rtwdev->hal.rf_path_num; i++)
 		rtw8822c_pwr_track_path(rtwdev, &swing_table, i);
-
 }
 
 static void rtw8822c_pwr_track(struct rtw_dev *rtwdev)
-- 
2.21.0


^ permalink raw reply related

* [PATCH v2 1/3] rtw88: add beacon filter support
From: Ping-Ke Shih @ 2021-04-23  7:54 UTC (permalink / raw)
  To: tony0620emma, kvalo; +Cc: linux-wireless, phhuang

From: Po-Hao Huang <phhuang@realtek.com>

Adding this supports beacon filter and CQM.
Let firmware perform connection quality monitor and beacon processing.
This make host CPU wakeup less under power save mode.
To make mechanisms work as usual, fw will notify driver events such as
signal change and beacon loss.

This feature needs firmware 9.9.8 or newer to support it, and driver is
compatible with older firmware.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2: no change
---
 drivers/net/wireless/realtek/rtw88/fw.c       | 91 +++++++++++++++++++
 drivers/net/wireless/realtek/rtw88/fw.h       | 40 ++++++++
 drivers/net/wireless/realtek/rtw88/mac80211.c |  7 ++
 drivers/net/wireless/realtek/rtw88/main.c     |  4 +-
 drivers/net/wireless/realtek/rtw88/main.h     |  1 +
 5 files changed, 142 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
index ea2cd4db1d3c..aab9ce3e0bb7 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.c
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
@@ -127,6 +127,51 @@ static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload,
 	rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data);
 }
 
+struct rtw_beacon_filter_iter_data {
+	struct rtw_dev *rtwdev;
+	u8 *payload;
+};
+
+static void rtw_fw_bcn_filter_notify_vif_iter(void *data, u8 *mac,
+					      struct ieee80211_vif *vif)
+{
+	struct rtw_beacon_filter_iter_data *iter_data = data;
+	struct rtw_dev *rtwdev = iter_data->rtwdev;
+	u8 *payload = iter_data->payload;
+	u8 type = GET_BCN_FILTER_NOTIFY_TYPE(payload);
+	u8 event = GET_BCN_FILTER_NOTIFY_EVENT(payload);
+	s8 sig = (s8)GET_BCN_FILTER_NOTIFY_RSSI(payload);
+
+	switch (type) {
+	case BCN_FILTER_NOTIFY_SIGNAL_CHANGE:
+		event = event ? NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH :
+			NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW;
+		ieee80211_cqm_rssi_notify(vif, event, sig, GFP_KERNEL);
+		break;
+	case BCN_FILTER_NOTIFY_CONNECTION_STATUS:
+		if (event == BCN_FILTER_CONNECTION_LOSS)
+			ieee80211_connection_loss(vif);
+		else if (event == BCN_FILTER_CONNECTED)
+			rtwdev->beacon_loss = false;
+		break;
+	case BCN_FILTER_NOTIFY_BEACON_LOSS:
+		rtwdev->beacon_loss = true;
+		rtw_leave_lps(rtwdev);
+		break;
+	}
+}
+
+static void rtw_fw_bcn_filter_notify(struct rtw_dev *rtwdev, u8 *payload,
+				     u8 length)
+{
+	struct rtw_beacon_filter_iter_data dev_iter_data;
+
+	dev_iter_data.rtwdev = rtwdev;
+	dev_iter_data.payload = payload;
+	rtw_iterate_vifs(rtwdev, rtw_fw_bcn_filter_notify_vif_iter,
+			 &dev_iter_data);
+}
+
 void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
 {
 	struct rtw_c2h_cmd *c2h;
@@ -152,6 +197,9 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
 	case C2H_WLAN_INFO:
 		rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len);
 		break;
+	case C2H_BCN_FILTER_NOTIFY:
+		rtw_fw_bcn_filter_notify(rtwdev, c2h->payload, len);
+		break;
 	case C2H_HALMAC:
 		rtw_fw_c2h_cmd_handle_ext(rtwdev, skb);
 		break;
@@ -527,6 +575,49 @@ void rtw_fw_update_wl_phy_info(struct rtw_dev *rtwdev)
 	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
 }
 
+void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, bool connect,
+				 struct ieee80211_vif *vif)
+{
+	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
+	struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid);
+	static const u8 rssi_min = 0, rssi_max = 100, rssi_offset = 100;
+	struct rtw_sta_info *si =
+		sta ? (struct rtw_sta_info *)sta->drv_priv : NULL;
+	s32 threshold = bss_conf->cqm_rssi_thold + rssi_offset;
+	struct rtw_fw_state *fw = &rtwdev->fw;
+	u8 h2c_pkt[H2C_PKT_SIZE] = {0};
+
+	if (!(fw->feature & FW_FEATURE_BCN_FILTER))
+		return;
+
+	if (!connect) {
+		SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P1);
+		SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, connect);
+		rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+
+		return;
+	}
+	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P0);
+	ether_addr_copy(&h2c_pkt[1], bss_conf->bssid);
+	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+
+	memset(h2c_pkt, 0, sizeof(h2c_pkt));
+	threshold = clamp_t(s32, threshold, rssi_min, rssi_max);
+	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BCN_FILTER_OFFLOAD_P1);
+	SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, connect);
+	SET_BCN_FILTER_OFFLOAD_P1_OFFLOAD_MODE(h2c_pkt,
+					       BCN_FILTER_OFFLOAD_MODE_DEFAULT);
+	SET_BCN_FILTER_OFFLOAD_P1_THRESHOLD(h2c_pkt, (u8)threshold);
+	SET_BCN_FILTER_OFFLOAD_P1_BCN_LOSS_CNT(h2c_pkt, BCN_LOSS_CNT);
+	if (si)
+		SET_BCN_FILTER_OFFLOAD_P1_MACID(h2c_pkt, si->mac_id);
+	else
+		rtw_warn(rtwdev, "CQM config with station not found\n");
+	SET_BCN_FILTER_OFFLOAD_P1_HYST(h2c_pkt, bss_conf->cqm_rssi_hyst);
+	SET_BCN_FILTER_OFFLOAD_P1_BCN_INTERVAL(h2c_pkt, bss_conf->beacon_int);
+	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+}
+
 void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev)
 {
 	struct rtw_lps_conf *conf = &rtwdev->lps_conf;
diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
index 7c5b1d75e26f..084d60b73e76 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.h
+++ b/drivers/net/wireless/realtek/rtw88/fw.h
@@ -24,6 +24,13 @@
 #define DLFW_BLK_SIZE_LEGACY		4
 #define FW_START_ADDR_LEGACY		0x1000
 
+#define BCN_LOSS_CNT			7
+#define BCN_FILTER_CONNECTION_LOSS	0
+#define BCN_FILTER_CONNECTED		1
+#define BCN_FILTER_NOTIFY_SIGNAL_CHANGE		0
+#define BCN_FILTER_NOTIFY_CONNECTION_STATUS	1
+#define BCN_FILTER_NOTIFY_BEACON_LOSS		2
+
 enum rtw_c2h_cmd_id {
 	C2H_CCX_TX_RPT = 0x03,
 	C2H_BT_INFO = 0x09,
@@ -32,6 +39,7 @@ enum rtw_c2h_cmd_id {
 	C2H_HW_FEATURE_REPORT = 0x19,
 	C2H_WLAN_INFO = 0x27,
 	C2H_WLAN_RFON = 0x32,
+	C2H_BCN_FILTER_NOTIFY = 0x36,
 	C2H_HW_FEATURE_DUMP = 0xfd,
 	C2H_HALMAC = 0xff,
 };
@@ -78,9 +86,19 @@ enum rtw_fw_feature {
 	FW_FEATURE_LPS_C2H = BIT(1),
 	FW_FEATURE_LCLK = BIT(2),
 	FW_FEATURE_PG = BIT(3),
+	FW_FEATURE_BCN_FILTER = BIT(5),
 	FW_FEATURE_MAX = BIT(31),
 };
 
+enum rtw_beacon_filter_offload_mode {
+	BCN_FILTER_OFFLOAD_MODE_0 = 0,
+	BCN_FILTER_OFFLOAD_MODE_1,
+	BCN_FILTER_OFFLOAD_MODE_2,
+	BCN_FILTER_OFFLOAD_MODE_3,
+
+	BCN_FILTER_OFFLOAD_MODE_DEFAULT = BCN_FILTER_OFFLOAD_MODE_1,
+};
+
 struct rtw_coex_info_req {
 	u8 seq;
 	u8 op_code;
@@ -237,6 +255,10 @@ struct rtw_fw_hdr_legacy {
 #define GET_RA_REPORT_BW(c2h_payload)		(c2h_payload[6])
 #define GET_RA_REPORT_MACID(c2h_payload)	(c2h_payload[1])
 
+#define GET_BCN_FILTER_NOTIFY_TYPE(c2h_payload)	(c2h_payload[1] & 0xf)
+#define GET_BCN_FILTER_NOTIFY_EVENT(c2h_payload)	(c2h_payload[1] & 0x10)
+#define GET_BCN_FILTER_NOTIFY_RSSI(c2h_payload)	(c2h_payload[2] - 100)
+
 /* PKT H2C */
 #define H2C_PKT_CMD_ID 0xFF
 #define H2C_PKT_CATEGORY 0x01
@@ -345,6 +367,8 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
 #define H2C_CMD_LPS_PG_INFO		0x2b
 #define H2C_CMD_RA_INFO			0x40
 #define H2C_CMD_RSSI_MONITOR		0x42
+#define H2C_CMD_BCN_FILTER_OFFLOAD_P0	0x56
+#define H2C_CMD_BCN_FILTER_OFFLOAD_P1	0x57
 #define H2C_CMD_WL_PHY_INFO		0x58
 
 #define H2C_CMD_COEX_TDMA_TYPE		0x60
@@ -381,6 +405,20 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
 	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
 #define SET_WL_PHY_INFO_RX_EVM(h2c_pkt, value)				       \
 	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
+#define SET_BCN_FILTER_OFFLOAD_P1_MACID(h2c_pkt, value)			       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
+#define SET_BCN_FILTER_OFFLOAD_P1_ENABLE(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(16))
+#define SET_BCN_FILTER_OFFLOAD_P1_HYST(h2c_pkt, value)			       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(20, 17))
+#define SET_BCN_FILTER_OFFLOAD_P1_OFFLOAD_MODE(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 21))
+#define SET_BCN_FILTER_OFFLOAD_P1_THRESHOLD(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
+#define SET_BCN_FILTER_OFFLOAD_P1_BCN_LOSS_CNT(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(3, 0))
+#define SET_BCN_FILTER_OFFLOAD_P1_BCN_INTERVAL(h2c_pkt, value)		       \
+	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(13, 4))
 
 #define SET_PWR_MODE_SET_MODE(h2c_pkt, value)                                  \
 	le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(14, 8))
@@ -577,6 +615,8 @@ void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
 void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
 void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool conn);
 void rtw_fw_update_wl_phy_info(struct rtw_dev *rtwdev);
+void rtw_fw_beacon_filter_config(struct rtw_dev *rtwdev, bool connect,
+				 struct ieee80211_vif *vif);
 int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
 				u8 *buf, u32 size);
 void rtw_remove_rsvd_page(struct rtw_dev *rtwdev,
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
index 333df6b38113..9087c5b1ea80 100644
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -148,11 +148,15 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw,
 {
 	struct rtw_dev *rtwdev = hw->priv;
 	struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
+	struct rtw_fw_state *fw = &rtwdev->fw;
 	enum rtw_net_type net_type;
 	u32 config = 0;
 	u8 port = 0;
 	u8 bcn_ctrl = 0;
 
+	if (fw->feature & FW_FEATURE_BCN_FILTER)
+		vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
+				     IEEE80211_VIF_SUPPORTS_CQM_RSSI;
 	rtwvif->port = port;
 	rtwvif->stats.tx_unicast = 0;
 	rtwvif->stats.rx_unicast = 0;
@@ -399,6 +403,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
 			rtw_write32_clr(rtwdev, REG_FWHW_TXQ_CTRL,
 					BIT_EN_BCNQ_DL);
 	}
+	if (changed & BSS_CHANGED_CQM)
+		rtw_fw_beacon_filter_config(rtwdev, true, vif);
 
 	if (changed & BSS_CHANGED_MU_GROUPS)
 		rtw_chip_set_gid_table(rtwdev, vif, conf);
@@ -450,6 +456,7 @@ static int rtw_ops_sta_remove(struct ieee80211_hw *hw,
 {
 	struct rtw_dev *rtwdev = hw->priv;
 
+	rtw_fw_beacon_filter_config(rtwdev, false, vif);
 	mutex_lock(&rtwdev->mutex);
 	rtw_sta_remove(rtwdev, sta, true);
 	mutex_unlock(&rtwdev->mutex);
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
index f3a3a86fa9b5..94fadef5c131 100644
--- a/drivers/net/wireless/realtek/rtw88/main.c
+++ b/drivers/net/wireless/realtek/rtw88/main.c
@@ -239,7 +239,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
 	 * get that vif and check if device is having traffic more than the
 	 * threshold.
 	 */
-	if (rtwdev->ps_enabled && data.rtwvif && !ps_active)
+	if (rtwdev->ps_enabled && data.rtwvif && !ps_active &&
+	    !rtwdev->beacon_loss)
 		rtw_enter_lps(rtwdev, data.rtwvif->port);
 
 	rtwdev->watch_dog_cnt++;
@@ -292,6 +293,7 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
 	rtw_fw_media_status_report(rtwdev, si->mac_id, true);
 
 	rtwdev->sta_cnt++;
+	rtwdev->beacon_loss = false;
 	rtw_info(rtwdev, "sta %pM joined with macid %d\n",
 		 sta->addr, si->mac_id);
 
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index dc3744847ba9..321667c03b16 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -1837,6 +1837,7 @@ struct rtw_dev {
 	/* lps power state & handler work */
 	struct rtw_lps_conf lps_conf;
 	bool ps_enabled;
+	bool beacon_loss;
 	struct completion lps_leave_check;
 
 	struct dentry *debugfs;
-- 
2.21.0


^ permalink raw reply related

* [PATCH v2 2/3] rtw88: add path diversity
From: Ping-Ke Shih @ 2021-04-23  7:54 UTC (permalink / raw)
  To: tony0620emma, kvalo; +Cc: linux-wireless, phhuang
In-Reply-To: <20210423075442.17498-1-pkshih@realtek.com>

From: Po-Hao Huang <phhuang@realtek.com>

This feature chooses to transmit with antenna that has better signal
strength periodically under 1ss rate.

It can benefit connection quality in the following cases:
1. User is far away from the AP.
2. The far-field pattern of the antenna showed significant signal
strength difference.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2: fix access address should be natural alignment
---
 drivers/net/wireless/realtek/rtw88/debug.h    |  1 +
 drivers/net/wireless/realtek/rtw88/main.h     | 15 ++++
 drivers/net/wireless/realtek/rtw88/phy.c      | 81 +++++++++++++++++++
 drivers/net/wireless/realtek/rtw88/phy.h      |  1 +
 drivers/net/wireless/realtek/rtw88/rtw8822c.c | 39 +++++++--
 5 files changed, 131 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h
index c8efd1900a34..0dd3f9a88c8d 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.h
+++ b/drivers/net/wireless/realtek/rtw88/debug.h
@@ -20,6 +20,7 @@ enum rtw_debug_mask {
 	RTW_DBG_BF		= 0x00000800,
 	RTW_DBG_WOW		= 0x00001000,
 	RTW_DBG_CFO		= 0x00002000,
+	RTW_DBG_PATH_DIV	= 0x00004000,
 
 	RTW_DBG_ALL		= 0xffffffff
 };
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index 321667c03b16..02ad175055cb 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -841,6 +841,10 @@ struct rtw_chip_ops {
 			     u8 fixrate_en, u8 *new_rate);
 	void (*cfo_init)(struct rtw_dev *rtwdev);
 	void (*cfo_track)(struct rtw_dev *rtwdev);
+	void (*config_tx_path)(struct rtw_dev *rtwdev, u8 tx_path,
+			       enum rtw_bb_path tx_path_1ss,
+			       enum rtw_bb_path tx_path_cck,
+			       bool is_tx2_path);
 
 	/* for coex */
 	void (*coex_set_init)(struct rtw_dev *rtwdev);
@@ -1136,7 +1140,9 @@ struct rtw_chip_info {
 	u8 max_power_index;
 
 	u16 fw_fifo_addr[RTW_FW_FIFO_MAX];
+	u8 default_1ss_tx_path;
 
+	bool path_div_supported;
 	bool ht_supported;
 	bool vht_supported;
 	u8 lps_deep_mode_supported;
@@ -1781,6 +1787,14 @@ struct rtw_hal {
 		     [DESC_RATE_MAX];
 };
 
+struct rtw_path_div {
+	enum rtw_bb_path current_tx_path;
+	u32 path_a_sum;
+	u32 path_b_sum;
+	u16 path_a_cnt;
+	u16 path_b_cnt;
+};
+
 struct rtw_dev {
 	struct ieee80211_hw *hw;
 	struct device *dev;
@@ -1849,6 +1863,7 @@ struct rtw_dev {
 	DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS);
 
 	u8 mp_mode;
+	struct rtw_path_div dm_path_div;
 
 	struct rtw_fw_state wow_fw;
 	struct rtw_wow_param wow;
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
index 8146acaf1893..569dd3cfde35 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.c
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
@@ -127,6 +127,17 @@ static void rtw_phy_cfo_init(struct rtw_dev *rtwdev)
 		chip->ops->cfo_init(rtwdev);
 }
 
+static void rtw_phy_tx_path_div_init(struct rtw_dev *rtwdev)
+{
+	struct rtw_path_div *path_div = &rtwdev->dm_path_div;
+
+	path_div->current_tx_path = rtwdev->chip->default_1ss_tx_path;
+	path_div->path_a_cnt = 0;
+	path_div->path_a_sum = 0;
+	path_div->path_b_cnt = 0;
+	path_div->path_b_sum = 0;
+}
+
 void rtw_phy_init(struct rtw_dev *rtwdev)
 {
 	struct rtw_chip_info *chip = rtwdev->chip;
@@ -149,6 +160,7 @@ void rtw_phy_init(struct rtw_dev *rtwdev)
 
 	dm_info->iqk.done = false;
 	rtw_phy_cfo_init(rtwdev);
+	rtw_phy_tx_path_div_init(rtwdev);
 }
 EXPORT_SYMBOL(rtw_phy_init);
 
@@ -695,6 +707,7 @@ void rtw_phy_dynamic_mechanism(struct rtw_dev *rtwdev)
 	rtw_phy_dig(rtwdev);
 	rtw_phy_cck_pd(rtwdev);
 	rtw_phy_ra_track(rtwdev);
+	rtw_phy_tx_path_diversity(rtwdev);
 	rtw_phy_cfo_track(rtwdev);
 	rtw_phy_dpk_track(rtwdev);
 	rtw_phy_pwr_track(rtwdev);
@@ -2315,3 +2328,71 @@ bool rtw_phy_pwrtrack_need_iqk(struct rtw_dev *rtwdev)
 	return false;
 }
 EXPORT_SYMBOL(rtw_phy_pwrtrack_need_iqk);
+
+static void rtw_phy_set_tx_path_by_reg(struct rtw_dev *rtwdev,
+				       enum rtw_bb_path tx_path_sel_1ss)
+{
+	struct rtw_path_div *path_div = &rtwdev->dm_path_div;
+	enum rtw_bb_path tx_path_sel_cck = tx_path_sel_1ss;
+	struct rtw_chip_info *chip = rtwdev->chip;
+
+	if (tx_path_sel_1ss == path_div->current_tx_path)
+		return;
+
+	path_div->current_tx_path = tx_path_sel_1ss;
+	rtw_dbg(rtwdev, RTW_DBG_PATH_DIV, "Switch TX path=%s\n",
+		tx_path_sel_1ss == BB_PATH_A ? "A" : "B");
+	chip->ops->config_tx_path(rtwdev, rtwdev->hal.antenna_tx,
+				  tx_path_sel_1ss, tx_path_sel_cck, false);
+}
+
+static void rtw_phy_tx_path_div_select(struct rtw_dev *rtwdev)
+{
+	struct rtw_path_div *path_div = &rtwdev->dm_path_div;
+	enum rtw_bb_path path = path_div->current_tx_path;
+	s32 rssi_a = 0, rssi_b = 0;
+
+	if (path_div->path_a_cnt)
+		rssi_a = path_div->path_a_sum / path_div->path_a_cnt;
+	else
+		rssi_a = 0;
+	if (path_div->path_b_cnt)
+		rssi_b = path_div->path_b_sum / path_div->path_b_cnt;
+	else
+		rssi_b = 0;
+
+	if (rssi_a != rssi_b)
+		path = (rssi_a > rssi_b) ? BB_PATH_A : BB_PATH_B;
+
+	path_div->path_a_cnt = 0;
+	path_div->path_a_sum = 0;
+	path_div->path_b_cnt = 0;
+	path_div->path_b_sum = 0;
+	rtw_phy_set_tx_path_by_reg(rtwdev, path);
+}
+
+static void rtw_phy_tx_path_diversity_2ss(struct rtw_dev *rtwdev)
+{
+	if (rtwdev->hal.antenna_rx != BB_PATH_AB) {
+		rtw_dbg(rtwdev, RTW_DBG_PATH_DIV,
+			"[Return] tx_Path_en=%d, rx_Path_en=%d\n",
+			rtwdev->hal.antenna_tx, rtwdev->hal.antenna_rx);
+		return;
+	}
+	if (rtwdev->sta_cnt == 0) {
+		rtw_dbg(rtwdev, RTW_DBG_PATH_DIV, "No Link\n");
+		return;
+	}
+
+	rtw_phy_tx_path_div_select(rtwdev);
+}
+
+void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev)
+{
+	struct rtw_chip_info *chip = rtwdev->chip;
+
+	if (!chip->path_div_supported)
+		return;
+
+	rtw_phy_tx_path_diversity_2ss(rtwdev);
+}
diff --git a/drivers/net/wireless/realtek/rtw88/phy.h b/drivers/net/wireless/realtek/rtw88/phy.h
index 0b6f2fc8193c..112ed125970a 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.h
+++ b/drivers/net/wireless/realtek/rtw88/phy.h
@@ -61,6 +61,7 @@ void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
 				struct rtw_swing_table *swing_table);
 void rtw_phy_parsing_cfo(struct rtw_dev *rtwdev,
 			 struct rtw_rx_pkt_stat *pkt_stat);
+void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev);
 
 struct rtw_txpwr_lmt_cfg_pair {
 	u8 regd;
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index 6cb593cc33c2..b6b43654e5c6 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -80,6 +80,13 @@ static void rtw8822c_header_file_init(struct rtw_dev *rtwdev, bool pre)
 		rtw_write32_set(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN);
 }
 
+static void rtw8822c_bb_reset(struct rtw_dev *rtwdev)
+{
+	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
+	rtw_write16_clr(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
+	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB);
+}
+
 static void rtw8822c_dac_backup_reg(struct rtw_dev *rtwdev,
 				    struct rtw_backup_info *backup,
 				    struct rtw_backup_info *backup_rf)
@@ -2424,10 +2431,11 @@ static void rtw8822c_config_cck_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
 		else
 			rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8);
 	}
+	rtw8822c_bb_reset(rtwdev);
 }
 
 static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
-					 bool is_tx2_path)
+					 enum rtw_bb_path tx_path_sel_1ss)
 {
 	if (tx_path == BB_PATH_A) {
 		rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x11);
@@ -2436,21 +2444,28 @@ static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
 		rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x12);
 		rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0);
 	} else {
-		if (is_tx2_path) {
+		if (tx_path_sel_1ss == BB_PATH_AB) {
 			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x33);
 			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0404);
-		} else {
+		} else if (tx_path_sel_1ss == BB_PATH_B) {
+			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x32);
+			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
+		} else if (tx_path_sel_1ss == BB_PATH_A) {
 			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x31);
 			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
 		}
 	}
+	rtw8822c_bb_reset(rtwdev);
 }
 
 static void rtw8822c_config_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
+				    enum rtw_bb_path tx_path_sel_1ss,
+				    enum rtw_bb_path tx_path_cck,
 				    bool is_tx2_path)
 {
-	rtw8822c_config_cck_tx_path(rtwdev, tx_path, is_tx2_path);
-	rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, is_tx2_path);
+	rtw8822c_config_cck_tx_path(rtwdev, tx_path_cck, is_tx2_path);
+	rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, tx_path_sel_1ss);
+	rtw8822c_bb_reset(rtwdev);
 }
 
 static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
@@ -2466,7 +2481,8 @@ static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
 		rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x11111);
 
 	rtw8822c_config_rx_path(rtwdev, rx_path);
-	rtw8822c_config_tx_path(rtwdev, tx_path, is_tx2_path);
+	rtw8822c_config_tx_path(rtwdev, tx_path, BB_PATH_A, BB_PATH_A,
+				is_tx2_path);
 
 	rtw8822c_toggle_igi(rtwdev);
 }
@@ -2517,6 +2533,7 @@ static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
 				   struct rtw_rx_pkt_stat *pkt_stat)
 {
+	struct rtw_path_div *p_div = &rtwdev->dm_path_div;
 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
 	u8 rxsc, bw;
 	s8 min_rx_power = -120;
@@ -2559,6 +2576,13 @@ static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
 	for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
 		rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
 		dm_info->rssi[path] = rssi;
+		if (path == RF_PATH_A) {
+			p_div->path_a_sum += rssi;
+			p_div->path_a_cnt++;
+		} else if (path == RF_PATH_B) {
+			p_div->path_b_sum += rssi;
+			p_div->path_b_cnt++;
+		}
 		dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
 		dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
 
@@ -4851,6 +4875,7 @@ static struct rtw_chip_ops rtw8822c_ops = {
 	.cfg_csi_rate		= rtw_bf_cfg_csi_rate,
 	.cfo_init		= rtw8822c_cfo_init,
 	.cfo_track		= rtw8822c_cfo_track,
+	.config_tx_path		= rtw8822c_config_tx_path,
 
 	.coex_set_init		= rtw8822c_coex_cfg_init,
 	.coex_set_ant_switch	= NULL,
@@ -5192,6 +5217,8 @@ struct rtw_chip_info rtw8822c_hw_spec = {
 	.band = RTW_BAND_2G | RTW_BAND_5G,
 	.page_size = 128,
 	.dig_min = 0x20,
+	.default_1ss_tx_path = BB_PATH_A,
+	.path_div_supported = true,
 	.ht_supported = true,
 	.vht_supported = true,
 	.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK) | BIT(LPS_DEEP_MODE_PG),
-- 
2.21.0


^ permalink raw reply related

* Re: [PATCH] iw: set retain atrribute on sections
From: Greg KH @ 2021-04-23  7:41 UTC (permalink / raw)
  To: Manoj Gupta; +Cc: Johannes Berg, stable, maskray, llozano, linux-wireless
In-Reply-To: <20210422182545.726897-1-manojgupta@google.com>

On Thu, Apr 22, 2021 at 11:25:45AM -0700, Manoj Gupta wrote:
> LLD 13 and GNU ld 2.37 support -z start-stop-gc which allows garbage
> collection of C identifier name sections despite the __start_/__stop_
> references.  Simply set the retain attribute so that GCC 11 (if
> configure-time binutils is 2.36 or newer)/Clang 13 will set the
> SHF_GNU_RETAIN section attribute to prevent garbage collection.
> 
> Without the patch, there are linker errors like the following with -z
> start-stop-gc:
> ld.lld: error: undefined symbol: __stop___cmd
> >>> referenced by iw.c:418
> >>>               iw.o:(__handle_cmd)
> 
> Suggested-by: Fangrui Song <maskray@google.com>
> 
> Signed-off-by: Manoj Gupta <manojgupta@google.com>
> ---
>  iw.h | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)


<formletter>

This is not the correct way to submit patches for inclusion in the
stable kernel tree.  Please read:
    https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html
for how to do this properly.

</formletter>

^ permalink raw reply

* [wireless-drivers-next:master] BUILD SUCCESS 9382531ec63fc123d1d6ff07b0558b6af4ea724b
From: kernel test robot @ 2021-04-23  3:01 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless

tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
branch HEAD: 9382531ec63fc123d1d6ff07b0558b6af4ea724b  Merge tag 'mt76-for-kvalo-2021-04-21' of https://github.com/nbd168/wireless

elapsed time: 721m

configs tested: 178
configs skipped: 2

The following configs have been built successfully.
More configs may be tested in the coming days.

gcc tested configs:
arm                                 defconfig
arm64                            allyesconfig
arm64                               defconfig
arm                              allyesconfig
arm                              allmodconfig
x86_64                           allyesconfig
riscv                            allmodconfig
riscv                            allyesconfig
i386                             allyesconfig
powerpc                 mpc834x_itx_defconfig
powerpc                     redwood_defconfig
m68k                          atari_defconfig
powerpc                      cm5200_defconfig
powerpc                 mpc85xx_cds_defconfig
arm                           spitz_defconfig
xtensa                  audio_kc705_defconfig
powerpc                      acadia_defconfig
powerpc                      ep88xc_defconfig
arc                      axs103_smp_defconfig
powerpc                 linkstation_defconfig
arm                         s5pv210_defconfig
sparc                       sparc32_defconfig
sh                              ul2_defconfig
m68k                       m5208evb_defconfig
mips                     decstation_defconfig
arm                           sama5_defconfig
sh                        edosk7760_defconfig
xtensa                           alldefconfig
nios2                            alldefconfig
mips                         bigsur_defconfig
arm                           h3600_defconfig
sh                   rts7751r2dplus_defconfig
powerpc                  mpc885_ads_defconfig
mips                          rm200_defconfig
arc                           tb10x_defconfig
arm                     eseries_pxa_defconfig
parisc                           alldefconfig
powerpc                      mgcoge_defconfig
mips                        omega2p_defconfig
arm                          exynos_defconfig
arm                          gemini_defconfig
sh                          rsk7269_defconfig
powerpc                       ebony_defconfig
arc                            hsdk_defconfig
arm                       versatile_defconfig
arm                        cerfcube_defconfig
powerpc                     akebono_defconfig
mips                           ip28_defconfig
powerpc                 mpc837x_mds_defconfig
mips                            e55_defconfig
powerpc                        icon_defconfig
arm                        multi_v7_defconfig
sh                           se7724_defconfig
arm                          pcm027_defconfig
sh                        apsh4ad0a_defconfig
arm                        magician_defconfig
ia64                            zx1_defconfig
mips                      maltasmvp_defconfig
mips                malta_qemu_32r6_defconfig
mips                     cu1000-neo_defconfig
arm                           u8500_defconfig
sh                           se7343_defconfig
mips                           ip32_defconfig
sh                          kfr2r09_defconfig
sh                        sh7763rdp_defconfig
csky                             alldefconfig
powerpc                     kmeter1_defconfig
powerpc                  iss476-smp_defconfig
openrisc                  or1klitex_defconfig
mips                      pic32mzda_defconfig
nios2                            allyesconfig
mips                        maltaup_defconfig
mips                        vocore2_defconfig
arc                          axs101_defconfig
arm                       aspeed_g5_defconfig
arm                   milbeaut_m10v_defconfig
arm                         mv78xx0_defconfig
um                            kunit_defconfig
arm                       omap2plus_defconfig
powerpc                 mpc832x_rdb_defconfig
openrisc                    or1ksim_defconfig
powerpc                       maple_defconfig
sh                           se7751_defconfig
m68k                            mac_defconfig
mips                   sb1250_swarm_defconfig
h8300                       h8s-sim_defconfig
sparc                               defconfig
powerpc                     ep8248e_defconfig
mips                          rb532_defconfig
powerpc                     tqm8548_defconfig
powerpc                     mpc512x_defconfig
powerpc                      walnut_defconfig
powerpc                     rainier_defconfig
arm                           stm32_defconfig
powerpc                     mpc83xx_defconfig
arm                        trizeps4_defconfig
powerpc                         ps3_defconfig
arm                    vt8500_v6_v7_defconfig
nios2                         3c120_defconfig
arm                            dove_defconfig
arm                        neponset_defconfig
arm                      tct_hammer_defconfig
m68k                        mvme16x_defconfig
ia64                          tiger_defconfig
um                           x86_64_defconfig
ia64                             allmodconfig
ia64                                defconfig
ia64                             allyesconfig
m68k                             allmodconfig
m68k                                defconfig
m68k                             allyesconfig
nios2                               defconfig
arc                              allyesconfig
nds32                             allnoconfig
nds32                               defconfig
csky                                defconfig
alpha                               defconfig
alpha                            allyesconfig
xtensa                           allyesconfig
h8300                            allyesconfig
arc                                 defconfig
sh                               allmodconfig
parisc                              defconfig
s390                             allyesconfig
s390                             allmodconfig
parisc                           allyesconfig
s390                                defconfig
sparc                            allyesconfig
i386                                defconfig
mips                             allyesconfig
mips                             allmodconfig
powerpc                          allyesconfig
powerpc                          allmodconfig
powerpc                           allnoconfig
x86_64               randconfig-a004-20210421
x86_64               randconfig-a002-20210421
x86_64               randconfig-a001-20210421
x86_64               randconfig-a005-20210421
x86_64               randconfig-a006-20210421
x86_64               randconfig-a003-20210421
i386                 randconfig-a005-20210421
i386                 randconfig-a002-20210421
i386                 randconfig-a001-20210421
i386                 randconfig-a006-20210421
i386                 randconfig-a004-20210421
i386                 randconfig-a003-20210421
i386                 randconfig-a012-20210421
i386                 randconfig-a014-20210421
i386                 randconfig-a011-20210421
i386                 randconfig-a013-20210421
i386                 randconfig-a015-20210421
i386                 randconfig-a016-20210421
i386                 randconfig-a014-20210422
i386                 randconfig-a012-20210422
i386                 randconfig-a011-20210422
i386                 randconfig-a013-20210422
i386                 randconfig-a015-20210422
i386                 randconfig-a016-20210422
riscv                    nommu_k210_defconfig
riscv                    nommu_virt_defconfig
riscv                             allnoconfig
riscv                               defconfig
riscv                          rv32_defconfig
um                               allmodconfig
um                                allnoconfig
um                               allyesconfig
um                                  defconfig
x86_64                    rhel-8.3-kselftests
x86_64                              defconfig
x86_64                               rhel-8.3
x86_64                      rhel-8.3-kbuiltin
x86_64                                  kexec

clang tested configs:
x86_64               randconfig-a015-20210421
x86_64               randconfig-a016-20210421
x86_64               randconfig-a011-20210421
x86_64               randconfig-a014-20210421
x86_64               randconfig-a013-20210421
x86_64               randconfig-a012-20210421

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply

* [wireless-drivers-next:pending] BUILD SUCCESS bbc6785fe9a8a785fcfd1e89ded1011d235b7bd7
From: kernel test robot @ 2021-04-22 22:16 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless

tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git pending
branch HEAD: bbc6785fe9a8a785fcfd1e89ded1011d235b7bd7  Merge tag 'mt76-for-kvalo-2021-04-21' of https://github.com/nbd168/wireless into pending

elapsed time: 724m

configs tested: 149
configs skipped: 2

The following configs have been built successfully.
More configs may be tested in the coming days.

gcc tested configs:
arm                                 defconfig
arm64                            allyesconfig
arm64                               defconfig
arm                              allyesconfig
arm                              allmodconfig
x86_64                           allyesconfig
riscv                            allmodconfig
i386                             allyesconfig
riscv                            allyesconfig
powerpc                      pcm030_defconfig
arm                         s3c6400_defconfig
xtensa                          iss_defconfig
mips                      loongson3_defconfig
powerpc                  iss476-smp_defconfig
arm                              alldefconfig
arm                      footbridge_defconfig
alpha                               defconfig
h8300                    h8300h-sim_defconfig
xtensa                              defconfig
powerpc                      ep88xc_defconfig
arc                      axs103_smp_defconfig
powerpc                 linkstation_defconfig
arm                         s5pv210_defconfig
sparc                       sparc32_defconfig
sh                              ul2_defconfig
m68k                       m5208evb_defconfig
mips                     decstation_defconfig
arm                           sama5_defconfig
sh                        edosk7760_defconfig
xtensa                           alldefconfig
powerpc                  mpc885_ads_defconfig
mips                          rm200_defconfig
arc                           tb10x_defconfig
powerpc                      acadia_defconfig
sh                           se7724_defconfig
arm                          pcm027_defconfig
sh                        apsh4ad0a_defconfig
arm                        magician_defconfig
ia64                            zx1_defconfig
mips                      maltasmvp_defconfig
mips                        maltaup_defconfig
mips                        bcm47xx_defconfig
powerpc                 canyonlands_defconfig
powerpc                      ppc44x_defconfig
arc                          axs101_defconfig
arm                       aspeed_g5_defconfig
arm                   milbeaut_m10v_defconfig
arm                         mv78xx0_defconfig
um                            kunit_defconfig
arc                              allyesconfig
powerpc               mpc834x_itxgp_defconfig
mips                      pistachio_defconfig
arm                          pxa910_defconfig
mips                         tb0287_defconfig
um                             i386_defconfig
arm                           spitz_defconfig
powerpc                     kmeter1_defconfig
arm                         nhk8815_defconfig
arm                        vexpress_defconfig
arm                         s3c2410_defconfig
sh                             shx3_defconfig
powerpc                         ps3_defconfig
arm                    vt8500_v6_v7_defconfig
nios2                         3c120_defconfig
arm                          gemini_defconfig
arm                            dove_defconfig
arm                        neponset_defconfig
nds32                             allnoconfig
mips                 decstation_r4k_defconfig
mips                      maltaaprp_defconfig
arm                       omap2plus_defconfig
arm                      tct_hammer_defconfig
m68k                        mvme16x_defconfig
ia64                          tiger_defconfig
um                           x86_64_defconfig
mips                malta_qemu_32r6_defconfig
arm                           u8500_defconfig
ia64                             allmodconfig
ia64                                defconfig
ia64                             allyesconfig
m68k                             allmodconfig
m68k                                defconfig
m68k                             allyesconfig
nios2                               defconfig
nds32                               defconfig
nios2                            allyesconfig
csky                                defconfig
alpha                            allyesconfig
xtensa                           allyesconfig
h8300                            allyesconfig
arc                                 defconfig
sh                               allmodconfig
parisc                              defconfig
s390                             allyesconfig
s390                             allmodconfig
parisc                           allyesconfig
s390                                defconfig
sparc                            allyesconfig
sparc                               defconfig
i386                                defconfig
mips                             allyesconfig
mips                             allmodconfig
powerpc                          allyesconfig
powerpc                          allmodconfig
powerpc                           allnoconfig
x86_64               randconfig-a004-20210421
x86_64               randconfig-a002-20210421
x86_64               randconfig-a001-20210421
x86_64               randconfig-a005-20210421
x86_64               randconfig-a006-20210421
x86_64               randconfig-a003-20210421
i386                 randconfig-a005-20210421
i386                 randconfig-a002-20210421
i386                 randconfig-a001-20210421
i386                 randconfig-a006-20210421
i386                 randconfig-a004-20210421
i386                 randconfig-a003-20210421
x86_64               randconfig-a015-20210422
x86_64               randconfig-a016-20210422
x86_64               randconfig-a011-20210422
x86_64               randconfig-a014-20210422
x86_64               randconfig-a012-20210422
x86_64               randconfig-a013-20210422
i386                 randconfig-a012-20210421
i386                 randconfig-a014-20210421
i386                 randconfig-a011-20210421
i386                 randconfig-a013-20210421
i386                 randconfig-a015-20210421
i386                 randconfig-a016-20210421
riscv                    nommu_k210_defconfig
riscv                    nommu_virt_defconfig
riscv                             allnoconfig
riscv                               defconfig
riscv                          rv32_defconfig
um                               allmodconfig
um                                allnoconfig
um                               allyesconfig
um                                  defconfig
x86_64                    rhel-8.3-kselftests
x86_64                              defconfig
x86_64                               rhel-8.3
x86_64                      rhel-8.3-kbuiltin
x86_64                                  kexec

clang tested configs:
x86_64               randconfig-a015-20210421
x86_64               randconfig-a016-20210421
x86_64               randconfig-a011-20210421
x86_64               randconfig-a014-20210421
x86_64               randconfig-a013-20210421
x86_64               randconfig-a012-20210421

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

^ permalink raw reply

* Re: [PATCH v2][next] wireless: wext-spy: Fix out-of-bounds warning
From: Kees Cook @ 2021-04-22 20:48 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Gustavo A. R. Silva, David S. Miller, Jakub Kicinski,
	linux-wireless, netdev, linux-kernel, linux-hardening
In-Reply-To: <120f5db6566b583cc7050f13e947016f3cb82412.camel@sipsolutions.net>

On Thu, Apr 22, 2021 at 10:04:29PM +0200, Johannes Berg wrote:
> On Thu, 2021-04-22 at 15:00 -0500, Gustavo A. R. Silva wrote:
> > 
> > Changes in v2:
> >  - Use direct struct assignments instead of memcpy().
> >  - Fix one more instance of this same issue in function
> >    iw_handler_get_thrspy().
> >  - Update changelog text.
> 
> Thanks.
> 
> >  - Add Kees' RB tag. 
> 
> He probably won't mind in this case, but you did some pretty substantial
> changes to the patch, so I really wouldn't recommend keeping it there.

Thanks for double-checking! Yeah, I'm fine with it; Gustavo and I had
talked in the past about similar solutions in other places, so he
forwarded the intent from those conversations. (Not that you had any
visibility into that!) But, yes, still:

Reviewed-by: Kees Cook <keescook@chromium.org>

Thanks!

-- 
Kees Cook

^ permalink raw reply

* Re: [PATCH v2][next] wireless: wext-spy: Fix out-of-bounds warning
From: Gustavo A. R. Silva @ 2021-04-22 20:10 UTC (permalink / raw)
  To: Kees Cook, Johannes Berg, Gustavo A. R. Silva, David S. Miller,
	Jakub Kicinski
  Cc: linux-wireless, netdev, linux-kernel, linux-hardening
In-Reply-To: <120f5db6566b583cc7050f13e947016f3cb82412.camel@sipsolutions.net>



On 4/22/21 15:04, Johannes Berg wrote:
> On Thu, 2021-04-22 at 15:00 -0500, Gustavo A. R. Silva wrote:
>>
>> Changes in v2:
>>  - Use direct struct assignments instead of memcpy().
>>  - Fix one more instance of this same issue in function
>>    iw_handler_get_thrspy().
>>  - Update changelog text.
> 
> Thanks.
> 
>>  - Add Kees' RB tag. 
> 
> He probably won't mind in this case, but you did some pretty substantial
> changes to the patch, so I really wouldn't recommend keeping it there.

Right.

Kees, could you please confirm you RB tag in this new version?

Thanks
--
Gustavo

^ permalink raw reply

* Re: [PATCH][next] wireless: wext-spy: Fix out-of-bounds warning
From: Gustavo A. R. Silva @ 2021-04-22 20:03 UTC (permalink / raw)
  To: Johannes Berg, Gustavo A. R. Silva, David S. Miller,
	Jakub Kicinski
  Cc: linux-wireless, netdev, linux-kernel, linux-hardening, Kees Cook
In-Reply-To: <317099c78edb9fdde3db3f1e7c9a4f77529b281a.camel@sipsolutions.net>



On 4/22/21 02:04, Johannes Berg wrote:
> On Wed, 2021-04-21 at 18:43 -0500, Gustavo A. R. Silva wrote:
>>
>>  	/* Just do it */
>> -	memcpy(&(spydata->spy_thr_low), &(threshold->low),
>> -	       2 * sizeof(struct iw_quality));
>> +	memcpy(&spydata->spy_thr_low, &threshold->low, sizeof(threshold->low));
>> +	memcpy(&spydata->spy_thr_high, &threshold->high, sizeof(threshold->high));
>>
> 
> It would've been really simple to stick to 80 columns here (and
> everywhere in the patch), please do that.
> 
> Also, why not just use struct assigments?
> 
> 	spydata->spy_thr_low = threshold->low;
> 
> etc.
> Done: https://lore.kernel.org/lkml/20210422200032.GA168995@embeddedor/
> Seems far simpler (and shorter lines).

Done:
	https://lore.kernel.org/lkml/20210422200032.GA168995@embeddedor/

Thanks for the feedback.
--
Gustavo

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox