* [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
zcmbTf3w)DB)<6C{N!q5g(6msRQc5o=AT7vUM3*Jdilt2f5fueBrDfCRQlOxMw?vCq
ziWVL;kb;J!DA!eA^<8&$-P%;;rUHU;QMb?{B`GwQHrf5TyZwL9JV`IC`+oNGhtK4B
zo-=38oVlGjbLPzS#LMw@ugBk#{UXQ3a<Q>J_&1j0I9ZB9c{zsTlz2}-;J8eSwwRtg
z{c!RV9Ji?Ry;~M1NY33Qyqr)ZPrXZOp%|eqp+J6Sk<>zn^r5II&a|vXNWMpEk%oa$
z768@@pDVsJpPMSRTt@I9_z?b%kT*?gnSn41As?X_VKah&@Fv0mgg+o$K)8r-4dL$y
zQPZWCUAIUrFU*iydcx2A@RMK^D#Oq4H;7CZh9vz~6IcK`2!BWDL5Nx?wZtL3I6Bj^
z4dEa{Bf@EfzafkqlWDmXL4#0%U_sc4@DYMAhrfwGEqs<##&-#GhGv+RW03$M6CnrT
zCWP?_lMsmbG(1r?>>p*+|C=)H|4j_^|0ZVof1d^e{l8<A(#$#A;<pXirrb7SQ);56
z2SGqM7JjGidITrJ0fhGv2<Ae#fY6HYF@gty;1s^?_fFq|aQHi(GCBPlG-wbNM;1S9
zWR80LEo!{y%}li1iE!id9>5|Y5*NXH5OELA6!gQIitaB~SSDx`mP$O|M7R+Cehjcz
z5$X}XLg+zAC{b8Y@SFpWDl9RNDJ*#i%Mi>6Z$BnHn*65`s?~{>x7Q?EUaC&CbcO@L
zRIA@F8ore`Pp?h1Oh&jJVKzcO!hD3g5S~EThwu)<F9@-l6D?T?`3SQvCR!dwcm~0V
z@FfC&DbX?-VLpNhK|tVnnSyGiMb;Yr&vB!70#6KP%j~`n2F$|ujo}@@{)n(QS`oty
zmkpN>$Doat$J{jh*5QSCpJ<g@W+Ti;xEo<5!r%8uE!_x_XX;zxcjP&feJ_z(#22aM
z{xAYPOWz(Cp22tjup8g~!)N&J3&PE*xwlO`l4vm_e2*~kXrkpcgr08_En`n4T1pVs
zBJ4mge<HQ~6=Ch4rIy4`rIrsreSd4}2wtARNw^oI%RhSm;E1zP@4uLNDt_o~qgSlY
zoO>VrmXxk%FM?^p#N??DPrv!@JLf-q&+1uy7{ZPTdAH+}5>5Cme$WWqjGGsiu3LG}
zYWkeCcpW2%_e}bpJn&mcxOv9pU&#?vriJq>c#QJnxal{~eXQWID*AZ;v73kU{B6Q3
z6K~GI=WQkHmQ-(;dmqE={a(C|zJ+fmPL@)VxJl=fV|%z;xCz{Neg-#zA1}F;yP3a*
zpTSR%+#<P^zgg15&5%sQFZX_+&?J!rl7tn-j=_}yxrVEn<jq=@?3W9P8r6g{-@1B*
zSEX<C@<r+k+(-*&Q9if9qTKkXMR@?>Uc7&fXUPUm`LR%{nVgy%SagB+F4{54n`zAU
zDm1)F?Z&&INI0O$lH>-2uQkK@BH^+o3#dzaQ90AIUYRC>no*JpoS7wALvjPlFIbdM
zJpmGWX~6m~pJc@Q&z7v<rTO02_pdBi$xFs{3kw!y(zmc?(Z`aBp9?qNW#emvBX><5
z?DB2gDN_(DF5inn>|)gokeQ3qvtRW^6~>&Ae;0kaK^GHUr;GibQ~u*jPu07+ETiT+
zr=0b<uzvAPQdvMQI2TWs<^+_&g~hX_1$d_4y+c|a7$*Gj?$Jpb1H&{99jE-`XDO87
zDrrFQ-d&Jb=F`|XL(+HJCMrRhZ?$m8l9|#5Bzk7a3~5_{6Fy!t(>(d}l8<6fReVG^
zgT5`@QR7==Bd%p#N{#kBLA8J_v5D`4gc{${@Ov!Ymxtf0b~t_N@VnDjU`rIV=VP}j
zUMrfEq1Ut%YeX}rYoz8~#;9^>R4E{)f}6V(B{9UcUOqM3FDshgYG>J(cgZy2WO`LV
zOE45+iLm>gbZL2)Lip^S<U2NY#cQ}#QHnuUBF?^$Q8cUchAxh!mv5C9$xq1zd;P@;
zgw@c6eg>@A*XXMml+x}^8`p;1WQ7F(&FW5K%-GhY=$C(aZ~hP8n}4&cdsw&_iCYIv
zdS!=v`iGYWRdLEmRMEzQ?vX4dr(F4YPYSovI_+IP$NaA{=}F0n6>r7sjqdpBCrU5A
zg}$!$cT0-eW?a3*ozm{%t0Z|`)$eq3_C#fuwDJpj^cs)mx_S@4N9yLai*%CkQyP9I
zW+S%>Pd8UMFW9wLT6t@ytTL(d>ZRM<{J6{QN$z>UC5I)CN_DBFbN1NHd-AVEl`gv+
zeeYQv|ENsy@ulc{|EA*~``x5L+McSFy5rY0*In0m?F!xCd}Q37>Aj;NHkaEXpOWd#
zZ_e~en&*7ReWq04tD$JB;nMsT5uV?$Vy<Corgud%LFcq^Tlpr!;RH!h@f5X-=<r3E
z-nn-)^ZHD0L9=v=q)t+n+0L!}M_J5@=#x<=p4l^27p2>(;ewWFT(D*ur##=J{_I)%
zK**fW1oflC%uRa=bc#KcWVS);4LXi{daAZ+wiX(%i^;i3m+%H6LFpu!cGZ>gsaslO
z6k2b$qp34S+u2$^b!}TDqxbg^jqe->Jv}DlwWe#p|G9iB&+zYYINUMX;?{yG`7K<K
zn?&@$m>Hbap#z_9n)6wVHF`@_ove)O{AXFz3bcjZ;xDv4r;}B2kULRUDPp*l6sO&j
zfL530a>`p=5(TFm>k?xlHGrN_k)vDO#TCY$snflu8}uEge9#s9+Mw5cI?AowHRyGM
zBYkUAU$!D~BsL<c#-iMOUla`lJ-S2@XLvriqUrhI$|hn%IC1aXi8TRxy(+*NrBzJS
z=~Z2YwjnfD42^+;?U7hM5-ZHPZ=6(K<Pl8wO_rAVKM;1`HzR7FUkS*M_f2Gwgr(^z
z`GK?byvY?%8V_6(MJS^t<S$*8NHnEYv3+?6?<`G8Y3({#?+Og7+@cHT#q!S=eq1^s
zgIGr%#ru5n`KC*wFUh{80yPH2@s}@*yFV>v$r$1}UnstR0z~bG`)8Xe)setzjL|G3
zg6T+L-FY^b81SV(<CAO7__*Q^eItuL2n{Nceb=~CX5}iIerP<<)-7AuHlyiSqa*rE
z)X63qzg3{N;GaJ?zMWkm+tU1H)a%OY1yxDyXRjiz5^?jBu7B2YLI(~PfYZWr7kOdE
z1GA){E<E<YjL9M|>uuoYd<K(i`2jEE>|JVM&C)81^3ew_`9~B|Dddwp!e1XqopHq#
zXC1U9wk{ftMPq|{jqC(4^kx1<w(^}l6$jgm?m;x-QNm2q7~e3>vq6P0aappo#%~wy
zTsDq9*Djkm3>*|53raLGXvr4uvvy87{YRm3*-gC1`qWN7HMRM&?37H%@fL2ca!a#i
z+c@Rr%aoHxNLxO3S<~0l<6gbO8#(2@M;JW#xFZJrcZge(i%wQrr{hhW^7gNztg<@l
zT!d2@(l```DmVYYQXTOhferW;b}dg!{#|fbF=tde<8q@6>pKV!5aFxkS&7j>MbZ2=
z`}xdvg5pc)S)TSAJPYe|<!nsxdWCn2>E6SfaS~cJz2v^boO00T5k9ESD4sWVccqt5
zjBxLRH|xY%uy+o$ne`TDty}G)Ov-%gBZ3`sS7!VFD~nq(=wz%|@tE6sLK&6ur)8%I
zx5mfW2A?^8RVI6vhPZOg_widZQRJbyh&8+_cpgljvgZ4diukQr)u}XvFwyMnnzy&)
zqP+NWD1F%wEn(L98tMmcJE{Bd644NDdno&kS)Yp;RP-{#8yj@m^A_b?NkoqPy=?G`
z_>*yrwHlwX7gL;;QAlC;LqliR_*U1~+P=0Ovb9_gGh0{R7=Bw{Zx6pcS#M!)FWH<v
zE#Ad^F>MQhhbBnNe075A;juHEzCv5H3{_AO6RChAyN#HZ=^Z+;Qk=dHTOCvvPFeT8
zm>(xR^KjaPy6^9}D3*yUQrqHb>{M}Goaw=fym3xIzCd=Se~Kdyr_HGQp2|!m=0+Zz
z349~^v4+>nPmk-8SHv<7s406Y)eg<o!E9tvsnfKn;8-Kf(3TX|`0U_VY@FDw@ibcW
z^4Ez+sS#96vXhjnoTZg-bNUY2PNJ```Ciq6QtEl5rd{MfIIex#+|(Ua#JRbZtTP)T
z%4m%@70M_Pc0x~*8^DZ*(<iD#$P#K6gW6UEMO1_=#k-<dZJTo;v%N=OOX{ex%(rbP
z6k9{9moL`-Kq;JPHj7hksP&9gMLjS=8*ln(6w_Rt(19)Wgi;hx7ALvqw~FZNg)605
z<_MvDU(~-5N&}%(ZM<>2r~$Lom6t3I9+?a#c9H42`nfhcqwe&ruh-TWw_@z-!6<Nm
z5n&WXjVg*-rv3p1C5jZM2S36KD^z1671IhFv0@rSi)?C07EU?lizo#OT7gOvPOeCf
zi{PsKyx?1rGWganq7`*I!a!9Fz$o)aF^s!<F;K<<7*2mI!>H`V0GGn9vV|&YI4WOD
zaOnkFKR`PVe=ld>O<nx^3FU`)sRJ*6S^1oVuN3a6c#QW5f3BFAyxgX?Et<l0&z&L-
zEjm1m^%al6SKb}_3Ds1U%hxD8SgA^O`O53Hn0G2KscoXfa`_5{*D4>J>Vo>KJy_BT
z8OKrslZ{ry+f0}5xvbvPW2|+{O^4jSrFa7^4@T?fkEV2rUrk}z!*p6b<sj(Cg42)n
z>8j4IVi#Lr7*=%`FmdL>_|Q5Okkunu-}eZ==rhK;e04ju%{8HN2eq4vRQaaN_Wn8x
z;KpOZ97A$4RC`Ac()Uzz`Zy9|z+WyH45KH~ye2V7L)A^mir8F=AxNXQ(m}8&MGvdv
z&aTCb6OZs0Lq^=5!+dojqv8>+8fJj+EaT8*O6Lqcy`L|}?@^{5VD6c3oImvO!x3rM
zQ^ub_9;-aU9^+`FJ7z4#Z;FX%EHtIwK{QmM707#=Lsk5&N1~O6)-^@A5@Vh`O5d%t
zEOErBs9YM>b341l7>{tslo#8IS_hu7Q@ChK2KA6>G=D%yueuNKk5tW{Nv$%!Rcq^Q
z0b5C{wqEAtP)oyEJ+%5NXreHx57fH(B1|pE7#~8YYV3?ww1`EV(G0D=x_XI8+o16r
z@@PETX2Qw~lGZ|8qUC@m&YYWsdseCLKM)+O;Y>7(1ET`E<&HYtO98BSOgVtP6wug7
z737QX)+p+sV(J6I5{&YBQ;cr0UmggW96Y#<P(L7?T$P&9c!V=VvtF{QdoAKMo+xX+
zE<B$bJVNYh8WGQ|j<naKti2xXZLfW+$EN;tL~JkWOC0otxF4AUYIsSwx>_|Aye^cT
zvM7`FF;>!&`?TFmJ>sCE_Ec6h)n4V4r;gl2oK$#(*=v$-*>gmiT@y;QM=2V;3+;S$
zQYl|SbtGB3synGkUb+P``?)JybhMD1b5*LK@7J#gFRvMas)#SrJNRNfbp;HIYA3&T
zNNE}yR1{Z<xXJ->6@XL_1S~Ca40?dmN0o9)<x%1Kno*-)@Wo;!XZo3<smIlX1c$_6
z@YH&0LTj7G5n1p&xq2x7l5j_LmK69xWp&<UwOgJ^Y3$J5I8%@DbDi4F8)eX%9zQHI
zT9jW@M=0Wnez8vYygKUvs!dU&>Q_@t<5c?|-_2SOGWFz{v~aImYEwIsbMr&%cB_5M
zcISJ<k=6>eg`>XS9&=N)kvGwdDyY|HqcO|Y-ah*EE24TwzXz^FGW3_Ftr&4Km4;kJ
zPo+n2t)0bR6Zmx*gYO8Y7sa0<F<KBv7ACAynZIsh3r|)d($Gt&kRhhc9%-nuiB!hN
z4-a7lOtX&Il3F(;((ETJ%6~;up?Ra%)Y%p1AWTlV`RFJVDefwDp5yKG`}z@1`O!sA
zxdn;>ebFys^v~)XST0=B$p*6?#T%*hA3rSour5dS_+g^_jz8K_2L<BcHEKf%R&;eb
z<28$N@fud)g6fgc({IH43ve_HN5XiH)JDJRNAo`QNa~o!57&h5w9n7xprUZfpN<r;
z9;NPDZX**@q-lju9vOjZ{{E5l+tFJJU0q}BTNpzY(}8Ox*U%={=zH-RS68%MWHr-7
z@CX|ss}mm`2P*eJnm$zOx7Ta;Xgqu|<OS0aJ;F<mjxKrp@aSF!I1>tAsdgjB`SH+w
zsa8OLw@BaITf{!tUwdKkRBU15qoak)$K;ZEr-a<cZZhvX$(9)g5QKo<et_5D_n5ed
z6Jd1>R(H&yqoH@MvjN5Al<l43%9Phfmc*R$lOvf}^qxF(TfZ(ljlI9qtz|-~$6$2l
zF^JTUY11JwLsF?o8tA21O{*R0An@Ip5e$Oti|oE~huwFFqspxaC!;x!*4J`iPW4Bz
zUs`wY3Jhkp3XjZnm@yraY<YDwhWH<j@zoMMeMbl27=}ial;=W&!wL;X&U%`3H?2?0
zyuF&QCJAx=7%k*C9|fbmy5V!7gd*!3UdeFa{<uDG5KVu#19y9ykhEc1+R-EF;5bX4
z)V0nb1;5hjWLglQoU4V>4YT-8;mr-H=6!*?9XGol&gS$_=@4s-I<?eQcx+!_al=?D
zuVG){E@w8q8TSPiH86@5WI3qQMMYVZ^-Jq?GCW^e`jl>wQ^Z=_yu|qkdoS_q3#_4e
z2UHfhq*?r$B<&d1llBGPa{#WNl#M0yzQ8H=LCe*B0k2~yP_n|ASd>o)_dlLC`Zo^|
z`o6%_Ciyl_KR8Du$|iqek(2<#K4Hh>s+&5=;AXO5%EA=39dP6Ls#P$cv5w2uNNP8y
z+<!!9dptYy@xu~hJd=}r_(=&myG8(=Q-0MhjCn#YmHO8S!V_6TY3k+-&VaVj(gZYA
z<aXi9Cnm@%f`i57pZd|1X@<_Oy-t~-M}H8LuBIbeC1OHI8njIk5Upej6_sCYlT{+F
zBJ;dQxbw-or7C}e(D`IWY|(l#1%&jIV|$@b^g>gfnl)bK-)l=`6)7{S{0D8K;z#fA
z+M*a-<^RA&!@Fp`V0kJ#@4rv*gz(i<Dg1ij@>4TZX<uPY?vBaDyt2K=_?~VVDm6xd
zF^^(EoU+k8`{^`vzhzI)HdAjOQZ2=Lol{O=Itf8!xuWb`OI=q_kmxW@c^^)7Y-v=M
zIK%EgA%%|4DLqWc6283J?u{z7C^@x*741JzHUAsgA=NP$4PRnZ+{jdX^;6-P4UFAS
zk3P~%`ah@ocgExU<zObRKkY50tXhLCqK@;`g)EDCUx`ATxc~o~#SJ+Otl1>0Y$z|B
za^$fDRvM2m&N4GG?nen2+jC?>_V97k1TP6|Efb+YoU^0}pIU~+lz$~c&soL-%0Dw2
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�r}R{NR{wORG7?swDi
zCpMHX_##K~BV#GWC)UN2?D)L}{)zZDIx(JT7)FflaOpu2as$O|2QN2JBD%%s8&HQm
zRd!o~Ufu1Os`1>RJMNZOTSC@b6L{m$hVZdrCxn5xtZ-TXkie&pYw%ZKvgt9Zod>Zj
zzC)MHq)0>fBr&0j2NGP?e<tv$_vHrk&EiESc!SFhUtH@6q!8b^0bBsAkI56c(>ukp
ztfCE@x$WY3G7f{{?q0Q1QAG|-wc*{22LC~;Nx`Q`8~h6E3krVhOv<(aV~BBTXn-S6
z<n77uTQhDG5@F3~-pE^p^@@TYeaB7R^v7>>j`%P$M%-PTQ)=0dYm0Clx1@BGVxEK8
z1YU9cq`|GvI_Zl>rDd9B+L|`{a$4_7<ma0eKlI>F2uawV5X$}`BK`XB4ityxIQWWq
zcO}+EBmLr0s@%X$j_h%`_RlZgFq|8p>yq)?lpC1uh<;!gyEpN9KQhw8_G^@#pp$_2
z`x9|D=iw@^ZZ2zt+`u?<6Q}I-iDm|>V4Uv+nF^38#0|>{rA&sPGZeZ+$B*1Vkz>jO
zQrw=!DMj*xIV2Z1$)2K&D8v3)@vE@;fVc>paQG^bk)PqNXWgE}kIbO@tetAQ6m?qm
z?c4)g1@`Bv8@)Umy3Ky0_1h#q&+NoW@n-+KyVxlsQ?vhr-nWl>-#*zjLcy=Y*-)C=
zi5b&>O4a7Khf}rr8+z0Cz3l}I`(d89^HWP|ugM>bvOYDGPq?SeFW&z{WIt@>D@116
zAngyeik5*kh*RwBnM{!NV8GCZZWeiGU5P=P(HA1|>#Y}u@<T^cXX&`*tJcpB^caql
zWU9h(`!}?>Wa-?c4L>(hvMQG~br?T733UQh&yEqL#<tA!{zW>vh47x-z<B$}anv-A
zU{7YfPWG)-1z2MO+<{sEiP1(J?{aYuxlF-hOlcaW3bOn?@9%T8>i4HLDm>Od55t-9
zV(Z0W{8004tVb1xL@&h5T)yJw_Vk;mQCX9Q@8532l*5tnL@x_qJA}RE2IS#qZ1_2-
zX*}zNA~lU?v?^zuSYc1r--X)^ElmE%a2-U1zS=B;SZ~4*a8XaAB<RRtVU_DT%#O@c
z=0upzTgT-_Z;j0+B7YBJ0DwsxB=wE#&75$Ov!jKf@K<yDIOXgB^=6_#^n25p8belp
zGC#sB!&Me@pzquf-Yg^u*V`Il;aM2wXMXru<PztM=l!CX?N`OUd~Sd{J#wu;M<|Rw
zm910nrE#FrV&7b;^OIsemmub91@&$ey4d;5+}yw>S5Hw7R)vxW7PHmszQ6)@&-zIu
zf#;|p`dfa!yzm^8q1$!9Z;DpnK6ztqz<|O3ygzztOzu;<7xEKnzfZ4i5HG>a4d5nv
zhyu|ekG>?!a2GSunF+`#_XP-@>X=NYqO${7a-?Mcr`l7nmSH{!=y(Q)Y*|z3$0>cz
z()jxw_@}#xemRbcm=Iin<9P52y@Yb3hy*K(hdgFJ^@cKNubWf&RDP57?G%2hs#h1p
z;Oz4_+Y}TWvsq&!-nwQaKXk$-IF~a&gI<la?1m(-ImAB*6iJe`DfqfWyc+gD<YHZ;
z<hM+T3+;AF4D3(4;eg3*+-5AQbo4Gah%UbLt}uxAi^YYk(^B~{!{S0bL^F?zB_cO3
zCj_lksrX}L6hm;TZCcW1`ksM(veq+GMYR#zz0N86Hk6@SEC)pWHOIT+DB&a40k@H2
zJkesWUQuA6zj`H;{Z3-PBrINM@Yfmq^(zF&FH)D0!fl2eEraT+uCH~^RkV2LItJwu
znGYE{E}UfVkTC4|?=b}bgk|svOYsRy@yQkOL<%uRSy53Ef^+v%A@DBlVICu>8I3G9
zH{(Za)`+S?)8s8UijQO6`h~}S)V=?fLZ4uOt9i#k9I_xncYlF8)65In@uwXA=ZhhE
z^MV^1)_noD>ISOA)zj!&Ee$mEwO_<5dWuQlOP0mpPTXC(b<Hf!>{-jKO#@HKioV!O
z*l9)DM-}yth`q7~rGN`P4s}UYIOQFDlFG<zv-5%<*%J);x`Xhw7@n<w;~_l1?FaF@
zw2{P6t@}0@d@Rb79KoXyZ#E+GfyRl7dBH!~CHjLv83(WZ<#xUZzm4;P`F0K5$Cuj|
zcw+OUy-8(y6HC{Zag7~}*b^|C3Z~5U#FX+3m(vrK7if5d8LZelFZj@2+$vl;FR0&J
zW_FLIX*eADI9M>cS7W*t$y=12;Pig5u>s`g+Ua&C`o?MoWk5RCW$8441ZO!=rl!Rx
z$m4c$xfBc5N8x@@SOE&dK%w3)&zTo2wI`U&zngl{v$=JyCzfdgRK-M&2f6T}3kKQY
zKw{izoQA|t;C+rG!8C8mLHArwQmIr`+&Z^|{Y9sK?9iWvAck&abpujA(bTItn^%@L
zNc9OOjYr)Oxi(Q`qT=WZtj~5gte?7n`XP|gA1!N`7c@4N<JZ)*62DbVoW9S~gC>A`
z*NxUmwfC)4X!oPavnp`F0vAZiu@EL-3c7MKnt6%Uv)C!PD;`&4_m7scXhIa<%69iv
zveS`ZG<GPM6D?JCS<}YdvrRo!2Rod*>!$tB^yAkK;bh0gqZ@atO$R$<ISQi*-!=U@
z=Nvm<Io`b>o7`lk(Af`@+{`$mwt%olo6$@o&7Bwg?cqU+Ow2D*J^s#Y^&ma3or13P
z5P58{TWA*HYYB~DTs~N5>!C~K8;)J)R~>YJg>xXH;Q*&-XeDB@__zh?gPzWC+;QrZ
z%?HFO_&4GlJjvJ?hy_1tw<v^bFz1TqpIW!VJISa%#^N!zi)sx1oB%wMtOrN%x8Y(V
zYx@X(RLZz+wSBggFT%6&w{@9_XLa|7^fZ0~fA=qZ|Cxx2(Fz|7YP3eD=34R?!i_jD
z)(kxIj~>|P(wy0DamCST5JQc1*GN9AYCTD`%GmDZJ6h<?Py;uPMN>?dS}xF+6OL@A
zOBVKCL-!qDvWxF9*U*Xh*zS=#u)g+jtMPU&N=v5n1?|z9aS8=<i<&EmRwRbs2!l?h
z&Wi0`kI5UqO|jkE9m5PybntnX+Z7&p9%m#d-4a4JY5F5D<Z0D!xdE=9O6OJ3w$--r
z?VQW*0GE0v%q8QmMLl9+UoPxVj_=Th-<RN`UbSPqJGS)Cy1LKTe7^W|narZ>(T>Pv
zHv(h#Ilh?P%nGR<uTeWKJ7*il!zeYrw-*?D?U>BB(xlecSTjcPs*#bux!RzMKHc{>
zSLr<R_q_F?QT)gWG!)T=R@HX?3^%m|gDk4nvrD(S`DdJo9aL3~=Ss)g=C?vx$6KK}
z*0)FT6YfKj`S}5PG5zgBd;NUx7yF!EoXex>!q6Xnc%RD~|10pL`}X>7#Gg+FwG94t
z_*$X~ue3C@xR{<p7aLeNWbk*gQ&F5DwhI$6WCA-daZ-MQ>XwQy-&^gd&LfY|ES&nv
zGFEy^n<~94n%0H5l6673hSPHfEp5kDP4<<|MT!N+sivQ$->&eN&#l0l<lAU?SaGM5
zJf@$o22zW;Drp_JimPlnE2(QaTri0@|J;DPYC&L?Y!Z?$Our)gp0mny{P!{|Z;U==
z`LbZz$+nHtwp^?uE7Gb;uTn#JTdwe1xm7L4E#8*n5=~LZ-%4fM`1z7Gyhe7K-xj?U
zf4KMbPo*vYA9HUWA7zpCk9IxX>F#XM1dt9}c6LOvfDEG~BtVu9pn@Wcc1W<3UP3^0
zbVjEe0xlyeS)gJ9Go9|B$l}1LGtN7&cNzkUiVlR}sH0;bpk#yYth3yi-0!KUI}7Ta
z`F-v`_mAZ1r=F@)r>ag>opb8cIrW$8uhc8~9+R|3wL%HVY`K&fy+V3iI<L%8{Q38J
zi&(a_Rh64+*q;|%MjF1ss8;D+a?C|C*@LZrF~wX23KrI_p!-rehW6)unLIp(jhmk3
zEvv_YwmHiyqE?8mqpWe@5uW#v_sNY(8<VoUB|JBVO-M>dIJc%659l<e2+*^@NW<>$
z@wKW7n5){L@hGRlfm|#T-*`<7n?HWll+|0q@)YK=F~|V5!v9t)yR_KSR!!mUF|2Ad
zS2n<n4MVu&5n#n*%*nm?^RL#kDE`}6Hf0o$M(?O9Kwz&hTbB1z-Vw`k=W-?6D&MN!
z(WQXqE7hs0$nxG_Z=ucC9JF^>KTt1lOB{<)W_j1}m*dzZX5+`=*tl@pX=Z_Uze*w|
z8@~|8CXlZXLzefqr$^4D%6|3`OX9QQS>h;h2lLw|*T5Z2zB!&vmC%Z+coxgj`5)rh
z3VV9jTNLBdssodWSd()Jn}p^&M08A$K~};QN=fg6KR*(R3TfV`_OXFDqRiIZH4za-
zseAAp{Rx9&F%ZTNh#fVwsmdK*;|EffDqCLD^C1<gDvDb_n*msSZvvZY4_uU_^)|@F
zwi&KFykSOFylTDEt27=EU4&+4KMy<Ez$AIzSMUXXZ^oZxTc196Tc6IbtuHJG6J~{?
zIQ76=-C;{rcP#!Y^(bh)Xz{sJxAx*<lE(zyuq&y~4A1GrtjjACi|k%~w(LdY3G%fM
zBi-?vwB_oCH74WXRIl+v;D6YIrwXBR&8<Co>T;H)%aOKd8(605;$QMW?u8popIlev
zN(Pn_z2fAwKs7W>n@$CHKXR(2>q-3m6n{TE^}Nr9G!y;`@&42)drQ~T`0;amfVRx~
zye|yDbRQP^s!kR8Ucv7O{I16D8vHhXAxFsy5X{hEr5iidG|MdrR*I=(YXXt${%tV8
zQJzD8pK9<nqpT8?X?KH5Z$~@~nj4iW9J+}oPT0g#j`T?BWHVc-Qu?2_im@@~x8O0y
z*#+^hXlBa^Q$Ey`L=h)Ug+7H<gGf;HyVf^`v@(TQaQxJg-*vhss9_WlmHb(jbn^M<
zQ`w?%`JKtt^eGN2G!(P47-Y%kbEdIHET3<l#$LxGayt9t?fG4ARR?+HS&AKDYlN}C
z#G5x#hr`iK!*v=C%8}q5BhTa8XRwK3l%nnN&umIbpp<Dnavp-B%v0$Ug*V6bmvjiB
zn~+DnGuXJKe5@{nn-hlZ5-?K~QuW|;(6VO`+ytFlq(HBX$Wk>-CISZDCuXtH{M-x{
z2CP4y!S2Fi+)TDGau8O%m!j<sw$w5cVPJ;>Z0rfU72xri0^qwd1;Bp-AmGlQ#qx$0
zv~>4`WT`F=!6XW~F3b{TM$Tpna|V$(>l=o|cN$7PbZbM$^lER#>(Fe0*W0s29bKpc
zHO{%6EkZ=%WWMEgmWKB?Z)drMUrK|_SHKvzxldno!W4v&_tQ#YKXI0s*47iI1n)#^
zmUrn{`a&G(36r)*hm_1ADbso=Pxe4cme+6=VI{_K`y4j<!CT2ixUv)r!`Z&DQ@uK(
zVrDr3e<LwwqUE=Gtf#29|47fgZ4Qfs)cRHp5p7@~iBR&pj?#sC>yKe49#fdw3ev!}
zD<TY;I^U^5E`&K9U`If){|lN1qnAZhkKB@aR?7UA2&+(G1|4LI<&;Vn<#&nFuc-D3
zro~R&j3`b$MTOy%q+H5m*(0~A8m<XaMrE%Mn$y6|3_<f1LX+lf08P-%_o6w#1&Mm7
z{|C{`_2Y>NAk&4vm4$vhv4NcR`I#$GoCZsv`2o<(8iFRIenBdexOFbOL%OQwznse^
zFT<vt-9$Tqh;^l~kVJG-#5ian<^kIkeV5a<gXtEegC(HcTCv3{6WJpB;?BuARESo7
za8p;b7Yj@=zR@}0v95$(R9Hqd>Mr3jd8MwLBC_ab1gd3b0`xV!=27g#mbIZ3^qyL?
z2G`7FB)rv>uA$rfK*><OGg(oT+aBJCcd?I#V;@!WlZkACvc6Nx%ktP*R?mA9**$im
zh4dj?^9TW?6kF%cBu(YgmKPBp-FCSo3826(>T`g+VawH!#{9+G7sq7>Ukqy;*$`45
zTp_ADO!UWWo_VL|ecoK}4*(ug8Ad!xmBZ^fDsSiVck<sJl39tUycLomq;X^=_U)Ws
zv<5eXUHo%izj+p-w_$Ir063T92m!#I{7SU|b+XQJgklH(=?2Tf1>-Fb_l@Qgl3C>a
zN?gNId*S;93#A5pqqc$>G>uYrXr;PAQ!eGG4ANHZ#n8s6zR<j}d`#KsJ)w|GWD|Ab
zuQs@Fja6(t6O>qy#jhh8j*HLZ)8aa(ff52^9vB=2oEV-lsV>j};OoH1!}|{1(<mJL
zQp&$gW*h9KU59E|C+tV$T?T9)uFsnt@ND>R+|YB>rwZ0VN#|QQhYGk(D(#Y^f|g=*
zjb99|VuM$rWz_B%Al5x5pNT<=Q`p|2>xeRX=29ITlhCJuWPUM)%}gM!__*l;w(k}M
zywrfMVk{##QgccXRr7*Ljj$e%^SF5|hPCh|^VnT?5nHhP`q38Tw2t^x_33vZ$X!K{
znyPPw^v8K@+-RC5Bg)m4O*K@7K$5r2V<{WxgQlUWMza^?vJ{9of=MUZkXog#998_$
z4a1GEu><~I8&)3Z^pmcpn#ENbgrSmi4t_c1((KKsYQp|0SMjs?EM^m-i@=MMaj(cc
zR5tbB>@kNlCiiYVMV%VgMV%U57(zZ4tEjmt&2Rg31}z3KWN#o%o11d2vQKNspj03g
zV{PmU<Lpj0j*aEp?}QP@YVR1n0`JPbUcLO|l6Ru~BgLl>Kc+wCQyDVAzN$oB8O15h
zvcMSET~{Ng5oCm~=k<4joy~`WKw-J!6`DVp-Lw>WpZlW7y9a-}@mKi;3ixHce8_qv
z?`^_g0sc1P?~zkzO72^IAwy)pEk4_T?5Dce*;y!LKc$fU*bv!IrHAm>^qEo?{l2-1
z^91x0Nq&6$0+terrDDbFK5gdfoqB$90kf}wwF2!uRdKx(DMoG?-Swli`eFC|=&m27
z4&L{pEo68~J%9N}EMazir#{CiKIMA{!49St`UX<X`TX*a*w6SB6Vvl)CU%@}Ok-pC
zEGrA)o+75@O=(PxPZ!d#K2GE(EqExzgI`(5#_Y4Q+rUYTG9g(!qWJ$7vJw3FU4V3I
zF(B<Tvk0!ci>Z|9-FgmoWHh9ow7X!_li#i2TdW|3t%b-}EkinK6ObOh8|F#0DX1D+
zy4JXwyc1%H-tY%j?uEPAq_J7vze2@70t=hzM!ny`XFh-TZg2qj<f48#VWLl>Ot&72
z5ZeuiS>-AVaR=X*XX1a%Q;Ny|pWu{gx>X_*zda2d_sQK%8}r@TO1nulLm0_zI<V-!
zK%Dr6?}Ezj9*X$)=NXRp59Ap@{H4V}{EbCSn?SXlFi~d)x-x)x{wP8me_+bDr?N<H
zOk->KVH@b??lcz0-$`S$m>U`nj3>-Qh(O#tkEqDaPo#>+uNHy|+}#s-?Lyd_)q@=9
z2X^7h_`r{+0@V1$0OeUML%xmc)7b?6SRosQVp^G)++2_h9*gCg@W59;skvoRBiMrU
z>iL{>tUINhP9Bp7SdXN$F{too={RW3=f6s4&*E)r2Ac_W($4+1tBzM3e;HIKZOUK^
z^WOGlx%}z`3p(Z%B~(>($5v4+M}MU>dZ%=GM#q@n_T`{V7%_il>Ne!5)`AO@%Zan8
zf%JOLmawS_mwannlLv|3Kh^VlCl2hA`JH$0+$BJK4d1c^r`WWV3|&TO)atvB(zRi$
z#=o@G^VgTK`P9Wr*aSTOwS>){M2@+%IK0>7Jt^*RLhsTIJ2J7-*Yjmd*=poGu#`<2
zRp0$36c&02gfiWx^N*IYtgz;8XSIaO!VdkpDLi@^OOF3KjGEfqeY%>s`S2SjO!D{3
z;Nqn|68p|gL5Qxg{KaK#bi~(TtSD^X%oeFn1<(%t<th9(%UG=aMwp?+q5nE8Y@eze
zjt%hjbnB6h**7Q$y(^&mkn1^H9WGJ_Ptu8jxzmccbU4~WSmm%gt<Y-uf6EfIEQsGJ
zm?Nb>kD^OqlYb)*zb})GikuPd(8q++*v6Q9eCJ_NbEi<b{F^_W$!0>+Q+L32%~&(w
z(Te{*lT9K`&u5uz8ZG#laIw|`y%`V9V$;FvIBVj%6k-&!yepkKGt}kE*a#@r?)RWA
zSmI(V$-SSt#pr=`>!;AkW|^yv>%309j78=gPMH2$Ogu=-T6HC~J)5J=CrtPIc>*e}
z#6U^nV3SC$x%)ir2>i_~HfIr4b_-B{<XQqsAPFGcwFr=emdrr-k>fGhFhpzSY1wR(
z1})5?)*Z`c37A+4ekq&Hg}YFNe+zO0jew9-$|vQpm^ifCJxUm^(C7hZk$Nw+jX0Y!
z83CS`!$!y4k_a|T4QA&4V!}>lT=wR$`+{ks=r7FjZsEQhHdD;*C<B|rO8E){i@|=d
z(xq-#H$&s^#^&z7Q8)S(lgA<QQ;V5}EZu%tjNMvvDg%o}?_jF^LIxol*QtecBj^3A
zU%JtWoI|kk!vcdwu<QU%BY>h1fYjv#R_`At`7H^@^Ku8P1SoBBiT_<)u~zpV(DtJV
zv;{X9Xof&rG{inwx!fk;EwU05d3<PZ4##^K+H%PN+VWcxMH&~7Zbe&xzN8*LPE2az
zW*S$yQ{^fj7-+8y=;nYNhe8lJR`RIjSj<~^%5pY+B(bG8Wx;_e<F@5&9Z?-r_gna%
zma~LhEa!sT8A@t21Ddg1F&oV`60FqF`L1*;XKeRsvL)R~ZwOJIxUNp~W{{-PRxlW*
z3X<A=9d)>PcMh92l&VIq1j`Dv`1F-*f*sPqEu<s2awzFg-6d}I#gv&pG#J3@yTc(;
z1R05L4iKQaqN&<XMKXEa+W+bb)x{qR#g|NU!^b_(tNpL53eY-6UJ#SqR6(%fU1ffl
zFd3v+GC3PE_+sp7di|Fp?_#mh0=cAOyG+r%_8w+|syv`|P|&>19ML%Pl3(-iJ#r?x
zOr(z3GqNlox}j8#`eN!Uo~lw%Ep?>~la#H4a;m2)4Tpv5N@kNOTT`ye)Mhbzwx&T-
z0Tp?h^3gRW%|&g)r!)Mc0q=KDn7j}k1Iqy<^hz&IIRevcQ1v_Xu#Zan>9%?Z-2y2g
zT4A9fHx8gsu`uH-n&eZoOP+7gx+rW(#UuS|6@67gti9X+oq#KQQvFixqQHE&xJ{H3
zP{i2D4WMc$l?{W=hCoL?JHTc5vjxBjl+1(0kPU0x7_hbC3xN~W>@lf<nm|?{uLSbc
z7$7@<h7v(><kSFk1vET9lglsVVv-F9FRC2?@5gpvk|=u&w;)UUD1RFVDwVrft~SuK
zn(yyf`z>9&@>XpB%dRExw{$IfR#rbSTcGU%r6E15u$bkMiyY`ubRaU|U9@?S?NMwB
z*tgMnj-dmmx0hI<qG%Vie6rqn_0~~&nsVg~Md3=5u$CG)W$P~_Js>Yx&2FEL*+PeQ
z=9i0cyC|@=`1eosUfMzNmG({k{%V#oD!=P^jWmP-&gbFxvqgbpz#+RW&9)yn2CQb8
zq)@Tn&vM2G4p@K&bTDgB(c^*uls)|F{cMVz(EC4IQD{4&QpZgLE6ZAWrO_5^`T|X)
zDWUB78}1g%tJ)xi%8P}Z>X_n32Z`9yDN#mIMrmL><G+4@%@G^L<p)?~Hmc87H`rQK
zfqtx{ehly*>PqTqW_cM#$%EB8pxg?<Q8)w3oD@#8-l4Av;~8t%-3#T;ktu*d=SE+M
z2@m8e(#4trf$UR+DHZK%X-!4m82;`W7N<<^y@xliVY3B_qaS2*qX<Q95h1DmJ|ubm
zgKTz&+>QWSq86>tVy{;e+rX~VQm=+X(4mw=-8#G_yzxQyqmUx#6X`%IDV*!qvfDKo
zsp`s%#5SJ0mW{Konj&?nGgELa`c9p;LVEO0AwC5t10Y4jLb(%&6dzxk<=t1?Z@C{{
zPaMhJJ;u}*TMLqcD`z*Se)P0y`c<;CG}fsrKY*=v#4JsDSS;}d6AkkDsnn&-)ZUTM
zl=`^}SF6#OAbrYdb$NyE*ciL;h%D@|6qensuq5zIoss3e*BMXp8CGmB5xC$a0;lL7
zbd^+n(6#0>MbUD&$^D>fTUBvu_zZ^gB?$wVyo!99D_04t0|*s<Kf4eW0FPv9b8vT~
z6C6x+9F#uI!EmXCAQ9cGoMd7`2OQNT2hwC!$I37+`JOnXA`!&`xlw3KzYi-w7I%24
z7LWqY_je@kNY3*9vK|UzXj*q9m*ef>`XaBRUY3z$3p;W>?$EOc<uqK}8Eew$SP9vo
zLj=S4$qnMO*0VdN6FmpEEZUtFegTD9iMCIeRE;ke6P>p3UF+GB(M3A1ILvSIl4v||
zn4gZTLNObl5}-5n`5V}}TzQ^R7NWf!0x}(JKEAdL%c(<Ogga&O0e@`I7;(U_u7r$p
zx`cQjvCnHNo2m&PT4BE404p0D?*E12Tu5vCEulswg37Z@>-7~nZ2cBxArAOYXX!%L
zhUTfF`;pFIKuTXIos0m~vJt>(g+&>yTEp^`q?!^wW`nzr)v*oln2vNDZ9|$32<6r`
zIh_Mm0^*vAhi`v~EwLx}J}UgWtJg8}Q^LxwFiC<%e$f>eZ?{rUjTu23hC?4VY9m5g
zIP|Bm2GIM;QTO7~Y1Q?>P)4+Gx!Th8KXuXum67G**Xg!#c}>i^0HrAZgW=Q@H2;P5
z!YSB`*dUqAh?qk(Y*8f>J=m@WcR%9}S)X8J2K=h;7$+|{528{U=9Q!L-&5%y1}go7
zs8qrs`fiUJnyQNW2*HFBY`nRdp-0$46B=3GM_qP?<VR02bHL^=V2cpImALOL?<$w}
zqI&J))IV^PDfLYBJIWLahls(vkGj;4_T<d~O*-_dk#xswzW9A^1pOxT34)Bwejt-&
z_wKJ>9NW_Mpj)~2ZX?UauljU&ZGd*-J7BZC2=WPZx1D;zL`Y|OpAzp+othy^sBjgB
z7U!^0kuro4^80rxMV(sIxgK>UVXRQ;`g-|>hukfJYUByA%B9}w@M>v#;6$&-r{_IJ
zHa(!gN`PW!SsqIo2SXVl0g<dTs74+mj<uHMgDE3%$RmUyG8mDyH`H^tvY;?36uhxU
z?D42oUe?4;-;u|rialf8MmC!?97{K{)Nv7`2S;EVMj+G}1bydveqbZZ2iyMLwUGva
z)*BiKLpxT<zwAKpQE6+4QE6Qc<4D-fn>EHD9hn><q`UCk^?hbXA9RtOuixwlW}|du
z;me=2apHvu=e2c`89F6y&u1FLy}<|^F`5>zJ*HXhG)P~Ja(I=*z>7s4CSaJJt2|lW
z`#dznTk&f>{_gVJ2~xO$JvF#{<!5!c3y^Y}PcC4$&AXdslTD+#;??Ck^haQ);LsO@
z5#hWRtgm$Fe>IwD@U>v%vLcT`6Xehz7%9q5iV>=@z*wsv9btq!X)G}c3rLFJQ-BM2
z%2nK2z*dI3uy&|atH|(_zhA&MW3=aQV#g$KLEmhG8BrV$euO>n{~O(XZV`*h&4*&U
zBtlzZg!kfMYI|A#R7Lv0xNcd6sD(0~j^!QROG06Pi#ES|41d@RwYdE8`?UE4fVBAm
z07LTxl;S^}XHY5r|CUD;G(?+UY-S-bx8f5}iTic=KzotpKcY=K`2U3V_vaao_7CL=
zpe=Oy%PlNq?xi2l<iAF1H0@uOxSrEu74eS|e=QY;b>G$N-}b$_`P++G1QEPA6L9m7
zthgQW|3&}*NgDM3KP_Zo|7W^>%#k_8&`#F#6~!!PtTiLv6w#V?)t;H#JP8J4K+qh=
ze_hPRN^jrB-z#Pt)mhE<>`B@D_RTCFGwQz0EH7p7sLbg7s+KGe<*}u7T1lNXl%9{p
zHnr90U0*vZ*5O^uTQ;*v;a|S4>{1D>EhUXEVN*4KeSNx)UeZdSA*CNhB@71+{8$N;
zlg-_C4zNrLF!5&~rV?Y*59>WyWK}@u>o1}-LyMwts$glFyY;dWhLC9#wlb6pl%gie
z--$UITAIEP8xD&y1kQ$$mD#{^x3H;GGsa=MI{&NVhG?x!D!ABLzXgX6_553Uh-1VJ
zyl^Xv9@pIcPECwg1!h<2KX#x#E9Jl1%BIgHR?Z{rv1QGM%wdp7NQ{bnNuFda<f&F=
z5xe&Ht?c1ZIAW-obz|U!rK*`1J<4Ln)5(Lw`x6iG!Vd3)o{&n_-k^OB{iWMPl&5zd
zWf5ckcpEEZ5O>4&s`iyZQ{&J#kK=!Rl*LXKR+Hwqp0^;)qc_mUtELd!N+K1ux5?Ys
z{UG7Twz0TKH#S%|Of_k9rPidw@REo<j-S}Z#sbEdI2bt6QI9OCZN%N{^+A;@;bZ#O
zxs(R$;L8x|yz9xr-0bNps7mjF7Xg1x6)ZZAbU3|o>*cSftB1mZ>95F<@g+}voZV*E
z>s5Q{yVIK~Tm{Kx&IufDg(@OB`RhFYy--)u4M%^D#^E{qwX7Oa%V*Wh4rFevX3dbM
zeK{P6ANlnI)#Rh`!<r|m@pw}Qs>$!c(b0Em@p$EsRWQ*hsLJm-I~<6p#^cQ#Qq8$x
zIf5!yLTF(*Rc%K)O1o4B8kL6!(9Z8UKR6<OgjNngsBsV>^uJynG>>=H5CESIt4<y?
zk9W-wgl_2>e>Lj|swqX!e7D_ALr9|(J@cbsok!+LmeQWHHBH`(FNrt_fXLA*Q=)2b
z6X--%5^?WOaN54-Cv4ip(w=kja&M!|#1)b`u^0Rih`;eC>>(VWBt60Au8!+$tT|yy
z$7z&U2E~j)R!nfpT1IonCW+s%rp1X5CCXP4$<@r%D-zyggq%$8$}7Tv7J9;M{P$0=
zgkYG*m3*70C>q7TeS$5Cj_Z+49~8wh{zRAQFvTOp1X_kCS@fNyJ&lAoIx2wpkbHiu
zfKy?a30i%d;d)?h^SUS5Qr)U41dT2V`{(&To@B{zu>2OHrU&F|Fjr<QiF6|Oz4ATv
zIGMgXz%~YP+2-2eear*C7VGxLq^(H~@8f*?PgxxC$*=yD&48uH80d=nVRaZ&c(es_
zEUq7&KxDGT0qv}x^Cqoi6BeWsrp3f{liEutgGm#A0{UCzCk-Z#`WftK9_RCa24^C)
zsXXvAmK61%$KidzqpDnotkJ%w&N;l9SQE)Q@RLY~H-o?aGl;&c>-r0iUe`2iAP!hq
zXHgwZHKjdkXe$z13hA`4bqMVueWfK?K6JQWs9MxQN}%((;b&okr;6R;h(bP1BnX;{
z(w_gD((I<ygPLEzahQA#7C60>k1JLePxLDuHDpSMQvub*<ECffTE$x}Tka1<c&JKW
zM&93f{u(GvM%}J%7{v1WEm+2NcHh#Xz#V!&_CP)`D%2-|qZptr^vd%2NPaO6p8dLc
zH4r~;${%P9v-=Z3EB^K=EUJr?=@-TN%>-ONKN)GJA!zDS$meHbC<YF40wo2k@x?gX
z_NRnZIK20}NrqxZIrsQt@YVjWB+!i|-JAs5{pdnQ`V@m0W&YLEY{lw;yw-1{53@QV
z#km{dL@Tb=96yiQa&IW*6SX#&e|cBCLuW8pQwgI67~0ZVo4dyY7vO<3H{bqqHXUop
zk)N}vk#4M0OxUS6gHMv#Dq6GLyzS>K<{o#?N<<Z>IWlxWX|^0~p*c}L(EG&51o;7A
zByxyE+)$;<Hm2pEU6RUL_y#+hFp0oY+i7p7jMPqQp#aDC+F4u*Ub8$kfzL9vldRaX
zHmyo6uB{CJs)e??g?HF-rtgO?CeCmG$NwvYY3v2U;6UUFPmKe!0ZUG(@mnTu=@Gim
zKr5gi9@+}EzZo?S7B}1$<3k5q8lN?RTKr$wVq|S+6QnE{#cXHsKi)7Qj2d0E8JBd4
zw6i9J?+YqdRm^NT-74E@*lv&=h79|xu>Uw=lC3cKd)r~XaSj}r;j=xaJJE?7COEt+
zMOZ?*(o+I9iptVAti#1W0oB_kjDY30!|Sb@*>b1t0(KJ{%ABhz@mqupdQT3VqM>Ix
zLK;<<u+k!)*%Z@DZET&P<p~qpQjny~3*x37&{C95;QMy48L&A!xr4=o!Qf_aFS)UU
z>4&F8l(OPjvTH|-kwV!kj(;S;FApA}a91hIAkf!K*&PvBe2>PPlryjw)NO&^;a4O1
zjGb)!%+<Bww7`Pnz<)CN*?**i<_FCV*|`VOYUrDrZ{EowZ~vT(KK6s9J&-S^hQoWR
z7A|_OFS~BIK_o(KEj`IV<=6!N+np>v#@z!;Bjk?uefjz=K=CEo_gDVUoh)X7!z<tW
zB)V78(flxNwZmKKq&C0Qrk+Vk#+ZrBj1t&OQu*p#ECtpavZY~Mmjc_X!q3&0^4eW6
zer@LUyV%@t!o=TDOlI~Byh;sA>iM!J9s91#K2twXW-@>xmYP-)TD8)M&V_(c&sRUg
zrjD)mi=@p%td8n=*)weZiuxXFjqs)-=kF2rEkeIAEVIljR1Hu2OfWvf()hS%+3X3;
zJ#Z`6=b6_Gj_8ERZ=Yu-q?-A|&%&?=9sl!Z*_3h3J#_*`eOK6!E@|d}coxTD)bMrw
zUP4)OI%m(Z(P6_lnds+O_E^ez9>!Fv@{kIWLJ`HUS>pERSPWI<dXB}$4mB8ZcsIUI
z6k%;$c3p)qsYDZxP2}G^$0px@Yyz1m6B`fPGK*@SO)S$RVLn8uLvPZ_dv`OAT!|2d
zE+&d%S`=v!l40Mj=WCy5^FoeIptaYb&x_>M&$B7FjgJIOOEU%_y=|0naq_-oED&S(
zr_ZxBck6Sqnn`<2YdEdjRPz4fC`|Fk*V1o!OA8g+`w-ZmhtG<r)b0Z(gd9)euE8%@
zsyL7O^)Fz_O6UZN5Lzj^h0*=ye`gZnhU@ZI0<Jnwi!pnFO_+5{B2J^U4LV&!C2A1!
zMy^dE*OvJLn`aLnPvD|9%dJ0d3K6(b4+P`aSL5lIN|cp*B`;EbZi@`}kHL5IZ1d;&
zL_8HRc%k!({gbGq7Qg<b*H+-{t1-Pzy*MwYS>2$nqyt-Zqq>}sp+*qD;x}{h5635w
znhLt-Z@D7rG?h75`*Ht<T~76-@<qGhrsr>yT&6P9c_F?&IEjQ^mk@V@^}(0H7P>Uh
zQpogUYsI4V!QiQ}e9Qxe7-O6?Sw1nKC+&Z!ljQf*NdYarV$;|8X&X~7EIJP=u*I7;
z_JrlmRAthA^-hXYU{k3U_vmsbiue0oNp-1akfgA2;*Z7i)ku{hVsn{kW>BQsq5orK
zsQNh2cIZDGNB@6<|8!t+cnq`A`_3`+-;F_lzXEioL%(z~{b$HW=+Sq29v(CCxG7Xk
zpMoaP|0w*YDk3n_o5t{+FS2O~WL%-J1yn3RwJ@v_n%GRADZelEGg6k2!r{V;Y)<&9
zDS_!!0A)k?ODu8;4DHIpDt)q21!G7|QAU*p7fGP)5b{%4CGi~j>%uA>`ky^8VFrbY
zm1B|&++XLGm)HVmO%A@q=4gH-&rN<I0tT<%mtbk##`|7klP1acIZ2VCZlFr2f`Bq5
zozH!ljh@i5Hoq_9l`sgs0cL=B7HUBYfB0pXPyLiX_A(Sq$v9gYyc{8qG+J&B?$c#I
za`-01B$o5Yhm_(LF60pu^E$na>`gs90&WLX*wSAAnL<DPGs&_N0Yqhgj`S6dZ)VUp
zIk!T<2=1FKp3z{qh`kHqWB0Jgu`l$78OR1z*3vuZ49wid)AyjGkMvFupX4O_9)<{7
z{KOtM6C2A{D2qqm9ySS~#n<5ahZ5I6bd~~Qi|BaGtn5Q5go_AEE!MucKCC>|LFFN>
z9<NHAr;(nWB1=k$HHqgJC{xtNA1-52qiIMe1oWW4nl@fm1_R_cey|J|<l6YRWo&M6
z9D=B$lr4_Ol(VV$m{rae2A6j3p;Svff3cj6n-tfViF>uF)gxN-n&hxDafsEcpe#@~
zo-AiEcM&G;ZeU_N+Lr1YKa)x;5vbhZ9tnRaL2*v+bJfS%@t<%sztETA>d#g*WYC!v
zx+<!IO_=&U82f>~*apyFBv58+5znh&F>{LgzInBu#N49YH@B_0KL1}=X5EB;#-C`7
z^kpz@<Q%!si3&D)0mU{7)fM$kc@>Gp^}e&e+}*M*Yuel^ri3e>U-rBjHuqdReL-WE
ze}4I2-xz&6->3H?{;vuaIbVkSl)ttSGUUGZ>iTK3-@N<AQ_IiJ`}|71@9M8YP|15#
z$>w_Bb)H+vCZ!kkz3O7t)27oMf9k+T*U`3q+s+#VT?uEJN87cV9q$$OJ>xps&J0Hp
z*YlZER6=Q$e<L5d=~yL;iYx8Z{ZiWOsp`1l`OMvYw%U!W|3!U|)OFmz+ZXQc$4(XT
zo0V*=y{K<#-O<)<*_p5y7%_t&Ae#$MYh2%+{X}9fHWwy2-GuB?ac&#ew+%72imqfP
zB9d$ea+0>&{Bq}SQNdC-a6&vQ(kvL-pG)@mMgh;zS%8UDf@)~nmQ$D%*H^Va7!V&B
z@0P3DzhC|Um$rxmML=KX2lhg&&-WSlyZ8a_^)Gv2Ktd!$MTnruZIVpVgUfQ@{w9IQ
z7qLg?n)h@DBdP-VBX{UqpFo%vtd)zUiq!M>@;&?5|BSr7Tal|koEe!-XyXrZ+*42N
z<U2T<C2jc&KhD{0Q{R(nbUJwZiT0+;#s%`6C<;}jR%;O3P39=lc?ZX|ZR3$u0{IfY
zpo-0$kdDktyFaVac@wRv)nmM)3<_JIfW3-M*Q*L=2&J|IR_Cd$OS}KCLv(tUYT}+M
z_CKQ?Ci%`a;xbjw6hdVifAJMIY4mSPl)7D5=>Ji&(UgM^u#4vJzQWS(+6k8p3F6b-
zZH?n7%a>Enk8|jyV1*@e#%POd^%Pi<<2n%%ZZL#5Us#Pr>4n~?A&b&as@cpmc_sPU
zRob`9Wrv%%;`V-<CLTfEUHg)cwkz}n7c@F`+~9jV?T+Haora^?x2@vL))>uSKM<)r
zv<6oGf8+Pm2t(>EH5lY({&Ed;@u(-W$y@4Fm%r3Hc?RWnAeLTgtA2(;59V0}kyq&3
z_*XT;r|Rhau;*{%Is3)B`SgC=Sr(BLE8@MGFgk%Ra}iTfuJzZHYwhnY?`ON1JwEDv
z(Mi{0>hV<QPx$^Q-a{3C5YOC#--+j>N8S|AoJW2wo{w)jBAzd8dQChZwz<XglJ!^O
zS-q)7JU_K^@%*#30#AkhCttoSo*TY=fzs{zH)Ea^8D>S5iswTGcJW+Y@H0FW`rn@Z
ziFi+mdQ?2q6E=%y$P|lsE}CKz&limO;^{O#ES|N-b>dl?|A2VDVZ2W~-!-lf&ku|_
zc-kHMKI1Zx@bmn1@q99Wk$7&)UnriN^XH3aetwd8K9oO4Jpa9Mrg;8+<5cl{MiGZ6
z0%3m{CEhcmCW!Y{UE{?29h)e?FCDg*P^2iC*i=Lv{M%n)Pif;LozN7nh~>#nHf6e?
zG+%*BYkjFrn(6cv;QI5$sK7KI*umi-u++(>C#;B#?OpB!d~1H+?)|Hh!kc4z-g2)>
zOlxwUj_uh?iwrJJU2tMv8)NuCoNPR~t;mk;EvBW;md|5qS!7H;Ry@l8(qb5yM1Nmp
z>uT9u<54mPhYmF=>x-?}Q(N)-FVQ-OeqkK{O)Z-uTvrfe8F%~w?hg;(4tL-AjOK-<
zw6B1q#llh^?1Btg%4fQ;bcjb3f852!j4c(x?hD$T)%WOJk8c(V5S$^&xlg)S5_02_
zz{k6Bho_X!akB*Z5y^|)EIzLkVHR+r<btr&ezbMIm`bH!A_6IQ_)`qk6Lo(>@NMn-
zCbRIkWiAC%F<5fE$ma%Y5hyuYF3G#xY(DTrHO2C$bFG>FPmAi<xKMXroj-IOu0GYl
z`<(zhkT-4s@agtvOa$Rv>nE+Z%?L?A&zRl37DaIW^mZNO;Ngvl^4H=+4tyGlZKw>C
zM;>Hxx8RoIFLlpBHg>ujtMcT5cE<>2X*hbf`60cG>_Fq-LH3}gCXVz2|K>rjvY9Ju
z;$%4}K7LR+L)1ywV|)eIRN8mwKx&Pv_$b`ml7QpH_EQr#Xk12V$8Em>*IE<D9k0Sw
zF`iYgvdQ*)U<jguGgXKFjrb^7F)3`}x`VJ?rIexH^nME`cf6c;jIfg`LTL^1(soB*
zu;mCC@|&C*Ao3v!rFH``9JFfll-Jl?3U?1R-<kMtdLD2-jivMiD&HN?pL&hO&pZ>4
zJ;&UD>xryzgE--EgJg{^9az*gGXi-9IR4RVZ0e{p@n4SnZt}=8@!w69&cySLhu9R>
zz@I<FV!}V_4G!!_wl@B|Lo82vBc6|cosA#sj+c9r;x6khj1;r0jc2`%`)+Og+1FW2
z7HRdP3pGJ-{X**8B3ZC;BX|v(mz7#AZ^rJvlIoYmrEB@Rbvjtur%gEdu706i=C0GZ
z?{(&m?Ceryhc$$WYrerMa+@fw0NXnGvBPZ9=+3UN+`&Xuafqsu_aBC@oKDzUlBXNF
zN2VTO%aR(pCT0bzpp-@O0GKXCE|roqlJh_9U?tX0UVDVij{m3^Mm5BRLNC{ZTU5-_
zUj(1}u}$7R&V9)+^3fmomUkXuR_Z3>Q8r$3$HRDXBHt6qR4c{>`ciDqO<wNO2^M@`
zGLa*dB^*EMUE_*^Rb-d}Dwp;h82S1B7`a3Fta`YaYCFo7jj8u#R;M+2K7$)v9OKJI
zrF`iz7OkW#MaS68b@2#$EMN9JloF3%wX(m@c*HS1l(HJ$vt{qg8Hh3%cn>&>i8jyi
zs<NL;F1tdQrTcHbD|(zM=SU1HcJrIZ*!&SsO_5CDx>Csf4*gS8c=8+Y{e-9E4HhrG
zjB}_r*q!0zCrd@!k?@e!_6Exp-ip$i!peUnb}2N3XZ;!jR!<=g2a>k@nx(`ID_oP;
zl=|7A5<#(vaBJfq{F;3{GH{SUiVTve4;~l$+{ee+Lb}(R<L>^_y@(W}=0DtEv#(t*
z@Z!?X2^KeZ4b=aNLU7kD^s&IZt@?&93Sk3wx03tq7updk6X6ARx2Ari7pS%IM^CUh
zlk(wx-gr0=HpA1WEBTUk44FOWe>}m)&MZKWXEhmJ{g|Jt;9iE7i-)GlwXCn+Y@5}Q
z2A}A7$Hv-!f-QuQzVJ6}P6SbzyZdP;Ia?hMVc0yCKlK|n5mBX6dChOI>73&yf5XOV
z;=1-!7kJ;{U;PHGT^o;k6C3V_Q@P<yHXg60H{nr=ioEb9n-I6tTY!iatdM*h$kT17
zHxp|IaJxPunh<}PfAA)Y%4zPZtdT?<ijiW>=v^(|<!h<*K0>@7gQDJenwkTIA!#0P
z1>rX5ZU}}?!`c%*h<MUlYyq+M#c#31hYNfqv@BSgDP|!&jKW#8UjMngdj!7K3-6<Y
z9?HofY^Yf2lzrPo={UdhR&m+`VO&n#>8s@ZZ?T2*aXGU3?W>N1GSSl;;YTy&?W^}(
zb<`<(9m&kB=q*joXnV1B9<`8y>GCaavy{jmEX@D-HjLLP-?g_HqI>(E;8DM2^CxwD
zy1|s{o%Ug>H{_JgJJ-Ceb1W7r`t??4c*X2(k$m@WS%~z>)!$Y9mUXX>3G7wB?ksRQ
z23#ykg3ksfmNx$UI4LRer)R?;j=Z;3US<boBtBmnCoRnRZt445wKir|=zn@vJES1h
zrqKUR=qV^XI(7aFy^|pffqU>TitF^!qDkpQ%C1!SFO{$0#=#$;M1)*uJcYGiFO`np
zad{{*v}iHgD5%?ZT;{7HB?BfjeBoU+9vQrpdLmL92P*s^QcA$%W~7uOX&d;D$4j>-
zg#Ae#9wHlM-;3}UN@Sz#vz?Oen0&{0qDIV!m&Z#<h`ajAa})Sq$4es?9z3g@fo)a)
z!Y6@kRPGrlzP7Nfxb|%%Z>qjWhaxI`wF1`E3DTU|&0Fic7dykO+O3i?Xod>Lvu6OV
z;N#)o0!2zENb976k9pGsY56S+)53|;+*^{KoG8t_CF#UO$&}mqsf^Cx9hu#&r@QMG
zizZ^4*QJcTcKYDGoyCilw#?*=#G^NYuZ+6tnfJUe*HxJG?@i&&MZN`fMZPcaSHm|=
zl4e6RufXHsxK8bIDC%Bu{*p}hn}x+bpu$K%xI27>Qk^w&`k*#W?lRFvF>4i;N8kZf
zh_c-ia$fDVexWcE6mrTaMaFDjN*u@5?%TjrAI)~?XD!3K&=ouMwM!lPz5Kz+(h_Ax
zpO)87mR5@&f1fO6i62X%q+D{4mu+b~3z6ciZxj9=;qE9YNpo8cYOzA5L>}QU@fpN=
zEvkE@_sLV{x@US#r;gN(v>a`FrgzIJOWoF_XTa9KB;5FZ7hUqOXq5GPsEgp_2{;=C
z9QOd6d_Nq@Pg8@|mJwT(#!+`{4Kiwl*!1_&k>WXLu^hSJha~pTqv5w`1doeBOQ?a@
zyG!_n7-_;x{P^NCT}Ziv{bFwHSElGS``#O8tn7R)70neLzBBortFEI3@W$bekrKvL
zb{3}5r-CGcliR%G$h#)`_;rjFIo4lJ7?AHoC;`{eI(!O`{eg1yF)LO|u_t#H4%AnW
zl-uk8(A&=NGdq&2&a471JCn1nIu4Jy<NYPCAg%fg4Ml0!{{1n_J#TDpayUI7c|NQ;
zBk2y9ZaW?QV7w9V1d@be0N#(!96;G$61+4SUh>>uAtl=DP|E<hGERDI0?Oo^^*!ev
zxt<vqu5jQt6gn}MH~R{CMV$1$#@&@#O)q)zST7FqC*!4rD5}Vb;oE%bk=~N(XzT7a
zZQL`xe{vC`8GRG^yYbSTkT?5OIf}xFi(}67zr{<jF^NS7Om|{g1HJYsvPUSxn^l<+
zEeThaWh}{dxOUX%@P!FdBoSNABfZCKzU`X?W!Z@MM|!u_1g#6n`{?y6wWIe^4F!E;
zgoVO_^s(g<qF%?$;I9+79q?r!W$s8Wt$*MHtbjsiO_)B?yQdnrO~BBF#XZuysyb+`
zHcy7Mvk!iCA!#f~AA`dd2H$)U{9=MMdi3yOv#A*Wdx8|Ftn1V9s43EYeA^Uhaa<r9
zu73*np?>(9JS`_oufn^{=ToFfGbv+k(^+49Js~5TcWe46p2i?bR3HfMZ(^o`Py>)<
zxDkN6tvYDkh`h7D)2_3=YxomUEv)dN$4yhE^r-zcSGp$VKtO8TUQ_4}YCK?ig0_Ck
zm99PbqT?S-mC8Z^)lhcj!qxZt9Q@DIq$s{~nv^+^s`XY<>N0z1#$9m!5bIL8(p}^`
zFWS1qI}uD<-{QG&Bdgt(d!1ZuMq4*|wIUV2#oSqP`Tah{$tYd$Hu?Lm?|j#K$DACg
z3)v<gfw;S_icN199Gw2$Hm!?};})cA_<`xt=-G*uC!ko4DF(4DKiV2(BX_D_nSTAr
zNZaxE%HO;1y$x=}m9AX%-b3!y?>)@Fnl3G);mCcY_xyp7hTS*jO?jlZ@<5PzdHdX1
zgsZ#DvHvU>gk>|N$FSeMJ41@IKXS^H5uD?2n|#k<iH)|N@v6|C1?d!-VQfySTZ5qD
zD?BlACZE+G8OP)^cpm9pSw*q>!ec=dRY7Zm^HlrPVz|%1u%G0?1?fSRVYb~Jhg0a-
ziRZ@Y0uWZTT3ZKT-0{6Yt^o-d$Y8fJ@FFJPQvUKxY23QR!f1=Wl|(doCc&KfI=iyg
z8Pc%0?th(YJ?XH0u(tj&=V)7Q+f$zO+Cxr5yCj&I7hBhRN^21=ul=7n<Y@gVyrqIw
zaAfyqTj8XAJ!yEy+M~Tj&!$?<#b;_&m@}3nZDX{z#1jo{V`J4g$6C7VeW%j;Kh6*5
z?Y<!nDQ`IR>Gu#i_ja!oL0Ct`ev2IHy{+@VaPGb-tGcg&gbX*SbB5*|85`|Qb$;P&
zu2nTeLu^y;y<-hVBFHz!5QGD@1?j;R#AQdu1`25_aYzEmZg)#?ta`6zAB|fAa{ENT
zQ`jg)G5tQ5`+ozhx-w)hGxyG?ia+8lv!uC1Bsnj(Vi5mw*7reu$P@;FP7{CDcewtn
zudQB6aOmIRcg>b21i2Aj)y+5HXAa6>6_HoEQT{m|AmPmFup~kvtJzt-1Rk&C7D8Kt
z;(;&tZgF>&)TCCo@%q_PLJ>Jw32<}nt|tT&oDcEa_=R_z^3l<G@YS$ZM3w-Up*f!#
zmXnzHNy`K5QGkVsu1kddLyTG9f~mvrxm}8}pLIrIvyO%l=(!GC$05(Dx-_tKf1UT)
zyrXR&w-tI^b*aVYI{qi+t$8uXW9|4Dd0cgOSX9N<j*o7@TR8&w7(9#Xv^J&1(D6o!
z=8~apnG>zDxw{S>I0pyP%RG29*JH1km83LeH6Lqs)-i+g6oZS_fAEgmr3pB~U&%w~
zNKs=ag1!wm3^&P$Xn-2{qB+te`!2ZlvUXVUamXh@QgT=vxq?7<9~{!%@|Ub;a!D(%
zM&I<j=wjPc#&3G=g{z(0XvG488P)l%IwSoa+Ozdtg;dTC2kG)4EORO?**FA3M_L-X
ztnQ#kN9ElKBD}Sjh@m!6O8sa=p0qYzR5cvD5UmFCX^>AThYlHrhP}Q^$V&qmX&f86
zmb;{_WAd!<)Q_Xi??GZX{m_~-X}P*QJXU3S-?^eW*qniLvk&JPI+U;tG>FMM$Z!fy
z3oAlq#@TGd6^&fGm^ufy>UMO6`ES+HdCA*L<_XR#Y)PVcKC$F>@ib-35YL?SDdL&G
zBvw36rB4>mKV^&;&y9<36HndZ2=Po?JVHEQTN)ysuivMJ&N$^srWCJ5OlHfe!)fvb
zfeqgFMKJ!Cd=cOeWkEpE^(lXPuC&3f=(_K;qU+w%L5LJ{&uInzuR*Z1fMUj2=ODhh
zFsBvZGHDUM&tt3`X^zMFwaK^AlU8T)m4KpStR~+*9^9nQG5PL=M;vq=-O@IgeD|Mq
z=$~B*1aNGnz(9n=*4BDzO}^ekfNMP{`6lvpiP9uET{=`9Z`$SeWJ_kl1+PdZxr~Me
z&w2)T_6{UU2@_ULDX3C(tvV}z)W#~h-V(sB`BeO?L}|A2noq~WlfW^eadj%wgUHcP
zhvwDQx89dmuz#@JJ8-!dZN28BU3x*fqU(t&rFmT&n*m4jtqUNPL0VlpHMYQyx>}$S
z)G04k^!3k66<zm>5I1A;2#W&vT3FNZa^J-4h>q3Q6c2UX>vW~KQdl;6*aIY-4*fSv
zZw03pl@qv1fLl{Vxz~IaSe}TKSNU|=)W@$aehXXWf?Py|?=^n-M;?_d&9qC|hg(y<
z#?wapIq=5}UtuD}n4d5;cFLnp62Yp@LyOT?3oYYyDGKXj*Bl=wBdsoler@yr+VOEE
z{p!?b*QI16K6cG^Wyi-mJ|fByn~^9@p==ZuZCA;uY52=riGOm2-K}r=zFWzdfl3<j
zRj#gk;8&uxs`U*+M62z}YrZtMq5U=AcAk(TO`V%q{8{^ma<oG*GP7Exi^^}GFj=oh
zv@G~WQN})9c<rCxC_i1*IV}UNDvqDq#-C2X=9AocHlvLnz|Te0((AY@H?pO^MVWW9
z>3X;BFO+v%XJH1uEiXv=xLH|t>Im7l$2HYom-0TpeCi|0@fPLaeJRqUw8|lw<*aTw
z>$OuKv3-xffx^Xq_@=%Mm!9|7u04L1mB}eTdA%OyMUP$k9bY|9nm+wBdK7i$W+c9T
z#dVmn{PUYr9g^|gZ?Am#T(a#dYBgtc!2v3NZ61b{_yH(l3$a~amx(T+Q)aQ^eM3bq
z1tKLH&t)Ku#4qDH)xfW-UP?=AqSUjUC7$c}3s4kk=~1Dj9!}1QG~he@3N8OJ*2*48
z2p9A0)v6#}anQw$)#{7s)d(91YouTvgj=DCO@GTDxpBmW@bmpev)Uc{Zph8@N^_|1
zahJUi9MpB%@Mm4$-4+vfsPBO5P~VsM>vO3Z&-OW7i!9a~*7l&rLw!}Q<EB~ot;X+H
zT)W#e7Z3HVaRHh&p_A$Oh56Dr`zV@kVjVlwx7Xzm+LV3>O(ZT*2U%O4z9`CL-PEZy
z=yZqr{s8^+QRrO4hvXRH&oM?!v)4wQMYyL$Scq_AJ$8{lfNCiYhQ}oJ7sKGrHE?iY
z&py=mJJ*LD;l@C94xd&4+to?B*ahj^M<o{B33*9oC`l+Q1Y;;~HZoU7NE+qXbk<#+
z6Jd%*<u;8P)RKh`Y2+)euX{<jIn?*$sc5e~tv0H7(dGesfX-7cLdANMz{;qcx_J<7
ze@B2F?5(F<(cY7_Q8sHwG<xkEV&6u4^G+V>d%|_L&x!H)+_lKMyJI){|HW^1nTp#(
zW(Ark_DSm*G%$FwE|4hG;2DIz2(TBGJx}nb7eMTMt7kiUQ|?Qd^8%d%(|1t|cfHZB
zo<-xj2+U$gBb*%ALN2Ap5uR`P3R5YkEO&?OEBnUrQ6tjmopAIVAq?OC#`zHzkkmS8
z^$+!Z=4v{&`^M+rdOoHWU=c~Jv*W|LcF!>s|JZqCOKpCK!yAzoz*`gBP)p=-rgLzO
z{pucCX&+u@7fSE=;b`nFyLQ!kDAn;%UCLR++gN?ga|~!ef--)bA&?^^a+{lu2sA!Y
z`Rs%-VKbN*vM;ykz4_C+&bvSV7XRzd_IX_A+O>Fp7U3zhU3=;s$D+OF+WhwMc@Pk4
z$IT3&8w{rYLxJ$M&M|&cA!N-fqrJ;&SvLNkjMtS25{m}efW+)#r9h}qL6<>YT7NO>
z;;UXljyf4+eOMVQgDR;_6GF|(lOf`|6Tau5!`)~E{{H4xVM6YAFM>%pq8Q-!UU!tm
zaAS9y;U?S<f%DwDY$P917QRO-mIGe7P}1YD_}D^dIZFANh0@2Gs_K8|UxDAqSAHxl
z$;!!sKzf}#=EqpTSLZ}r4{xq&jcASbX2UbaK<sL8QcFyUxaEg@Hss5-wnnt?z2-T%
z{UD{h+1Jje-X%SV)6?yDLDV9y^{6=MVYa$9LkE-)2^l8Zh6dIrv*Bi9q5kHWvOvvX
zo#DoZJs#Q^d@1D5h89SF&2|WCQF&qOf&^!KsBcX6WL?PgZb*4b^O`p5#4K#R5pDBy
zv(_nmEU!`iViccRykqcbx-M*;%ov}Add7Ce;SSk*0fV+ZYqv8}ELm31H@5(7@lnYz
z0QGps1%L{e&-?WFQp7jkElt(<0r3NOOEaf9bx(=FRZ+3vx3I=UZylc(6hkOZ@6u+=
zr%Thj_>H@z$<v~;;*gtGqVLPCAIzP+NSbCJYrMCve`|#CwTw-kNx9C08J=Ys(cafR
zld^G=?u^F8r$|9DI!lc1Y12LK{;i?Lt?vFuwRs0juVrMQjN@Rm_c>3v?p@P82m8UF
z-;4j@M!;D@FbIOxDZ|iOY><dTD;(wn;2=xtX0Ma%dAV&Rrwg3@w&&9S0@YQ+ddZmE
zR^Zt*EXCHk#PhCc<w1sE2!jOp?|kJ2>3lzAaZnl2j>T}3s7&!^&%ucHvgY<WrKKIm
zIg8>{;<+#`+IzW<)<jB8j_at?SnL|G6?d2nE!vp=%>LfUZ0q&**6`Nc(+N6lVd(Yt
z>p`14u7{tF_HM5uYo&e3v)38g!S3yGY(95WDv|O=%+cxk4Iw}vqP^l9L;Ks?v_{Pw
zM^10f$Ed`3Ms~a~7)v_9ThrbPw6!EGS%EcfiA%7W<O|ZIIa8avJk?6GRG9i64RLdq
zeBe`xOI7l_kh{#VbV|c?Xzp5BE#LU0+3xsDp*Q%HqEPW((^rnas4Ruv!c%MyL%5o&
z`SUl<yO44oAmDSs)vd}EE)j&O@kG_)Zr$L!d2x3^_2O<7@tuX>392&=1I5gsi%**j
zV3K0YZ=$BehC+nYdY{KFmJ;k=Ix{^K6YX4U8hmIgtmj(KJGXmwcxpUzaoTvUeUHbE
zrBq@4h3AE{UmJF}zUZ`i)_dSY#f-hlL#mRTRxP{&S=tba5oD5tqaUZ|Rebq{C)Wd%
zi*VTU%Co5x4gEHXRUyC8u@Ai^j;~0}G+#di);GG)p)Vu6QNU0IJo%-?QdDF`-*|&6
zC`23)#hCHga$j#qc2{o%4^Nk-hbEfW5CM^rm8YdkV?*P;V+_>SJCoaZUb+-1G~zqG
zTE0D9nv{pHIR!~s&3T9Wb0Ty>FcJ&Avz!pTt11I2VM!yKUu@o-l=oqfxP3=MB!A0o
z&O1VDzxE<Dn^;+b<FtEKLL(N`HHP=6OS=|QX20qae8I>#xIb(<<ok!~bvID6j<g(3
zN$Ao;^gln00Z2ohwfv76QXCn<Wdmt}Ys`n#>U+CO!1l3h;vh6aF}wtN&fq0d`sksb
z2>zxn1%G&nG<`J9t_`LH910#f9O$H)CDPPM>KtOrX0?U2g_yN7wX~xMhAr!=*1L*-
zy+n#3H7PcruT1avrSj0FQsnC4Z3>IiQn#QkJ@g;%W9!#?8(n@rV;HiOYnRyJXnlo>
zt8$SATCh5-g<d0nY^ijgeaPzHo>-{IdQaSw%$@}|YA=O;%8E$qw-j1Ga%X6DZWr2t
z(7nMN-WD&@N<!Myy;*^tQa8Y+6ANirtfu^=Q;pDTG8%e=%k=pbLPK5NzjZ{OreeD@
z)$U|DWr)+KHnJ>$YFV{KbMccrb%VD2&b3nBQfIhMTOPkQC@-YE-|}w^KoH)?!WNzx
z)0~5gTEKUYSk|Z!HwhWtrz0<E8iW2!%NuQ7#)H_6UsYOEjjuUX`>Y+iOon#*sdlAN
zSLQr<RoCQ|;?<RQ#CllppvODWxZ8;>ybaq8xUZo!5F8tX+x*m~gI!^MZD7zo_PElh
zu`u&5bZU#j{H(6&Sikjs)9xF$-}uSxs(n}H@4orT&8>5S%Gee}XU)c%oV~jhDo(ov
zfNZ<l)R5{v@M?4WizC`kTx~i!)pV{U=z_B7&eki*>c(fCv#=aQw6LuBxo=-~9#dU%
zA+DdReNvvPY}Sq053xMkjng#Yi?yF>_9YhGc|%(Un#qc|vEZB6e23nvbM`-`F`jcq
z3cZ}R_~VYF9(D0&t#^3s(Kf2~edpv&cj9u_tQ!%nuU}bwcyWsBMq*xn@wwL7YXKZP
ziKZ;E7!{a5YawEcxRC|Gub*1t?B6=scvNgvM_Y9^Qr_LBlX9y}Z?xO{CeLEo{np*B
z`K@;u<?5oXsLc>@<I+{N;lkC4n{2jm>T*TlV(bn<m9y8Y@<#4^vCa6NT6dReSz0)D
z!jWaEC*?4;jyhchj27yL4@PM0`zCn-I5WV>G5Ew;X&Q8WsVG#P_nMl=DK_!wENNm&
zY?i7b(OL!W!Ovi|zu27H9PQocCc-5@9rAF~be9ME8fNvDEa|~KbZubCBdRW>b(Mq|
ztgKbfrcE@6H5R`DYis}%6N;SCg5|u{r8CfVIk^(~i!3f&>zc@CW<x|sv^;^a5nCKN
z3b-2WEp_*A8)=O8?s6xthvy~(e${K>VTzs%n+0;zM|*erb3KDxS{$)Od!O-t-ANJD
zQ0kfbaWe?=z1@5EqiPT#>BZgdXzv;PUB%y0_Z@1`c2KvLe~>Mu;V66Oe!(kQ>wVAh
zaXHe=sj!YXAd+k_gg^-F!9mesztUj7Kql>0@uD1Q0&&xsINWgdV`AMF8+_U1JM6-B
zYN*`D;Rr=O;0TFTL2*HaCPM%9A^%;D6ooB%TaBSz+o(X;Tzo9DULSpj;X09ZN)wJK
z4yrHhFww=P(OGuLN_1T+HcMR*(tygKEGvY^+Xr!Ovho$3?I_kFlW%#gX0LW%u-Gk@
zbO#RhwB->4;-txU3?W8KO*^k2Yd6__FP;)geS-^8L}P{QL!@u=LD_35xV{-evk3vc
z#^T83CD*gpt?fFTAg-*Y0~=Yk*n~=si*=Xeh()>NkW7|w2lMO_m#t_~Bs)RslfbIR
z8x2zQGSrx3yTYvDRKHLr*{<NcW5}BZdc<E~R>)tm^VOii?IH2DE9gl#_3EzfFupKX
znlL|c^WOx=Cl<t;9nJqT{pS6O_gBAfICB5{IY&Nw|AF_B-M<-K@7&`$+j$(@${hY;
zE{qLuy)YLF{>Us<rFt**wmGYRYpm%hqpCcyFzi7+5v(|GrQIUdqcxhG;erWPSeJQ%
z8nMIgeHN<jaP!f&oYumm-9nYG**Es~bm#4@EcVZ5txmi71Xx_eD96#yI@A-i5BKkI
zh3d^*g?XcCqR#4c@YTzuQFpwVs}}nv2_r?2DM$%%k7tYXUT1zQGv4D#H8V@lK8^KU
zO7OmO?Pb^azU9&kxIh2j18+A+)0wobwCf%Gc8K%o=B}#!FE*#v53U#kR+*sL#6msH
z!Q`fui32b}au&LpOub%@Q021{%S;I2Dej=Uy9z0UCqe*i$R^uGdBkz1HG-BCc!;4P
zIf&V@Vudsb_FJ|UI3JuPq$xPy>(=@m@PWf~Mqw9C1z%SJks{4ASM+AIC0ZBw7L9Ka
z{<rXfR3lO;KM6gE)(SWf8-_s8;rmK#76XX2hT5?PTy{F0C!I2KV+_6X1;4<xWg3KS
zRNM@(3HT1ydOhjBijsZ0EHWEY6qcH(CzRbrOxTb{qnnNeDTS!_{=~DsqcAngOs2rb
zM~O^qFSddNbI<w=_3BFm(N5P4_TVn6$1BBxJFsXPo^z#w*>`$n3uu~n0OL~O#*MXo
zMSRHKJtk}W8|`tkP~58Q-npNqo};dg5W)L%`>h??OOCqTZNV3@%we#C<AV3eN9AX_
z!v?0M7H4?DJi)FDsqEh-PE&pWSg-)59RL<sNCtrg@6{p_rUI<cxm<Mx6c29o3{7RK
zxug!=eOj&4>?JKi$w6!D$}_1@O{AVot(~^^j=Zn?oVE7;K1XfEHO#dvGLRiyB*J4o
zwO{u&)%N$L)>6x^b(6Y+7SDm>EV1B(pw~2FWvh1u^#oKJwCp^vtlu2gI*Jy3!5Y${
zPf?82f`v@zQDIYf&F&U#S)~Gk#j?{>%xh5ZWtq_>iMi@aENfAph<NEY_xZ=tz#65v
z8L<5AFAQrBY>r_a7~SmP#_&sGYs3Qmv}sL!mD_ICHfk#j?V*if7ag@vn?f4DtyNlE
z6L+`TAFO9Y-L)Afmz;#~i@&UsviNH_8NgiTDnny8n6!I8ckKp?hYh0#d#O0V3#|yL
z{6*W`JZmjQ)SeI<R!(d-A{T@I7&9ZJ{D3L9jqDWUUXWpVydh#o-e5N^=?OEu<2p$z
zwCE-|gAvNor%msORdh*@tPy*BRA^;Ld1>o7OxdA%wF5afVF0K<515u^#DIrU6s|eV
zb-|Tt#c`9u8>yz-#&=|ssy0yGPW-aNs{#mW)h1N+j{9@>I20Nz5^bQJDo}(<SkV{n
zxITALnO*1!s&pe14$s!Yt0b1jjjd9iqHw$}v@&e{Kf!fAZF&$J#ZU-2fEaB>`wyc1
zzjrN$vs(x{IfgdvMQiN=)9>qGVp~avflT;g*(*kJIEWA$kbQp>NE`&>@{WfQht?x3
zPg{x0<(SADTb0m#JaHOaNam`Nb9uvI*atiBjKA|3oh%O-3aaKE*Xi18Vji4<+MQba
zv?;jq9T4y9h6AQGr>(Vmpc)bzTv=C3X&EPjD-ViaOKzc};n1$xF%1aZlG^^Q3Ug2%
z5hIZxPSk4qA03gm3G=l8L|IfD?JYdXKv<jT?PNdpdbFyp|Ismd1<3ORbRLDZPoCaX
z`$M_ax}X`>+HbR=@wUL1E$#_eYa`8eim^?K9yNT@28$$0F`Nu9XIm%ajk$#^{oJCz
z4+wyqd!}yix8j!m(+TpV{!^Vd)GCRivM$H5b5O6s5VT$_D3;oh=JVKqX@kf)xq-UY
z^>;7;=W<7JUD?Pz!Pp0S^G9!txG?Jc@cABgL!R+rmqvU#e9mhd!+G%i;2Q?#^lr2Z
zV=GutSRa5m0(06b&*@&3e@=&0IKAO<;eHaL+vh|=p_RYDzQBy>?W(*DrYfjyY(plO
zBqkS~;rpovHCS8M<qJYzg2vuEFsUeOv_Vmrd`spfBJb0tB{1}V$Ngh;>d=`W4a@{>
z<(m3XLEVenh`RSZAdR2<*F2Wl50kL4iu~(pqZY<qM`7$0(%3L=I7aeW#FE~LJm&!^
z1||z7eDecRlyXyV7%#(*htK7X<`HG1_Jjzn@j$=-AV*SWBEJTa(4o@8x4R7sU)zYd
zK&7(!!r@biw(aW0Y3~{-Dh}29H5)Qb?dp{mIj0k03FXa<uUG?f326P(Kr(_kqyq=z
zk?@Pq@2APX!!AN|j^Cs;53g{U9=$?-4CZ7Zc;Mdf^83WbMpE1)gYoEy2Fuxy%2dlU
ziD_$<#=OP-wxf{5qRm@9w8;-@Zbrqa1bhM0zApsY1`$KfdJy!12%&*JaG1g)c<%_o
zU!6hpY?{!+n;#bYnp3+klpjtZ>Q|c2ptXh$$`@P_ir_A4HI`=$8H?293@>R99<tP4
z16|0#We$h<8@OFG<H9W@fRY-9+3ob|MNbFy!HER4yssP#-dozCG>)j8y#C(25qno|
z7@Ie|3V8s6`s5QMazJnf`*6n!g?X#)7aN@;Z8~#->1Z3v0Tb0m+;cYZaAFpbE-WB-
z1;NlzZj;$L5|l69tN-4L5)d4Z8bKZph-vBIIcue<S%g1bOt-cN#~&8lU;=C)f0H7E
z%y!<JsJxd9T;$0mQ<aSQ60}qXNODXU|HE2o;iOyXYso;ZaD>Z8ual-uy_w@O5#Qt!
zY|Xh`z#g#f(tu&6p<2>6hUcx5CWQJ~3_2I#&#sda#!?0HUQNt3<=xb$;wJ&velB<L
zen`M#i4@4H1`HLf+DL9uRSwE6dZFhc<{pxVm`aA0Idd_WTcB>*8avQv`J#v1=uLgH
z9Rx}YScCZ$_p@5_1OsAm8az6&K<9WI0}J_3AiH2Qy=y%h^T0h;XP&&4d)5WA@;|PZ
z#zpT!lxukmjzWm~EiK#)_cUeHsT+dIiQahUdMVzXiBpMD1AIxWNv=f;g%$P8L5z^B
z2Mmng;CHnwmY^0ILlW^AMugV>K?5GervI=C+0l1p!f{DtR%k;GEKFoF8PPDbxo7-@
z0%=aPwI7?P!>6R_Vo~`r>9TW91`gO$534UK*N()|WJ%4?@|*lelUSc@kBm}RHlj>M
z;`3LWhwa*ixBM@T!<q(}p;lLfH;n0|EJer?g1DoO!~QRoVFEE!upftKP*-XzoQJ#p
z5JD=O4ttKI9;Kc;gIPJibc+Qi&~xE?!v+_eY3RDp3gSTmEnl7(;%~b)He_$G$a)RK
z{q{prj5NKIfA)|xaq{%eiP<~F+8NrA?oiwtVa#{ht*F<$yA63F9+u)M@0|}z(=eg-
z>_^>T?!w|;10{s)`%Q|KoB>#`VU9fguyof0G$l0tS~aoZqE7gG^DkNQhy>7gJ7t{I
zFp`m%w4vWaVzuSM|DAP;SHVXarMYPYTrRAM4Hi^2#b1={HDj}geIcXPNib?vK-Zk%
zQC}Pn^YLXFlVExcEfp^{O0#2zf`K6>(4QjgexV!2I_%It!7mu4aisl#*f-OaSa{Z#
z?GkdhI1-h%l0G-tsKgG!wgwyD(J8k+VbWgQ7N>&8^6|#ws4>hu!cua2#kqS=ujO;{
zr1`-)ht{7l9NKWElyA<%@<0coS(j5?_d_UvFOP16czeMAwo<&U@xQGSZx4z$vbLmh
zYyIDFu?uhO{BP^U+j{X9*PU9u<Z^25RILAD<`o~0Ft0pw@0pxKWv2Vi7^WRsbtW1H
zsjJVJom&&{KSOKv14vosTyuujpr_%N=D~Vw=zQTuX$8VS;3yV~`Djaf>!aOGWR8<_
zb^g=ey8l$s?aZi4*_jN}qpR<ond)0sAFwTYwA;CuN>JXq6b1vP7uridMt;~7$)-xr
zApf&+emLZ%yoPqleYEvk?~aeY^=1e|CTK(K8?_fS=aE4;E&mpHJG`XLjKS3zGFsEa
zSD@@>>09qcvhK3Mc(cudUCPs!p4eYxXaTT8Z(x%3Zy80#22~Es`mKJu=3=a^(blEH
zhI>J}3BK6yE?5mr&1wf2nRSEq?s8WBz)CheV~F2oRxLn2;s+T3mv99rqn$B@5q;|H
zhF*2%RG*q(%a@{(hFv(U&bsC~6(|(I;a1QS`TPPYZUfQi_h)$q$6@lMl5td6zV#Zx
zuHt5JCM3Z7qD%e(S8?)ze&7US@cPQnlaQPLt^meO1YX@p{XkYaWS$?K_pR6IlIQNL
z1C4|QXK(8N)7rN{H(hLdCzJFAEe({O21})FT3!W90YBt$)RZERJ^%#-Q8cxsg(NMs
zMW~`SSoC-gpgf(Df`+!fkf)C;UQsFquZqY^R6x8y5TpUxq)B>Q=kxaa?U{et6wW>0
zTHpFui{?Kwd-lxinb|Y5XV2bsWEf}DjEMF9apvz%oM?qOJ@Z31guf=`1z!qHa;;F1
zrI|Nk#w=`*)k}sD0c9WDsdPe6_Vq#8dDVP2h^5Tn@62Zd?+PYI_ZJ6OK#sjI5hXVX
zbWHrq48HgQ7OTUe?D4!H#_DBXWHvl-6tM$O5GHcMK%)%K2XdoM!4s~LymLpM?r{oo
z;e`=2A{85(q-`gSehq{3iaPk`Cg(0o=jtqZVtbiI1~WI2ant`&jF{eE%wi)b`U1J@
z=JSdn<ZR-rirJWd>CymR?E7*z0pn%V0%nL0&!#Dp=L|g+N<wUlx}<SC(azwV%pY8c
zmmCG25Bai%EG+?^ce}${!$)<&9$1KT0Kv8ZE0D(^Z@(VhGjt*6(-yMSPSo*Vd+z8C
z*@c>a7N`Ue$MU}~WPchJFzlw-b)vf3@!$frr<&t2nLPjzcpzxtnPxUfgT``;ncXc)
zuE$4+XcRwhW}`%0jD-z}%W9KG?xcV5fX|0&KEuMu{?r<aXsL7&5f6Ii;L2Or4mQ9_
zUnjW7!7o}^9PDrZUFg~oqoJ+pH6CGQ55jf&U|x0?ZvPis*$BLa+h%2t_Eub&;qaSC
zW)I1HRtZapQlhDKFs3&KQJGE{=PTB+r-tRLmr6CPTk~r0=yz{1!3`(U;OX-SQYDZ`
zeBbl2B`kiR6Sn`x>NHQ?12lJtIddx-g5dX+us_8(eLvMogEEAM;G7&cNMvTJUnv^{
z`%Vv*vN(;?_cM=L#1eY$^aSi~8Tf`$HjZih{CFu#zQf?_t9ZCHc%UBOp*QS=66ukP
z*kB;Kdl4HlT;u;r(6t^wdlk2-8oxBWT<?kOj3YwT^Hq!3eDzb@y@;iS^*tB@FA5KQ
zY*@@T!>grVrxce3@6Cat0&ypbC&NORd`3zZ+1a>08vlp2(WPSq)ljbmsMqLnmW-~S
zUCzc(GuD=~`$TifSt9*<%2`Un(Ak?8hvh%0SZ!06EH2eR|4kl*n)#>-HYg7B14bL=
zqfu%x4ON;mWfd$-J&%6`7<B?aU%}$g`hC=Tm?blK$@ZhV<V_!$nkHM$l335ylKo_S
zo2z-!5|%n;=0Is}0LIVk^`3AmfvzoXRE#w<63&^c+ulKmaG-!RC@pO209#)D+u~8W
z5qZDubeUS8`oh%uC;sXZmWFQlbP3CNz~DbryS8`uh6ihncphML_smzr2<<jFVb}{M
zICG%5&0j#H?Qv4KwHW-;rR0j%aHU_Vg&9w=3=Mqj@(2H-?#q;4p1u@Q`u%0B50Z}a
zjHN7w|9Kg!OpnZ=PHn6;z(Yl#>nTQtv;2`c-|I*rPL5^+uUN`5;<Nn6Yd?etP*&8@
z8cpL_OeF(9fP%yX|8XfxjrpZE&;U6avLH}^n{L!g{_-=+SZs`B0>M?t;`z&1%)JGE
zIpKqo3P7c<8cMVU$^h;L$M*uokOI{8c5q>vTWO?%g5Oxi2Ea!^R3#g5Cv_~@vm>$_
zaekKFsqx4do?XdCB+eYziu;1{QTdJ0_$8QvwtaR}V<(iok|jox@;!P(VB%j^vVml5
z`(`B@53dSP7d!2sauj>u+6|KpxxZ-^hvR6LXbpAClefyeoF>QuYDH3Of2%g|7~4|a
z7Ou=UoX(XY0IW(}xVy{GP8THAPFT`PM4wjs6wmISU<094(7NIRe(Y(M5Zjfr%T<Dt
ztDj-9aa~D-G*E$RKKvQ5sscXg88*CMfoHnC5T_<7Ku0r52I6VdK@7_^&#*YNOeVV+
zw$|9>XtBee=$2=YHGy?zLA4(SeMB$9k9e0QQ**Vy!7gk*!;GYndce{JDJk+R9z95x
zg1pyqHX5sC)^aw;Q0?D=wH!ut7v%odYa=o$6$z;RPQ-hNHOpDjplVDplqo3I9WVm5
z4HsvoB6m1Hy`1GeL5<O#y1liR{MtO)%p|tX*d|n_WoetO%}>zGvc9Br^c<aby-|5&
zRRA+g6E^3%ROYFW%_Umj!UK#I&$3t=JvGm=$6^HKfTE`&&Ugz|4ttIbf$KG*c*jC5
zB(yuOb*DSrS_f+42&zeqwfXsOHCd+Xv!2cEEtV-!lNzc?iJ?!o4pNy5b=7d(jYl7l
z<jfo>%Hq49W8(%?``@WOAy*RFSQIfbxreyC{}MHgc%G%Fq8Dxh>Y3bgeV<J+g0L6t
z1Um0|HYoM$M<O?F+XjXXQ7nDeZBvy-D&O^p7vKC{fU1}C6VHRkFXypUEOm^eMkr{}
zof6~QBLyYGAodNVLol4Dl1=YKbJT{&YgxRkij9qxnJH`3CY`u7yMi}02Y?s;s))+k
z;(@neezLu<z#I(<$|qg|76gEwLr8kUPmR@e4s@PoV@cSP<l$!kI6N-(l(7i-9vEVQ
z%gBKq%orO>7(2NkRd{A5Kr&z=4WcfcD;K0dQ9W@{y9;-@Cmd4gWuhmXJ8kUfxIn#A
zZ>x8*LJ{_eVCS9PRw73R5V%&b_=udjBymF7Jo*LJZ}`%=;V0GE(lBA5aHEn#ioC|+
zm=M0H4;-Gn&1b#93~5<y$L)RKEB!rakcnB_SyWVV_{NC!eYo~}lwf^}UcA4+#$>-T
ziwZP&M$_(2*y{~AUfnNb?AKtk*9|WPs**rhWp+bWxWBYc$O^B`g?j;v&{t-0+so=d
z@jq9yKZjkxTca1+`|{=0Y<My(AlQjn(qZG`K$Ue*@gebrOEtt&9RH@8C05PYVyu&f
zwQkLE2sU#Ad1a2kiA^;>pp{Ckh&UbSfm=spvce_S0?(S+GiqRx7JB7W@BG<`t&cen
z8eELiGaMR13|azYu*AM-HkkEh4a`z#S{2V17Hm5Bx|L$*tm7Z8#43!KoC!6iT5GfL
zq-Pxnt;8EES$t+!f|No}g!v=lRMM<CQsH;EP|W>E!G&Ie?i8g%`$<@^dWKJVks0p)
zpPDq@-^Fg^E5QIWQJamPC<UdSzxN{KyMfV@=!q8N=PhV0_Uc14qhU@>)}trjYUf3~
z++_Z69`_QP28LcNe?EQ*1{SKh`mbOtPOn(jHj8x*s{(BXiB9z%$;p8fMp0+|l?{)d
zS);cY;k&P~RgFh!A)xlchoOy+-%7squWVT-uE6pZj4Ke=#K*pjwQeRJVH2+Dz@$|$
z5ofG~v22!u&HIs;q0CF|v^L|J*Qp-Kx=m7^dZkS+d1MC~V_X>Nrxw$gCEpdQlAF>`
zJM8)P!IMdHRU9z8EGeYR4i^r$Rpg)-hjeoIT@TSvS3YvIP*;4jiV)$%3q(Lnetv;S
zWFV^Gm<tCW;qd?7<>{9k#;RonM7}_QVM>7kx7*$0)#xsXR}SJ=W<@{%ts6Rpz&iU{
z^mHhc6^Ifvvf{+J`gl$-RCp(yCVIPGn>@qE{0)jRGx)5(!Cp)?U;a078h+z%EFGa^
zGSc@qmNBltFC7okMU~v_89Z{|lj&79L$q~J9JFV8`^pUx;$RYQ6^ltA8^^RMig@i0
zPhUu`B@($!s^;rfvDBb40)ryBj6hs)8G*QZ?nW6y0%gb&0_Qm@0|yDX@1>Y<h)$p3
z!&kEpU^w~WYDNw#dae=8PG7^~VyU63(up{%CeYF?4xrWi(KT#HEba7ErFY^0Ixr|{
z^BOiNiIUL63TdcB!Xsm3i5J(fgqY9g?FCPT$Z=j`Yepk|J;Qsyf(5sLk9~#3r(*M4
ztG)Hag*e(9MgqCa@$@S!A!koxQnsmXV)4%Ao<F9-VCy1Whfh89Hc*B?-s3fC#{JcK
z!9yS-xd-m!5MzDG8!$#75ng<S^?PD6o}vzdl3!<*+jg9FL99r;3nRIC$y*qCfs{46
zUK_OHqM>W2@FgS(Nav5dijCEm7<>U>m3h7nK3GdaPxV55ZTe4V^@64mOs0c4(;S+i
zYADD|Ym8dok<I2ZQ`EXBUDO6mMQDCUS<n2$)^un_hv-5#gc#^sY(R7x3*<t;aYFc3
zOMW~I+D$H8*s!^JsB=zrs2?p4&F_T^CNc`9E{TM~)>H?hIJh0AI3^Yb4S2@8SPyOb
z?sKR|a<5HMicyFwUR^Hvo+n*G^df9;^R;QLZw?e{8ff3xBZ!VWuHCv$J?WP_C+ub&
zf>U?SW}EvCIiG!f`KN1Hy4;FlBV%&Mi-dvD*`TBB*sKa+GP)aMpBsUVM6{4a2H1m9
zd4o7mQK^~J8)L;0{m2|#VTYcIO-sU2I2sL>-Y{r%P^SW>aU#@Io~%Mmo5ag1+IvrR
zgrAHbN?BS(mV?ElKxVypv{~q&DOry<0<y6PDihSsOTrF5<t}rCozkb#_zFH6cF2RD
zlDDk!EhyJezNX?Zu+%ELSH{WFKgS-iA=lM&{cu<4DQU5?+W(k+-6MGjhlowK0gFPI
zZu%p_wh6X6x%SWvlp0tBuqcol9Jm#Z5S>HfNOJ2#i()7D#zIN45gXx#iQ<O|wjN-=
z(U0^tJ&0XJShscV4)9yCR`Ct%S^DfsEPm8O8<gL35BJ=V4ttsu7mYaF0qZv$GJ-|g
z#BK0JAt3?J5GsuZ&z{<9$dCeTHV|LW`)z=jDUeL82LA;T>0*Tmv>+DAX{2@}U$lW`
zW(0<EU^_(h7(ZJMTcT}Xq)0{DD|nD{aRVD3UHdp5za;m>)T9hQ@`R0Socb7lWFs38
zRqwB?HPwevUxL5CxDm^Ri+{9{4T(PDzcVicbsH=;xGsKUBl`$x^_$oV{G`4HJ2Xvx
zY0aVD4@-D>_fK`G_gn4%JIE+yJv0oX6uW2<FkrvLE;XI&{V#7Z{j9PqK|Zo^Agu*J
zCOp~M{vxbHW)-h)o=xMwWQtEbIl}J*Qam*q;WB8A%h^7kyIy1IN%elXN5nWbA<}df
z0Qf2prnW^0#>;xY&f@q(oc%A<``<V-!~mncFU>*o6klOoH0-ub;RiSyG{9^MHhv}n
zjP~BbWjBC%NDX^HKSZc&5ot`YI+F`S@Bp+7@$n~XAgpuo7i%DtY~r8Qu(+gSz#on~
zDrthh$-lsURiTZfmW%spn4xzQ5fHE2i4at(ix1h1g{+C^ZN~HDCS2tTvx6k(GB?3O
z(s)m-MQt^GLt!KA_KPK0kX~c$vW(s2ueATS59;+W7APGRHu;~05yLJMhECamR;PcZ
zFezv}7ifRijf#ppH?v7-SDKwA#e;M;y^}Gh^*zr|@tJC}Ts`32f(YQ`#db*VTzrF_
zO^Ke~9+7((9ztZzT-;@6sc9qpA$UbKx-?Q3aM7iL*CetsE>nu&bR&>qTrI>VE<UT4
zrA9^MheA_RT|On>rhktAwHD8f>iux#b}mGx(m(u@w$<oRXXCFBO_|^&#n_xGMr}Pm
zQOjZmMYKPDB&F5(4k?g}<t#v|`eCrDGptz{W`z0Po?BSLq$J!fkz?XOUkvd*R~LyP
zg5QHgZ<8;V<k?ml2AH`JWd(95XPe^$<>HIBU`OKOo42s|f+@cF<a*jSUtpk6-$z68
zG3*cn?-wSUJ|e$=GUcP8nWlVAs2eE0j`;tp?pA{BaYulZL@rWuBXfUoTiM+i_MpmB
z)dFF0=sGUD4d5tP4hUE?*vfLE>C#ALakdvz{m_#?ZpDp*m^fnxfDd4q62l$7jjYXz
z;aoRqGgG+>UuT*9hy%bpcB9emY=7)0yuU`bAQ@z6dYz3*al$UCMqvUP&m3V|CzLj1
z=3~C%gNXv1-|+_Pk3z@1fsyaxkG{b&)i?RpH*hg>^IMhM?g+z?Huw6l>neTxQCal)
zH^{;v@9kh|n%<r$e!qhyMUjY+n!db}lx0dB*ps>VCI^HdE`G+r46zSeV3-OW98g!6
z_3XWkrP2K`*v}*f%ygO3lSA-#JglC){^b3-5$0id2^(h8VvB-Fe+@Uw*EC5eAwNTm
zv_PrZmE5+C-65*8bsI~HM7?sI?GqYR`jRXBn{6zaJ#67Ox3SThI-Ivt>zE<x`zO}o
z=6!L4tjMf7F>b2r*r47arhMFjuYHqJ)E0Um_;DR1Bxpz-cKI#5qmIQzxA^j!1_Nw5
zfx*UQYCRj9(&C$WP7AxXS~zS8G+3JLQ<oen9t`@R8ZXqdyQ%`IG~P8x>n+l{<^aLR
z|C6}5e-dZ7CC(<>gwdsj?uE1c%{uGo2uOW)z_?Yo6)gPVYM$P}!dOH*zo&r>P0Kq&
zO|5sE$j?WK5eo1-Vds?MXzf^rNwkcHC_(Tw4Xj^Jiq5Y?6h`9S26nId4c^kgD(=iX
zQ=u!bQ;~Q$r~IHw|K(2>T@kVuVZKG=bK9G2JjmGeCYz0)__tW*BQ3r;b<Y)tTBkQ@
zKsEIul|JtbtYojHq0+fPSy3M59ld6~@q<cVB-R_6A*zxvdg!%);%OB1G+$7hQ9AiY
zZ?V)t$Dk~$a%W;3-1x!SUg$_P1Ke8DOc`DN7-fvW9mCt~fpKG(2KaD*3*m*SU8?E7
z=Z_M`kX8C*81f`e6+Do$_=>k#LKc}RRn9QxtoFtBzXvh>ESNuM7A%-zvS+nd*3wHP
zoOauvt;GdRlaa^?`|}sy#tndrtKR`5-o@kJVe$Pmc>k*w5>8XyFqa9m+*Ju+a{-_B
z4$H_mA_A-YuVc;Yu)soXGBf9iT|q(nO6<a{ztJPgo!DYZ-)5`$-gj6`)&G#_f4(je
z{3axs6rS>a!;BNCRw3SqWml8d6_-V>Tg1TF?a8defdk{vT|qUI&{`|-;DR59POa*p
z(#&a%&WI;7P2SAW4cc-?D{Oj+OuNNsBZjCw>1cf%kCv=hA#APT$<?^hQW^~EEPI!w
z{ZI5j@~7`YpcJ6T^I{L671RiB2H73gCTl^XKx|gK)ov{5u&Ss>h^cR9!-w}cB2Bc0
zz(D>=2R5B_!DnrNrXyKj)#^0uISyE66{}wXFWb%xh^E&3Vk8nQ@~y0+Oa#n#Y-jyL
z_Wi8V@8U<dvpj4A<KM#yd(4wuH!?#!kTM_RdGE2iky8C0djbQ%`JR|0<91+nx%ksN
z*o$zsq3<%t&3o>|h6lcZb~17V^wdtadEAn#P2Mez^}?>V`D(B-T<260Ix$V&XTeUb
z%`w<gXocYX2%oZxW%k_dNysG<7@NVocd<#mO$tV=ELW*j1^mV?mNcrm9X8V8m&<gP
zx~5BYQSv&Q{;KtsnFI!zxtk3Sc@FgXj92VtD`1y+0&m|9y#V?cum`e2`pDYDrrctY
zcJrRwjMSdk0|pN8AhX-*y=?d`QRDXFHoZI4{Jm_@;BHZ{MUESfpW<~L?fvoiL|yU%
zY?71bF<f$dxR*VyG2l&j?E5Tfh^c6>ZbgI5+_A8*IM)?<jg7>K$f_o<qj)WRqS)0E
zev00jE#*(V4_O68Q=}Ah5%FLg_<i<(Fprtus)yOy#l*-g>3CcImcLN>?vHO1Z+{;v
zO%_l109+u8kNJQ-KnAIw|9~ZiWWiHF7O(#RyS|6`u@BhTo{tt!auhj$3LcwcK4h!#
zQ0t8kS$yyPv{!&fJF;t^RN8;UL;T2xEMve!ZF;-bOfRi43#=sID=Z%Gr~)HRvgY0_
z=kXu0eq;bOd*0RSZx6szTlJ!0E$U_W2$@ZRr;tzkh$ZxH@>JGd-9D%Isb8rL4N(7i
z4$(0;ejq#2-?s)VN_$)T@tq&BvHiZgyu!h-9EBS+Lqn|L5EO)1!>DZDf%5t-1iLgC
zZ1u!-R*Q!)v@^qjlV|)pi<?zQ*V&eZ?Q3hR%#McK8;(QBP}^9advhM0;>D;g^3~L+
z%thY3#v*SnIDXWR0)eMjHoV4dDDpPE14uF&u$fx=k@F$G_2040S=c`PoDqT$0tik#
z|L=I~*8j&M-<+Q)=>;6sZ6539BHwApN0*GQB41?<@WB((;<I?%O6!V+U<n<?69J37
zh1-jKo9ap~<4YVHkZR8to)5H`dkr`kik4Xcom=E96AQP>JI7w+TiXy_V&zpIv#5BP
zi4HW8=rY*q7hQ%zz^dN<n2nlrD?le+Sqt9>aKzJL-QjxJpsvUhXMLH2ULUOnN+w4E
zPuj;~7Rn@sq_|`aswiKAj`XakqoJ~6aNnV_+0+n%(gKQP*3^(B^GJ_XtRKUNngvVm
z!bWg($}cQdV-HF_yLBIn8zcd`v};LM8Ht`es2?zF(LWQ43@(0d9~+zSVOtcQBNzEj
z-nKK}*rw(gpRiP^;^ws}*13zkrh^(QTqSKMM@d~AF|fePUb11mp^;hSE3MPu(1Bkp
zvf2fbiOF5O=u`f|C)lDF@*AIEs8eO=Fwp0wvALfdg*@Ru*gOW0OwaxYyD!|RP=p^u
zNbL5DyhYpT;6=5K{*>i~5ePAcf=}7JyoWp!x2w?=g{6I5)0~0~ZLb`>^$dc%xj(sN
zu|0HMUZB+GBHz?ToBqNAi85-x*t4eZXZ@%~+54e*<l@Wsv-p@<XSBH7B$t-%Vq#Me
z6Y+QVv#pv?s6<Tpj1AGm;;QYb&sbB>V+$EvwywiKy~eXXXG2l}l3i}c_U`Omy3pY$
zimVUT>(U14G%yQ5VM4O*bL?V1=X*bAG1$c%{v7Hc6#e_>(5JoP)91xtUG)5*w#Jxg
z^V=$}$YN;@nF(yt0o-IzL1ieY?Cd~YT|-lYs`XASNen;dYYssFeAhxDLNzBsah0Uu
zkW%UYH~-HAY*f{3fvCu@I~dqW2Hk!w0N%;DH7UjF?A)Jh`bhIVLrpkg;f1Ur54QR8
zej1N)o3sD~m}~-z?7&7u+E)7eLY4l%4<#4tlZ_6N=}a7%`9-E<{1@XLSzly1CVT;r
zqHKU36)#1d)H$VRQKv&v0f^eQu93wEI=tP8vlGRfZe-~!*33h{U@1u-n6)P%34@<7
zJcTp|>P|z|h+Vo(e~9ON!4kq2w)dS(c^7@bG6C1M`VwTOfc(MC9j&adI-8$Ij!^^s
z{qt5DM?iLR(9waL6z$YK!s4YUWL=2ZY|EuPvq3ZTMRc~04?oC;JT%nZf3nJw-)L%_
z(5MwB$NaBoPfXoB&>x=jqES=Y=f+3Q?ubQ$OOO{&p)(H~599Aq6e?Q9-#G{+s$LfU
z%|UiY)LoVkob)0r41Zg>`yg~%@3v@k<d)-vS<XHh6HYh$L1BMptlxo+sXU*oZZ^_x
zjna5l6U#^&>X}fdvP>9Ck%jIBILbgHss6~#)i7BTQhF4OPG%^Cv$!{!gv9MwlQ{IY
zHL-hj$ljzbiO{J@kZK<4;l@MaU_9@T09|tkx~(VMrq}f<9|Czuy@iAX^r8iB!9(x{
zXU@Fh^>sGA!$Pn1){3tXe615-I#H=$)2Ay@K`N&}F{~PNHa<=h|708Szid&`Br1un
zoWtQGHiQb}_aA0M9t_6UBrUae;-g_?)BoEXGU%j+p?D1}#!tuB?bdUHa`I0Ov-`m#
zewROEzr=+h1Z!VnpSg;E_N5RrUHg*NBXZ4uvRVE9z>z+*+wc+MM6k1e{3j~|RLNJ^
z#XvOm6`1B9{ODH#!|z|Q_j-PN8n0Gp%L3rtU$aSRiy&B5mF#tfyta}SL9w8(yF#WE
zr6a`xPvh&h?~qao|B~OZv}i;7q1Vq`?$h$e1p+tlN528P+s&W*24?07_<{fif1e8V
z`ztczC*QCkNrpDvl*G+plg3U?x^STVzPiv2>O3|j_42pZ5*sBd%@LNAAi>yENmmcF
z|D{e71hCQ_$up0zp<%v=Je9u3VP1ZO-GyduJHlq*$9DuZI0mbI+l(P#<YkvbPQjn2
zQ1Ef_jBf=+W`8TBx=}~jn5q`sXG`&$4Kg&1HF}}3+38&kD=I4et5*YG596yw#L<^b
zHFd_BuA=5<hi|2w1Rk`)_}#I&^ey9UBA&i&z8dk}$u)E>?t+9T`=5x%xJz8vf&Msk
zls&D!!SlXjL!x+lKj9iA#XQTa=1&}hNLP29g-1n#8Gd(JPw%p+2fq_%)??qXd&z0d
zWT!U~@3|ti12do_P?~!Ur*CdJ#?o&`mxO&`JilXIzqP$^qz<YHwl<rO0qYI^$uYRC
z=&Hx*wpiYN4BLMczbTS<lC|;%TxA>=5~pd$F@lfrSC0!Z=DWw)HXSYTeOyzVPVf3U
zmHw$;`P>t1D*EZ&6KolNl1?%h{Qs3tJjsd>+<8)ntlTGAY>$xhgM|)Ik2bD5#qLAu
zv{OR#Reg#jjm?_j^v)N@sOaRu>nD^DJJ{Du1fj7^i~*eS5{wSdja(3^wdsG4p*JB!
zuJfnZqiERJ@7W;HFx^RAt0ZvA_o&Qwm-+hd*@UPYKMdX|8fdP(j`QI6I0X?I`gcOd
zpN8P=yUW2)Q%(ypR>f&HmQ6g#cb#T~`@MSt#afPeO!d*$qEV||qlGz{L~9FgIStFa
zXIdH@xRuub)}p30r*l42UA1mHJCJxQ;|Hu*E8T1P6F;zfg{K3GFY>-zr*&6C%T)+7
ztVQ1K+X?8?9|Y5M{UC^${v%6DhyToMn8}6!0Z-tp5jw3!0}mTO0wKX&c<MUi^51i{
zuq;Ms*Ijb)svmK#eV_0B5lrKKe*Q<6KI45DUeFfPN;q?IX5u8HS|HTI_?yL*>za@?
z28>d^AbH7WtIfKep8ut<Z!P-8@_t+29Hv`btSw$qlXV^2%9`JYQGdP9pZEzYs&%o*
z$g6*1cMB&6+qS&qGucai#b2Cot^5d}pd2#64u)ib<6qb_T?ICkWG-(D$?oyJN(@7X
zza{JX82BhW1ATiJzxNCpu!1i-!{Xx_S{q-#`gM;DVH+d(Cg=XUPt&2Pw25y!!-{c=
zi#W^D$bHh3FMW@lA@e*)wch3B6VI|?z*KRT8KU2#I%0#7WC4J^oWFUNWeq~{IV$u1
zxWIOnk|^(P*psDexqw(d`W(xNgOsB-LWg9_W%xYRDqoen>>Nvg^U+-8Fnt+I68YGZ
zS0$I-bNIXG*nlA*J>@WK;bo^QSqqxTkWvK<756!))0UKl@D9u4c>71PGRg=Ez|Ufi
zcKsOm>Yo`oeY*cw78m(M*#W%7p?kH5%J?@wvpbWCBu(DJZFJ0tN^bIoZllz0a6Qhm
zp+Io=dBK6!{mNnt^rVPtW7D55v*{a95voFP+*kb7Um(R43QP++tcQ!i!p=i^|A{gq
zUSM>TtSh$OpjxQ;{lBo-Fj#d4qJ1J0kNk!8K!F6WyA____lu|vs*w~DTdw3GxjHq_
z5L|Js88WahZkcZ&-i=>y>fG&lpe|(Yh1N(D_15H(2DeTzI!<9wC8x=|vR-TMC|NCh
z0AL>hNgwRw!AtMa<{gThFU4I038VvYQtsE}T~M#Z01*;M<S4XPi!mVaH4r}Qj^>2q
z5mlm_cM!riR|6q-PKT)nQ{4OP{;3rAE$&Xc;=3c(daU-@{~WQvy9ao~7a8AlwcLuE
zFkeS`Re=I;MZ7rR*j7*=sKx^EhySv|ntxH@C3a&yNxn($jk5Wg3oI;6l4U}@wzR|g
zZL_>5(t7sU8S1{e`9?5R_<;-P-Y(i|J(WR{bYR4@H8}--zaYkGzl(AvTm)l$^Q*|A
z802Cl8P*(%VSX6io>aJvE<D;bJ_0iwuD35jhEsTyLBod5$KNUbwt|j07)BQ_Vud6J
zQ!)8{28%(%dtbsq5VFW&mtfM>#UHqY>u48WaS8fMyZ9TISUl6T@%@*u&h6s=0BkIY
zolUUaEXRx5N|!Ao_^VFboXWsRY?jqtk_znN^PH?-T=yJMJ`z_#yZ9O>ON|Z$rFeEX
z|H8?Vl6HGmLWn?8>+obeA#Emcf)qT%XeWAgH`iRo6OV_*y6WObFSB?){W1$B^WWK+
z1UTl?>r$|WI>{R31ct#KF@Xt%18NN&kYgCY4I#!<Fm1ZbGJ?@2#1pgF+06|X`4N`g
z7V;}joH9V@5V^3!x~L?jRL<;i|9WOq-vw|{b`_2?hZV(S^e31_+%FYi7Tq`%%76#U
zuYbksPdsGFfzRt&l}iiF8=L+gWpiPAgTAg;%))C@`bsXJ4htPq@wKlkM<?N~ltB$k
zr2bNosldgS|3x<rE9mL6dlaaR6{C=oaO|wOOMzNdF+?{QQ2$Yps?$yuiK_BM1?;P`
zcm?f&ia+UM0d}#hkCJgvd6WXxP!_I0eO;l^(W3n`|M&_U5KU{7I<ISO`t^#~Q}w&b
z){Hym$*qfqfi&9rf&dDun}~yp)fAG<%2n1xcTE1*Vj-dxtD_`*k*$vUD2rdb%I;qH
zEL?MvA99M)dY-kHEpoNcsgc;q4&?wyLx+$zd3V@TJSJ>j93-(rcn`vbwSmxw2rcLg
z?L)|_gi<_<dDU;s5SG=h+luv)zxx{-Te82_^ky!sal^2oV1HUqAZA1<nTn-4nGWAp
z`l62ihw}IEY1d%06st3;^*vv74c-v;*Op=bB<o--6*RC=9lBzt|NpN?Em&8b>do>|
z*SVn?w@O)X9IS$qQOPvqr573wmwd_vS34|_!6v;rdzjK4S#ZlMdU~?yU>6^JFxjTR
zvw~#j6X5^uC5LtsEy$Ekn}K1?e*&M(bOhfyk$*vBU-Lh?bmCt(Ged~D&*AQ77MF6{
z^$lFOCgY+!Lq|msL&FYan2YJF+!c2sZoETl#Y8fNL)9(PN(>q|J7CY$F!bl-Chv<5
zy7#HZMNwC(O@D8hJZ8a64|X6y92&QSli|OU@;BOt!6_kOQR#m;*+qZ^Y9JpI&w57<
zg9HkD5MwV$Nu2zmi^YYBvazM=aIumwF;{SbboWg*oI9?wzEkEuB{x09dFWOyI80Ym
zf$(irf@Q2m@F%JY4ObWc<2uZ8yZG!IY=A5j2eapHuyLu~kCsl*h+ZHK!xN3(y2ui7
z5F$r;H-r$f13$4J;kY{Aktx(0o!$rNuq`W{5nX`$q-bkL=>;*Dahr9MrQaPaUZ951
z1>(M28WtR;hVA2LZnAhh(<~Ie4{YyU#D-n90G9VIp*TxnYYmTXVHNlH@F(Ovc~;kI
zuzZ8B0`axoACXfizOwyMIrGI=vo9*ANT&J{a*7pgD;NKwMchdh26>46y@kd1(%_-K
z2C7ihHY}&ft?bX4#ZTMx9yJwT?STOhv(N#t6krc7znt!8YlUbE>DF4~5rV8o17xbk
zW8zy|At)C^WTB&V@J|kR3go<xEw$;-ETe+(-<st~Y+U44WiR6AT3I}Lti2UxDHj9g
z=2DeD<}mK9#U9Rv^#_JO^$nRS{eQV_`e}n~`T>PD{S=Ezzx-Rc^!>`FA8n+eOPEbw
zZ0`X*8r$x1sVaTa6+prKnO2MrsYaB7D=?B-yIMT{evo9S^!HwYzPSqdjpF`cpnszx
zjUVV=a?qxKq(n-)6hFA&#wv@$Uv$s`|B2+p-2sn_f&J16H%p^^$$z`q9dW?|uL9{p
zl>}Zq-9vgaA20Oa;xtva%;9F{0qrV`MkuINs7)bhs0y6;26xttHWoK-5<q+W-#}|^
z4%oEJcDSR<ZB6RQzlrOU0)D?&Q29}>IB&n`75llJULoN+BSUJRNK5mv2hktT`PicQ
z#QZIz?4z&Xg5iqqRS@Gf(Srrxn$qF!ALR@yaoIA6V3&5vXvF!cp4^v%Nzw6!`lhMf
z2A6q>CEYLg>v8&i&=0A56QA#AX~W?lu@)w@TS*;KUQ$)VFUZW%>g<xswsJfPZ1Pcy
z=m2Ym_MD%^SD}(Q57n+|e(0Q_TRW+I$uEq~bE0R&!u)>it5{P5P?RQ+fV0^!PgL_m
z9($b5FXop=Uuuuc{<lj;yNb3`$ZM?K*^IveYZev+hk}1`?MNM+J_Pzq0A(r(OFBU+
zYm++97UKaiUV(U4fp7wyd>l^A$O1%`fPnHxC&Yqo&6og~2?`7?@KsbtCvF$1t<;JF
zr4@Me+N~9~+TAz=1lrLga!`A-z|8LMtmFy-6=+ChCzWQ}4V^GA2pHKEXBAoyAmw9r
z@d`%Jqgnt3T0?E1!l2}2cSyD*pjHZ~KzpbW5-L|fsh7l>G%0L}!PM1_GtvH;qWuPJ
zh8*YUafHR`wgwS;7C>eR5Dnb5$=-6dF9{;_!+>~LKsce<qCoJ3-=RlI{jgEgN|r*X
zWvvVlC3F#ClYo)M5ON7aM~W^Qye41*1%YiUt(zlSC+3B<seSDhInt?XTvaGO^W6Az
zS?4C4GyaUW0ib4!{BpM2I=^1-{8}6Ma<ASp^V}>Ym$Q9iAijOemWL4=Jo1%E32h$i
zC$YkbidmY_jH<w=Qd<nI0Bd(bAR|+W^74xaEWe15fxMj~)~s!H2#MT<wmxv{-gr*k
zt|lg%qq0&Hx1C!lI)Mgbqx`Ds>W{#{LKV7(4=j<2*=nO@#FFNptRRqcU69nGZCzPQ
z!w3asH@c%sIxHWa-E?;8S&DPIX=sTrXgJxFug8RDGOgNGHhnX60wb^pCgJ~m_<zsS
z0g()mjewwO^E4GtElKvzX;PV!{bW$)4&;1yIU(1=?f3oQel~qi#6{zOGXA$c)3wjR
z>VymbM6(Ug=pk?yLLY?xVs2=iV87swhmcUJ?iS#5{*NHdtcF%`7h|n%#~2VwyK?n8
z1SjOKf8e#$k@gUAV1RV(9JUPRBap&UZE+KZ@JRE1U#t?Ij&O>(Z)=nYI|O_N>K+Ia
ze2V#0dx8Q#Q-t65$S}@^B7BcWmgn$@^eS_uTSi<E5eD<S{y=yRG8oL)+ItIx7d(#%
z1bf;dL|D~k6zRP>!xKb!YMX>twNZmo%rPFd0xugh6K*o7fzU)ideuntJ*^U<%}X^L
zX|8EiTHvJ`8qCAJk^(9(Rlr~_@ym2v&LW&*-sqPUNEGQQ=F#mEpHZY6;LAo<!043}
zE^L(*FnUp;Dj=Ndl?aSpYQaeJ-&-XGOiBgb@yiMrMU7L;W4yA3Mx{c(DHSj&1%B-g
zz*B=V%wDBIi9W)gVcy`D<>4v7xhiVWWTnrIqQH^n45fz9OBNOCt&rH{Ba)3Y@99jZ
z7A2WKaYqW0ntZar7NyG)Mg9zPx<c|qCH+-}LW#baRX|`cTYSo(Lyai>o=;N1)<zXD
zm{)a%slbuuHl;$gHrZt!uhL~cnLf&`3_4NZNb_sT7;}JWQvQ#XG2!r4$qd{p`^=%V
z_;kA@kxh_nq}i|Zp-n;fahvQ@8+2j`A$Q9zu_+XaQwp^CXw1M1eV{^O&}NvM{mP)6
z45y^J))D3vJ|)6W2uGOnl`*06&mo=#rNeMJYW<IiFx@!NC{FYXHfo;6PjujfI<1ww
zo=~)4b>?aC$s@zLBHODTi6#-n658nYKv=F{iK4h9b8ol-l=-N*By%6n01-Bd;z$!l
zmSgnOYD{4<0;()VrC_M@i3}zsOvrF=m~HaQikM*d;+Uszw%9wETRf_4u|qH)!xzDt
zly<kY$%0Ix-O!y;+HF&Kd5b49$L2TD+Gnx(t5ms*V6q`!1R;ybLA2H8w~BC!PcOoa
z{skfo^;sn>)1h;#gcpnSRj4B6Z}cw_;b<61kl{)ZcKPp6!p|z<$X+7if>IwS?5j2D
zv#ULOwjf_=f#>_zZCj6Cx1A>}T3GWp{;bW;a=EZyk-J_P-LwDd9{_bG(^<gah6+y^
zEXEQkZ_v8QahxLHc2DO%wPuh;izC7Srip(5H&u4ROYc;=-fL)~Q*Wx%KFUm5C1;A;
zXg84?KS&w?k5eO7>?2fK0hA4@m?lY+;%?yeOp}U_$@~b@Ov6VZPta)M?oE+b`&NSw
z8wM;VRAQ3{R@)(hGM*c)3)x8Tfl`;tmx9`j4zXTQIVtXyyiB9%7nkCGxfT&62H%HU
zO<O`=6Glf%a9yO)-2X`G@(`|`JEu7CT0-2pi{m8CvOlmE8PBN}WawUK3tuda{NUIr
z-s*I<nHKVT?*hEt!Cyhg6lg_^)oM~R>LFG$NzGZv?3OK8mmd*F9sodp8Efc4sw$mc
zWpOYcqt(R4PiRFMRx+k$tnDbxoVrGCfpBNAn12C)8OG({R5d+d+eT$=geMB<V=Y%%
u50TkN$Xn!hWal?5f5XBE#gkzNbt#?gyD*>zK)i&fg=iAOPvxq_zyAYJD=Uit
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
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox