]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge tag 'wireless-drivers-next-for-davem-2017-11-03' of git://git.kernel.org/pub...
authorDavid S. Miller <davem@davemloft.net>
Sat, 4 Nov 2017 09:07:50 +0000 (18:07 +0900)
committerDavid S. Miller <davem@davemloft.net>
Sat, 4 Nov 2017 09:07:50 +0000 (18:07 +0900)
Kalle Valo says:

====================
wireless-drivers-next patches for 4.15

Mostly fixes this time, but also few new features.

Major changes:

wil6210

* remove ssid debugfs file

rsi

* add WOWLAN support for suspend, hibernate and shutdown states

ath10k

* add support for CCMP-256, GCMP and GCMP-256 ciphers on hardware
  where it's supported (QCA99x0 and QCA4019)
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
MAINTAINERS
drivers/net/wireless/ath/ath10k/htt_rx.c
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/marvell/libertas/cfg.c

diff --combined MAINTAINERS
index d20c9a483c42e5cfaf93f1fa16209d7e512f2b41,a28f0aabed05d2be6d524e9479d96dddc49714ad..9729ebe4eb12e09f3e508624210cce4a080de2a0
@@@ -2713,7 -2713,6 +2713,7 @@@ L:      linux-kernel@vger.kernel.or
  S:    Supported
  F:    arch/x86/net/bpf_jit*
  F:    Documentation/networking/filter.txt
 +F:    Documentation/bpf/
  F:    include/linux/bpf*
  F:    include/linux/filter.h
  F:    include/uapi/linux/bpf*
@@@ -2898,7 -2897,6 +2898,7 @@@ F:      drivers/gpio/gpio-brcmstb.
  F:    Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.txt
  
  BROADCOM GENET ETHERNET DRIVER
 +M:    Doug Berger <opendmb@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -3422,7 -3420,7 +3422,7 @@@ F:      drivers/scsi/snic
  CISCO VIC ETHERNET NIC DRIVER
  M:    Christian Benvenuti <benve@cisco.com>
  M:    Govindarajulu Varadarajan <_govind@gmx.com>
 -M:    Neel Patel <neepatel@cisco.com>
 +M:    Parvi Kaustubhi <pkaustub@cisco.com>
  S:    Supported
  F:    drivers/net/ethernet/cisco/enic/
  
@@@ -5353,7 -5351,9 +5353,7 @@@ M:      "J. Bruce Fields" <bfields@fieldses.
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
  F:    include/linux/fcntl.h
 -F:    include/linux/fs.h
  F:    include/uapi/linux/fcntl.h
 -F:    include/uapi/linux/fs.h
  F:    fs/fcntl.c
  F:    fs/locks.c
  
