diff --git a/blacklist.conf b/blacklist.conf index 2134d58..8d8160d 100644 --- a/blacklist.conf +++ b/blacklist.conf @@ -2804,3 +2804,4 @@ f192970de860d3ab90aa9e2a22853201a57bde78 # not needed 4966babd904d7f8e9e20735f3637a98fd7ca538c # CONFIG_ROSE is not set de526f401284e1638d4c97cb5a4c292ac3f37655 # not needed 0e5a82efda872c2469c210957d7d4161ef8f4391 # not needed +4ba0b8187d98cb4c5e33c0e98895ac5dcb86af83 # depends on dd123e62bdedcd3a486e48e883ec63138ec2c14c, which introduces a new driver diff --git a/patches.suse/adm8211-fix-error-return-code-in-adm8211_probe.patch b/patches.suse/adm8211-fix-error-return-code-in-adm8211_probe.patch new file mode 100644 index 0000000..9a7115f --- /dev/null +++ b/patches.suse/adm8211-fix-error-return-code-in-adm8211_probe.patch @@ -0,0 +1,48 @@ +From 05c2a61d69ea306e891884a86486e1ef37c4b78d Mon Sep 17 00:00:00 2001 +From: Zhang Changzhong +Date: Fri, 4 Dec 2020 16:47:17 +0800 +Subject: [PATCH] adm8211: fix error return code in adm8211_probe() +Git-commit: 05c2a61d69ea306e891884a86486e1ef37c4b78d +References: git-fixes +Patch-mainline: v5.11-rc1 + +Fix to return a negative error code from the error handling +case instead of 0, as done elsewhere in this function. + +Fixes: cc0b88cf5ecf ("[PATCH] Add adm8211 802.11b wireless driver") +Reported-by: Hulk Robot +Signed-off-by: Zhang Changzhong +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1607071638-33619-1-git-send-email-zhangchangzhong@huawei.com +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/admtek/adm8211.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/admtek/adm8211.c ++++ b/drivers/net/wireless/admtek/adm8211.c +@@ -1805,6 +1805,7 @@ static int adm8211_probe(struct pci_dev + if (io_len < 256 || mem_len < 1024) { + printk(KERN_ERR "%s (adm8211): Too short PCI resources\n", + pci_name(pdev)); ++ err = -ENOMEM; + goto err_disable_pdev; + } + +@@ -1814,6 +1815,7 @@ static int adm8211_probe(struct pci_dev + if (reg != ADM8211_SIG1 && reg != ADM8211_SIG2) { + printk(KERN_ERR "%s (adm8211): Invalid signature (0x%x)\n", + pci_name(pdev), reg); ++ err = -EINVAL; + goto err_disable_pdev; + } + +@@ -1821,7 +1823,7 @@ static int adm8211_probe(struct pci_dev + if (err) { + printk(KERN_ERR "%s (adm8211): Cannot obtain PCI resources\n", + pci_name(pdev)); +- return err; /* someone else grabbed it? don't disable it */ ++ goto err_disable_pdev; + } + + if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) || diff --git a/patches.suse/mwl8k-Fix-a-double-Free-in-mwl8k_probe_hw.patch b/patches.suse/mwl8k-Fix-a-double-Free-in-mwl8k_probe_hw.patch new file mode 100644 index 0000000..6f8055c --- /dev/null +++ b/patches.suse/mwl8k-Fix-a-double-Free-in-mwl8k_probe_hw.patch @@ -0,0 +1,37 @@ +From a8e083ee8e2a6c94c29733835adae8bf5b832748 Mon Sep 17 00:00:00 2001 +From: Lv Yunlong +Date: Fri, 2 Apr 2021 11:26:27 -0700 +Subject: [PATCH] mwl8k: Fix a double Free in mwl8k_probe_hw +Git-commit: a8e083ee8e2a6c94c29733835adae8bf5b832748 +References: git-fixes +Patch-mainline: v5.13-rc1 + +In mwl8k_probe_hw, hw->priv->txq is freed at the first time by +dma_free_coherent() in the call chain: +if(!priv->ap_fw)->mwl8k_init_txqs(hw)->mwl8k_txq_init(hw, i). + +Then in err_free_queues of mwl8k_probe_hw, hw->priv->txq is freed +at the second time by mwl8k_txq_deinit(hw, i)->dma_free_coherent(). + +My patch set txq->txd to NULL after the first free to avoid the +double free. + +Fixes: a66098daacee2 ("mwl8k: Marvell TOPDOG wireless driver") +Signed-off-by: Lv Yunlong +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20210402182627.4256-1-lyl2019@mail.ustc.edu.cn +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/marvell/mwl8k.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/wireless/marvell/mwl8k.c ++++ b/drivers/net/wireless/marvell/mwl8k.c +@@ -1469,6 +1469,7 @@ static int mwl8k_txq_init(struct ieee802 + txq->skb = kcalloc(MWL8K_TX_DESCS, sizeof(*txq->skb), GFP_KERNEL); + if (txq->skb == NULL) { + pci_free_consistent(priv->pdev, size, txq->txd, txq->txd_dma); ++ txq->txd = NULL; + return -ENOMEM; + } + diff --git a/patches.suse/wcn36xx-Add-ability-for-wcn36xx_smd_dump_cmd_req-to-.patch b/patches.suse/wcn36xx-Add-ability-for-wcn36xx_smd_dump_cmd_req-to-.patch new file mode 100644 index 0000000..82a9c6f --- /dev/null +++ b/patches.suse/wcn36xx-Add-ability-for-wcn36xx_smd_dump_cmd_req-to-.patch @@ -0,0 +1,48 @@ +From c0c2eb20c79e10e7c828e8a1be1efd346d568d5f Mon Sep 17 00:00:00 2001 +From: Bryan O'Donoghue +Date: Thu, 9 Sep 2021 15:44:28 +0100 +Subject: [PATCH] wcn36xx: Add ability for wcn36xx_smd_dump_cmd_req to pass + two's complement +Git-commit: c0c2eb20c79e10e7c828e8a1be1efd346d568d5f +References: git-fixes +Patch-mainline: v5.16-rc1 + +Qcom documents suggest passing of negative values to the dump command, +however currently we convert from string to u32 not s32, so we cannot pass +a two's complement value to the firmware in this way. + +There is in fact only one parameter which takes a two's complement value + in the antenna diversity switch command. + +Downstream: +iwpriv wlan0 dump 71 3 + +Upstream: +echo "71 3 " > /sys/kernel/debug/ieee80211/phy0/wcn36xx/dump + +Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware") +Signed-off-by: Bryan O'Donoghue +Reviewed-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20210909144428.2564650-3-bryan.odonoghue@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/debug.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/debug.c b/drivers/net/wireless/ath/wcn36xx/debug.c +index 389b5e7129a6..6af306ae41ad 100644 +--- a/drivers/net/wireless/ath/wcn36xx/debug.c ++++ b/drivers/net/wireless/ath/wcn36xx/debug.c +@@ -120,7 +120,7 @@ static ssize_t write_file_dump(struct file *file, + if (begin == NULL) + break; + +- if (kstrtou32(begin, 0, &arg[i]) != 0) ++ if (kstrtos32(begin, 0, &arg[i]) != 0) + break; + } + +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Add-ieee80211-rx-status-rate-information.patch b/patches.suse/wcn36xx-Add-ieee80211-rx-status-rate-information.patch new file mode 100644 index 0000000..4307fb7 --- /dev/null +++ b/patches.suse/wcn36xx-Add-ieee80211-rx-status-rate-information.patch @@ -0,0 +1,159 @@ +From 0aa90483f23e792f6cf571e8b396eef746194438 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Mon, 15 Jun 2020 20:29:06 +0300 +Subject: [PATCH] wcn36xx: Add ieee80211 rx status rate information +Git-commit: 0aa90483f23e792f6cf571e8b396eef746194438 +References: git-fixes +Patch-mainline: v5.10-rc1 + +Packet encoding, bandwidth and bitrate can be derived from the +wcn36xx rate_idx, part of the buffer descriptor. + +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1591961254-10243-1-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/txrx.c | 109 +++++++++++++++++++++++- + 1 file changed, 108 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c +index a6902371e89c..dda6d8946aef 100644 +--- a/drivers/net/wireless/ath/wcn36xx/txrx.c ++++ b/drivers/net/wireless/ath/wcn36xx/txrx.c +@@ -23,9 +23,104 @@ static inline int get_rssi0(struct wcn36xx_rx_bd *bd) + return 100 - ((bd->phy_stat0 >> 24) & 0xff); + } + ++struct wcn36xx_rate { ++ u16 bitrate; ++ u16 mcs_or_legacy_index; ++ enum mac80211_rx_encoding encoding; ++ enum mac80211_rx_encoding_flags encoding_flags; ++ enum rate_info_bw bw; ++}; ++ ++static const struct wcn36xx_rate wcn36xx_rate_table[] = { ++ /* 11b rates */ ++ { 10, 0, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 20, 1, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 55, 2, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 110, 3, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ ++ /* 11b SP (short preamble) */ ++ { 10, 0, RX_ENC_LEGACY, RX_ENC_FLAG_SHORTPRE, RATE_INFO_BW_20 }, ++ { 20, 1, RX_ENC_LEGACY, RX_ENC_FLAG_SHORTPRE, RATE_INFO_BW_20 }, ++ { 55, 2, RX_ENC_LEGACY, RX_ENC_FLAG_SHORTPRE, RATE_INFO_BW_20 }, ++ { 110, 3, RX_ENC_LEGACY, RX_ENC_FLAG_SHORTPRE, RATE_INFO_BW_20 }, ++ ++ /* 11ag */ ++ { 60, 4, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 90, 5, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 120, 6, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 180, 7, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 240, 8, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 360, 9, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 480, 10, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ { 540, 11, RX_ENC_LEGACY, 0, RATE_INFO_BW_20 }, ++ ++ /* 11n */ ++ { 65, 0, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 130, 1, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 195, 2, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 260, 3, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 390, 4, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 520, 5, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 585, 6, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ { 650, 7, RX_ENC_HT, 0, RATE_INFO_BW_20 }, ++ ++ /* 11n SGI */ ++ { 72, 0, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 144, 1, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 217, 2, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 289, 3, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 434, 4, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 578, 5, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 650, 6, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ { 722, 7, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_20 }, ++ ++ /* 11n GF (greenfield) */ ++ { 65, 0, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 130, 1, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 195, 2, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 260, 3, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 390, 4, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 520, 5, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 585, 6, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ { 650, 7, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_20 }, ++ ++ /* 11n CB (channel bonding) */ ++ { 135, 0, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 270, 1, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 405, 2, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 540, 3, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 810, 4, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 1080, 5, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 1215, 6, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ { 1350, 7, RX_ENC_HT, 0, RATE_INFO_BW_40 }, ++ ++ /* 11n CB + SGI */ ++ { 150, 0, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 300, 1, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 450, 2, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 600, 3, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 900, 4, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 1200, 5, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 1350, 6, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ { 1500, 7, RX_ENC_HT, RX_ENC_FLAG_SHORT_GI, RATE_INFO_BW_40 }, ++ ++ /* 11n GF + CB */ ++ { 135, 0, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 270, 1, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 405, 2, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 540, 3, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 810, 4, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 1080, 5, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 1215, 6, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ { 1350, 7, RX_ENC_HT, RX_ENC_FLAG_HT_GF, RATE_INFO_BW_40 }, ++ ++ /* TODO: AC rates */ ++}; ++ + int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + { + struct ieee80211_rx_status status; ++ const struct wcn36xx_rate *rate; + struct ieee80211_hdr *hdr; + struct wcn36xx_rx_bd *bd; + u16 fc, sn; +@@ -61,7 +156,6 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + status.mactime = 10; + status.signal = -get_rssi0(bd); + status.antenna = 1; +- status.rate_idx = 1; + status.flag = 0; + status.rx_flags = 0; + status.flag |= RX_FLAG_IV_STRIPPED | +@@ -70,6 +164,19 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + + wcn36xx_dbg(WCN36XX_DBG_RX, "status.flags=%x\n", status.flag); + ++ if (bd->rate_id < ARRAY_SIZE(wcn36xx_rate_table)) { ++ rate = &wcn36xx_rate_table[bd->rate_id]; ++ status.encoding = rate->encoding; ++ status.enc_flags = rate->encoding_flags; ++ status.bw = rate->bw; ++ status.rate_idx = rate->mcs_or_legacy_index; ++ } else { ++ status.encoding = 0; ++ status.bw = 0; ++ status.enc_flags = 0; ++ status.rate_idx = 0; ++ } ++ + memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status)); + + if (ieee80211_is_beacon(hdr->frame_control)) { +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Channel-list-update-before-hardware-scan.patch b/patches.suse/wcn36xx-Channel-list-update-before-hardware-scan.patch new file mode 100644 index 0000000..c89caf9 --- /dev/null +++ b/patches.suse/wcn36xx-Channel-list-update-before-hardware-scan.patch @@ -0,0 +1,200 @@ +From d707f812bb0513ea0030d0c9fe2a456bae5a4583 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Mon, 25 Oct 2021 17:22:08 +0200 +Subject: [PATCH] wcn36xx: Channel list update before hardware scan +Git-commit: d707f812bb0513ea0030d0c9fe2a456bae5a4583 +References: git-fixes +Patch-mainline: v5.16-rc1 + +The channel scan list must be updated before triggering a hardware scan +so that firmware takes into account the regulatory info for each single +channel such as active/passive config, power, DFS, etc... Without this +the firmware uses its own internal default channel configuration, which +is not aligned with mac80211 regulatory rules, and misses several +channels (e.g. 144). + +Fixes: 2f3bef4b247e ("wcn36xx: Add hardware scan offload support") +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1635175328-25642-1-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/hal.h | 32 ++++++++++++ + drivers/net/wireless/ath/wcn36xx/main.c | 1 + drivers/net/wireless/ath/wcn36xx/smd.c | 82 ++++++++++++++++++++++++++++++++ + drivers/net/wireless/ath/wcn36xx/smd.h | 1 + 4 files changed, 116 insertions(+) + +--- a/drivers/net/wireless/ath/wcn36xx/hal.h ++++ b/drivers/net/wireless/ath/wcn36xx/hal.h +@@ -359,6 +359,8 @@ enum wcn36xx_hal_host_msg_type { + WCN36XX_HAL_START_SCAN_OFFLOAD_RSP = 205, + WCN36XX_HAL_STOP_SCAN_OFFLOAD_REQ = 206, + WCN36XX_HAL_STOP_SCAN_OFFLOAD_RSP = 207, ++ WCN36XX_HAL_UPDATE_CHANNEL_LIST_REQ = 208, ++ WCN36XX_HAL_UPDATE_CHANNEL_LIST_RSP = 209, + WCN36XX_HAL_SCAN_OFFLOAD_IND = 210, + + WCN36XX_HAL_AVOID_FREQ_RANGE_IND = 233, +@@ -1223,6 +1225,36 @@ struct wcn36xx_hal_stop_scan_offload_rsp + u32 status; + } __packed; + ++#define WCN36XX_HAL_CHAN_REG1_MIN_PWR_MASK 0x000000ff ++#define WCN36XX_HAL_CHAN_REG1_MAX_PWR_MASK 0x0000ff00 ++#define WCN36XX_HAL_CHAN_REG1_REG_PWR_MASK 0x00ff0000 ++#define WCN36XX_HAL_CHAN_REG1_CLASS_ID_MASK 0xff000000 ++#define WCN36XX_HAL_CHAN_REG2_ANT_GAIN_MASK 0x000000ff ++#define WCN36XX_HAL_CHAN_INFO_FLAG_PASSIVE BIT(7) ++#define WCN36XX_HAL_CHAN_INFO_FLAG_DFS BIT(10) ++#define WCN36XX_HAL_CHAN_INFO_FLAG_HT BIT(11) ++#define WCN36XX_HAL_CHAN_INFO_FLAG_VHT BIT(12) ++#define WCN36XX_HAL_CHAN_INFO_PHY_11A 0 ++#define WCN36XX_HAL_CHAN_INFO_PHY_11BG 1 ++#define WCN36XX_HAL_DEFAULT_ANT_GAIN 6 ++#define WCN36XX_HAL_DEFAULT_MIN_POWER 6 ++ ++struct wcn36xx_hal_channel_param { ++ u32 mhz; ++ u32 band_center_freq1; ++ u32 band_center_freq2; ++ u32 channel_info; ++ u32 reg_info_1; ++ u32 reg_info_2; ++} __packed; ++ ++struct wcn36xx_hal_update_channel_list_req_msg { ++ struct wcn36xx_hal_msg_header header; ++ ++ u8 num_channel; ++ struct wcn36xx_hal_channel_param channels[80]; ++} __packed; ++ + enum wcn36xx_hal_rate_index { + HW_RATE_INDEX_1MBPS = 0x82, + HW_RATE_INDEX_2MBPS = 0x84, +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -664,6 +664,7 @@ static int wcn36xx_hw_scan(struct ieee80 + + mutex_unlock(&wcn->scan_lock); + ++ wcn36xx_smd_update_channel_list(wcn, &hw_req->req); + return wcn36xx_smd_start_hw_scan(wcn, vif, &hw_req->req); + } + +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -16,6 +16,7 @@ + + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + ++#include + #include + #include + #include +@@ -755,6 +756,86 @@ out: + return ret; + } + ++int wcn36xx_smd_update_channel_list(struct wcn36xx *wcn, struct cfg80211_scan_request *req) ++{ ++ struct wcn36xx_hal_update_channel_list_req_msg *msg_body; ++ int ret, i; ++ ++ msg_body = kzalloc(sizeof(*msg_body), GFP_KERNEL); ++ if (!msg_body) ++ return -ENOMEM; ++ ++ INIT_HAL_MSG((*msg_body), WCN36XX_HAL_UPDATE_CHANNEL_LIST_REQ); ++ ++ msg_body->num_channel = min_t(u8, req->n_channels, sizeof(msg_body->channels)); ++ for (i = 0; i < msg_body->num_channel; i++) { ++ struct wcn36xx_hal_channel_param *param = &msg_body->channels[i]; ++ u32 min_power = WCN36XX_HAL_DEFAULT_MIN_POWER; ++ u32 ant_gain = WCN36XX_HAL_DEFAULT_ANT_GAIN; ++ ++ param->mhz = req->channels[i]->center_freq; ++ param->band_center_freq1 = req->channels[i]->center_freq; ++ param->band_center_freq2 = 0; ++ ++ if (req->channels[i]->flags & IEEE80211_CHAN_NO_IR) ++ param->channel_info |= WCN36XX_HAL_CHAN_INFO_FLAG_PASSIVE; ++ ++ if (req->channels[i]->flags & IEEE80211_CHAN_RADAR) ++ param->channel_info |= WCN36XX_HAL_CHAN_INFO_FLAG_DFS; ++ ++ if (req->channels[i]->band == NL80211_BAND_5GHZ) { ++ param->channel_info |= WCN36XX_HAL_CHAN_INFO_FLAG_HT; ++ param->channel_info |= WCN36XX_HAL_CHAN_INFO_FLAG_VHT; ++ param->channel_info |= WCN36XX_HAL_CHAN_INFO_PHY_11A; ++ } else { ++ param->channel_info |= WCN36XX_HAL_CHAN_INFO_PHY_11BG; ++ } ++ ++ if (min_power > req->channels[i]->max_power) ++ min_power = req->channels[i]->max_power; ++ ++ if (req->channels[i]->max_antenna_gain) ++ ant_gain = req->channels[i]->max_antenna_gain; ++ ++ u32p_replace_bits(¶m->reg_info_1, min_power, ++ WCN36XX_HAL_CHAN_REG1_MIN_PWR_MASK); ++ u32p_replace_bits(¶m->reg_info_1, req->channels[i]->max_power, ++ WCN36XX_HAL_CHAN_REG1_MAX_PWR_MASK); ++ u32p_replace_bits(¶m->reg_info_1, req->channels[i]->max_reg_power, ++ WCN36XX_HAL_CHAN_REG1_REG_PWR_MASK); ++ u32p_replace_bits(¶m->reg_info_1, 0, ++ WCN36XX_HAL_CHAN_REG1_CLASS_ID_MASK); ++ u32p_replace_bits(¶m->reg_info_2, ant_gain, ++ WCN36XX_HAL_CHAN_REG2_ANT_GAIN_MASK); ++ ++ wcn36xx_dbg(WCN36XX_DBG_HAL, ++ "%s: freq=%u, channel_info=%08x, reg_info1=%08x, reg_info2=%08x\n", ++ __func__, param->mhz, param->channel_info, param->reg_info_1, ++ param->reg_info_2); ++ } ++ ++ mutex_lock(&wcn->hal_mutex); ++ ++ PREPARE_HAL_BUF(wcn->hal_buf, (*msg_body)); ++ ++ ret = wcn36xx_smd_send_and_wait(wcn, msg_body->header.len); ++ if (ret) { ++ wcn36xx_err("Sending hal_update_channel_list failed\n"); ++ goto out; ++ } ++ ++ ret = wcn36xx_smd_rsp_status_check(wcn->hal_buf, wcn->hal_rsp_len); ++ if (ret) { ++ wcn36xx_err("hal_update_channel_list response failed err=%d\n", ret); ++ goto out; ++ } ++ ++out: ++ kfree(msg_body); ++ mutex_unlock(&wcn->hal_mutex); ++ return ret; ++} ++ + static int wcn36xx_smd_switch_channel_rsp(void *buf, size_t len) + { + struct wcn36xx_hal_switch_channel_rsp_msg *rsp; +@@ -2550,6 +2631,7 @@ int wcn36xx_smd_rsp_process(struct rpmsg + case WCN36XX_HAL_8023_MULTICAST_LIST_RSP: + case WCN36XX_HAL_START_SCAN_OFFLOAD_RSP: + case WCN36XX_HAL_STOP_SCAN_OFFLOAD_RSP: ++ case WCN36XX_HAL_UPDATE_CHANNEL_LIST_RSP: + memcpy(wcn->hal_buf, buf, len); + wcn->hal_rsp_len = len; + complete(&wcn->hal_rsp_compl); +--- a/drivers/net/wireless/ath/wcn36xx/smd.h ++++ b/drivers/net/wireless/ath/wcn36xx/smd.h +@@ -70,6 +70,7 @@ int wcn36xx_smd_update_scan_params(struc + int wcn36xx_smd_start_hw_scan(struct wcn36xx *wcn, struct ieee80211_vif *vif, + struct cfg80211_scan_request *req); + int wcn36xx_smd_stop_hw_scan(struct wcn36xx *wcn); ++int wcn36xx_smd_update_channel_list(struct wcn36xx *wcn, struct cfg80211_scan_request *req); + int wcn36xx_smd_add_sta_self(struct wcn36xx *wcn, struct ieee80211_vif *vif); + int wcn36xx_smd_delete_sta_self(struct wcn36xx *wcn, u8 *addr); + int wcn36xx_smd_delete_sta(struct wcn36xx *wcn, u8 sta_index); diff --git a/patches.suse/wcn36xx-Disable-bmps-when-encryption-is-disabled.patch b/patches.suse/wcn36xx-Disable-bmps-when-encryption-is-disabled.patch new file mode 100644 index 0000000..d2abcb9 --- /dev/null +++ b/patches.suse/wcn36xx-Disable-bmps-when-encryption-is-disabled.patch @@ -0,0 +1,94 @@ +From c6522a5076e1a65877c51cfee313a74ef61cabf8 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Tue, 25 Aug 2020 15:45:27 +0200 +Subject: [PATCH] wcn36xx: Disable bmps when encryption is disabled +Git-commit: c6522a5076e1a65877c51cfee313a74ef61cabf8 +References: git-fixes +Patch-mainline: v5.10-rc1 + +For whatever reason, when connected to an open/no-security BSS, +the wcn36xx controller in bmps mode does not forward 'wake-up' +beacons despite AP sends DTIM with station AID. + +Meaning that AP is not able to wakeup the station and needs to wait +for the station to wakeup by its own (TX data, keep alive pkt...), +causing serious latency issues and unexpected deauth. + +When connected to AP with encryption enabled, this issue does not occur. +So a simple workaround is to only enable bmps support in that case. + +Ideally, it should be propertly fixed to allow bmps support with open +BSS, whatever the issue is at driver or firmware level. + +Tested on wcn3620 and wcn3680. + +Signed-off-by: Loic Poulain +Tested-by: Bryan O'Donoghue +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1598363127-26066-1-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 10 ++++++++++ + drivers/net/wireless/ath/wcn36xx/pmc.c | 5 ++++- + drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 + + 3 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c +index 2c3e68646fe4..8becd667fe7b 100644 +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -610,6 +610,15 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, + } + } + } ++ /* FIXME: Only enable bmps support when encryption is enabled. ++ * For any reasons, when connected to open/no-security BSS, ++ * the wcn36xx controller in bmps mode does not forward ++ * 'wake-up' beacons despite AP sends DTIM with station AID. ++ * It could be due to a firmware issue or to the way driver ++ * configure the station. ++ */ ++ if (vif->type == NL80211_IFTYPE_STATION) ++ vif_priv->allow_bmps = true; + break; + case DISABLE_KEY: + if (!(IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags)) { +@@ -891,6 +900,7 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw, + vif->addr, + bss_conf->aid); + vif_priv->sta_assoc = false; ++ vif_priv->allow_bmps = false; + wcn36xx_smd_set_link_st(wcn, + bss_conf->bssid, + vif->addr, +diff --git a/drivers/net/wireless/ath/wcn36xx/pmc.c b/drivers/net/wireless/ath/wcn36xx/pmc.c +index 1976b80c235f..8441031b667c 100644 +--- a/drivers/net/wireless/ath/wcn36xx/pmc.c ++++ b/drivers/net/wireless/ath/wcn36xx/pmc.c +@@ -23,7 +23,10 @@ int wcn36xx_pmc_enter_bmps_state(struct wcn36xx *wcn, + { + int ret = 0; + struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); +- /* TODO: Make sure the TX chain clean */ ++ ++ if (!vif_priv->allow_bmps) ++ return -ENOTSUPP; ++ + ret = wcn36xx_smd_enter_bmps(wcn, vif); + if (!ret) { + wcn36xx_dbg(WCN36XX_DBG_PMC, "Entered BMPS\n"); +diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +index 3221fed15620..719a6daf9298 100644 +--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h ++++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +@@ -122,6 +122,7 @@ struct wcn36xx_vif { + enum wcn36xx_hal_bss_type bss_type; + + /* Power management */ ++ bool allow_bmps; + enum wcn36xx_power_state pw_state; + + u8 bss_index; +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Ensure-finish-scan-is-not-requested-before-s.patch b/patches.suse/wcn36xx-Ensure-finish-scan-is-not-requested-before-s.patch new file mode 100644 index 0000000..4b257ba --- /dev/null +++ b/patches.suse/wcn36xx-Ensure-finish-scan-is-not-requested-before-s.patch @@ -0,0 +1,78 @@ +From d195d7aac09bddabc2c8326fb02fcec2b0a2de02 Mon Sep 17 00:00:00 2001 +From: Joseph Gates +Date: Wed, 18 Aug 2021 13:31:43 +0200 +Subject: [PATCH] wcn36xx: Ensure finish scan is not requested before start + scan +Git-commit: d195d7aac09bddabc2c8326fb02fcec2b0a2de02 +References: git-fixes +Patch-mainline: v5.15-rc1 + +If the operating channel is the first in the scan list, it was seen that +a finish scan request would be sent before a start scan request was +sent, causing the firmware to fail all future scans. Track the current +channel being scanned to avoid requesting the scan finish before it +starts. + +Cc: +Fixes: 5973a2947430 ("wcn36xx: Fix software-driven scan") +Signed-off-by: Joseph Gates +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1629286303-13179-1-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 5 ++++- + drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 + + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c +index d202f2128df2..67f4db662402 100644 +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -408,13 +408,14 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) + wcn36xx_dbg(WCN36XX_DBG_MAC, "wcn36xx_config channel switch=%d\n", + ch); + +- if (wcn->sw_scan_opchannel == ch) { ++ if (wcn->sw_scan_opchannel == ch && wcn->sw_scan_channel) { + /* If channel is the initial operating channel, we may + * want to receive/transmit regular data packets, then + * simply stop the scan session and exit PS mode. + */ + wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, + wcn->sw_scan_vif); ++ wcn->sw_scan_channel = 0; + } else if (wcn->sw_scan) { + /* A scan is ongoing, do not change the operating + * channel, but start a scan session on the channel. +@@ -422,6 +423,7 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) + wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN, + wcn->sw_scan_vif); + wcn36xx_smd_start_scan(wcn, ch); ++ wcn->sw_scan_channel = ch; + } else { + wcn36xx_change_opchannel(wcn, ch); + } +@@ -702,6 +704,7 @@ static void wcn36xx_sw_scan_start(struct ieee80211_hw *hw, + + wcn->sw_scan = true; + wcn->sw_scan_vif = vif; ++ wcn->sw_scan_channel = 0; + if (vif_priv->sta_assoc) + wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn); + else +diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +index 6121d8a5641a..0feb235b5a42 100644 +--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h ++++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +@@ -246,6 +246,7 @@ struct wcn36xx { + struct cfg80211_scan_request *scan_req; + bool sw_scan; + u8 sw_scan_opchannel; ++ u8 sw_scan_channel; + struct ieee80211_vif *sw_scan_vif; + struct mutex scan_lock; + bool scan_aborted; +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Fix-TX-data-path.patch b/patches.suse/wcn36xx-Fix-TX-data-path.patch new file mode 100644 index 0000000..da90a67 --- /dev/null +++ b/patches.suse/wcn36xx-Fix-TX-data-path.patch @@ -0,0 +1,80 @@ +From 512b191d965237249999b3c58600fe50356ab323 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Fri, 24 Jul 2020 12:20:50 +0200 +Subject: [PATCH] wcn36xx: Fix TX data path +Git-commit: 512b191d965237249999b3c58600fe50356ab323 +References: git-fixes +Patch-mainline: v5.10-rc1 + +This patch contains the following fixes: + +- Use correct queue for submitting QoS packet. The queue id to use +is a one-to-one mapping with the TID. + +- Don't encrypt a frame with IEEE80211_TX_INTFL_DONT_ENCRYPT flag. + +- Use the 'special queue' for null packets, preventing the firmware +to submit it as AMPDU. + +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1595586052-16081-5-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/txrx.c | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/ath/wcn36xx/txrx.c ++++ b/drivers/net/wireless/ath/wcn36xx/txrx.c +@@ -267,9 +267,11 @@ static void wcn36xx_set_tx_data(struct w + bool bcast) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + struct ieee80211_vif *vif = NULL; + struct wcn36xx_vif *__vif_priv = NULL; +- bool is_data_qos; ++ bool is_data_qos = ieee80211_is_data_qos(hdr->frame_control); ++ u16 tid = 0; + + bd->bd_rate = WCN36XX_BD_RATE_DATA; + +@@ -297,10 +299,21 @@ static void wcn36xx_set_tx_data(struct w + bd->dpu_desc_idx = __vif_priv->self_dpu_desc_index; + bd->dpu_sign = __vif_priv->self_ucast_dpu_sign; + } ++ if (is_data_qos) { ++ tid = ieee80211_get_tid(hdr); ++ /* TID->QID is one-to-one mapping */ ++ bd->queue_id = tid; ++ } + +- if (ieee80211_is_nullfunc(hdr->frame_control) || +- (sta_priv && !sta_priv->is_data_encrypted)) ++ if (info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT || ++ (sta_priv && !sta_priv->is_data_encrypted)) { + bd->dpu_ne = 1; ++ } ++ ++ if (ieee80211_is_any_nullfunc(hdr->frame_control)) { ++ /* Don't use a regular queue for null packet (no ampdu) */ ++ bd->queue_id = WCN36XX_TX_U_WQ_ID; ++ } + + if (bcast) { + bd->ub = 1; +@@ -308,13 +321,11 @@ static void wcn36xx_set_tx_data(struct w + } + *vif_priv = __vif_priv; + +- is_data_qos = ieee80211_is_data_qos(hdr->frame_control); +- + wcn36xx_set_tx_pdu(bd, + is_data_qos ? + sizeof(struct ieee80211_qos_hdr) : + sizeof(struct ieee80211_hdr_3addr), +- skb->len, sta_priv ? sta_priv->tid : 0); ++ skb->len, tid); + + if (sta_priv && is_data_qos) + wcn36xx_tx_start_ampdu(wcn, sta_priv, skb); diff --git a/patches.suse/wcn36xx-Fix-multiple-AMPDU-sessions-support.patch b/patches.suse/wcn36xx-Fix-multiple-AMPDU-sessions-support.patch new file mode 100644 index 0000000..4fb0011 --- /dev/null +++ b/patches.suse/wcn36xx-Fix-multiple-AMPDU-sessions-support.patch @@ -0,0 +1,169 @@ +From ffe835aa5bdb33572fceb0b14cba6a44c3371bdd Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Fri, 24 Jul 2020 12:20:47 +0200 +Subject: [PATCH] wcn36xx: Fix multiple AMPDU sessions support +Git-commit: ffe835aa5bdb33572fceb0b14cba6a44c3371bdd +References: git-fixes +Patch-mainline: v5.10-rc1 + +Several AMPDU sessions can be started, e.g. for different TIDs. +Currently the driver does not take care of the session ID when +requesting block-ack (statically set to 0), which leads to never +block-acked packet with sessions other than 0. + +Fix this by saving the session id when creating the ba session and +use it in subsequent ba operations. + +This issue can be reproduced with iperf in two steps (tid 0 strem +then tid 6 stream). + +1.0 iperf -s # wcn36xx side +1.1 iperf -c ${IP_ADDR} # host side + +Then + +2.0 iperf -s -u -S 0xC0 # wcn36xx side +2.1 iperf -c ${IP_ADDR} -u -S 0xC0 -l 2000 # host side + +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1595586052-16081-2-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 10 ++++++---- + drivers/net/wireless/ath/wcn36xx/smd.c | 32 ++++++++++++++++++++++++++------ + drivers/net/wireless/ath/wcn36xx/smd.h | 4 ++-- + 3 files changed, 34 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -1082,6 +1082,7 @@ static int wcn36xx_ampdu_action(struct i + enum ieee80211_ampdu_mlme_action action = params->action; + u16 tid = params->tid; + u16 *ssn = ¶ms->ssn; ++ u8 session; + + wcn36xx_dbg(WCN36XX_DBG_MAC, "mac ampdu action action %d tid %d\n", + action, tid); +@@ -1091,10 +1092,11 @@ static int wcn36xx_ampdu_action(struct i + switch (action) { + case IEEE80211_AMPDU_RX_START: + sta_priv->tid = tid; +- wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 0, +- get_sta_index(vif, sta_priv)); +- wcn36xx_smd_add_ba(wcn); +- wcn36xx_smd_trigger_ba(wcn, get_sta_index(vif, sta_priv)); ++ session = wcn36xx_smd_add_ba_session(wcn, sta, tid, ssn, 0, ++ get_sta_index(vif, sta_priv)); ++ wcn36xx_smd_add_ba(wcn, session); ++ wcn36xx_smd_trigger_ba(wcn, get_sta_index(vif, sta_priv), tid, ++ session); + break; + case IEEE80211_AMPDU_RX_STOP: + wcn36xx_smd_del_ba(wcn, tid, get_sta_index(vif, sta_priv)); +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -2102,6 +2102,22 @@ out: + return ret; + } + ++static int wcn36xx_smd_add_ba_session_rsp(void *buf, int len, u8 *session) ++{ ++ struct wcn36xx_hal_add_ba_session_rsp_msg *rsp; ++ ++ if (len < sizeof(*rsp)) ++ return -EINVAL; ++ ++ rsp = (struct wcn36xx_hal_add_ba_session_rsp_msg *)buf; ++ if (rsp->status != WCN36XX_FW_MSG_RESULT_SUCCESS) ++ return rsp->status; ++ ++ *session = rsp->ba_session_id; ++ ++ return 0; ++} ++ + int wcn36xx_smd_add_ba_session(struct wcn36xx *wcn, + struct ieee80211_sta *sta, + u16 tid, +@@ -2110,6 +2126,7 @@ int wcn36xx_smd_add_ba_session(struct wc + u8 sta_index) + { + struct wcn36xx_hal_add_ba_session_req_msg msg_body; ++ u8 session_id; + int ret; + + mutex_lock(&wcn->hal_mutex); +@@ -2135,17 +2152,20 @@ int wcn36xx_smd_add_ba_session(struct wc + wcn36xx_err("Sending hal_add_ba_session failed\n"); + goto out; + } +- ret = wcn36xx_smd_rsp_status_check(wcn->hal_buf, wcn->hal_rsp_len); ++ ret = wcn36xx_smd_add_ba_session_rsp(wcn->hal_buf, wcn->hal_rsp_len, ++ &session_id); + if (ret) { + wcn36xx_err("hal_add_ba_session response failed err=%d\n", ret); + goto out; + } ++ ++ ret = session_id; + out: + mutex_unlock(&wcn->hal_mutex); + return ret; + } + +-int wcn36xx_smd_add_ba(struct wcn36xx *wcn) ++int wcn36xx_smd_add_ba(struct wcn36xx *wcn, u8 session_id) + { + struct wcn36xx_hal_add_ba_req_msg msg_body; + int ret; +@@ -2153,7 +2173,7 @@ int wcn36xx_smd_add_ba(struct wcn36xx *w + mutex_lock(&wcn->hal_mutex); + INIT_HAL_MSG(msg_body, WCN36XX_HAL_ADD_BA_REQ); + +- msg_body.session_id = 0; ++ msg_body.session_id = session_id; + msg_body.win_size = WCN36XX_AGGR_BUFFER_SIZE; + + PREPARE_HAL_BUF(wcn->hal_buf, msg_body); +@@ -2212,7 +2232,7 @@ static int wcn36xx_smd_trigger_ba_rsp(vo + return rsp->status; + } + +-int wcn36xx_smd_trigger_ba(struct wcn36xx *wcn, u8 sta_index) ++int wcn36xx_smd_trigger_ba(struct wcn36xx *wcn, u8 sta_index, u16 tid, u8 session_id) + { + struct wcn36xx_hal_trigger_ba_req_msg msg_body; + struct wcn36xx_hal_trigger_ba_req_candidate *candidate; +@@ -2221,7 +2241,7 @@ int wcn36xx_smd_trigger_ba(struct wcn36x + mutex_lock(&wcn->hal_mutex); + INIT_HAL_MSG(msg_body, WCN36XX_HAL_TRIGGER_BA_REQ); + +- msg_body.session_id = 0; ++ msg_body.session_id = session_id; + msg_body.candidate_cnt = 1; + msg_body.header.len += sizeof(*candidate); + PREPARE_HAL_BUF(wcn->hal_buf, msg_body); +@@ -2229,7 +2249,7 @@ int wcn36xx_smd_trigger_ba(struct wcn36x + candidate = (struct wcn36xx_hal_trigger_ba_req_candidate *) + (wcn->hal_buf + sizeof(msg_body)); + candidate->sta_index = sta_index; +- candidate->tid_bitmap = 1; ++ candidate->tid_bitmap = 1 << tid; + + ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len); + if (ret) { +--- a/drivers/net/wireless/ath/wcn36xx/smd.h ++++ b/drivers/net/wireless/ath/wcn36xx/smd.h +@@ -132,9 +132,9 @@ int wcn36xx_smd_add_ba_session(struct wc + u16 *ssn, + u8 direction, + u8 sta_index); +-int wcn36xx_smd_add_ba(struct wcn36xx *wcn); ++int wcn36xx_smd_add_ba(struct wcn36xx *wcn, u8 session_id); + int wcn36xx_smd_del_ba(struct wcn36xx *wcn, u16 tid, u8 sta_index); +-int wcn36xx_smd_trigger_ba(struct wcn36xx *wcn, u8 sta_index); ++int wcn36xx_smd_trigger_ba(struct wcn36xx *wcn, u8 sta_index, u16 tid, u8 session_id); + + int wcn36xx_smd_update_cfg(struct wcn36xx *wcn, u32 cfg_id, u32 value); + diff --git a/patches.suse/wcn36xx-Fix-software-driven-scan.patch b/patches.suse/wcn36xx-Fix-software-driven-scan.patch new file mode 100644 index 0000000..b543e19 --- /dev/null +++ b/patches.suse/wcn36xx-Fix-software-driven-scan.patch @@ -0,0 +1,393 @@ +From 5973a2947430a297e3442c28114822a90dff362c Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Mon, 24 Aug 2020 18:53:55 +0200 +Subject: [PATCH] wcn36xx: Fix software-driven scan +Git-commit: 5973a2947430a297e3442c28114822a90dff362c +References: git-fix +Patch-mainline: v5.10-rc1 + +For software-driven scan, rely on mac80211 software scan instead +of internal driver implementation. The internal implementation +cause connection trouble since it keep the antenna busy during +the entire scan duration, moreover it's only a passive scanning +(no probe request). Therefore, let mac80211 manages sw scan. + +Note: we fallback to software scan if firmware does not report +scan offload support or if we need to scan the 5Ghz band (currently +not supported by the offload scan...). + +Signed-off-by: Loic Poulain +Signed-off-by: Bryan O'Donoghue +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1598288035-19790-1-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 164 +++++++++++---------- + drivers/net/wireless/ath/wcn36xx/smd.c | 23 ++- + drivers/net/wireless/ath/wcn36xx/smd.h | 8 +- + drivers/net/wireless/ath/wcn36xx/txrx.c | 11 +- + drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 6 +- + 5 files changed, 119 insertions(+), 93 deletions(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c +index 868de9d4a14a..2c3e68646fe4 100644 +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -354,8 +354,6 @@ static void wcn36xx_stop(struct ieee80211_hw *hw) + + wcn36xx_dbg(WCN36XX_DBG_MAC, "mac stop\n"); + +- cancel_work_sync(&wcn->scan_work); +- + mutex_lock(&wcn->scan_lock); + if (wcn->scan_req) { + struct cfg80211_scan_info scan_info = { +@@ -378,12 +376,37 @@ static void wcn36xx_stop(struct ieee80211_hw *hw) + kfree(wcn->hal_buf); + } + +-static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) ++static void wcn36xx_change_ps(struct wcn36xx *wcn, bool enable) ++{ ++ struct ieee80211_vif *vif = NULL; ++ struct wcn36xx_vif *tmp; ++ ++ list_for_each_entry(tmp, &wcn->vif_list, list) { ++ vif = wcn36xx_priv_to_vif(tmp); ++ if (enable && !wcn->sw_scan) { ++ if (vif->bss_conf.ps) /* ps allowed ? */ ++ wcn36xx_pmc_enter_bmps_state(wcn, vif); ++ } else { ++ wcn36xx_pmc_exit_bmps_state(wcn, vif); ++ } ++ } ++} ++ ++static void wcn36xx_change_opchannel(struct wcn36xx *wcn, int ch) + { +- struct wcn36xx *wcn = hw->priv; + struct ieee80211_vif *vif = NULL; + struct wcn36xx_vif *tmp; + ++ list_for_each_entry(tmp, &wcn->vif_list, list) { ++ vif = wcn36xx_priv_to_vif(tmp); ++ wcn36xx_smd_switch_channel(wcn, vif, ch); ++ } ++} ++ ++static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) ++{ ++ struct wcn36xx *wcn = hw->priv; ++ + wcn36xx_dbg(WCN36XX_DBG_MAC, "mac config changed 0x%08x\n", changed); + + mutex_lock(&wcn->conf_mutex); +@@ -392,24 +415,29 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) + int ch = WCN36XX_HW_CHANNEL(wcn); + wcn36xx_dbg(WCN36XX_DBG_MAC, "wcn36xx_config channel switch=%d\n", + ch); +- list_for_each_entry(tmp, &wcn->vif_list, list) { +- vif = wcn36xx_priv_to_vif(tmp); +- wcn36xx_smd_switch_channel(wcn, vif, ch); +- } +- } + +- if (changed & IEEE80211_CONF_CHANGE_PS) { +- list_for_each_entry(tmp, &wcn->vif_list, list) { +- vif = wcn36xx_priv_to_vif(tmp); +- if (hw->conf.flags & IEEE80211_CONF_PS) { +- if (vif->bss_conf.ps) /* ps allowed ? */ +- wcn36xx_pmc_enter_bmps_state(wcn, vif); +- } else { +- wcn36xx_pmc_exit_bmps_state(wcn, vif); +- } ++ if (wcn->sw_scan_opchannel == ch) { ++ /* If channel is the initial operating channel, we may ++ * want to receive/transmit regular data packets, then ++ * simply stop the scan session and exit PS mode. ++ */ ++ wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, ++ wcn->sw_scan_vif); ++ } else if (wcn->sw_scan) { ++ /* A scan is ongoing, do not change the operating ++ * channel, but start a scan session on the channel. ++ */ ++ wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN, ++ wcn->sw_scan_vif); ++ wcn36xx_smd_start_scan(wcn, ch); ++ } else { ++ wcn36xx_change_opchannel(wcn, ch); + } + } + ++ if (changed & IEEE80211_CONF_CHANGE_PS) ++ wcn36xx_change_ps(wcn, hw->conf.flags & IEEE80211_CONF_PS); ++ + mutex_unlock(&wcn->conf_mutex); + + return 0; +@@ -614,55 +642,26 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, + return ret; + } + +-static void wcn36xx_hw_scan_worker(struct work_struct *work) ++static int wcn36xx_hw_scan(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ struct ieee80211_scan_request *hw_req) + { +- struct wcn36xx *wcn = container_of(work, struct wcn36xx, scan_work); +- struct cfg80211_scan_request *req = wcn->scan_req; +- u8 channels[WCN36XX_HAL_PNO_MAX_NETW_CHANNELS_EX]; +- struct cfg80211_scan_info scan_info = {}; +- bool aborted = false; ++ struct wcn36xx *wcn = hw->priv; + int i; + +- wcn36xx_dbg(WCN36XX_DBG_MAC, "mac80211 scan %d channels worker\n", req->n_channels); +- +- for (i = 0; i < req->n_channels; i++) +- channels[i] = req->channels[i]->hw_value; +- +- wcn36xx_smd_update_scan_params(wcn, channels, req->n_channels); +- +- wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN); +- for (i = 0; i < req->n_channels; i++) { +- mutex_lock(&wcn->scan_lock); +- aborted = wcn->scan_aborted; +- mutex_unlock(&wcn->scan_lock); +- +- if (aborted) +- break; +- +- wcn->scan_freq = req->channels[i]->center_freq; +- wcn->scan_band = req->channels[i]->band; +- +- wcn36xx_smd_start_scan(wcn, req->channels[i]->hw_value); +- msleep(30); +- wcn36xx_smd_end_scan(wcn, req->channels[i]->hw_value); +- +- wcn->scan_freq = 0; ++ if (!get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { ++ /* fallback to mac80211 software scan */ ++ return 1; + } +- wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN); +- +- scan_info.aborted = aborted; +- ieee80211_scan_completed(wcn->hw, &scan_info); + +- mutex_lock(&wcn->scan_lock); +- wcn->scan_req = NULL; +- mutex_unlock(&wcn->scan_lock); +-} ++ /* For unknown reason, the hardware offloaded scan only works with ++ * 2.4Ghz channels, fallback to software scan in other cases. ++ */ ++ for (i = 0; i < hw_req->req.n_channels; i++) { ++ if (hw_req->req.channels[i]->band != NL80211_BAND_2GHZ) ++ return 1; ++ } + +-static int wcn36xx_hw_scan(struct ieee80211_hw *hw, +- struct ieee80211_vif *vif, +- struct ieee80211_scan_request *hw_req) +-{ +- struct wcn36xx *wcn = hw->priv; + mutex_lock(&wcn->scan_lock); + if (wcn->scan_req) { + mutex_unlock(&wcn->scan_lock); +@@ -674,12 +673,6 @@ static int wcn36xx_hw_scan(struct ieee80211_hw *hw, + + mutex_unlock(&wcn->scan_lock); + +- if (!get_feat_caps(wcn->fw_feat_caps, SCAN_OFFLOAD)) { +- /* legacy manual/sw scan */ +- schedule_work(&wcn->scan_work); +- return 0; +- } +- + return wcn36xx_smd_start_hw_scan(wcn, vif, &hw_req->req); + } + +@@ -696,16 +689,35 @@ static void wcn36xx_cancel_hw_scan(struct ieee80211_hw *hw, + /* ieee80211_scan_completed will be called on FW scan + * indication */ + wcn36xx_smd_stop_hw_scan(wcn); +- } else { +- struct cfg80211_scan_info scan_info = { +- .aborted = true, +- }; +- +- cancel_work_sync(&wcn->scan_work); +- ieee80211_scan_completed(wcn->hw, &scan_info); + } + } + ++static void wcn36xx_sw_scan_start(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, ++ const u8 *mac_addr) ++{ ++ struct wcn36xx *wcn = hw->priv; ++ struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); ++ ++ wcn->sw_scan = true; ++ wcn->sw_scan_vif = vif; ++ if (vif_priv->sta_assoc) ++ wcn->sw_scan_opchannel = WCN36XX_HW_CHANNEL(wcn); ++ else ++ wcn->sw_scan_opchannel = 0; ++} ++ ++static void wcn36xx_sw_scan_complete(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif) ++{ ++ struct wcn36xx *wcn = hw->priv; ++ ++ /* ensure that any scan session is finished */ ++ wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, wcn->sw_scan_vif); ++ wcn->sw_scan = false; ++ wcn->sw_scan_opchannel = 0; ++} ++ + static void wcn36xx_update_allowed_rates(struct ieee80211_sta *sta, + enum nl80211_band band) + { +@@ -1151,6 +1163,8 @@ static const struct ieee80211_ops wcn36xx_ops = { + .set_key = wcn36xx_set_key, + .hw_scan = wcn36xx_hw_scan, + .cancel_hw_scan = wcn36xx_cancel_hw_scan, ++ .sw_scan_start = wcn36xx_sw_scan_start, ++ .sw_scan_complete = wcn36xx_sw_scan_complete, + .bss_info_changed = wcn36xx_bss_info_changed, + .set_rts_threshold = wcn36xx_set_rts_threshold, + .sta_add = wcn36xx_sta_add, +@@ -1329,8 +1343,6 @@ static int wcn36xx_probe(struct platform_device *pdev) + goto out_wq; + } + +- INIT_WORK(&wcn->scan_work, wcn36xx_hw_scan_worker); +- + wcn->smd_channel = qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", wcn36xx_smd_rsp_process, hw); + if (IS_ERR(wcn->smd_channel)) { + wcn36xx_err("failed to open WLAN_CTRL channel\n"); +diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c +index 908cc6cf7b1a..5a565f119e5d 100644 +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -517,8 +517,10 @@ int wcn36xx_smd_stop(struct wcn36xx *wcn) + return ret; + } + +-int wcn36xx_smd_init_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode) ++int wcn36xx_smd_init_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode, ++ struct ieee80211_vif *vif) + { ++ struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); + struct wcn36xx_hal_init_scan_req_msg msg_body; + int ret; + +@@ -526,6 +528,13 @@ int wcn36xx_smd_init_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode) + INIT_HAL_MSG(msg_body, WCN36XX_HAL_INIT_SCAN_REQ); + + msg_body.mode = mode; ++ if (vif_priv->bss_index != WCN36XX_HAL_BSS_INVALID_IDX) { ++ /* Notify BSSID with null DATA packet */ ++ msg_body.frame_type = 2; ++ msg_body.notify = 1; ++ msg_body.scan_entry.bss_index[0] = vif_priv->bss_index; ++ msg_body.scan_entry.active_bss_count = 1; ++ } + + PREPARE_HAL_BUF(wcn->hal_buf, msg_body); + +@@ -607,8 +616,10 @@ int wcn36xx_smd_end_scan(struct wcn36xx *wcn, u8 scan_channel) + } + + int wcn36xx_smd_finish_scan(struct wcn36xx *wcn, +- enum wcn36xx_hal_sys_mode mode) ++ enum wcn36xx_hal_sys_mode mode, ++ struct ieee80211_vif *vif) + { ++ struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); + struct wcn36xx_hal_finish_scan_req_msg msg_body; + int ret; + +@@ -616,6 +627,14 @@ int wcn36xx_smd_finish_scan(struct wcn36xx *wcn, + INIT_HAL_MSG(msg_body, WCN36XX_HAL_FINISH_SCAN_REQ); + + msg_body.mode = mode; ++ msg_body.oper_channel = WCN36XX_HW_CHANNEL(wcn); ++ if (vif_priv->bss_index != WCN36XX_HAL_BSS_INVALID_IDX) { ++ /* Notify BSSID with null data packet */ ++ msg_body.notify = 1; ++ msg_body.frame_type = 2; ++ msg_body.scan_entry.bss_index[0] = vif_priv->bss_index; ++ msg_body.scan_entry.active_bss_count = 1; ++ } + + PREPARE_HAL_BUF(wcn->hal_buf, msg_body); + +diff --git a/drivers/net/wireless/ath/wcn36xx/smd.h b/drivers/net/wireless/ath/wcn36xx/smd.h +index 68c59df7a0ad..b1d8083d9d9d 100644 +--- a/drivers/net/wireless/ath/wcn36xx/smd.h ++++ b/drivers/net/wireless/ath/wcn36xx/smd.h +@@ -59,11 +59,13 @@ void wcn36xx_smd_close(struct wcn36xx *wcn); + int wcn36xx_smd_load_nv(struct wcn36xx *wcn); + int wcn36xx_smd_start(struct wcn36xx *wcn); + int wcn36xx_smd_stop(struct wcn36xx *wcn); +-int wcn36xx_smd_init_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode); + int wcn36xx_smd_start_scan(struct wcn36xx *wcn, u8 scan_channel); + int wcn36xx_smd_end_scan(struct wcn36xx *wcn, u8 scan_channel); +-int wcn36xx_smd_finish_scan(struct wcn36xx *wcn, +- enum wcn36xx_hal_sys_mode mode); ++int wcn36xx_smd_finish_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode, ++ struct ieee80211_vif *vif); ++int wcn36xx_smd_init_scan(struct wcn36xx *wcn, enum wcn36xx_hal_sys_mode mode, ++ struct ieee80211_vif *vif); ++ + int wcn36xx_smd_update_scan_params(struct wcn36xx *wcn, u8 *channels, size_t channel_count); + int wcn36xx_smd_start_hw_scan(struct wcn36xx *wcn, struct ieee80211_vif *vif, + struct cfg80211_scan_request *req); +diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c +index f5872e7dfb51..820505619f66 100644 +--- a/drivers/net/wireless/ath/wcn36xx/txrx.c ++++ b/drivers/net/wireless/ath/wcn36xx/txrx.c +@@ -144,15 +144,8 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + fc = __le16_to_cpu(hdr->frame_control); + sn = IEEE80211_SEQ_TO_SN(__le16_to_cpu(hdr->seq_ctrl)); + +- /* When scanning associate beacons to this */ +- if (ieee80211_is_beacon(hdr->frame_control) && wcn->scan_freq) { +- status.freq = wcn->scan_freq; +- status.band = wcn->scan_band; +- } else { +- status.freq = WCN36XX_CENTER_FREQ(wcn); +- status.band = WCN36XX_BAND(wcn); +- } +- ++ status.freq = WCN36XX_CENTER_FREQ(wcn); ++ status.band = WCN36XX_BAND(wcn); + status.mactime = 10; + status.signal = -get_rssi0(bd); + status.antenna = 1; +diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +index 2d89849c630b..3221fed15620 100644 +--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h ++++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +@@ -223,10 +223,10 @@ struct wcn36xx { + spinlock_t hal_ind_lock; + struct list_head hal_ind_queue; + +- struct work_struct scan_work; + struct cfg80211_scan_request *scan_req; +- int scan_freq; +- int scan_band; ++ bool sw_scan; ++ u8 sw_scan_opchannel; ++ struct ieee80211_vif *sw_scan_vif; + struct mutex scan_lock; + bool scan_aborted; + +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Fix-warning-due-to-bad-rate_idx.patch b/patches.suse/wcn36xx-Fix-warning-due-to-bad-rate_idx.patch new file mode 100644 index 0000000..4206838 --- /dev/null +++ b/patches.suse/wcn36xx-Fix-warning-due-to-bad-rate_idx.patch @@ -0,0 +1,54 @@ +From 6ea131acea98026f144f64fb2d8ea7dbb95d3049 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Sat, 29 Aug 2020 04:38:41 +0100 +Subject: [PATCH] wcn36xx: Fix warning due to bad rate_idx +Git-commit: 6ea131acea98026f144f64fb2d8ea7dbb95d3049 +References: git-fixes +Patch-mainline: v5.10-rc1 + +The rate_idx is the index of the bitrate in the supported rate table. +However the 5Ghz band has a smaller legacy bitrate table than 2.4Ghz +since it does not have the DSSS bitrates (1, 2, 5.5, 11). + +So in 5Ghz band the index should adjusted accrodingly (-4). + +Signed-off-by: Loic Poulain +[bod: Made sure fix is only applied if the rate_idx > n_bitrates] +Signed-off-by: Bryan O'Donoghue +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20200829033846.2167619-6-bryan.odonoghue@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/txrx.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c +index 90924f6106ee..19f5e306848b 100644 +--- a/drivers/net/wireless/ath/wcn36xx/txrx.c ++++ b/drivers/net/wireless/ath/wcn36xx/txrx.c +@@ -230,6 +230,7 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + const struct wcn36xx_rate *rate; + struct ieee80211_hdr *hdr; + struct wcn36xx_rx_bd *bd; ++ struct ieee80211_supported_band *sband; + u16 fc, sn; + + /* +@@ -270,6 +271,14 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + status.enc_flags = rate->encoding_flags; + status.bw = rate->bw; + status.rate_idx = rate->mcs_or_legacy_index; ++ sband = wcn->hw->wiphy->bands[status.band]; ++ ++ if (status.band == NL80211_BAND_5GHZ && ++ status.encoding == RX_ENC_LEGACY && ++ status.rate_idx >= sband->n_bitrates) { ++ /* no dsss rates in 5Ghz rates table */ ++ status.rate_idx -= 4; ++ } + } else { + status.encoding = 0; + status.bw = 0; +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Increase-number-of-TX-retries.patch b/patches.suse/wcn36xx-Increase-number-of-TX-retries.patch new file mode 100644 index 0000000..e55d51b --- /dev/null +++ b/patches.suse/wcn36xx-Increase-number-of-TX-retries.patch @@ -0,0 +1,39 @@ +From 1c20560607e6e142af76b9bd57e275b9053958a1 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Fri, 24 Jul 2020 12:20:49 +0200 +Subject: [PATCH] wcn36xx: Increase number of TX retries +Git-commit: 1c20560607e6e142af76b9bd57e275b9053958a1 +References: git-fixes +Patch-mainline: v5.10-rc1 + +Increase the short/long retry limit to 15 in order to impove TX +robustness in noisy/busy environment. 15 is the default value +defined in the downstream driver. Observed number of ack timeout +is reduced with this change. + +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1595586052-16081-4-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/smd.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c +index 59f9f53fc788..908cc6cf7b1a 100644 +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -45,8 +45,8 @@ static struct wcn36xx_cfg_val wcn36xx_cfg_vals[] = { + WCN36XX_CFG_VAL(MAX_MEDIUM_TIME, 6000), + WCN36XX_CFG_VAL(MAX_MPDUS_IN_AMPDU, 64), + WCN36XX_CFG_VAL(RTS_THRESHOLD, 2347), +- WCN36XX_CFG_VAL(SHORT_RETRY_LIMIT, 6), +- WCN36XX_CFG_VAL(LONG_RETRY_LIMIT, 6), ++ WCN36XX_CFG_VAL(SHORT_RETRY_LIMIT, 15), ++ WCN36XX_CFG_VAL(LONG_RETRY_LIMIT, 15), + WCN36XX_CFG_VAL(FRAGMENTATION_THRESHOLD, 8000), + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ZERO, 5), + WCN36XX_CFG_VAL(DYNAMIC_THRESHOLD_ONE, 10), +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Move-hal_buf-allocation-to-devm_kmalloc-in-p.patch b/patches.suse/wcn36xx-Move-hal_buf-allocation-to-devm_kmalloc-in-p.patch index d2b86a8..fa08012 100644 --- a/patches.suse/wcn36xx-Move-hal_buf-allocation-to-devm_kmalloc-in-p.patch +++ b/patches.suse/wcn36xx-Move-hal_buf-allocation-to-devm_kmalloc-in-p.patch @@ -63,7 +63,7 @@ Acked-by: Takashi Iwai out_free_dxe_ctl: wcn36xx_dxe_free_ctl_blks(wcn); out_free_dxe_pool: -@@ -374,8 +365,6 @@ static void wcn36xx_stop(struct ieee8021 +@@ -372,8 +363,6 @@ static void wcn36xx_stop(struct ieee8021 wcn36xx_dxe_free_mem_pools(wcn); wcn36xx_dxe_free_ctl_blks(wcn); @@ -71,8 +71,8 @@ Acked-by: Takashi Iwai - kfree(wcn->hal_buf); } - static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) -@@ -1322,6 +1311,12 @@ static int wcn36xx_probe(struct platform + static void wcn36xx_change_ps(struct wcn36xx *wcn, bool enable) +@@ -1335,6 +1324,12 @@ static int wcn36xx_probe(struct platform mutex_init(&wcn->hal_mutex); mutex_init(&wcn->scan_lock); diff --git a/patches.suse/wcn36xx-Specify-ieee80211_rx_status.nss.patch b/patches.suse/wcn36xx-Specify-ieee80211_rx_status.nss.patch new file mode 100644 index 0000000..0ce20ac --- /dev/null +++ b/patches.suse/wcn36xx-Specify-ieee80211_rx_status.nss.patch @@ -0,0 +1,38 @@ +From 1af05d43b9bef43ef71387b0d467c6c7aa6641a0 Mon Sep 17 00:00:00 2001 +From: Bryan O'Donoghue +Date: Sat, 29 Aug 2020 04:38:42 +0100 +Subject: [PATCH] wcn36xx: Specify ieee80211_rx_status.nss +Git-commit: 1af05d43b9bef43ef71387b0d467c6c7aa6641a0 +References: git-fixes +Patch-mainline: v5.10-rc1 + +Specify the number of spatial streams in ieee80211_rx_status. For non VHT +data-rates the wireless core doesn't care about this field, however for VHT +data-rates it does. + +Every version of wcn36xx has one spatial stream, so specify nss for +wcn3620, wcn3660 and wcn3680 now. + +Signed-off-by: Bryan O'Donoghue +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20200829033846.2167619-7-bryan.odonoghue@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/txrx.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c +index 19f5e306848b..1b831157ede1 100644 +--- a/drivers/net/wireless/ath/wcn36xx/txrx.c ++++ b/drivers/net/wireless/ath/wcn36xx/txrx.c +@@ -272,6 +272,7 @@ int wcn36xx_rx_skb(struct wcn36xx *wcn, struct sk_buff *skb) + status.bw = rate->bw; + status.rate_idx = rate->mcs_or_legacy_index; + sband = wcn->hw->wiphy->bands[status.band]; ++ status.nss = 1; + + if (status.band == NL80211_BAND_5GHZ && + status.encoding == RX_ENC_LEGACY && +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Use-kmemdup-instead-of-duplicating-it-in-wcn.patch b/patches.suse/wcn36xx-Use-kmemdup-instead-of-duplicating-it-in-wcn.patch new file mode 100644 index 0000000..a37b9e1 --- /dev/null +++ b/patches.suse/wcn36xx-Use-kmemdup-instead-of-duplicating-it-in-wcn.patch @@ -0,0 +1,39 @@ +From 3f96556f639e6cc507cc682406e83671f8e7c1ea Mon Sep 17 00:00:00 2001 +From: YueHaibing +Date: Mon, 6 Aug 2018 12:39:07 +0300 +Subject: [PATCH] wcn36xx: Use kmemdup instead of duplicating it in + wcn36xx_smd_process_ptt_msg_rsp +Git-commit: 3f96556f639e6cc507cc682406e83671f8e7c1ea +References: git-fixes +Patch-mainline: v4.20-rc1 + +Replace calls to kmalloc followed by a memcpy with a direct call to +kmemdup. + +Signed-off-by: YueHaibing +Signed-off-by: Kalle Valo +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/smd.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c +index 00098f24116d..1d2d698fb779 100644 +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -792,10 +792,10 @@ static int wcn36xx_smd_process_ptt_msg_rsp(void *buf, size_t len, + rsp->header.len - sizeof(rsp->ptt_msg_resp_status)); + + if (rsp->header.len > 0) { +- *p_ptt_rsp_msg = kmalloc(rsp->header.len, GFP_ATOMIC); ++ *p_ptt_rsp_msg = kmemdup(rsp->ptt_msg, rsp->header.len, ++ GFP_ATOMIC); + if (!*p_ptt_rsp_msg) + return -ENOMEM; +- memcpy(*p_ptt_rsp_msg, rsp->ptt_msg, rsp->header.len); + } + return ret; + } +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-Use-sequence-number-allocated-by-mac80211.patch b/patches.suse/wcn36xx-Use-sequence-number-allocated-by-mac80211.patch new file mode 100644 index 0000000..af87726 --- /dev/null +++ b/patches.suse/wcn36xx-Use-sequence-number-allocated-by-mac80211.patch @@ -0,0 +1,38 @@ +From 84aff52e4f57ed4702ec328b839941cd29551d49 Mon Sep 17 00:00:00 2001 +From: Loic Poulain +Date: Fri, 24 Jul 2020 12:20:52 +0200 +Subject: [PATCH] wcn36xx: Use sequence number allocated by mac80211 +Git-commit: 84aff52e4f57ed4702ec328b839941cd29551d49 +References: git-fixes +Patch-mainline: v5.10-rc1 + +Instead of using the firmware generated sequence number, use the one +already allocated by the mac80211 layer. This allows better control +of the sequence numbers and avoid to rely on same sequence for Data, +QOS Data and QOS Null Data packets. + +Signed-off-by: Loic Poulain +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1595586052-16081-7-git-send-email-loic.poulain@linaro.org +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/txrx.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c +index 52aff4c63587..f5872e7dfb51 100644 +--- a/drivers/net/wireless/ath/wcn36xx/txrx.c ++++ b/drivers/net/wireless/ath/wcn36xx/txrx.c +@@ -207,7 +207,8 @@ static void wcn36xx_set_tx_pdu(struct wcn36xx_tx_bd *bd, + bd->pdu.mpdu_header_off; + bd->pdu.mpdu_len = len; + bd->pdu.tid = tid; +- bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_DPU_QOS; ++ /* Use seq number generated by mac80211 */ ++ bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_HOST; + } + + static inline struct wcn36xx_vif *get_vif_by_addr(struct wcn36xx *wcn, +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-disable-HW_CONNECTION_MONITOR.patch b/patches.suse/wcn36xx-disable-HW_CONNECTION_MONITOR.patch new file mode 100644 index 0000000..d3d7d13 --- /dev/null +++ b/patches.suse/wcn36xx-disable-HW_CONNECTION_MONITOR.patch @@ -0,0 +1,38 @@ +From f998f9fcf9033b1e7f76bf4c17969b74be664dce Mon Sep 17 00:00:00 2001 +From: Eduardo Abinader +Date: Tue, 17 Dec 2019 15:12:47 +0100 +Subject: [PATCH] wcn36xx: disable HW_CONNECTION_MONITOR +Git-commit: f998f9fcf9033b1e7f76bf4c17969b74be664dce +References: git-fixes +Patch-mainline: v5.10-rc1 + +Whenever the signal stregth decays smoothly and physical connnection +is already gone and no deauth has arrived, the qcom soc is not +able to indicate neither WCN36XX_HAL_MISSED_BEACON_IND nor +WCN36XX_HAL_MISSED_BEACON_IND. It was noticed that such situation gets +even more reproducible, when the driver fails to enter bmps mode - which is +highly likely to occur. Thus, in order to provide proper disconnection +of the connected STA, let mac80211 handle it, instead of wcn3xx driver. + +Signed-off-by: Eduardo Abinader +Signed-off-by: Kalle Valo +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c +index c30fdd0cbf1e..e49c306e0eef 100644 +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -1169,7 +1169,6 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn) + + ieee80211_hw_set(wcn->hw, TIMING_BEACON_ONLY); + ieee80211_hw_set(wcn->hw, AMPDU_AGGREGATION); +- ieee80211_hw_set(wcn->hw, CONNECTION_MONITOR); + ieee80211_hw_set(wcn->hw, SUPPORTS_PS); + ieee80211_hw_set(wcn->hw, SIGNAL_DBM); + ieee80211_hw_set(wcn->hw, HAS_RATE_CONTROL); +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-ensure-pairing-of-init_scan-finish_scan-and-.patch b/patches.suse/wcn36xx-ensure-pairing-of-init_scan-finish_scan-and-.patch new file mode 100644 index 0000000..6ca63f3 --- /dev/null +++ b/patches.suse/wcn36xx-ensure-pairing-of-init_scan-finish_scan-and-.patch @@ -0,0 +1,191 @@ +From 8f1ba8b0ee2679f0b3d22d2a5c1bc70c436fd872 Mon Sep 17 00:00:00 2001 +From: Benjamin Li +Date: Wed, 27 Oct 2021 10:03:05 -0700 +Subject: [PATCH] wcn36xx: ensure pairing of init_scan/finish_scan and + start_scan/end_scan +Git-commit: 8f1ba8b0ee2679f0b3d22d2a5c1bc70c436fd872 +References: git-fixes +Patch-mainline: v5.17-rc1 + +An SMD capture from the downstream prima driver on WCN3680B shows the +following command sequence for connected scans: + +- init_scan_req + - start_scan_req, channel 1 + - end_scan_req, channel 1 + - start_scan_req, channel 2 + - ... + - end_scan_req, channel 3 +- finish_scan_req +- init_scan_req + - start_scan_req, channel 4 + - ... + - end_scan_req, channel 6 +- finish_scan_req +- ... + - end_scan_req, channel 165 +- finish_scan_req + +Upstream currently never calls wcn36xx_smd_end_scan, and in some cases[1] +still sends finish_scan_req twice in a row or before init_scan_req. A +typical connected scan looks like this: + +- init_scan_req + - start_scan_req, channel 1 +- finish_scan_req +- init_scan_req + - start_scan_req, channel 2 +- ... + - start_scan_req, channel 165 +- finish_scan_req +- finish_scan_req + +This patch cleans up scanning so that init/finish and start/end are always +paired together and correctly nested. + +- init_scan_req + - start_scan_req, channel 1 + - end_scan_req, channel 1 +- finish_scan_req +- init_scan_req + - start_scan_req, channel 2 + - end_scan_req, channel 2 +- ... + - start_scan_req, channel 165 + - end_scan_req, channel 165 +- finish_scan_req + +Note that upstream will not do batching of 3 active-probe scans before +returning to the operating channel, and this patch does not change that. +To match downstream in this aspect, adjust IEEE80211_PROBE_DELAY and/or +the 125ms max off-channel time in ieee80211_scan_state_decision. + +[1]: commit d195d7aac09b ("wcn36xx: Ensure finish scan is not requested +before start scan") addressed one case of finish_scan_req being sent +without a preceding init_scan_req (the case of the operating channel +coinciding with the first scan channel); two other cases are: +1) if SW scan is started and aborted immediately, without scanning any + channels, we send a finish_scan_req without ever sending init_scan_req, + and +2) as SW scan logic always returns us to the operating channel before + calling wcn36xx_sw_scan_complete, finish_scan_req is always sent twice + at the end of a SW scan + +Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware") +Signed-off-by: Benjamin Li +Tested-by: Bryan O'Donoghue +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20211027170306.555535-4-benl@squareup.com +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 34 +++++++++++++++++++++++------ + drivers/net/wireless/ath/wcn36xx/smd.c | 4 +++ + drivers/net/wireless/ath/wcn36xx/wcn36xx.h | 1 + 3 files changed, 32 insertions(+), 7 deletions(-) + +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -397,6 +397,7 @@ static void wcn36xx_change_opchannel(str + static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed) + { + struct wcn36xx *wcn = hw->priv; ++ int ret; + + wcn36xx_dbg(WCN36XX_DBG_MAC, "mac config changed 0x%08x\n", changed); + +@@ -412,17 +413,31 @@ static int wcn36xx_config(struct ieee802 + * want to receive/transmit regular data packets, then + * simply stop the scan session and exit PS mode. + */ +- wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, +- wcn->sw_scan_vif); +- wcn->sw_scan_channel = 0; ++ if (wcn->sw_scan_channel) ++ wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel); ++ if (wcn->sw_scan_init) { ++ wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, ++ wcn->sw_scan_vif); ++ } + } else if (wcn->sw_scan) { + /* A scan is ongoing, do not change the operating + * channel, but start a scan session on the channel. + */ +- wcn36xx_smd_init_scan(wcn, HAL_SYS_MODE_SCAN, +- wcn->sw_scan_vif); ++ if (wcn->sw_scan_channel) ++ wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel); ++ if (!wcn->sw_scan_init) { ++ /* This can fail if we are unable to notify the ++ * operating channel. ++ */ ++ ret = wcn36xx_smd_init_scan(wcn, ++ HAL_SYS_MODE_SCAN, ++ wcn->sw_scan_vif); ++ if (ret) { ++ mutex_unlock(&wcn->conf_mutex); ++ return -EIO; ++ } ++ } + wcn36xx_smd_start_scan(wcn, ch); +- wcn->sw_scan_channel = ch; + } else { + wcn36xx_change_opchannel(wcn, ch); + } +@@ -717,7 +732,12 @@ static void wcn36xx_sw_scan_complete(str + struct wcn36xx *wcn = hw->priv; + + /* ensure that any scan session is finished */ +- wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, wcn->sw_scan_vif); ++ if (wcn->sw_scan_channel) ++ wcn36xx_smd_end_scan(wcn, wcn->sw_scan_channel); ++ if (wcn->sw_scan_init) { ++ wcn36xx_smd_finish_scan(wcn, HAL_SYS_MODE_SCAN, ++ wcn->sw_scan_vif); ++ } + wcn->sw_scan = false; + wcn->sw_scan_opchannel = 0; + } +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -551,6 +551,7 @@ int wcn36xx_smd_init_scan(struct wcn36xx + wcn36xx_err("hal_init_scan response failed err=%d\n", ret); + goto out; + } ++ wcn->sw_scan_init = true; + out: + mutex_unlock(&wcn->hal_mutex); + return ret; +@@ -581,6 +582,7 @@ int wcn36xx_smd_start_scan(struct wcn36x + wcn36xx_err("hal_start_scan response failed err=%d\n", ret); + goto out; + } ++ wcn->sw_scan_channel = scan_channel; + out: + mutex_unlock(&wcn->hal_mutex); + return ret; +@@ -611,6 +613,7 @@ int wcn36xx_smd_end_scan(struct wcn36xx + wcn36xx_err("hal_end_scan response failed err=%d\n", ret); + goto out; + } ++ wcn->sw_scan_channel = 0; + out: + mutex_unlock(&wcn->hal_mutex); + return ret; +@@ -652,6 +655,7 @@ int wcn36xx_smd_finish_scan(struct wcn36 + wcn36xx_err("hal_finish_scan response failed err=%d\n", ret); + goto out; + } ++ wcn->sw_scan_init = false; + out: + mutex_unlock(&wcn->hal_mutex); + return ret; +--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h ++++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h +@@ -227,6 +227,7 @@ struct wcn36xx { + struct cfg80211_scan_request *scan_req; + bool sw_scan; + u8 sw_scan_opchannel; ++ bool sw_scan_init; + u8 sw_scan_channel; + struct ieee80211_vif *sw_scan_vif; + struct mutex scan_lock; diff --git a/patches.suse/wcn36xx-fix-spelling-mistake-to-too.patch b/patches.suse/wcn36xx-fix-spelling-mistake-to-too.patch new file mode 100644 index 0000000..2261be1 --- /dev/null +++ b/patches.suse/wcn36xx-fix-spelling-mistake-to-too.patch @@ -0,0 +1,33 @@ +From d7809bd9eae67b4252cbc4672431610227cbb729 Mon Sep 17 00:00:00 2001 +From: Colin Ian King +Date: Thu, 23 Jan 2020 00:51:17 +0000 +Subject: [PATCH] wcn36xx: fix spelling mistake "to" -> "too" +Git-commit: d7809bd9eae67b4252cbc4672431610227cbb729 +References: git-fixes +Patch-mainline: v5.10-rc1 + +There is a spelling mistake in a wcn36xx_err message. Fix it. + +Signed-off-by: Colin Ian King +Signed-off-by: Kalle Valo +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/smd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c +index 523550f94a3f..77269ac7f352 100644 +--- a/drivers/net/wireless/ath/wcn36xx/smd.c ++++ b/drivers/net/wireless/ath/wcn36xx/smd.c +@@ -1620,7 +1620,7 @@ int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct ieee80211_vif *vif, + msg_body.beacon_length6 = msg_body.beacon_length + 6; + + if (msg_body.beacon_length > BEACON_TEMPLATE_SIZE) { +- wcn36xx_err("Beacon is to big: beacon size=%d\n", ++ wcn36xx_err("Beacon is too big: beacon size=%d\n", + msg_body.beacon_length); + ret = -ENOMEM; + goto out; +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-fix-typo.patch b/patches.suse/wcn36xx-fix-typo.patch new file mode 100644 index 0000000..8b29a51 --- /dev/null +++ b/patches.suse/wcn36xx-fix-typo.patch @@ -0,0 +1,31 @@ +From 3c33a11a291303db4b96b5e39dfd54831937bfa5 Mon Sep 17 00:00:00 2001 +From: Eduardo Abinader +Date: Fri, 8 Nov 2019 11:10:46 +0200 +Subject: [PATCH] wcn36xx: fix typo +Git-commit: 3c33a11a291303db4b96b5e39dfd54831937bfa5 +References: git-fixes +Patch-mainline: v5.10-rc1 + +Signed-off-by: Eduardo Abinader +Signed-off-by: Kalle Valo +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/hal.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/hal.h b/drivers/net/wireless/ath/wcn36xx/hal.h +index 8abda2760e04..6ba0fd57c951 100644 +--- a/drivers/net/wireless/ath/wcn36xx/hal.h ++++ b/drivers/net/wireless/ath/wcn36xx/hal.h +@@ -2091,7 +2091,7 @@ struct wcn36xx_hal_set_bss_key_rsp_msg { + /* + * This is used configure the key information on a given station. + * When the sec_type is WEP40 or WEP104, the def_wep_idx is used to locate +- * a preconfigured key from a BSS the station assoicated with; otherwise ++ * a preconfigured key from a BSS the station associated with; otherwise + * a new key descriptor is created based on the key field. + */ + struct wcn36xx_hal_set_sta_key_req_msg { +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-remove-unecessary-return.patch b/patches.suse/wcn36xx-remove-unecessary-return.patch new file mode 100644 index 0000000..49b18eb --- /dev/null +++ b/patches.suse/wcn36xx-remove-unecessary-return.patch @@ -0,0 +1,31 @@ +From 6dea30b4fd548dd68e6a98da01ffeb50e7f99150 Mon Sep 17 00:00:00 2001 +From: Eduardo Abinader +Date: Wed, 30 Oct 2019 09:41:41 +0100 +Subject: [PATCH] wcn36xx: remove unecessary return +Git-commit: 6dea30b4fd548dd68e6a98da01ffeb50e7f99150 +References: git-fixes +Patch-mainline: v5.10-rc1 + +Signed-off-by: Eduardo Abinader +Signed-off-by: Kalle Valo +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/main.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c +index 79998a3ddb7a..dcae79c576bf 100644 +--- a/drivers/net/wireless/ath/wcn36xx/main.c ++++ b/drivers/net/wireless/ath/wcn36xx/main.c +@@ -935,8 +935,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw, + out: + + mutex_unlock(&wcn->conf_mutex); +- +- return; + } + + /* this is required when using IEEE80211_HW_HAS_RATE_CONTROL */ +-- +2.40.1 + diff --git a/patches.suse/wcn36xx-use-dma_zalloc_coherent-instead-of-allocator.patch b/patches.suse/wcn36xx-use-dma_zalloc_coherent-instead-of-allocator.patch new file mode 100644 index 0000000..1a69079 --- /dev/null +++ b/patches.suse/wcn36xx-use-dma_zalloc_coherent-instead-of-allocator.patch @@ -0,0 +1,76 @@ +From d410e28f3ae476e1572b8893c646ef44fae7bbbd Mon Sep 17 00:00:00 2001 +From: YueHaibing +Date: Mon, 6 Aug 2018 12:39:16 +0300 +Subject: [PATCH] wcn36xx: use dma_zalloc_coherent instead of allocator/memset +Git-commit: d410e28f3ae476e1572b8893c646ef44fae7bbbd +References: git-fixes +Patch-mainline: v4.20-rc1 + +Use dma_zalloc_coherent instead of dma_alloc_coherent +followed by memset 0. + +Signed-off-by: YueHaibing +Signed-off-by: Kalle Valo +Signed-off-by: Oliver Neukum +--- + drivers/net/wireless/ath/wcn36xx/dxe.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c +index 06cfe8d311f3..5ab3e31c9ffa 100644 +--- a/drivers/net/wireless/ath/wcn36xx/dxe.c ++++ b/drivers/net/wireless/ath/wcn36xx/dxe.c +@@ -174,13 +174,12 @@ static int wcn36xx_dxe_init_descs(struct device *dev, struct wcn36xx_dxe_ch *wcn + int i; + + size = wcn_ch->desc_num * sizeof(struct wcn36xx_dxe_desc); +- wcn_ch->cpu_addr = dma_alloc_coherent(dev, size, &wcn_ch->dma_addr, +- GFP_KERNEL); ++ wcn_ch->cpu_addr = dma_zalloc_coherent(dev, size, ++ &wcn_ch->dma_addr, ++ GFP_KERNEL); + if (!wcn_ch->cpu_addr) + return -ENOMEM; + +- memset(wcn_ch->cpu_addr, 0, size); +- + cur_dxe = (struct wcn36xx_dxe_desc *)wcn_ch->cpu_addr; + cur_ctl = wcn_ch->head_blk_ctl; + +@@ -628,13 +627,13 @@ int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn) + 16 - (WCN36XX_BD_CHUNK_SIZE % 8); + + s = wcn->mgmt_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_H; +- cpu_addr = dma_alloc_coherent(wcn->dev, s, &wcn->mgmt_mem_pool.phy_addr, +- GFP_KERNEL); ++ cpu_addr = dma_zalloc_coherent(wcn->dev, s, ++ &wcn->mgmt_mem_pool.phy_addr, ++ GFP_KERNEL); + if (!cpu_addr) + goto out_err; + + wcn->mgmt_mem_pool.virt_addr = cpu_addr; +- memset(cpu_addr, 0, s); + + /* Allocate BD headers for DATA frames */ + +@@ -643,13 +642,13 @@ int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn) + 16 - (WCN36XX_BD_CHUNK_SIZE % 8); + + s = wcn->data_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_L; +- cpu_addr = dma_alloc_coherent(wcn->dev, s, &wcn->data_mem_pool.phy_addr, +- GFP_KERNEL); ++ cpu_addr = dma_zalloc_coherent(wcn->dev, s, ++ &wcn->data_mem_pool.phy_addr, ++ GFP_KERNEL); + if (!cpu_addr) + goto out_err; + + wcn->data_mem_pool.virt_addr = cpu_addr; +- memset(cpu_addr, 0, s); + + return 0; + +-- +2.40.1 + diff --git a/series.conf b/series.conf index 6d6503d..175d0a7 100644 --- a/series.conf +++ b/series.conf @@ -42215,6 +42215,8 @@ patches.suse/ice-Add-support-for-dynamic-interrupt-moderation.patch patches.suse/ice-Fix-error-on-driver-remove.patch patches.suse/ath10k-fix-kernel-panic-by-moving-pci-flush-after-na.patch + patches.suse/wcn36xx-Use-kmemdup-instead-of-duplicating-it-in-wcn.patch + patches.suse/wcn36xx-use-dma_zalloc_coherent-instead-of-allocator.patch patches.suse/ath10k-skip-resetting-rx-filter-for-WCN3990.patch patches.suse/ath10k-schedule-hardware-restart-if-WMI-command-time.patch patches.suse/ath9k-fix-tx99-with-monitor-mode-interface.patch @@ -53815,6 +53817,7 @@ patches.suse/ath10k-fix-memory-leak-for-tpc_stats_final.patch patches.suse/ath10k-Correct-error-handling-of-dma_map_single.patch patches.suse/net-ath10k-Fix-a-NULL-ptr-deref-bug.patch + patches.suse/wcn36xx-remove-unecessary-return.patch patches.suse/0001-rt2800-remove-errornous-duplicate-condition.patch patches.suse/rtlwifi-fix-memory-leak-in-rtl92c_set_fw_rsvdpagepkt.patch patches.suse/rtlwifi-rtl8192de-Fix-missing-code-to-retrieve-RX-bu.patch @@ -53822,6 +53825,7 @@ patches.suse/rtlwifi-rtl8192de-Fix-missing-enable-interrupt-flag.patch patches.suse/iwlwifi-mvm-fix-unaligned-read-of-rx_pkt_status.patch patches.suse/ath10k-fix-get-invalid-tx-rate-for-Mesh-metric.patch + patches.suse/wcn36xx-fix-typo.patch patches.suse/s390-bpf-Wrap-JIT-macro-parameter-usages-in-parentheses.patch patches.suse/bpf-skmsg-fix-potential-psock-NULL-pointer-dereferen.patch patches.suse/mac80211-consider-QoS-Null-frames-for-STA_NULLFUNC_A.patch @@ -54906,6 +54910,7 @@ patches.suse/brcmfmac-Fix-memory-leak-in-brcmf_usbdev_qinit.patch patches.suse/orinoco-avoid-assertion-in-case-of-NULL-pointer.patch patches.suse/ath9k-fix-storage-endpoint-lookup.patch + patches.suse/wcn36xx-disable-HW_CONNECTION_MONITOR.patch patches.suse/net-ena-remove-set-but-not-used-variable-rx_ring.patch patches.suse/gianfar-Fix-TX-timestamping-with-a-stacked-DSA-drive.patch patches.suse/vmxnet3-Remove-always-false-conditional-statement.patch @@ -54923,6 +54928,7 @@ patches.suse/Revert-ath10k-fix-DMA-related-firmware-crashes-on-mu.patch patches.suse/ath10k-Correct-the-DMA-direction-for-management-tx-b.patch patches.suse/ar5523-Add-USB-ID-of-SMCWUSBT-G2-wireless-adapter.patch + patches.suse/wcn36xx-fix-spelling-mistake-to-too.patch patches.suse/bnxt_en-Remove-the-setting-of-dev_port.patch patches.suse/ALSA-control-remove-useless-assignment-in-.info-call.patch patches.suse/ALSA-usx2y-Adjust-indentation-in-snd_usX2Y_hwdep_dsp.patch @@ -58497,7 +58503,12 @@ patches.suse/brcmfmac-check-ndev-pointer.patch patches.suse/mwifiex-Do-not-use-GFP_KERNEL-in-atomic-context.patch patches.suse/ath10k-provide-survey-info-as-accumulated-data.patch + patches.suse/wcn36xx-Add-ieee80211-rx-status-rate-information.patch patches.suse/ath10k-check-idx-validity-in-__ath10k_htt_rx_ring_fi.patch + patches.suse/wcn36xx-Fix-multiple-AMPDU-sessions-support.patch + patches.suse/wcn36xx-Increase-number-of-TX-retries.patch + patches.suse/wcn36xx-Fix-TX-data-path.patch + patches.suse/wcn36xx-Use-sequence-number-allocated-by-mac80211.patch patches.suse/ath10k-start-recovery-process-when-payload-length-ex.patch patches.suse/ath6kl-prevent-potential-array-overflow-in-ath6kl_ad.patch patches.suse/ath9k_htc-Use-appropriate-rs_datalen-type.patch @@ -58511,6 +58522,10 @@ patches.suse/rtl8xxxu-prevent-potential-memory-leak.patch patches.suse/mwifiex-remove-function-pointer-check.patch patches.suse/brcmsmac-fix-memory-leak-in-wlc_phy_attach_lcnphy.patch + patches.suse/wcn36xx-Fix-software-driven-scan.patch + patches.suse/wcn36xx-Disable-bmps-when-encryption-is-disabled.patch + patches.suse/wcn36xx-Fix-warning-due-to-bad-rate_idx.patch + patches.suse/wcn36xx-Specify-ieee80211_rx_status.nss.patch patches.suse/gve-Get-and-set-Rx-copybreak-via-ethtool.patch patches.suse/gve-Add-stats-for-gve.patch patches.suse/gve-Use-dev_info-err-instead-of-netif_info-err.patch @@ -59147,6 +59162,7 @@ patches.suse/net-ena-use-xdp_return_frame-to-free-xdp-frames.patch patches.suse/net-ena-introduce-ndo_xdp_xmit-function-for-XDP_REDI.patch patches.suse/mac80211-don-t-set-set-TDLS-STA-bandwidth-wider-than.patch + patches.suse/adm8211-fix-error-return-code-in-adm8211_probe.patch patches.suse/mwifiex-Fix-possible-buffer-overflows-in-mwifiex_2.patch patches.suse/nfc-s3fwrn5-Release-the-nfc-firmware.patch patches.suse/ALSA-hda-Fix-regressions-on-clear-and-reconfig-sysfs.patch @@ -60474,6 +60490,7 @@ patches.suse/ibmvnic-queue-reset-work-in-system_long_wq.patch patches.suse/rtlwifi-8821ae-upgrade-PHY-and-RF-parameters.patch patches.suse/ipw2x00-potential-buffer-overflow-in-libipw_wx_set_e.patch + patches.suse/mwl8k-Fix-a-double-Free-in-mwl8k_probe_hw.patch patches.suse/msft-hv-2332-net-mana-Add-a-driver-for-Microsoft-Azure-Network-Ad.patch patches.suse/mac80211-clear-the-beacon-s-CRC-after-channel-switch.patch patches.suse/mac80211-bail-out-if-cipher-schemes-are-invalid.patch @@ -61436,6 +61453,7 @@ patches.suse/msft-hv-2430-net-mana-Move-NAPI-from-EQ-to-CQ.patch patches.suse/msft-hv-2431-net-mana-Add-support-for-EQ-sharing.patch patches.suse/msft-hv-2432-net-mana-Add-WARN_ON_ONCE-in-case-of-CQE-read-overfl.patch + patches.suse/wcn36xx-Ensure-finish-scan-is-not-requested-before-s.patch patches.suse/ath6kl-wmi-fix-an-error-code-in-ath6kl_wmi_sync_poin.patch patches.suse/bcma-Fix-memory-leak-for-internally-handled-cores.patch patches.suse/ipv4-make-exception-cache-less-predictible.patch @@ -61797,6 +61815,7 @@ patches.suse/gve-DQO-avoid-unused-variable-warnings.patch patches.suse/gve-Use-kvcalloc-instead-of-kvzalloc.patch patches.suse/Bluetooth-sco-Fix-lock_sock-blockage-by-memcpy_from_.patch + patches.suse/wcn36xx-Add-ability-for-wcn36xx_smd_dump_cmd_req-to-.patch patches.suse/ath10k-Fix-missing-frame-timestamp-for-beacon-probe-.patch patches.suse/msft-hv-2449-net-mana-Use-kcalloc-instead-of-kzalloc.patch patches.suse/msft-hv-2451-hv_netvsc-use-netif_is_bond_master-instead-of-open-c.patch @@ -61820,6 +61839,7 @@ patches.suse/libertas-Fix-possible-memory-leak-in-probe-and-disco.patch patches.suse/wcn36xx-Fix-HT40-capability-for-2Ghz-band.patch patches.suse/wcn36xx-add-proper-DMA-memory-barriers-in-rx-path.patch + patches.suse/wcn36xx-Channel-list-update-before-hardware-scan.patch patches.suse/ath10k-fix-control-message-timeout.patch patches.suse/ath6kl-fix-control-message-timeout.patch patches.suse/ath10k-fix-division-by-zero-in-send-path.patch @@ -62098,6 +62118,7 @@ patches.suse/media-saa7146-mxb-Fix-a-NULL-pointer-dereference-in-.patch patches.suse/Bluetooth-bfusb-fix-division-by-zero-in-send-path.patch patches.suse/msft-hv-2486-net-mana-Add-XDP-support.patch + patches.suse/wcn36xx-ensure-pairing-of-init_scan-finish_scan-and-.patch patches.suse/ibmvnic-Update-driver-return-codes.patch patches.suse/gve-Correct-order-of-processing-device-options.patch patches.suse/gve-Move-the-irq-db-indexes-out-of-the-ntfy-block-st.patch