@@@ -5362,8 -5362,6 +5362,8 @@@ M:      Alexander Viro <viro@zeniv.linux.org
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
  F:    fs/*
 +F:    include/linux/fs.h
 +F:    include/uapi/linux/fs.h
  
  FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    Riku Voipio <riku.voipio@iki.fi>
@@@ -6678,7 -6676,7 +6678,7 @@@ F:      include/net/ieee802154_netdev.
  F:    Documentation/networking/ieee802154.txt
  
  IFE PROTOCOL
 -M:    Yotam Gigi <yotamg@mellanox.com>
 +M:    Yotam Gigi <yotam.gi@gmail.com>
  M:    Jamal Hadi Salim <jhs@mojatatu.com>
  F:    net/ife
  F:    include/net/ife.h
@@@ -6740,7 -6738,7 +6740,7 @@@ S:      Maintaine
  F:    drivers/usb/atm/ueagle-atm.c
  
  IMGTEC ASCII LCD DRIVER
 -M:    Paul Burton <paul.burton@imgtec.com>
 +M:    Paul Burton <paul.burton@mips.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/auxdisplay/img-ascii-lcd.txt
  F:    drivers/auxdisplay/img-ascii-lcd.c
@@@ -7578,7 -7576,7 +7578,7 @@@ F:      arch/mips/include/asm/kvm
  F:    arch/mips/kvm/
  
  KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
 -M:    Alexander Graf <agraf@suse.com>
 +M:    Paul Mackerras <paulus@ozlabs.org>
  L:    kvm-ppc@vger.kernel.org
  W:    http://www.linux-kvm.org/
  T:    git git://github.com/agraf/linux-2.6.git
@@@ -8751,7 -8749,7 +8751,7 @@@ Q:      http://patchwork.ozlabs.org/project/
  F:    drivers/net/ethernet/mellanox/mlxsw/
  
  MELLANOX FIRMWARE FLASH LIBRARY (mlxfw)
 -M:    Yotam Gigi <yotamg@mellanox.com>
 +M:    mlxsw@mellanox.com
  L:    netdev@vger.kernel.org
  S:    Supported
  W:    http://www.mellanox.com
@@@ -9001,7 -8999,7 +9001,7 @@@ F:      Documentation/mips
  F:    arch/mips/
  
  MIPS BOSTON DEVELOPMENT BOARD
 -M:    Paul Burton <paul.burton@imgtec.com>
 +M:    Paul Burton <paul.burton@mips.com>
  L:    linux-mips@linux-mips.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/clock/img,boston-clock.txt
@@@ -9011,7 -9009,7 +9011,7 @@@ F:      drivers/clk/imgtec/clk-boston.
  F:    include/dt-bindings/clock/boston-clock.h
  
  MIPS GENERIC PLATFORM
 -M:    Paul Burton <paul.burton@imgtec.com>
 +M:    Paul Burton <paul.burton@mips.com>
  L:    linux-mips@linux-mips.org
  S:    Supported
  F:    arch/mips/generic/
@@@ -9221,6 -9219,7 +9221,6 @@@ F:      include/linux/isicom.
  MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
  M:    Bin Liu <b-liu@ti.com>
  L:    linux-usb@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
  F:    drivers/usb/musb/
  
@@@ -9416,7 -9415,6 +9416,7 @@@ M:      Florian Fainelli <f.fainelli@gmail.c
  S:    Maintained
  F:    net/dsa/
  F:    include/net/dsa.h
 +F:    include/linux/dsa/
  F:    drivers/net/dsa/
  
  NETWORKING [GENERAL]
@@@ -9438,7 -9436,6 +9438,7 @@@ F:      include/uapi/linux/net.
  F:    include/uapi/linux/netdevice.h
  F:    include/uapi/linux/net_namespace.h
  F:    tools/testing/selftests/net/
 +F:    lib/net_utils.c
  F:    lib/random32.c
  
  NETWORKING [IPSEC]
@@@ -10188,6 -10185,7 +10188,6 @@@ F:   Documentation/parport*.tx
  
  PARAVIRT_OPS INTERFACE
  M:    Juergen Gross <jgross@suse.com>
 -M:    Chris Wright <chrisw@sous-sol.org>
  M:    Alok Kataria <akataria@vmware.com>
  M:    Rusty Russell <rusty@rustcorp.com.au>
  L:    virtualization@lists.linux-foundation.org
@@@ -10567,8 -10565,6 +10567,8 @@@ M:   Peter Zijlstra <peterz@infradead.org
  M:    Ingo Molnar <mingo@redhat.com>
  M:    Arnaldo Carvalho de Melo <acme@kernel.org>
  R:    Alexander Shishkin <alexander.shishkin@linux.intel.com>
 +R:    Jiri Olsa <jolsa@redhat.com>
 +R:    Namhyung Kim <namhyung@kernel.org>
  L:    linux-kernel@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Supported
@@@ -10899,7 -10895,7 +10899,7 @@@ S:   Maintaine
  F:    drivers/block/ps3vram.c
  
  PSAMPLE PACKET SAMPLING SUPPORT:
 -M:    Yotam Gigi <yotamg@mellanox.com>
 +M:    Yotam Gigi <yotam.gi@gmail.com>
  S:    Maintained
  F:    net/psample
  F:    include/net/psample.h
@@@ -14569,7 -14565,6 +14569,6 @@@ L:   wil6210@qca.qualcomm.co
  S:    Supported
  W:    http://wireless.kernel.org/en/users/Drivers/wil6210
  F:    drivers/net/wireless/ath/wil6210/
- F:    include/uapi/linux/wil6210_uapi.h
  
  WIMAX STACK
  M:    Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
index 0aeeb233af780469fcc907ba5ee0bb53086d606a,f068376ec565f6afc3883c552673e0879e5b2de4..e31438541ee1defbcd9e19c73cf66a12f07316d3
@@@ -200,9 -200,9 +200,9 @@@ static void ath10k_htt_rx_msdu_buff_rep
        spin_unlock_bh(&htt->rx_ring.lock);
  }
  
- static void ath10k_htt_rx_ring_refill_retry(unsigned long arg)
+ static void ath10k_htt_rx_ring_refill_retry(struct timer_list *t)
  {
-       struct ath10k_htt *htt = (struct ath10k_htt *)arg;
+       struct ath10k_htt *htt = from_timer(htt, t, rx_ring.refill_retry_timer);
  
        ath10k_htt_rx_msdu_buff_replenish(htt);
  }
@@@ -507,7 -507,7 +507,7 @@@ int ath10k_htt_rx_alloc(struct ath10k_h
        *htt->rx_ring.alloc_idx.vaddr = 0;
  
        /* Initialize the Rx refill retry timer */
-       setup_timer(timer, ath10k_htt_rx_ring_refill_retry, (unsigned long)htt);
+       timer_setup(timer, ath10k_htt_rx_ring_refill_retry, 0);
  
        spin_lock_init(&htt->rx_ring.lock);
  
@@@ -550,11 -550,6 +550,11 @@@ static int ath10k_htt_rx_crypto_param_l
                return IEEE80211_TKIP_IV_LEN;
        case HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2:
                return IEEE80211_CCMP_HDR_LEN;
 +      case HTT_RX_MPDU_ENCRYPT_AES_CCM256_WPA2:
 +              return IEEE80211_CCMP_256_HDR_LEN;
 +      case HTT_RX_MPDU_ENCRYPT_AES_GCMP_WPA2:
 +      case HTT_RX_MPDU_ENCRYPT_AES_GCMP256_WPA2:
 +              return IEEE80211_GCMP_HDR_LEN;
        case HTT_RX_MPDU_ENCRYPT_WEP128:
        case HTT_RX_MPDU_ENCRYPT_WAPI:
                break;
@@@ -580,11 -575,6 +580,11 @@@ static int ath10k_htt_rx_crypto_tail_le
                return IEEE80211_TKIP_ICV_LEN;
        case HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2:
                return IEEE80211_CCMP_MIC_LEN;
 +      case HTT_RX_MPDU_ENCRYPT_AES_CCM256_WPA2:
 +              return IEEE80211_CCMP_256_MIC_LEN;
 +      case HTT_RX_MPDU_ENCRYPT_AES_GCMP_WPA2:
 +      case HTT_RX_MPDU_ENCRYPT_AES_GCMP256_WPA2:
 +              return IEEE80211_GCMP_MIC_LEN;
        case HTT_RX_MPDU_ENCRYPT_WEP128:
        case HTT_RX_MPDU_ENCRYPT_WAPI:
                break;
@@@ -1061,21 -1051,9 +1061,21 @@@ static void ath10k_htt_rx_h_undecap_raw
        hdr = (void *)msdu->data;
  
        /* Tail */
 -      if (status->flag & RX_FLAG_IV_STRIPPED)
 +      if (status->flag & RX_FLAG_IV_STRIPPED) {
                skb_trim(msdu, msdu->len -
                         ath10k_htt_rx_crypto_tail_len(ar, enctype));
 +      } else {
 +              /* MIC */
 +              if ((status->flag & RX_FLAG_MIC_STRIPPED) &&
 +                  enctype == HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2)
 +                      skb_trim(msdu, msdu->len - 8);
 +
 +              /* ICV */
 +              if (status->flag & RX_FLAG_ICV_STRIPPED &&
 +                  enctype != HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2)
 +                      skb_trim(msdu, msdu->len -
 +                               ath10k_htt_rx_crypto_tail_len(ar, enctype));
 +      }
  
        /* MMIC */
        if ((status->flag & RX_FLAG_MMIC_STRIPPED) &&
  static void ath10k_htt_rx_h_undecap_nwifi(struct ath10k *ar,
                                          struct sk_buff *msdu,
                                          struct ieee80211_rx_status *status,
 -                                        const u8 first_hdr[64])
 +                                        const u8 first_hdr[64],
 +                                        enum htt_rx_mpdu_encrypt_type enctype)
  {
        struct ieee80211_hdr *hdr;
        struct htt_rx_desc *rxd;
        u8 da[ETH_ALEN];
        u8 sa[ETH_ALEN];
        int l3_pad_bytes;
 +      int bytes_aligned = ar->hw_params.decap_align_bytes;
  
        /* Delivered decapped frame:
         * [nwifi 802.11 header] <-- replaced with 802.11 hdr
        /* push original 802.11 header */
        hdr = (struct ieee80211_hdr *)first_hdr;
        hdr_len = ieee80211_hdrlen(hdr->frame_control);
 +
 +      if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
 +              memcpy(skb_push(msdu,
 +                              ath10k_htt_rx_crypto_param_len(ar, enctype)),
 +                     (void *)hdr + round_up(hdr_len, bytes_aligned),
 +                      ath10k_htt_rx_crypto_param_len(ar, enctype));
 +      }
 +
        memcpy(skb_push(msdu, hdr_len), hdr, hdr_len);
  
        /* original 802.11 header has a different DA and in
@@@ -1203,7 -1171,6 +1203,7 @@@ static void ath10k_htt_rx_h_undecap_eth
        u8 sa[ETH_ALEN];
        int l3_pad_bytes;
        struct htt_rx_desc *rxd;
 +      int bytes_aligned = ar->hw_params.decap_align_bytes;
  
        /* Delivered decapped frame:
         * [eth header] <-- replaced with 802.11 hdr & rfc1042/llc
        /* push original 802.11 header */
        hdr = (struct ieee80211_hdr *)first_hdr;
        hdr_len = ieee80211_hdrlen(hdr->frame_control);
 +
 +      if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
 +              memcpy(skb_push(msdu,
 +                              ath10k_htt_rx_crypto_param_len(ar, enctype)),
 +                     (void *)hdr + round_up(hdr_len, bytes_aligned),
 +                      ath10k_htt_rx_crypto_param_len(ar, enctype));
 +      }
 +
        memcpy(skb_push(msdu, hdr_len), hdr, hdr_len);
  
        /* original 802.11 header has a different DA and in
  static void ath10k_htt_rx_h_undecap_snap(struct ath10k *ar,
                                         struct sk_buff *msdu,
                                         struct ieee80211_rx_status *status,
 -                                       const u8 first_hdr[64])
 +                                       const u8 first_hdr[64],
 +                                       enum htt_rx_mpdu_encrypt_type enctype)
  {
        struct ieee80211_hdr *hdr;
        size_t hdr_len;
        int l3_pad_bytes;
        struct htt_rx_desc *rxd;
 +      int bytes_aligned = ar->hw_params.decap_align_bytes;
  
        /* Delivered decapped frame:
         * [amsdu header] <-- replaced with 802.11 hdr
  
        hdr = (struct ieee80211_hdr *)first_hdr;
        hdr_len = ieee80211_hdrlen(hdr->frame_control);
 +
 +      if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
 +              memcpy(skb_push(msdu,
 +                              ath10k_htt_rx_crypto_param_len(ar, enctype)),
 +                     (void *)hdr + round_up(hdr_len, bytes_aligned),
 +                      ath10k_htt_rx_crypto_param_len(ar, enctype));
 +      }
 +
        memcpy(skb_push(msdu, hdr_len), hdr, hdr_len);
  }
  
@@@ -1318,15 -1267,13 +1318,15 @@@ static void ath10k_htt_rx_h_undecap(str
                                            is_decrypted);
                break;
        case RX_MSDU_DECAP_NATIVE_WIFI:
 -              ath10k_htt_rx_h_undecap_nwifi(ar, msdu, status, first_hdr);
 +              ath10k_htt_rx_h_undecap_nwifi(ar, msdu, status, first_hdr,
 +                                            enctype);
                break;
        case RX_MSDU_DECAP_ETHERNET2_DIX:
                ath10k_htt_rx_h_undecap_eth(ar, msdu, status, first_hdr, enctype);
                break;
        case RX_MSDU_DECAP_8023_SNAP_LLC:
 -              ath10k_htt_rx_h_undecap_snap(ar, msdu, status, first_hdr);
 +              ath10k_htt_rx_h_undecap_snap(ar, msdu, status, first_hdr,
 +                                           enctype);
                break;
        }
  }
@@@ -1369,8 -1316,7 +1369,8 @@@ static void ath10k_htt_rx_h_csum_offloa
  
  static void ath10k_htt_rx_h_mpdu(struct ath10k *ar,
                                 struct sk_buff_head *amsdu,
 -                               struct ieee80211_rx_status *status)
 +                               struct ieee80211_rx_status *status,
 +                               bool fill_crypt_header)
  {
        struct sk_buff *first;
        struct sk_buff *last;
        enum htt_rx_mpdu_encrypt_type enctype;
        u8 first_hdr[64];
        u8 *qos;
 -      size_t hdr_len;
        bool has_fcs_err;
        bool has_crypto_err;
        bool has_tkip_err;
         * decapped header. It'll be used for undecapping of each MSDU.
         */
        hdr = (void *)rxd->rx_hdr_status;
 -      hdr_len = ieee80211_hdrlen(hdr->frame_control);
 -      memcpy(first_hdr, hdr, hdr_len);
 +      memcpy(first_hdr, hdr, RX_HTT_HDR_STATUS_LEN);
  
        /* Each A-MSDU subframe will use the original header as the base and be
         * reported as a separate MSDU so strip the A-MSDU bit from QoS Ctl.
         */
        hdr = (void *)first_hdr;
 -      qos = ieee80211_get_qos_ctl(hdr);
 -      qos[0] &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
 +
 +      if (ieee80211_is_data_qos(hdr->frame_control)) {
 +              qos = ieee80211_get_qos_ctl(hdr);
 +              qos[0] &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
 +      }
  
        /* Some attention flags are valid only in the last MSDU. */
        last = skb_peek_tail(amsdu);
                status->flag |= RX_FLAG_DECRYPTED;
  
                if (likely(!is_mgmt))
 -                      status->flag |= RX_FLAG_IV_STRIPPED |
 -                                      RX_FLAG_MMIC_STRIPPED;
 -}
 +                      status->flag |= RX_FLAG_MMIC_STRIPPED;
 +
 +              if (fill_crypt_header)
 +                      status->flag |= RX_FLAG_MIC_STRIPPED |
 +                                      RX_FLAG_ICV_STRIPPED;
 +              else
 +                      status->flag |= RX_FLAG_IV_STRIPPED;
 +      }
  
        skb_queue_walk(amsdu, msdu) {
                ath10k_htt_rx_h_csum_offload(msdu);
                if (is_mgmt)
                        continue;
  
 +              if (fill_crypt_header)
 +                      continue;
 +
                hdr = (void *)msdu->data;
                hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED);
        }
@@@ -1497,9 -1434,6 +1497,9 @@@ static void ath10k_htt_rx_h_deliver(str
                                    struct ieee80211_rx_status *status)
  {
        struct sk_buff *msdu;
 +      struct sk_buff *first_subframe;
 +
 +      first_subframe = skb_peek(amsdu);
  
        while ((msdu = __skb_dequeue(amsdu))) {
                /* Setup per-MSDU flags */
                else
                        status->flag |= RX_FLAG_AMSDU_MORE;
  
 +              if (msdu == first_subframe) {
 +                      first_subframe = NULL;
 +                      status->flag &= ~RX_FLAG_ALLOW_SAME_PN;
 +              } else {
 +                      status->flag |= RX_FLAG_ALLOW_SAME_PN;
 +              }
 +
                ath10k_process_rx(ar, status, msdu);
        }
  }
@@@ -1657,7 -1584,7 +1657,7 @@@ static int ath10k_htt_rx_handle_amsdu(s
                ath10k_htt_rx_h_unchain(ar, &amsdu);
  
        ath10k_htt_rx_h_filter(ar, &amsdu, rx_status);
 -      ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status);
 +      ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status, true);
        ath10k_htt_rx_h_deliver(ar, &amsdu, rx_status);
  
        return num_msdus;
@@@ -1818,7 -1745,8 +1818,7 @@@ static void ath10k_htt_rx_delba(struct 
  }
  
  static int ath10k_htt_rx_extract_amsdu(struct sk_buff_head *list,
 -                                     struct sk_buff_head *amsdu,
 -                                     int budget_left)
 +                                     struct sk_buff_head *amsdu)
  {
        struct sk_buff *msdu;
        struct htt_rx_desc *rxd;
        if (WARN_ON(!skb_queue_empty(amsdu)))
                return -EINVAL;
  
 -      while ((msdu = __skb_dequeue(list)) && budget_left) {
 +      while ((msdu = __skb_dequeue(list))) {
                __skb_queue_tail(amsdu, msdu);
 -              budget_left--;
  
                rxd = (void *)msdu->data - sizeof(*rxd);
                if (rxd->msdu_end.common.info0 &
@@@ -1921,7 -1850,8 +1921,7 @@@ static int ath10k_htt_rx_h_rx_offload(s
        return num_msdu;
  }
  
 -static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb,
 -                                  int budget_left)
 +static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb)
  {
        struct ath10k_htt *htt = &ar->htt;
        struct htt_resp *resp = (void *)skb->data;
        if (offload)
                num_msdus = ath10k_htt_rx_h_rx_offload(ar, &list);
  
 -      while (!skb_queue_empty(&list) && budget_left) {
 +      while (!skb_queue_empty(&list)) {
                __skb_queue_head_init(&amsdu);
 -              ret = ath10k_htt_rx_extract_amsdu(&list, &amsdu, budget_left);
 +              ret = ath10k_htt_rx_extract_amsdu(&list, &amsdu);
                switch (ret) {
                case 0:
                        /* Note: The in-order indication may report interleaved
                         * should still give an idea about rx rate to the user.
                         */
                        num_msdus += skb_queue_len(&amsdu);
 -                      budget_left -= skb_queue_len(&amsdu);
                        ath10k_htt_rx_h_ppdu(ar, &amsdu, status, vdev_id);
                        ath10k_htt_rx_h_filter(ar, &amsdu, status);
 -                      ath10k_htt_rx_h_mpdu(ar, &amsdu, status);
 +                      ath10k_htt_rx_h_mpdu(ar, &amsdu, status, false);
                        ath10k_htt_rx_h_deliver(ar, &amsdu, status);
                        break;
                case -EAGAIN:
@@@ -2632,7 -2563,8 +2632,7 @@@ int ath10k_htt_txrx_compl_task(struct a
                }
  
                spin_lock_bh(&htt->rx_ring.lock);
 -              num_rx_msdus = ath10k_htt_rx_in_ord_ind(ar, skb,
 -                                                      (budget - quota));
 +              num_rx_msdus = ath10k_htt_rx_in_ord_ind(ar, skb);
                spin_unlock_bh(&htt->rx_ring.lock);
                if (num_rx_msdus < 0) {
                        resched_napi = true;
index b83f01d6e3ddd842e115a19266cb79d4dfcc6421,fc41308294890b5c62435429dc2bf71b1dd78755..71812a2dd513d3192a4ec2d2243da6726d0c5e5e
@@@ -812,6 -812,7 +812,6 @@@ static void wcn36xx_bss_info_changed(st
                        if (!sta) {
                                wcn36xx_err("sta %pM is not found\n",
                                              bss_conf->bssid);
 -                              rcu_read_unlock();
                                goto out;
                        }
                        sta_priv = wcn36xx_sta_to_priv(sta);
@@@ -1135,7 -1136,8 +1135,8 @@@ static int wcn36xx_init_ieee80211(struc
                BIT(NL80211_IFTYPE_MESH_POINT);
  
        wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz;
-       wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz;
+       if (wcn->rf_id != RF_IRIS_WCN3620)
+               wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz;
  
        wcn->hw->wiphy->max_scan_ssids = WCN36XX_MAX_SCAN_SSIDS;
        wcn->hw->wiphy->max_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN;
@@@ -1168,6 -1170,7 +1169,7 @@@ static int wcn36xx_platform_get_resourc
                                          struct platform_device *pdev)
  {
        struct device_node *mmio_node;
+       struct device_node *iris_node;
        struct resource *res;
        int index;
        int ret;
                goto unmap_ccu;
        }
  
+       /* External RF module */
+       iris_node = of_find_node_by_name(mmio_node, "iris");
+       if (iris_node) {
+               if (of_device_is_compatible(iris_node, "qcom,wcn3620"))
+                       wcn->rf_id = RF_IRIS_WCN3620;
+               of_node_put(iris_node);
+       }
        of_node_put(mmio_node);
        return 0;
  
index 9f3a7b512673596d10457e05ef69eb705c8c5f22,bb76707881cd4d8da94f28e6e9519ed4997aae50..f99031cfdf868e14509dee1db8e65c0ee099b4d0
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: GPL-2.0
  /*
   * Implement cfg80211 ("iw") support.
   *
@@@ -1699,9 -1698,6 +1699,6 @@@ static void lbs_join_post(struct lbs_pr
                                  0, GFP_KERNEL);
        cfg80211_put_bss(priv->wdev->wiphy, bss);
  
-       memcpy(priv->wdev->ssid, params->ssid, params->ssid_len);
-       priv->wdev->ssid_len = params->ssid_len;
        cfg80211_ibss_joined(priv->dev, bssid, params->chandef.chan,
                             GFP_KERNEL);