diff --git a/patch.sh b/patch.sh
index 87773041c2982d2d7b6db469655d3f79711a79ba..64ea90468ba0c641987384a881109440966a60ba 100644
--- a/patch.sh
+++ b/patch.sh
@@ -113,7 +113,7 @@ aufs () {
 	aufs_prefix="aufs5-"
 	#regenerate="enable"
 	if [ "x${regenerate}" = "xenable" ] ; then
-		KERNEL_REL=5.14
+		KERNEL_REL=5.16
 		wget https://raw.githubusercontent.com/sfjro/${aufs_prefix}standalone/aufs${KERNEL_REL}/${aufs_prefix}kbuild.patch
 		patch -p1 < ${aufs_prefix}kbuild.patch || aufs_fail
 		rm -rf ${aufs_prefix}kbuild.patch
@@ -154,7 +154,7 @@ aufs () {
 			cd -
 		fi
 		cd ./KERNEL/
-		KERNEL_REL=5.14
+		KERNEL_REL=5.16
 
 		cp -v ../${aufs_prefix}standalone/Documentation/ABI/testing/*aufs ./Documentation/ABI/testing/
 		mkdir -p ./Documentation/filesystems/aufs/
@@ -165,12 +165,19 @@ aufs () {
 
 		${git_bin} add .
 		${git_bin} commit -a -m 'merge: aufs' -m "https://github.com/sfjro/${aufs_prefix}standalone/commit/${aufs_hash}" -s
-		${git_bin} format-patch -5 -o ../patches/aufs/
+
+		wget https://raw.githubusercontent.com/sfjro/${aufs_prefix}standalone/aufs${KERNEL_REL}/rt.patch
+		patch -p1 < rt.patch || aufs_fail
+		rm -rf rt.patch
+		${git_bin} add .
+		${git_bin} commit -a -m 'merge: aufs-rt' -s
+
+		${git_bin} format-patch -6 -o ../patches/aufs/
 		echo "AUFS: https://github.com/sfjro/${aufs_prefix}standalone/commit/${aufs_hash}" > ../patches/git/AUFS
 
 		rm -rf ../${aufs_prefix}standalone/ || true
 
-		${git_bin} reset --hard HEAD~5
+		${git_bin} reset --hard HEAD~6
 
 		start_cleanup
 
@@ -179,9 +186,10 @@ aufs () {
 		${git} "${DIR}/patches/aufs/0003-merge-aufs-mmap.patch"
 		${git} "${DIR}/patches/aufs/0004-merge-aufs-standalone.patch"
 		${git} "${DIR}/patches/aufs/0005-merge-aufs.patch"
+		${git} "${DIR}/patches/aufs/0006-merge-aufs-rt.patch"
 
 		wdir="aufs"
-		number=5
+		number=6
 		cleanup
 	fi
 
@@ -442,6 +450,7 @@ beagleboard_dtbs () {
 
 		device="am335x-bone-uboot-univ.dtb" ; dtb_makefile_append
 		device="am335x-boneblack-uboot-univ.dtb" ; dtb_makefile_append
+		device="am335x-bonegreen-wireless-uboot-univ.dtb" ; dtb_makefile_append
 
 		${git_bin} add -f arch/arm/boot/dts/
 		${git_bin} add -f include/dt-bindings/
diff --git a/patches/aufs/0001-merge-aufs-kbuild.patch b/patches/aufs/0001-merge-aufs-kbuild.patch
index 2320fb1c2f75aa220e6207c46822a06dcf17e5c2..dd9eb52b30e6b9790de80e67c20e35d66ed9d9b7 100644
--- a/patches/aufs/0001-merge-aufs-kbuild.patch
+++ b/patches/aufs/0001-merge-aufs-kbuild.patch
@@ -1,7 +1,7 @@
-From de11f62218c9ffb120925e633deedf832f61d546 Mon Sep 17 00:00:00 2001
+From b054fb0bcb73960c9f800a4708803df83ffa5993 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Sep 2021 19:51:42 -0500
-Subject: [PATCH 1/5] merge: aufs-kbuild
+Date: Tue, 7 Dec 2021 18:55:51 -0600
+Subject: [PATCH 1/6] merge: aufs-kbuild
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
@@ -10,10 +10,10 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  2 files changed, 2 insertions(+)
 
 diff --git a/fs/Kconfig b/fs/Kconfig
-index a7749c126b8e..12fd57d4aa57 100644
+index a6313a969bc5..aca4b89d41a1 100644
 --- a/fs/Kconfig
 +++ b/fs/Kconfig
-@@ -307,6 +307,7 @@ source "fs/sysv/Kconfig"
+@@ -312,6 +312,7 @@ source "fs/sysv/Kconfig"
  source "fs/ufs/Kconfig"
  source "fs/erofs/Kconfig"
  source "fs/vboxsf/Kconfig"
@@ -22,10 +22,10 @@ index a7749c126b8e..12fd57d4aa57 100644
  endif # MISC_FILESYSTEMS
  
 diff --git a/fs/Makefile b/fs/Makefile
-index f98f3e691c37..5e9aaa284700 100644
+index 84c5e4cdfee5..b4fcdad8412e 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
-@@ -135,3 +135,4 @@ obj-$(CONFIG_EFIVAR_FS)		+= efivarfs/
+@@ -138,3 +138,4 @@ obj-$(CONFIG_EFIVAR_FS)		+= efivarfs/
  obj-$(CONFIG_EROFS_FS)		+= erofs/
  obj-$(CONFIG_VBOXSF_FS)		+= vboxsf/
  obj-$(CONFIG_ZONEFS_FS)		+= zonefs/
diff --git a/patches/aufs/0002-merge-aufs-base.patch b/patches/aufs/0002-merge-aufs-base.patch
index 5753369289ab3c1b7237aba1858f009ada2ea71a..3c121b1028da8e167f1c95c05f54d622591f2251 100644
--- a/patches/aufs/0002-merge-aufs-base.patch
+++ b/patches/aufs/0002-merge-aufs-base.patch
@@ -1,7 +1,7 @@
-From fd1e93e957c4edc0dd7acfde2fe4e59c935d198c Mon Sep 17 00:00:00 2001
+From 939ca297ec73208d6c0d6ce6cb6291e5fa2b7afb Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Sep 2021 19:51:43 -0500
-Subject: [PATCH 2/5] merge: aufs-base
+Date: Tue, 7 Dec 2021 18:55:52 -0600
+Subject: [PATCH 2/6] merge: aufs-base
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
@@ -9,7 +9,6 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  drivers/block/loop.c          | 18 ++++++++++++++++++
  fs/dcache.c                   |  2 +-
  fs/fcntl.c                    |  4 +++-
- fs/inode.c                    |  2 +-
  fs/namespace.c                |  6 ++++++
  fs/splice.c                   | 10 +++++-----
  fs/sync.c                     |  2 +-
@@ -18,13 +17,13 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  include/linux/mnt_namespace.h |  3 +++
  include/linux/splice.h        |  6 ++++++
  kernel/locking/lockdep.c      |  3 ++-
- 13 files changed, 65 insertions(+), 10 deletions(-)
+ 12 files changed, 64 insertions(+), 9 deletions(-)
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index d7b4f32875a9..6c2369610803 100644
+index 3b79fd441dde..3fb0a57f61b0 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -3089,6 +3089,19 @@ F:	include/uapi/linux/audit.h
+@@ -3122,6 +3122,19 @@ F:	include/uapi/linux/audit.h
  F:	kernel/audit*
  F:	lib/*audit.c
  
@@ -45,10 +44,10 @@ index d7b4f32875a9..6c2369610803 100644
  M:	Miguel Ojeda <ojeda@kernel.org>
  S:	Maintained
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index f0cdff0c5fbf..e65f941a4181 100644
+index dfc72a1f6500..c9d1ef703673 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
-@@ -810,6 +810,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
+@@ -798,6 +798,24 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
  	return error;
  }
  
@@ -87,7 +86,7 @@ index cf871a81f4fd..bc5095b734f5 100644
  {
  	struct dentry *this_parent;
 diff --git a/fs/fcntl.c b/fs/fcntl.c
-index f946bec8f1f1..a44da05bcb9a 100644
+index 9c6c6a3e2de5..02382fa9bd34 100644
 --- a/fs/fcntl.c
 +++ b/fs/fcntl.c
 @@ -33,7 +33,7 @@
@@ -108,24 +107,11 @@ index f946bec8f1f1..a44da05bcb9a 100644
  	if (error)
  		return error;
  
-diff --git a/fs/inode.c b/fs/inode.c
-index c93500d84264..f24d21236ad0 100644
---- a/fs/inode.c
-+++ b/fs/inode.c
-@@ -1778,7 +1778,7 @@ EXPORT_SYMBOL(generic_update_time);
-  * This does the actual work of updating an inodes time or version.  Must have
-  * had called mnt_want_write() before calling this.
-  */
--static int update_time(struct inode *inode, struct timespec64 *time, int flags)
-+int update_time(struct inode *inode, struct timespec64 *time, int flags)
- {
- 	if (inode->i_op->update_time)
- 		return inode->i_op->update_time(inode, time, flags);
 diff --git a/fs/namespace.c b/fs/namespace.c
-index 97adcb5ab5d5..4f543907c820 100644
+index 659a8f39c61a..128367073782 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -807,6 +807,12 @@ static inline int check_mnt(struct mount *mnt)
+@@ -808,6 +808,12 @@ static inline int check_mnt(struct mount *mnt)
  	return mnt->mnt_ns == current->nsproxy->mnt_ns;
  }
  
@@ -180,10 +166,10 @@ index 1373a610dc78..b7b5a0a0df6f 100644
  	if (wait)
  		sync_inodes_sb(sb);
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 640574294216..ffeed3ccd2d6 100644
+index 56eba723477e..e60d8ad85400 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -1335,6 +1335,7 @@ extern void fasync_free(struct fasync_struct *);
+@@ -1381,6 +1381,7 @@ extern void fasync_free(struct fasync_struct *);
  /* can be called from interrupts */
  extern void kill_fasync(struct fasync_struct **, int, int);
  
@@ -191,7 +177,7 @@ index 640574294216..ffeed3ccd2d6 100644
  extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
  extern int f_setown(struct file *filp, unsigned long arg, int force);
  extern void f_delown(struct file *filp);
-@@ -2043,6 +2044,7 @@ struct file_operations {
+@@ -2092,6 +2093,7 @@ struct file_operations {
  	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
  	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
  	int (*check_flags)(int);
@@ -199,7 +185,7 @@ index 640574294216..ffeed3ccd2d6 100644
  	int (*flock) (struct file *, int, struct file_lock *);
  	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
  	ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
-@@ -2564,6 +2566,7 @@ extern int current_umask(void);
+@@ -2615,6 +2617,7 @@ extern int current_umask(void);
  extern void ihold(struct inode * inode);
  extern void iput(struct inode *);
  extern int generic_update_time(struct inode *, struct timespec64 *, int);
@@ -207,7 +193,7 @@ index 640574294216..ffeed3ccd2d6 100644
  
  /* /sys/fs */
  extern struct kobject *fs_kobj;
-@@ -2810,6 +2813,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb)
+@@ -2778,6 +2781,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb)
  }
  
  void emergency_thaw_all(void);
@@ -216,7 +202,7 @@ index 640574294216..ffeed3ccd2d6 100644
  extern const struct file_operations def_blk_fops;
  extern const struct file_operations def_chr_fops;
 diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
-index 5cf387813754..59b65e1a9e85 100644
+index 9fe165beb0f9..e47f7e15eeaf 100644
 --- a/include/linux/lockdep.h
 +++ b/include/linux/lockdep.h
 @@ -248,6 +248,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock,
@@ -264,7 +250,7 @@ index a55179fd60fc..8e21c53cf883 100644
 +			 unsigned int flags);
  #endif
 diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
-index bf1c00c881e4..e0aaf34974df 100644
+index d624231eab2b..eff2ca26e6c5 100644
 --- a/kernel/locking/lockdep.c
 +++ b/kernel/locking/lockdep.c
 @@ -189,7 +189,7 @@ static
diff --git a/patches/aufs/0003-merge-aufs-mmap.patch b/patches/aufs/0003-merge-aufs-mmap.patch
index ee7c782b6688596b739d6578b0243cfdf0fba6e3..d758eba9d364535f557eae0e60b2c3ff4a1eb0e2 100644
--- a/patches/aufs/0003-merge-aufs-mmap.patch
+++ b/patches/aufs/0003-merge-aufs-mmap.patch
@@ -1,7 +1,7 @@
-From 94247fd160ced8d7a371a0515becbc5b42ce9b30 Mon Sep 17 00:00:00 2001
+From 9f963b09c6f29f6f96d254ed98865a8ee667424b Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Sep 2021 19:51:43 -0500
-Subject: [PATCH 3/5] merge: aufs-mmap
+Date: Tue, 7 Dec 2021 18:55:53 -0600
+Subject: [PATCH 3/6] merge: aufs-mmap
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
@@ -21,10 +21,10 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  create mode 100644 mm/prfile.c
 
 diff --git a/fs/proc/base.c b/fs/proc/base.c
-index e5b5f7709d48..4394d8c1bdad 100644
+index 1f394095eb88..93f2479ef319 100644
 --- a/fs/proc/base.c
 +++ b/fs/proc/base.c
-@@ -2183,7 +2183,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -2189,7 +2189,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path)
  	rc = -ENOENT;
  	vma = find_exact_vma(mm, vm_start, vm_end);
  	if (vma && vma->vm_file) {
@@ -50,7 +50,7 @@ index 13452b32e2bd..38acccfef9d4 100644
  		ino = inode->i_ino;
  	}
 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index eb97468dfe4c..570f1003a7dc 100644
+index cf25be3e0321..70af1c25ffa2 100644
 --- a/fs/proc/task_mmu.c
 +++ b/fs/proc/task_mmu.c
 @@ -280,7 +280,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
@@ -65,7 +65,7 @@ index eb97468dfe4c..570f1003a7dc 100644
  		dev = inode->i_sb->s_dev;
  		ino = inode->i_ino;
  		pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
-@@ -1866,7 +1869,7 @@ static int show_numa_map(struct seq_file *m, void *v)
+@@ -1865,7 +1868,7 @@ static int show_numa_map(struct seq_file *m, void *v)
  	struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
  	struct vm_area_struct *vma = v;
  	struct numa_maps *md = &numa_priv->md;
@@ -91,10 +91,10 @@ index a6d21fc0033c..02c2de31196e 100644
  		ino = inode->i_ino;
  		pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
 diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 7ca22e6e694a..c7c40fd7f65a 100644
+index 73a52aba448f..5dd42acf0707 100644
 --- a/include/linux/mm.h
 +++ b/include/linux/mm.h
-@@ -1805,6 +1805,28 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
+@@ -1806,6 +1806,28 @@ static inline void unmap_shared_mapping_range(struct address_space *mapping,
  	unmap_mapping_range(mapping, holebegin, holelen, 0);
  }
  
@@ -124,10 +124,10 @@ index 7ca22e6e694a..c7c40fd7f65a 100644
  		void *buf, int len, unsigned int gup_flags);
  extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
-index 52bbd2b7cb46..aeb888d44805 100644
+index 7f8ee09c711f..3a9a798a4ae1 100644
 --- a/include/linux/mm_types.h
 +++ b/include/linux/mm_types.h
-@@ -286,6 +286,7 @@ struct vm_region {
+@@ -294,6 +294,7 @@ struct vm_region {
  	unsigned long	vm_top;		/* region allocated to here */
  	unsigned long	vm_pgoff;	/* the offset in vm_file corresponding to vm_start */
  	struct file	*vm_file;	/* the backing file or NULL */
@@ -135,7 +135,7 @@ index 52bbd2b7cb46..aeb888d44805 100644
  
  	int		vm_usage;	/* region usage count (access under nommu_region_sem) */
  	bool		vm_icache_flushed : 1; /* true if the icache has been flushed for
-@@ -365,6 +366,7 @@ struct vm_area_struct {
+@@ -373,6 +374,7 @@ struct vm_area_struct {
  	unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZE
  					   units */
  	struct file * vm_file;		/* File we map to (can be NULL). */
@@ -144,20 +144,20 @@ index 52bbd2b7cb46..aeb888d44805 100644
  
  #ifdef CONFIG_SWAP
 diff --git a/kernel/fork.c b/kernel/fork.c
-index 44f4c2d83763..dc1b528f962c 100644
+index 10885c649ca4..f3a9cd12011b 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
-@@ -559,7 +559,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
- 			struct inode *inode = file_inode(file);
+@@ -573,7 +573,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
+ 		if (file) {
  			struct address_space *mapping = file->f_mapping;
  
 -			get_file(file);
 +			vma_get_file(tmp);
- 			if (tmp->vm_flags & VM_DENYWRITE)
- 				put_write_access(inode);
  			i_mmap_lock_write(mapping);
+ 			if (tmp->vm_flags & VM_SHARED)
+ 				mapping_allow_writable(mapping);
 diff --git a/mm/Makefile b/mm/Makefile
-index e3436741d539..0d1dc7789d64 100644
+index fc60a40ce954..c715b0138237 100644
 --- a/mm/Makefile
 +++ b/mm/Makefile
 @@ -52,7 +52,7 @@ obj-y			:= filemap.o mempool.o oom_kill.o fadvise.o \
@@ -170,10 +170,10 @@ index e3436741d539..0d1dc7789d64 100644
  # Give 'page_alloc' its own module-parameter namespace
  page-alloc-y := page_alloc.o
 diff --git a/mm/filemap.c b/mm/filemap.c
-index d1458ecf2f51..6ab6b7d72466 100644
+index 82a17c35eb96..348e22067abd 100644
 --- a/mm/filemap.c
 +++ b/mm/filemap.c
-@@ -3240,7 +3240,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
+@@ -3349,7 +3349,7 @@ vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
  	vm_fault_t ret = VM_FAULT_LOCKED;
  
  	sb_start_pagefault(mapping->host->i_sb);
@@ -183,10 +183,10 @@ index d1458ecf2f51..6ab6b7d72466 100644
  	if (page->mapping != mapping) {
  		unlock_page(page);
 diff --git a/mm/mmap.c b/mm/mmap.c
-index ca54d36d203a..43a69a77914f 100644
+index 88dcc5c25225..6c276614ca96 100644
 --- a/mm/mmap.c
 +++ b/mm/mmap.c
-@@ -185,7 +185,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
+@@ -183,7 +183,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
  	if (vma->vm_ops && vma->vm_ops->close)
  		vma->vm_ops->close(vma);
  	if (vma->vm_file)
@@ -195,7 +195,7 @@ index ca54d36d203a..43a69a77914f 100644
  	mpol_put(vma_policy(vma));
  	vm_area_free(vma);
  	return next;
-@@ -955,7 +955,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
+@@ -952,7 +952,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
  	if (remove_next) {
  		if (file) {
  			uprobe_munmap(next, next->vm_start, next->vm_end);
@@ -204,7 +204,7 @@ index ca54d36d203a..43a69a77914f 100644
  		}
  		if (next->anon_vma)
  			anon_vma_merge(vma, next);
-@@ -1898,7 +1898,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
+@@ -1873,7 +1873,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
  	return addr;
  
  unmap_and_free_vma:
@@ -213,7 +213,7 @@ index ca54d36d203a..43a69a77914f 100644
  	vma->vm_file = NULL;
  
  	/* Undo any partial mapping done by a device driver. */
-@@ -2758,7 +2758,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2731,7 +2731,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
  		goto out_free_mpol;
  
  	if (new->vm_file)
@@ -222,7 +222,7 @@ index ca54d36d203a..43a69a77914f 100644
  
  	if (new->vm_ops && new->vm_ops->open)
  		new->vm_ops->open(new);
-@@ -2777,7 +2777,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2750,7 +2750,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
  	if (new->vm_ops && new->vm_ops->close)
  		new->vm_ops->close(new);
  	if (new->vm_file)
@@ -231,7 +231,7 @@ index ca54d36d203a..43a69a77914f 100644
  	unlink_anon_vmas(new);
   out_free_mpol:
  	mpol_put(vma_policy(new));
-@@ -2972,7 +2972,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -2945,7 +2945,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
  	struct vm_area_struct *vma;
  	unsigned long populate = 0;
  	unsigned long ret = -EINVAL;
@@ -240,7 +240,7 @@ index ca54d36d203a..43a69a77914f 100644
  
  	pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.rst.\n",
  		     current->comm, current->pid);
-@@ -3031,10 +3031,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -3001,10 +3001,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
  	if (vma->vm_flags & VM_LOCKED)
  		flags |= MAP_LOCKED;
  
@@ -269,7 +269,7 @@ index ca54d36d203a..43a69a77914f 100644
  out:
  	mmap_write_unlock(mm);
  	if (populate)
-@@ -3315,7 +3332,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+@@ -3285,7 +3302,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
  		if (anon_vma_clone(new_vma, vma))
  			goto out_free_mempol;
  		if (new_vma->vm_file)
@@ -279,7 +279,7 @@ index ca54d36d203a..43a69a77914f 100644
  			new_vma->vm_ops->open(new_vma);
  		vma_link(mm, new_vma, prev, rb_link, rb_parent);
 diff --git a/mm/nommu.c b/mm/nommu.c
-index 3a93d4054810..501a874fedcb 100644
+index 02d2427b8f9e..a7419302ab4e 100644
 --- a/mm/nommu.c
 +++ b/mm/nommu.c
 @@ -523,7 +523,7 @@ static void __put_nommu_region(struct vm_region *region)
@@ -300,7 +300,7 @@ index 3a93d4054810..501a874fedcb 100644
  	put_nommu_region(vma->vm_region);
  	vm_area_free(vma);
  }
-@@ -1178,7 +1178,7 @@ unsigned long do_mmap(struct file *file,
+@@ -1175,7 +1175,7 @@ unsigned long do_mmap(struct file *file,
  					goto error_just_free;
  				}
  			}
@@ -309,7 +309,7 @@ index 3a93d4054810..501a874fedcb 100644
  			kmem_cache_free(vm_region_jar, region);
  			region = pregion;
  			result = start;
-@@ -1255,10 +1255,10 @@ unsigned long do_mmap(struct file *file,
+@@ -1252,10 +1252,10 @@ unsigned long do_mmap(struct file *file,
  	up_write(&nommu_region_sem);
  error:
  	if (region->vm_file)
diff --git a/patches/aufs/0004-merge-aufs-standalone.patch b/patches/aufs/0004-merge-aufs-standalone.patch
index 0ca41792244168317b43adcff66fe681de21406b..d453be5c568df5af8008ef17a921479d5abb54e0 100644
--- a/patches/aufs/0004-merge-aufs-standalone.patch
+++ b/patches/aufs/0004-merge-aufs-standalone.patch
@@ -1,7 +1,7 @@
-From 53e4cead539121b4500290934c76ab24532d2c70 Mon Sep 17 00:00:00 2001
+From e692487023d95676033236c49210a34961e69a3a Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Sep 2021 19:51:44 -0500
-Subject: [PATCH 4/5] merge: aufs-standalone
+Date: Tue, 7 Dec 2021 18:55:53 -0600
+Subject: [PATCH 4/6] merge: aufs-standalone
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
@@ -9,7 +9,6 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/exec.c                | 1 +
  fs/fcntl.c               | 1 +
  fs/file_table.c          | 2 ++
- fs/inode.c               | 1 +
  fs/namespace.c           | 3 +++
  fs/notify/group.c        | 1 +
  fs/open.c                | 1 +
@@ -20,7 +19,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  kernel/locking/lockdep.c | 1 +
  kernel/task_work.c       | 1 +
  security/security.c      | 8 ++++++++
- 15 files changed, 28 insertions(+)
+ 14 files changed, 27 insertions(+)
 
 diff --git a/fs/dcache.c b/fs/dcache.c
 index bc5095b734f5..9508bd57a3bc 100644
@@ -43,7 +42,7 @@ index bc5095b734f5..9508bd57a3bc 100644
  /**
   * d_ancestor - search for an ancestor
 diff --git a/fs/exec.c b/fs/exec.c
-index 38f63451b928..7710637ed0bc 100644
+index ac7b51b51f38..52a8be4ebc1e 100644
 --- a/fs/exec.c
 +++ b/fs/exec.c
 @@ -111,6 +111,7 @@ bool path_noexec(const struct path *path)
@@ -55,7 +54,7 @@ index 38f63451b928..7710637ed0bc 100644
  #ifdef CONFIG_USELIB
  /*
 diff --git a/fs/fcntl.c b/fs/fcntl.c
-index a44da05bcb9a..a9cf3ad53292 100644
+index 02382fa9bd34..3418c60b9014 100644
 --- a/fs/fcntl.c
 +++ b/fs/fcntl.c
 @@ -86,6 +86,7 @@ int setfl(int fd, struct file *filp, unsigned long arg)
@@ -86,23 +85,11 @@ index 45437f8e1003..786af52904fc 100644
  
  void __init files_init(void)
  {
-diff --git a/fs/inode.c b/fs/inode.c
-index f24d21236ad0..78de5b5dc084 100644
---- a/fs/inode.c
-+++ b/fs/inode.c
-@@ -1784,6 +1784,7 @@ int update_time(struct inode *inode, struct timespec64 *time, int flags)
- 		return inode->i_op->update_time(inode, time, flags);
- 	return generic_update_time(inode, time, flags);
- }
-+EXPORT_SYMBOL_GPL(update_time);
- 
- /**
-  *	atime_needs_update	-	update the access time
 diff --git a/fs/namespace.c b/fs/namespace.c
-index 4f543907c820..74d756a79cb7 100644
+index 128367073782..db9936562011 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -438,6 +438,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
+@@ -439,6 +439,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
  	mnt_dec_writers(real_mount(mnt));
  	preempt_enable();
  }
@@ -110,7 +97,7 @@ index 4f543907c820..74d756a79cb7 100644
  
  /**
   * mnt_drop_write - give up write access to a mount
-@@ -812,6 +813,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
+@@ -813,6 +814,7 @@ int is_current_mnt_ns(struct vfsmount *mnt)
  {
  	return check_mnt(real_mount(mnt));
  }
@@ -118,7 +105,7 @@ index 4f543907c820..74d756a79cb7 100644
  
  /*
   * vfsmount lock must be held for write
-@@ -2018,6 +2020,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -2011,6 +2013,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
  	}
  	return 0;
  }
@@ -139,7 +126,7 @@ index fb89c351295d..460ad19c2570 100644
  /*
   * Drop a reference to a group.  Free it if it's through.
 diff --git a/fs/open.c b/fs/open.c
-index 94bef26ff1b6..33412587d76d 100644
+index e0df1536eb69..81b2d7c83add 100644
 --- a/fs/open.c
 +++ b/fs/open.c
 @@ -65,6 +65,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry,
@@ -151,10 +138,10 @@ index 94bef26ff1b6..33412587d76d 100644
  long vfs_truncate(const struct path *path, loff_t length)
  {
 diff --git a/fs/read_write.c b/fs/read_write.c
-index 9db7adf160d2..8dc93a57a933 100644
+index af057c57bdc6..76017f8331fb 100644
 --- a/fs/read_write.c
 +++ b/fs/read_write.c
-@@ -503,6 +503,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+@@ -492,6 +492,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
  	inc_syscr(current);
  	return ret;
  }
@@ -162,7 +149,7 @@ index 9db7adf160d2..8dc93a57a933 100644
  
  static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
  {
-@@ -613,6 +614,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
+@@ -602,6 +603,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
  	file_end_write(file);
  	return ret;
  }
@@ -215,7 +202,7 @@ index 5c8c5175b385..ff7e9ff774b7 100644
  ssize_t
  __vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name,
 diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
-index e0aaf34974df..d7b737731d4e 100644
+index eff2ca26e6c5..0627584f7872 100644
 --- a/kernel/locking/lockdep.c
 +++ b/kernel/locking/lockdep.c
 @@ -210,6 +210,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock)
@@ -236,7 +223,7 @@ index 1698fbe6f0e1..081b05acadf8 100644
  }
 +EXPORT_SYMBOL_GPL(task_work_run);
 diff --git a/security/security.c b/security/security.c
-index 9ffa9e9c5c55..83b533a3fb8e 100644
+index 67264cb08fb3..0d78065d71fe 100644
 --- a/security/security.c
 +++ b/security/security.c
 @@ -1147,6 +1147,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry)
diff --git a/patches/aufs/0005-merge-aufs.patch b/patches/aufs/0005-merge-aufs.patch
index 88c4589080d8282078f42b1b65a10f2b097b471d..1b7d0f9ddcaef2a1361e7dea4064b03e342afad2 100644
--- a/patches/aufs/0005-merge-aufs.patch
+++ b/patches/aufs/0005-merge-aufs.patch
@@ -1,9 +1,9 @@
-From 587fd015482e13f3a2ddf7278e60824e8b6ad53a Mon Sep 17 00:00:00 2001
+From 7bdddf954953eaf17f986d7fd012513cd7dae554 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Sep 2021 19:51:45 -0500
-Subject: [PATCH 5/5] merge: aufs
+Date: Tue, 7 Dec 2021 18:55:54 -0600
+Subject: [PATCH 5/6] merge: aufs
 
-https://github.com/sfjro/aufs5-standalone/commit/03a3ee3199ae847b9e5ac7596900c64fc17cfd5a
+https://github.com/sfjro/aufs5-standalone/commit/fcc56866b84d43fd03d9e1d91d52f40e8a9d5335
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
  Documentation/ABI/testing/debugfs-aufs        |   55 +
@@ -29,24 +29,24 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/aufs/branch.c                              | 1427 ++++++++++++
  fs/aufs/branch.h                              |  375 ++++
  fs/aufs/conf.mk                               |   40 +
- fs/aufs/cpup.c                                | 1457 +++++++++++++
+ fs/aufs/cpup.c                                | 1459 +++++++++++++
  fs/aufs/cpup.h                                |  100 +
  fs/aufs/dbgaufs.c                             |  526 +++++
  fs/aufs/dbgaufs.h                             |   53 +
  fs/aufs/dcsub.c                               |  225 ++
  fs/aufs/dcsub.h                               |  137 ++
- fs/aufs/debug.c                               |  441 ++++
+ fs/aufs/debug.c                               |  444 ++++
  fs/aufs/debug.h                               |  226 ++
- fs/aufs/dentry.c                              | 1160 ++++++++++
+ fs/aufs/dentry.c                              | 1169 ++++++++++
  fs/aufs/dentry.h                              |  269 +++
  fs/aufs/dinfo.c                               |  554 +++++
  fs/aufs/dir.c                                 |  765 +++++++
  fs/aufs/dir.h                                 |  134 ++
- fs/aufs/dirren.c                              | 1316 +++++++++++
+ fs/aufs/dirren.c                              | 1315 +++++++++++
  fs/aufs/dirren.h                              |  140 ++
  fs/aufs/dynop.c                               |  368 ++++
  fs/aufs/dynop.h                               |   77 +
- fs/aufs/export.c                              |  837 +++++++
+ fs/aufs/export.c                              |  831 +++++++
  fs/aufs/f_op.c                                |  771 +++++++
  fs/aufs/fhsm.c                                |  427 ++++
  fs/aufs/file.c                                |  863 ++++++++
@@ -59,8 +59,8 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/aufs/hnotify.c                             |  715 ++++++
  fs/aufs/i_op.c                                | 1513 +++++++++++++
  fs/aufs/i_op_add.c                            |  941 ++++++++
- fs/aufs/i_op_del.c                            |  515 +++++
- fs/aufs/i_op_ren.c                            | 1251 +++++++++++
+ fs/aufs/i_op_del.c                            |  522 +++++
+ fs/aufs/i_op_ren.c                            | 1257 +++++++++++
  fs/aufs/iinfo.c                               |  286 +++
  fs/aufs/inode.c                               |  531 +++++
  fs/aufs/inode.h                               |  705 ++++++
@@ -76,7 +76,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/aufs/opts.h                                |  225 ++
  fs/aufs/plink.c                               |  516 +++++
  fs/aufs/poll.c                                |   51 +
- fs/aufs/posix_acl.c                           |  106 +
+ fs/aufs/posix_acl.c                           |  111 +
  fs/aufs/procfs.c                              |  170 ++
  fs/aufs/rdu.c                                 |  384 ++++
  fs/aufs/rwsem.h                               |   85 +
@@ -88,17 +88,17 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/aufs/sysfs.c                               |  374 ++++
  fs/aufs/sysrq.c                               |  149 ++
  fs/aufs/vdir.c                                |  896 ++++++++
- fs/aufs/vfsub.c                               |  916 ++++++++
+ fs/aufs/vfsub.c                               |  919 ++++++++
  fs/aufs/vfsub.h                               |  358 +++
  fs/aufs/wbr_policy.c                          |  830 +++++++
- fs/aufs/whout.c                               | 1070 +++++++++
+ fs/aufs/whout.c                               | 1072 +++++++++
  fs/aufs/whout.h                               |   87 +
  fs/aufs/wkq.c                                 |  372 ++++
  fs/aufs/wkq.h                                 |   89 +
  fs/aufs/xattr.c                               |  368 ++++
- fs/aufs/xino.c                                | 1925 +++++++++++++++++
+ fs/aufs/xino.c                                | 1926 +++++++++++++++++
  include/uapi/linux/aufs_type.h                |  452 ++++
- 92 files changed, 37816 insertions(+)
+ 92 files changed, 37847 insertions(+)
  create mode 100644 Documentation/ABI/testing/debugfs-aufs
  create mode 100644 Documentation/ABI/testing/sysfs-aufs
  create mode 100644 Documentation/filesystems/aufs/README
@@ -4306,10 +4306,10 @@ index 000000000000..12782f8e0f38
 +-include ${srctree}/${src}/conf_priv.mk
 diff --git a/fs/aufs/cpup.c b/fs/aufs/cpup.c
 new file mode 100644
-index 000000000000..dbaa01a55904
+index 000000000000..5b8b6b25200e
 --- /dev/null
 +++ b/fs/aufs/cpup.c
-@@ -0,0 +1,1457 @@
+@@ -0,0 +1,1459 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -5057,11 +5057,13 @@ index 000000000000..dbaa01a55904
 +{
 +	int err;
 +	struct dentry *dentry, *h_dentry, *h_parent, *parent;
++	struct path h_ppath;
 +	struct inode *h_dir;
 +	aufs_bindex_t bdst;
 +
 +	dentry = cpg->dentry;
 +	bdst = cpg->bdst;
++	h_ppath.mnt = au_sbr_mnt(dentry->d_sb, bdst);
 +	h_dentry = au_h_dptr(dentry, bdst);
 +	if (!au_ftest_cpup(cpg->flags, OVERWRITE)) {
 +		dget(h_dentry);
@@ -5073,9 +5075,9 @@ index 000000000000..dbaa01a55904
 +	} else {
 +		err = 0;
 +		parent = dget_parent(dentry);
-+		h_parent = au_h_dptr(parent, bdst);
++		h_ppath.dentry = au_h_dptr(parent, bdst);
 +		dput(parent);
-+		h_path->dentry = vfsub_lkup_one(&dentry->d_name, h_parent);
++		h_path->dentry = vfsub_lkup_one(&dentry->d_name, &h_ppath);
 +		if (IS_ERR(h_path->dentry))
 +			err = PTR_ERR(h_path->dentry);
 +	}
@@ -6840,10 +6842,10 @@ index 000000000000..1fde5f6aec5c
 +#endif /* __AUFS_DCSUB_H__ */
 diff --git a/fs/aufs/debug.c b/fs/aufs/debug.c
 new file mode 100644
-index 000000000000..f7fa23c1a9bc
+index 000000000000..3394083eadd7
 --- /dev/null
 +++ b/fs/aufs/debug.c
-@@ -0,0 +1,441 @@
+@@ -0,0 +1,444 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -7229,7 +7231,10 @@ index 000000000000..f7fa23c1a9bc
 +			AuDbgDentry(dentry);
 +			AuDbgInode(inode);
 +			au_debug_off();
-+			BUG();
++			if (au_test_fuse(h_inode->i_sb))
++				WARN_ON_ONCE(1);
++			else
++				BUG();
 +		}
 +	}
 +}
@@ -7519,10 +7524,10 @@ index 000000000000..4ff77fb633ec
 +#endif /* __AUFS_DEBUG_H__ */
 diff --git a/fs/aufs/dentry.c b/fs/aufs/dentry.c
 new file mode 100644
-index 000000000000..4b63daab7220
+index 000000000000..1bae481ab105
 --- /dev/null
 +++ b/fs/aufs/dentry.c
-@@ -0,0 +1,1160 @@
+@@ -0,0 +1,1169 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -7561,6 +7566,7 @@ index 000000000000..4b63daab7220
 +	struct inode *h_inode;
 +	struct au_branch *br;
 +	struct user_namespace *h_userns;
++	struct path h_path;
 +	int wh_found, opq;
 +	unsigned char wh_able;
 +	const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG);
@@ -7569,10 +7575,12 @@ index 000000000000..4b63daab7220
 +
 +	wh_found = 0;
 +	br = au_sbr(dentry->d_sb, bindex);
++	h_path.dentry = h_parent;
++	h_path.mnt = au_br_mnt(br);
 +	h_userns = au_br_userns(br);
 +	wh_able = !!au_br_whable(br->br_perm);
 +	if (wh_able)
-+		wh_found = au_wh_test(h_userns, h_parent, &args->whname,
++		wh_found = au_wh_test(h_userns, &h_path, &args->whname,
 +				      ignore_perm);
 +	h_dentry = ERR_PTR(wh_found);
 +	if (!wh_found)
@@ -7588,9 +7596,9 @@ index 000000000000..4b63daab7220
 +
 +real_lookup:
 +	if (!ignore_perm)
-+		h_dentry = vfsub_lkup_one(args->name, h_parent);
++		h_dentry = vfsub_lkup_one(args->name, &h_path);
 +	else
-+		h_dentry = au_sio_lkup_one(h_userns, args->name, h_parent);
++		h_dentry = au_sio_lkup_one(h_userns, args->name, &h_path);
 +	if (IS_ERR(h_dentry)) {
 +		if (PTR_ERR(h_dentry) == -ENAMETOOLONG
 +		    && !allow_neg)
@@ -7624,8 +7632,9 @@ index 000000000000..4b63daab7220
 +	    || (d_really_is_positive(dentry) && !d_is_dir(dentry)))
 +		goto out; /* success */
 +
++	h_path.dentry = h_dentry;
 +	inode_lock_shared_nested(h_inode, AuLsc_I_CHILD);
-+	opq = au_diropq_test(h_userns, h_dentry);
++	opq = au_diropq_test(h_userns, &h_path);
 +	inode_unlock_shared(h_inode);
 +	if (opq > 0)
 +		au_set_dbdiropq(dentry, bindex);
@@ -7771,18 +7780,18 @@ index 000000000000..4b63daab7220
 +}
 +
 +struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name,
-+			       struct dentry *parent)
++			       struct path *ppath)
 +{
 +	struct dentry *dentry;
 +	int wkq_err;
 +
-+	if (!au_test_h_perm_sio(userns, d_inode(parent), MAY_EXEC))
-+		dentry = vfsub_lkup_one(name, parent);
++	if (!au_test_h_perm_sio(userns, d_inode(ppath->dentry), MAY_EXEC))
++		dentry = vfsub_lkup_one(name, ppath);
 +	else {
 +		struct vfsub_lkup_one_args args = {
 +			.errp	= &dentry,
 +			.name	= name,
-+			.parent	= parent
++			.ppath	= ppath
 +		};
 +
 +		wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args);
@@ -7799,18 +7808,20 @@ index 000000000000..4b63daab7220
 +int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh)
 +{
 +	int err;
-+	struct dentry *parent, *h_parent, *h_dentry;
++	struct dentry *parent, *h_dentry;
 +	struct au_branch *br;
 +	struct user_namespace *h_userns;
++	struct path h_ppath;
 +
 +	parent = dget_parent(dentry);
-+	h_parent = au_h_dptr(parent, bindex);
 +	br = au_sbr(dentry->d_sb, bindex);
++	h_ppath.dentry = au_h_dptr(parent, bindex);
++	h_ppath.mnt = au_br_mnt(br);
 +	h_userns = au_br_userns(br);
 +	if (wh)
-+		h_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name);
++		h_dentry = au_whtmp_lkup(h_ppath.dentry, br, &dentry->d_name);
 +	else
-+		h_dentry = au_sio_lkup_one(h_userns, &dentry->d_name, h_parent);
++		h_dentry = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath);
 +	err = PTR_ERR(h_dentry);
 +	if (IS_ERR(h_dentry))
 +		goto out;
@@ -7885,6 +7896,7 @@ index 000000000000..4b63daab7220
 +	struct inode *h_inode;
 +	struct dentry *h_d;
 +	struct super_block *h_sb;
++	struct path h_ppath;
 +
 +	err = 0;
 +	memset(&ia, -1, sizeof(ia));
@@ -7899,7 +7911,9 @@ index 000000000000..4b63daab7220
 +		goto out;
 +
 +	/* main purpose is namei.c:cached_lookup() and d_revalidate */
-+	h_d = vfsub_lkup_one(&h_dentry->d_name, h_parent);
++	h_ppath.dentry = h_parent;
++	h_ppath.mnt = au_br_mnt(br);
++	h_d = vfsub_lkup_one(&h_dentry->d_name, &h_ppath);
 +	err = PTR_ERR(h_d);
 +	if (IS_ERR(h_d))
 +		goto out;
@@ -8685,7 +8699,7 @@ index 000000000000..4b63daab7220
 +};
 diff --git a/fs/aufs/dentry.h b/fs/aufs/dentry.h
 new file mode 100644
-index 000000000000..a1df828fd132
+index 000000000000..26d1332d269b
 --- /dev/null
 +++ b/fs/aufs/dentry.h
 @@ -0,0 +1,269 @@
@@ -8765,7 +8779,7 @@ index 000000000000..a1df828fd132
 +extern const struct dentry_operations aufs_dop, aufs_dop_noreval;
 +struct au_branch;
 +struct dentry *au_sio_lkup_one(struct user_namespace *userns, struct qstr *name,
-+			       struct dentry *parent);
++			       struct path *ppath);
 +int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir,
 +		struct dentry *h_parent, struct au_branch *br);
 +
@@ -10431,10 +10445,10 @@ index 000000000000..7a6e004307e9
 +#endif /* __AUFS_DIR_H__ */
 diff --git a/fs/aufs/dirren.c b/fs/aufs/dirren.c
 new file mode 100644
-index 000000000000..42f590603c91
+index 000000000000..341b706f5e13
 --- /dev/null
 +++ b/fs/aufs/dirren.c
-@@ -0,0 +1,1316 @@
+@@ -0,0 +1,1315 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2017-2021 Junjiro R. Okajima
@@ -10700,11 +10714,11 @@ index 000000000000..42f590603c91
 +		dir = d_inode(path->dentry);
 +		inode_lock_nested(dir, AuLsc_I_CHILD);
 +	}
-+	hinopath.dentry = vfsub_lkup_one(&hinoname, path->dentry);
++	hinopath.mnt = path->mnt;
++	hinopath.dentry = vfsub_lkup_one(&hinoname, (struct path *)path);
 +	err = PTR_ERR(hinopath.dentry);
 +	if (IS_ERR(hinopath.dentry))
 +		goto out_unlock;
-+	hinopath.mnt = path->mnt;
 +
 +	err = 0;
 +	flags = O_RDONLY;
@@ -11056,7 +11070,7 @@ index 000000000000..42f590603c91
 +	AuDebugOn(elm
 +		  && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm)));
 +
-+	infopath.dentry = vfsub_lookup_one_len(w->whname, w->h_ppath.dentry,
++	infopath.dentry = vfsub_lookup_one_len(w->whname, &w->h_ppath,
 +					       w->whnamelen);
 +	AuTraceErrPtr(infopath.dentry);
 +	if (IS_ERR(infopath.dentry)) {
@@ -11440,8 +11454,7 @@ index 000000000000..42f590603c91
 +	unlocked = 0;
 +	h_dir = d_inode(h_ppath->dentry);
 +	inode_lock_shared_nested(h_dir, AuLsc_I_PARENT);
-+	infopath.dentry = vfsub_lookup_one_len(whname, h_ppath->dentry,
-+					       whnamelen);
++	infopath.dentry = vfsub_lookup_one_len(whname, h_ppath, whnamelen);
 +	if (IS_ERR(infopath.dentry)) {
 +		drinfo = (void *)infopath.dentry;
 +		goto out;
@@ -12356,10 +12369,10 @@ index 000000000000..a86b106b2a13
 +#endif /* __AUFS_DYNOP_H__ */
 diff --git a/fs/aufs/export.c b/fs/aufs/export.c
 new file mode 100644
-index 000000000000..abd0897101bf
+index 000000000000..e28bceb7386a
 --- /dev/null
 +++ b/fs/aufs/export.c
-@@ -0,0 +1,837 @@
+@@ -0,0 +1,831 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -12768,7 +12781,7 @@ index 000000000000..abd0897101bf
 +
 +	/* do not call vfsub_lkup_one() */
 +	dir = d_inode(parent);
-+	dentry = vfsub_lookup_one_len_unlocked(arg.name, parent, arg.namelen);
++	dentry = vfsub_lookup_one_len_unlocked(arg.name, path, arg.namelen);
 +	AuTraceErrPtr(dentry);
 +	if (IS_ERR(dentry))
 +		goto out_name;
@@ -13156,14 +13169,8 @@ index 000000000000..abd0897101bf
 +	f = h_inode->i_sb->s_export_op->commit_metadata;
 +	if (f)
 +		err = f(h_inode);
-+	else {
-+		struct writeback_control wbc = {
-+			.sync_mode	= WB_SYNC_ALL,
-+			.nr_to_write	= 0 /* metadata only */
-+		};
-+
-+		err = sync_inode(h_inode, &wbc);
-+	}
++	else
++		err = sync_inode_metadata(h_inode, /*wait*/1);
 +
 +	au_cpup_attr_timesizes(inode);
 +	ii_write_unlock(inode);
@@ -19806,10 +19813,10 @@ index 000000000000..5c512f3403e2
 +}
 diff --git a/fs/aufs/i_op_del.c b/fs/aufs/i_op_del.c
 new file mode 100644
-index 000000000000..a11987581548
+index 000000000000..b7b5a4f69e98
 --- /dev/null
 +++ b/fs/aufs/i_op_del.c
-@@ -0,0 +1,515 @@
+@@ -0,0 +1,522 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -19906,6 +19913,9 @@ index 000000000000..a11987581548
 +	umode_t h_mode;
 +	struct dentry *h_dentry, *h_latest;
 +	struct inode *h_inode;
++	struct path h_ppath;
++	struct super_block *sb;
++	struct au_branch *br;
 +	struct user_namespace *h_userns;
 +
 +	h_dentry = au_h_dptr(dentry, bindex);
@@ -19944,13 +19954,17 @@ index 000000000000..a11987581548
 +	 * let's try heavy test.
 +	 */
 +	err = -EACCES;
-+	h_userns = au_sbr_userns(dentry->d_sb, bindex);
-+	if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)
++	sb = dentry->d_sb;
++	br = au_sbr(sb, bindex);
++	h_userns = au_br_userns(br);
++	if (unlikely(!au_opt_test(au_mntflags(sb), DIRPERM1)
 +		     && au_test_h_perm(h_userns, d_inode(h_parent),
 +				       MAY_EXEC | MAY_WRITE)))
 +		goto out;
 +
-+	h_latest = au_sio_lkup_one(h_userns, &dentry->d_name, h_parent);
++	h_ppath.dentry = h_parent;
++	h_ppath.mnt = au_br_mnt(br);
++	h_latest = au_sio_lkup_one(h_userns, &dentry->d_name, &h_ppath);
 +	err = -EIO;
 +	if (IS_ERR(h_latest))
 +		goto out;
@@ -20327,10 +20341,10 @@ index 000000000000..a11987581548
 +}
 diff --git a/fs/aufs/i_op_ren.c b/fs/aufs/i_op_ren.c
 new file mode 100644
-index 000000000000..022b6e8cef11
+index 000000000000..b8cf8c5dd020
 --- /dev/null
 +++ b/fs/aufs/i_op_ren.c
-@@ -0,0 +1,1251 @@
+@@ -0,0 +1,1257 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -20483,9 +20497,12 @@ index 000000000000..022b6e8cef11
 +{
 +	int rerr;
 +	struct inode *delegated;
++	struct path h_ppath = {
++		.dentry	= a->src_h_parent,
++		.mnt	= a->h_path.mnt
++	};
 +
-+	a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name,
-+					  a->src_h_parent);
++	a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name, &h_ppath);
 +	rerr = PTR_ERR(a->h_path.dentry);
 +	if (IS_ERR(a->h_path.dentry)) {
 +		RevertFailure("lkup one %pd", a->src_dentry);
@@ -20512,9 +20529,12 @@ index 000000000000..022b6e8cef11
 +{
 +	int rerr;
 +	struct inode *delegated;
++	struct path h_ppath = {
++		.dentry	= a->dst_h_parent,
++		.mnt	= a->h_path.mnt
++	};
 +
-+	a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name,
-+					  a->dst_h_parent);
++	a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name, &h_ppath);
 +	rerr = PTR_ERR(a->h_path.dentry);
 +	if (IS_ERR(a->h_path.dentry)) {
 +		RevertFailure("lkup one %pd", a->dst_dentry);
@@ -22413,7 +22433,7 @@ index 000000000000..5b6bacc5dc2b
 +}
 diff --git a/fs/aufs/inode.h b/fs/aufs/inode.h
 new file mode 100644
-index 000000000000..e092a1a03145
+index 000000000000..9d923fd3d77c
 --- /dev/null
 +++ b/fs/aufs/inode.h
 @@ -0,0 +1,705 @@
@@ -22743,7 +22763,7 @@ index 000000000000..e092a1a03145
 +#endif
 +
 +#ifdef CONFIG_FS_POSIX_ACL
-+struct posix_acl *aufs_get_acl(struct inode *inode, int type);
++struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu);
 +int aufs_set_acl(struct user_namespace *userns, struct inode *inode,
 +		 struct posix_acl *acl, int type);
 +#endif
@@ -27074,7 +27094,7 @@ index 000000000000..960bce3ca2f2
 +#endif /* __AUFS_OPTS_H__ */
 diff --git a/fs/aufs/plink.c b/fs/aufs/plink.c
 new file mode 100644
-index 000000000000..518350041aa2
+index 000000000000..82e51a50191c
 --- /dev/null
 +++ b/fs/aufs/plink.c
 @@ -0,0 +1,516 @@
@@ -27286,35 +27306,35 @@ index 000000000000..518350041aa2
 +struct au_do_plink_lkup_args {
 +	struct dentry **errp;
 +	struct qstr *tgtname;
-+	struct dentry *h_parent;
-+	struct au_branch *br;
++	struct path *h_ppath;
 +};
 +
 +static struct dentry *au_do_plink_lkup(struct qstr *tgtname,
-+				       struct dentry *h_parent,
-+				       struct au_branch *br)
++				       struct path *h_ppath)
 +{
 +	struct dentry *h_dentry;
 +	struct inode *h_inode;
 +
-+	h_inode = d_inode(h_parent);
++	h_inode = d_inode(h_ppath->dentry);
 +	inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2);
-+	h_dentry = vfsub_lkup_one(tgtname, h_parent);
++	h_dentry = vfsub_lkup_one(tgtname, h_ppath);
 +	inode_unlock_shared(h_inode);
++
 +	return h_dentry;
 +}
 +
 +static void au_call_do_plink_lkup(void *args)
 +{
 +	struct au_do_plink_lkup_args *a = args;
-+	*a->errp = au_do_plink_lkup(a->tgtname, a->h_parent, a->br);
++	*a->errp = au_do_plink_lkup(a->tgtname, a->h_ppath);
 +}
 +
 +/* lookup the plink-ed @inode under the branch at @bindex */
 +struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex)
 +{
-+	struct dentry *h_dentry, *h_parent;
++	struct dentry *h_dentry;
 +	struct au_branch *br;
++	struct path h_ppath;
 +	int wkq_err;
 +	char a[PLINK_NAME_LEN];
 +	struct qstr tgtname = QSTR_INIT(a, 0);
@@ -27322,40 +27342,39 @@ index 000000000000..518350041aa2
 +	AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM));
 +
 +	br = au_sbr(inode->i_sb, bindex);
-+	h_parent = br->br_wbr->wbr_plink;
++	h_ppath.dentry = br->br_wbr->wbr_plink;
++	h_ppath.mnt = au_br_mnt(br);
 +	tgtname.len = plink_name(a, sizeof(a), inode, bindex);
 +
 +	if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) {
 +		struct au_do_plink_lkup_args args = {
 +			.errp		= &h_dentry,
 +			.tgtname	= &tgtname,
-+			.h_parent	= h_parent,
-+			.br		= br
++			.h_ppath	= &h_ppath
 +		};
 +
 +		wkq_err = au_wkq_wait(au_call_do_plink_lkup, &args);
 +		if (unlikely(wkq_err))
 +			h_dentry = ERR_PTR(wkq_err);
 +	} else
-+		h_dentry = au_do_plink_lkup(&tgtname, h_parent, br);
++		h_dentry = au_do_plink_lkup(&tgtname, &h_ppath);
 +
 +	return h_dentry;
 +}
 +
 +/* create a pseudo-link */
-+static int do_whplink(struct qstr *tgt, struct dentry *h_parent,
-+		      struct dentry *h_dentry, struct au_branch *br)
++static int do_whplink(struct qstr *tgt, struct path *h_ppath,
++		      struct dentry *h_dentry)
 +{
 +	int err;
-+	struct path h_path = {
-+		.mnt = au_br_mnt(br)
-+	};
++	struct path h_path;
 +	struct inode *h_dir, *delegated;
 +
-+	h_dir = d_inode(h_parent);
++	h_dir = d_inode(h_ppath->dentry);
 +	inode_lock_nested(h_dir, AuLsc_I_CHILD2);
++	h_path.mnt = h_ppath->mnt;
 +again:
-+	h_path.dentry = vfsub_lkup_one(tgt, h_parent);
++	h_path.dentry = vfsub_lkup_one(tgt, h_ppath);
 +	err = PTR_ERR(h_path.dentry);
 +	if (IS_ERR(h_path.dentry))
 +		goto out;
@@ -27396,28 +27415,30 @@ index 000000000000..518350041aa2
 +struct do_whplink_args {
 +	int *errp;
 +	struct qstr *tgt;
-+	struct dentry *h_parent;
++	struct path *h_ppath;
 +	struct dentry *h_dentry;
-+	struct au_branch *br;
 +};
 +
 +static void call_do_whplink(void *args)
 +{
 +	struct do_whplink_args *a = args;
-+	*a->errp = do_whplink(a->tgt, a->h_parent, a->h_dentry, a->br);
++	*a->errp = do_whplink(a->tgt, a->h_ppath, a->h_dentry);
 +}
 +
 +static int whplink(struct dentry *h_dentry, struct inode *inode,
-+		   aufs_bindex_t bindex, struct au_branch *br)
++		   aufs_bindex_t bindex)
 +{
 +	int err, wkq_err;
++	struct au_branch *br;
 +	struct au_wbr *wbr;
-+	struct dentry *h_parent;
++	struct path h_ppath;
 +	char a[PLINK_NAME_LEN];
 +	struct qstr tgtname = QSTR_INIT(a, 0);
 +
-+	wbr = au_sbr(inode->i_sb, bindex)->br_wbr;
-+	h_parent = wbr->wbr_plink;
++	br = au_sbr(inode->i_sb, bindex);
++	wbr = br->br_wbr;
++	h_ppath.dentry = wbr->wbr_plink;
++	h_ppath.mnt = au_br_mnt(br);
 +	tgtname.len = plink_name(a, sizeof(a), inode, bindex);
 +
 +	/* always superio. */
@@ -27425,15 +27446,14 @@ index 000000000000..518350041aa2
 +		struct do_whplink_args args = {
 +			.errp		= &err,
 +			.tgt		= &tgtname,
-+			.h_parent	= h_parent,
-+			.h_dentry	= h_dentry,
-+			.br		= br
++			.h_ppath	= &h_ppath,
++			.h_dentry	= h_dentry
 +		};
 +		wkq_err = au_wkq_wait(call_do_whplink, &args);
 +		if (unlikely(wkq_err))
 +			err = wkq_err;
 +	} else
-+		err = do_whplink(&tgtname, h_parent, h_dentry, br);
++		err = do_whplink(&tgtname, &h_ppath, h_dentry);
 +
 +	return err;
 +}
@@ -27483,7 +27503,7 @@ index 000000000000..518350041aa2
 +		if (cnt > AUFS_PLINK_WARN)
 +			AuWarn1(msg ", %d\n", cnt);
 +#undef msg
-+		err = whplink(h_dentry, inode, bindex, au_sbr(sb, bindex));
++		err = whplink(h_dentry, inode, bindex);
 +		if (unlikely(err)) {
 +			pr_warn("err %d, damaged pseudo link.\n", err);
 +			au_hbl_del(&icntnr->plink, hbl);
@@ -27653,10 +27673,10 @@ index 000000000000..d1081a7f02f2
 +}
 diff --git a/fs/aufs/posix_acl.c b/fs/aufs/posix_acl.c
 new file mode 100644
-index 000000000000..2fa8e6dee637
+index 000000000000..69adf2bb5212
 --- /dev/null
 +++ b/fs/aufs/posix_acl.c
-@@ -0,0 +1,106 @@
+@@ -0,0 +1,111 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2014-2021 Junjiro R. Okajima
@@ -27682,7 +27702,7 @@ index 000000000000..2fa8e6dee637
 +#include <linux/fs.h>
 +#include "aufs.h"
 +
-+struct posix_acl *aufs_get_acl(struct inode *inode, int type)
++struct posix_acl *aufs_get_acl(struct inode *inode, int type, bool rcu)
 +{
 +	struct posix_acl *acl;
 +	int err;
@@ -27690,12 +27710,16 @@ index 000000000000..2fa8e6dee637
 +	struct inode *h_inode;
 +	struct super_block *sb;
 +
++	acl = ERR_PTR(-ECHILD);
++	if (rcu)
++		goto out;
++
 +	acl = NULL;
 +	sb = inode->i_sb;
 +	si_read_lock(sb, AuLock_FLUSH);
 +	ii_read_lock_child(inode);
 +	if (!(sb->s_flags & SB_POSIXACL))
-+		goto out;
++		goto unlock;
 +
 +	bindex = au_ibtop(inode);
 +	h_inode = au_h_iptr(inode, bindex);
@@ -27704,7 +27728,7 @@ index 000000000000..2fa8e6dee637
 +			 != (inode->i_mode & S_IFMT)))) {
 +		err = au_busy_or_stale();
 +		acl = ERR_PTR(err);
-+		goto out;
++		goto unlock;
 +	}
 +
 +	/* always topmost only */
@@ -27714,10 +27738,11 @@ index 000000000000..2fa8e6dee637
 +	else
 +		set_cached_acl(inode, type, acl);
 +
-+out:
++unlock:
 +	ii_read_unlock(inode);
 +	si_read_unlock(sb);
 +
++out:
 +	AuTraceErrPtr(acl);
 +	return acl;
 +}
@@ -32035,10 +32060,10 @@ index 000000000000..a3f709ee7475
 +}
 diff --git a/fs/aufs/vfsub.c b/fs/aufs/vfsub.c
 new file mode 100644
-index 000000000000..f905aa22ac3b
+index 000000000000..f6e27fbcf584
 --- /dev/null
 +++ b/fs/aufs/vfsub.c
-@@ -0,0 +1,916 @@
+@@ -0,0 +1,919 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -32099,6 +32124,11 @@ index 000000000000..f905aa22ac3b
 +	struct kstat st;
 +	struct super_block *h_sb;
 +
++	/*
++	 * Always needs h_path->mnt for LSM or FUSE branch.
++	 */
++	AuDebugOn(!h_path->mnt);
++
 +	/* for remote fs, leave work for its getattr or d_revalidate */
 +	/* for bad i_attr fs, handle them in aufs_getattr() */
 +	/* still some fs may acquire i_mutex. we need to skip them */
@@ -32207,38 +32237,38 @@ index 000000000000..f905aa22ac3b
 +}
 +
 +struct dentry *vfsub_lookup_one_len_unlocked(const char *name,
-+					     struct dentry *parent, int len)
++					     struct path *ppath, int len)
 +{
-+	struct path path = {
-+		.mnt = NULL
-+	};
++	struct path path;
 +
-+	path.dentry = lookup_one_len_unlocked(name, parent, len);
++	path.dentry = lookup_one_len_unlocked(name, ppath->dentry, len);
 +	if (IS_ERR(path.dentry))
 +		goto out;
-+	if (d_is_positive(path.dentry))
++	if (d_is_positive(path.dentry)) {
++		path.mnt = ppath->mnt;
 +		vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/
++	}
 +
 +out:
 +	AuTraceErrPtr(path.dentry);
 +	return path.dentry;
 +}
 +
-+struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent,
++struct dentry *vfsub_lookup_one_len(const char *name, struct path *ppath,
 +				    int len)
 +{
-+	struct path path = {
-+		.mnt = NULL
-+	};
++	struct path path;
 +
 +	/* VFS checks it too, but by WARN_ON_ONCE() */
-+	IMustLock(d_inode(parent));
++	IMustLock(d_inode(ppath->dentry));
 +
-+	path.dentry = lookup_one_len(name, parent, len);
++	path.dentry = lookup_one_len(name, ppath->dentry, len);
 +	if (IS_ERR(path.dentry))
 +		goto out;
-+	if (d_is_positive(path.dentry))
++	if (d_is_positive(path.dentry)) {
++		path.mnt = ppath->mnt;
 +		vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/
++	}
 +
 +out:
 +	AuTraceErrPtr(path.dentry);
@@ -32248,7 +32278,7 @@ index 000000000000..f905aa22ac3b
 +void vfsub_call_lkup_one(void *args)
 +{
 +	struct vfsub_lkup_one_args *a = args;
-+	*a->errp = vfsub_lkup_one(a->name, a->parent);
++	*a->errp = vfsub_lkup_one(a->name, a->ppath);
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -32713,9 +32743,7 @@ index 000000000000..f905aa22ac3b
 +	lockdep_off();
 +	sb_start_write(h_sb);
 +	lockdep_on();
-+	err = locks_verify_truncate(h_inode, h_file, length);
-+	if (!err)
-+		err = security_path_truncate(h_path);
++	err = security_path_truncate(h_path);
 +	if (!err) {
 +		h_userns = mnt_user_ns(h_path->mnt);
 +		lockdep_off();
@@ -32957,7 +32985,7 @@ index 000000000000..f905aa22ac3b
 +}
 diff --git a/fs/aufs/vfsub.h b/fs/aufs/vfsub.h
 new file mode 100644
-index 000000000000..8e1fca0406e4
+index 000000000000..0c76f421b95f
 --- /dev/null
 +++ b/fs/aufs/vfsub.h
 @@ -0,0 +1,358 @@
@@ -33066,20 +33094,20 @@ index 000000000000..8e1fca0406e4
 +int vfsub_kern_path(const char *name, unsigned int flags, struct path *path);
 +
 +struct dentry *vfsub_lookup_one_len_unlocked(const char *name,
-+					     struct dentry *parent, int len);
-+struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent,
++					     struct path *ppath, int len);
++struct dentry *vfsub_lookup_one_len(const char *name, struct path *ppath,
 +				    int len);
 +
 +struct vfsub_lkup_one_args {
 +	struct dentry **errp;
 +	struct qstr *name;
-+	struct dentry *parent;
++	struct path *ppath;
 +};
 +
 +static inline struct dentry *vfsub_lkup_one(struct qstr *name,
-+					    struct dentry *parent)
++					    struct path *ppath)
 +{
-+	return vfsub_lookup_one_len(name->name, parent, name->len);
++	return vfsub_lookup_one_len(name->name, ppath, name->len);
 +}
 +
 +void vfsub_call_lkup_one(void *args);
@@ -33192,7 +33220,7 @@ index 000000000000..8e1fca0406e4
 +static inline int vfsub_update_time(struct inode *h_inode,
 +				    struct timespec64 *ts, int flags)
 +{
-+	return update_time(h_inode, ts, flags);
++	return inode_update_time(h_inode, ts, flags);
 +	/* no vfsub_update_h_iattr() since we don't have struct path */
 +}
 +
@@ -34157,10 +34185,10 @@ index 000000000000..309ae56b609b
 +};
 diff --git a/fs/aufs/whout.c b/fs/aufs/whout.c
 new file mode 100644
-index 000000000000..8849e6239dd1
+index 000000000000..a6d30f64b0c0
 --- /dev/null
 +++ b/fs/aufs/whout.c
-@@ -0,0 +1,1070 @@
+@@ -0,0 +1,1072 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -34224,19 +34252,19 @@ index 000000000000..8849e6239dd1
 +/* ---------------------------------------------------------------------- */
 +
 +/*
-+ * test if the @wh_name exists under @h_parent.
++ * test if the @wh_name exists under @h_ppath.
 + * @try_sio specifies the necessary of super-io.
 + */
-+int au_wh_test(struct user_namespace *h_userns, struct dentry *h_parent,
++int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath,
 +	       struct qstr *wh_name, int try_sio)
 +{
 +	int err;
 +	struct dentry *wh_dentry;
 +
 +	if (!try_sio)
-+		wh_dentry = vfsub_lkup_one(wh_name, h_parent);
++		wh_dentry = vfsub_lkup_one(wh_name, h_ppath);
 +	else
-+		wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_parent);
++		wh_dentry = au_sio_lkup_one(h_userns, wh_name, h_ppath);
 +	err = PTR_ERR(wh_dentry);
 +	if (IS_ERR(wh_dentry)) {
 +		if (err == -ENAMETOOLONG)
@@ -34263,15 +34291,15 @@ index 000000000000..8849e6239dd1
 +}
 +
 +/*
-+ * test if the @h_dentry sets opaque or not.
++ * test if the @h_path->dentry sets opaque or not.
 + */
-+int au_diropq_test(struct user_namespace *h_userns, struct dentry *h_dentry)
++int au_diropq_test(struct user_namespace *h_userns, struct path *h_path)
 +{
 +	int err;
 +	struct inode *h_dir;
 +
-+	h_dir = d_inode(h_dentry);
-+	err = au_wh_test(h_userns, h_dentry, &diropq_name,
++	h_dir = d_inode(h_path->dentry);
++	err = au_wh_test(h_userns, h_path, &diropq_name,
 +			 au_test_h_perm_sio(h_userns, h_dir, MAY_EXEC));
 +	return err;
 +}
@@ -34289,6 +34317,7 @@ index 000000000000..8849e6239dd1
 +	/* strict atomic_t is unnecessary here */
 +	static unsigned short cnt;
 +	struct qstr qs;
++	struct path h_ppath;
 +	struct user_namespace *h_userns;
 +
 +	BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN);
@@ -34313,11 +34342,13 @@ index 000000000000..8849e6239dd1
 +	*p++ = '.';
 +	AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN);
 +
++	h_ppath.dentry = h_parent;
++	h_ppath.mnt = au_br_mnt(br);
 +	h_userns = au_br_userns(br);
 +	qs.name = name;
 +	for (i = 0; i < 3; i++) {
 +		sprintf(p, "%.*x", AUFS_WH_TMP_LEN, cnt++);
-+		dentry = au_sio_lkup_one(h_userns, &qs, h_parent);
++		dentry = au_sio_lkup_one(h_userns, &qs, &h_ppath);
 +		if (IS_ERR(dentry) || d_is_negative(dentry))
 +			goto out_name;
 +		dput(dentry);
@@ -34411,21 +34442,20 @@ index 000000000000..8849e6239dd1
 +	return err;
 +}
 +
-+static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh,
-+			  struct au_branch *br)
++static int unlink_wh_name(struct path *h_ppath, struct qstr *wh)
 +{
 +	int err;
-+	struct path h_path = {
-+		.mnt = au_br_mnt(br)
-+	};
++	struct path h_path;
 +
 +	err = 0;
-+	h_path.dentry = vfsub_lkup_one(wh, h_parent);
++	h_path.dentry = vfsub_lkup_one(wh, h_ppath);
 +	if (IS_ERR(h_path.dentry))
 +		err = PTR_ERR(h_path.dentry);
 +	else {
-+		if (d_is_reg(h_path.dentry))
-+			err = do_unlink_wh(d_inode(h_parent), &h_path);
++		if (d_is_reg(h_path.dentry)) {
++			h_path.mnt = h_ppath->mnt;
++			err = do_unlink_wh(d_inode(h_ppath->dentry), &h_path);
++		}
 +		dput(h_path.dentry);
 +	}
 +
@@ -34865,15 +34895,17 @@ index 000000000000..8849e6239dd1
 +static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex,
 +				unsigned int flags)
 +{
-+	struct dentry *opq_dentry, *h_dentry;
++	struct dentry *opq_dentry;
 +	struct super_block *sb;
 +	struct au_branch *br;
++	struct path h_path;
 +	int err;
 +
 +	sb = dentry->d_sb;
 +	br = au_sbr(sb, bindex);
-+	h_dentry = au_h_dptr(dentry, bindex);
-+	opq_dentry = vfsub_lkup_one(&diropq_name, h_dentry);
++	h_path.dentry = au_h_dptr(dentry, bindex);
++	h_path.mnt = au_br_mnt(br);
++	opq_dentry = vfsub_lkup_one(&diropq_name, &h_path);
 +	if (IS_ERR(opq_dentry))
 +		goto out;
 +
@@ -34884,11 +34916,8 @@ index 000000000000..8849e6239dd1
 +			goto out; /* success */
 +		}
 +	} else {
-+		struct path tmp = {
-+			.dentry = opq_dentry,
-+			.mnt	= au_br_mnt(br)
-+		};
-+		err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &tmp);
++		h_path.dentry = opq_dentry;
++		err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &h_path);
 +		if (!err)
 +			au_set_dbdiropq(dentry, -1);
 +	}
@@ -34954,11 +34983,14 @@ index 000000000000..8849e6239dd1
 +	int err;
 +	struct qstr wh_name;
 +	struct dentry *wh_dentry;
++	struct path h_path;
 +
 +	err = au_wh_name_alloc(&wh_name, base_name);
 +	wh_dentry = ERR_PTR(err);
 +	if (!err) {
-+		wh_dentry = vfsub_lkup_one(&wh_name, h_parent);
++		h_path.dentry = h_parent;
++		h_path.mnt = au_br_mnt(br);
++		wh_dentry = vfsub_lkup_one(&wh_name, &h_path);
 +		au_kfree_try_rcu(wh_name.name);
 +	}
 +	return wh_dentry;
@@ -34993,8 +35025,8 @@ index 000000000000..8849e6239dd1
 +/* ---------------------------------------------------------------------- */
 +
 +/* Delete all whiteouts in this directory on branch bindex. */
-+static int del_wh_children(struct dentry *h_dentry, struct au_nhash *whlist,
-+			   aufs_bindex_t bindex, struct au_branch *br)
++static int del_wh_children(struct path *h_path, struct au_nhash *whlist,
++			   aufs_bindex_t bindex)
 +{
 +	int err;
 +	unsigned long ul, n;
@@ -35024,7 +35056,7 @@ index 000000000000..8849e6239dd1
 +			if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) {
 +				memcpy(p, str->name, str->len);
 +				wh_name.len = AUFS_WH_PFX_LEN + str->len;
-+				err = unlink_wh_name(h_dentry, &wh_name, br);
++				err = unlink_wh_name(h_path, &wh_name);
 +				if (!err)
 +					continue;
 +				break;
@@ -35043,16 +35075,15 @@ index 000000000000..8849e6239dd1
 +
 +struct del_wh_children_args {
 +	int *errp;
-+	struct dentry *h_dentry;
++	struct path *h_path;
 +	struct au_nhash *whlist;
 +	aufs_bindex_t bindex;
-+	struct au_branch *br;
 +};
 +
 +static void call_del_wh_children(void *args)
 +{
 +	struct del_wh_children_args *a = args;
-+	*a->errp = del_wh_children(a->h_dentry, a->whlist, a->bindex, a->br);
++	*a->errp = del_wh_children(a->h_path, a->whlist, a->bindex);
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -35104,7 +35135,7 @@ index 000000000000..8849e6239dd1
 +{
 +	int err;
 +	unsigned int h_nlink;
-+	struct path h_tmp;
++	struct path wh_path;
 +	struct inode *wh_inode, *h_dir;
 +	struct au_branch *br;
 +	struct user_namespace *h_userns;
@@ -35113,6 +35144,8 @@ index 000000000000..8849e6239dd1
 +	IMustLock(h_dir);
 +
 +	br = au_sbr(dir->i_sb, bindex);
++	wh_path.dentry = wh_dentry;
++	wh_path.mnt = au_br_mnt(br);
 +	h_userns = au_br_userns(br);
 +	wh_inode = d_inode(wh_dentry);
 +	inode_lock_nested(wh_inode, AuLsc_I_CHILD);
@@ -35122,15 +35155,14 @@ index 000000000000..8849e6239dd1
 +	 * it means this whlist may have an obsoleted entry.
 +	 */
 +	if (!au_test_h_perm_sio(h_userns, wh_inode, MAY_EXEC | MAY_WRITE))
-+		err = del_wh_children(wh_dentry, whlist, bindex, br);
++		err = del_wh_children(&wh_path, whlist, bindex);
 +	else {
 +		int wkq_err;
 +		struct del_wh_children_args args = {
 +			.errp		= &err,
-+			.h_dentry	= wh_dentry,
++			.h_path		= &wh_path,
 +			.whlist		= whlist,
-+			.bindex		= bindex,
-+			.br		= br
++			.bindex		= bindex
 +		};
 +
 +		wkq_err = au_wkq_wait(call_del_wh_children, &args);
@@ -35140,10 +35172,8 @@ index 000000000000..8849e6239dd1
 +	inode_unlock(wh_inode);
 +
 +	if (!err) {
-+		h_tmp.dentry = wh_dentry;
-+		h_tmp.mnt = au_br_mnt(br);
 +		h_nlink = h_dir->i_nlink;
-+		err = vfsub_rmdir(h_dir, &h_tmp);
++		err = vfsub_rmdir(h_dir, &wh_path);
 +		/* some fs doesn't change the parent nlink in some cases */
 +		h_nlink -= h_dir->i_nlink;
 +	}
@@ -35233,7 +35263,7 @@ index 000000000000..8849e6239dd1
 +}
 diff --git a/fs/aufs/whout.h b/fs/aufs/whout.h
 new file mode 100644
-index 000000000000..08bce298f8a3
+index 000000000000..d55c4f9a9659
 --- /dev/null
 +++ b/fs/aufs/whout.h
 @@ -0,0 +1,87 @@
@@ -35268,9 +35298,9 @@ index 000000000000..08bce298f8a3
 +
 +/* whout.c */
 +int au_wh_name_alloc(struct qstr *wh, const struct qstr *name);
-+int au_wh_test(struct user_namespace *h_userns, struct dentry *h_parent,
++int au_wh_test(struct user_namespace *h_userns, struct path *h_ppath,
 +	       struct qstr *wh_name, int try_sio);
-+int au_diropq_test(struct user_namespace *h_userns, struct dentry *h_dentry);
++int au_diropq_test(struct user_namespace *h_userns, struct path *h_path);
 +struct au_branch;
 +struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br,
 +			     struct qstr *prefix);
@@ -36173,10 +36203,10 @@ index 000000000000..4839dd8f775e
 +}
 diff --git a/fs/aufs/xino.c b/fs/aufs/xino.c
 new file mode 100644
-index 000000000000..b126b34206f3
+index 000000000000..e6683663885b
 --- /dev/null
 +++ b/fs/aufs/xino.c
-@@ -0,0 +1,1925 @@
+@@ -0,0 +1,1926 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2021 Junjiro R. Okajima
@@ -36414,22 +36444,23 @@ index 000000000000..b126b34206f3
 +			     struct file *copy_src)
 +{
 +	struct file *file;
-+	struct dentry *dentry, *parent;
++	struct dentry *dentry;
 +	struct inode *dir, *delegated;
 +	struct qstr *name;
-+	struct path path;
++	struct path ppath, path;
 +	int err, do_unlock;
 +	struct au_xino_lock_dir ldir;
 +
 +	do_unlock = 1;
 +	au_xino_lock_dir(sb, base, &ldir);
 +	dentry = base->dentry;
-+	parent = dentry->d_parent; /* dir inode is locked */
-+	dir = d_inode(parent);
++	ppath.dentry = dentry->d_parent; /* dir inode is locked */
++	ppath.mnt = base->mnt;
++	dir = d_inode(ppath.dentry);
 +	IMustLock(dir);
 +
 +	name = &dentry->d_name;
-+	path.dentry = vfsub_lookup_one_len(name->name, parent, name->len);
++	path.dentry = vfsub_lookup_one_len(name->name, &ppath, name->len);
 +	if (IS_ERR(path.dentry)) {
 +		file = (void *)path.dentry;
 +		pr_err("%pd lookup err %ld\n", dentry, PTR_ERR(path.dentry));
@@ -38104,7 +38135,7 @@ index 000000000000..b126b34206f3
 +}
 diff --git a/include/uapi/linux/aufs_type.h b/include/uapi/linux/aufs_type.h
 new file mode 100644
-index 000000000000..8993ca8ef927
+index 000000000000..5219a4d117b3
 --- /dev/null
 +++ b/include/uapi/linux/aufs_type.h
 @@ -0,0 +1,452 @@
@@ -38150,7 +38181,7 @@ index 000000000000..8993ca8ef927
 +#include <limits.h>
 +#endif /* __KERNEL__ */
 +
-+#define AUFS_VERSION	"5.14-20210906"
++#define AUFS_VERSION	"5.15.5-20211129"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC	('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
diff --git a/patches/aufs/0006-merge-aufs-rt.patch b/patches/aufs/0006-merge-aufs-rt.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a53a0c28291f69dd8e3f6f34d018d565b9a7064d
--- /dev/null
+++ b/patches/aufs/0006-merge-aufs-rt.patch
@@ -0,0 +1,29 @@
+From f42db1bf9f9751db91a5a7b8e0128f2a7d18bcc7 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 7 Dec 2021 18:55:55 -0600
+Subject: [PATCH 6/6] merge: aufs-rt
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ fs/aufs/i_op.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/fs/aufs/i_op.c b/fs/aufs/i_op.c
+index bfce27d451f1..4accad3d8b26 100644
+--- a/fs/aufs/i_op.c
++++ b/fs/aufs/i_op.c
+@@ -637,7 +637,11 @@ int au_pin_hdir_relock(struct au_pin *p)
+ 
+ static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task)
+ {
++#if IS_ENABLED(CONFIG_PREEMPT_RT)
++	p->hdir->hi_inode->i_rwsem.rtmutex.owner = task;
++#else
+ 	atomic_long_set(&p->hdir->hi_inode->i_rwsem.owner, (long)task);
++#endif
+ }
+ 
+ void au_pin_hdir_acquire_nest(struct au_pin *p)
+-- 
+2.30.2
+
diff --git a/patches/backports/brcm80211/0001-backports-brcm80211-from-linux.git.patch b/patches/backports/brcm80211/0001-backports-brcm80211-from-linux.git.patch
deleted file mode 100644
index b2537fc46c26a1d4b36b1b68bb3aad5af7983445..0000000000000000000000000000000000000000
--- a/patches/backports/brcm80211/0001-backports-brcm80211-from-linux.git.patch
+++ /dev/null
@@ -1,3112 +0,0 @@
-From aa98c9bdc013d45777f0a9231be3d8daf0b10784 Mon Sep 17 00:00:00 2001
-From: Robert Nelson <robertcnelson@gmail.com>
-Date: Fri, 19 Jun 2020 11:07:30 -0500
-Subject: [PATCH] backports: brcm80211: from: linux.git
-
-Reference: v5.4.18
-Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
----
- .../net/wireless/broadcom/brcm80211/Kconfig   |   6 +-
- .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |  93 +--
- .../broadcom/brcm80211/brcmfmac/cfg80211.c    | 539 +++---------------
- .../broadcom/brcm80211/brcmfmac/cfg80211.h    |  32 +-
- .../broadcom/brcm80211/brcmfmac/chip.c        |  61 +-
- .../broadcom/brcm80211/brcmfmac/chip.h        |   1 -
- .../broadcom/brcm80211/brcmfmac/common.h      |   4 -
- .../broadcom/brcm80211/brcmfmac/commonring.c  |   8 +-
- .../broadcom/brcm80211/brcmfmac/core.c        |  82 +--
- .../broadcom/brcm80211/brcmfmac/core.h        |   2 -
- .../broadcom/brcm80211/brcmfmac/debug.c       |   9 +-
- .../broadcom/brcm80211/brcmfmac/debug.h       |  12 +-
- .../broadcom/brcm80211/brcmfmac/feature.c     |   7 +-
- .../broadcom/brcm80211/brcmfmac/feature.h     |   6 +-
- .../broadcom/brcm80211/brcmfmac/firmware.h    |   2 +-
- .../broadcom/brcm80211/brcmfmac/flowring.c    |   4 +-
- .../broadcom/brcm80211/brcmfmac/fweh.c        |   2 +-
- .../broadcom/brcm80211/brcmfmac/fwil.h        |   2 -
- .../broadcom/brcm80211/brcmfmac/fwil_types.h  |  13 -
- .../broadcom/brcm80211/brcmfmac/fwsignal.c    |  35 +-
- .../broadcom/brcm80211/brcmfmac/fwsignal.h    |  23 -
- .../broadcom/brcm80211/brcmfmac/msgbuf.c      |   2 +-
- .../broadcom/brcm80211/brcmfmac/p2p.c         | 154 +----
- .../broadcom/brcm80211/brcmfmac/p2p.h         |   9 +-
- .../broadcom/brcm80211/brcmfmac/pcie.c        |  11 +-
- .../broadcom/brcm80211/brcmfmac/pno.c         |   4 -
- .../broadcom/brcm80211/brcmfmac/sdio.c        | 101 +---
- .../broadcom/brcm80211/brcmfmac/sdio.h        |   1 +
- .../broadcom/brcm80211/brcmfmac/usb.c         | 128 ++---
- .../broadcom/brcm80211/brcmsmac/channel.c     |  10 +-
- .../broadcom/brcm80211/brcmsmac/mac80211_if.c |   5 +-
- .../broadcom/brcm80211/brcmsmac/main.c        |  25 +-
- .../broadcom/brcm80211/brcmsmac/stf.c         |   7 +-
- .../broadcom/brcm80211/brcmsmac/stf.h         |   2 +-
- .../broadcom/brcm80211/include/brcm_hw_ids.h  |   2 -
- .../broadcom/brcm80211/include/brcmu_wifi.h   |   2 -
- include/linux/mmc/sdio_ids.h                  |  92 +--
- 37 files changed, 327 insertions(+), 1171 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/Kconfig b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-index 5bf2318763c55..a5bf16c4f4951 100644
---- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
-+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-@@ -12,7 +12,7 @@ config BRCMSMAC
- 	select BRCMUTIL
- 	select FW_LOADER
- 	select CORDIC
--	help
-+	---help---
- 	  This module adds support for PCIe wireless adapters based on Broadcom
- 	  IEEE802.11n SoftMAC chipsets. It also has WLAN led support, which will
- 	  be available if you select BCMA_DRIVER_GPIO. If you choose to build a
-@@ -23,7 +23,7 @@ source "drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig"
- config BRCM_TRACING
- 	bool "Broadcom device tracing"
- 	depends on BRCMSMAC || BRCMFMAC
--	help
-+	---help---
- 	  If you say Y here, the Broadcom wireless drivers will register
- 	  with ftrace to dump event information into the trace ringbuffer.
- 	  Tracing can be enabled at runtime to aid in debugging wireless
-@@ -35,5 +35,5 @@ config BRCMDBG
- 	bool "Broadcom driver debug functions"
- 	depends on BRCMSMAC || BRCMFMAC
- 	select WANT_DEV_COREDUMP if BRCMFMAC
--	help
-+	---help---
- 	  Selecting this enables additional code for debug purposes.
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 46346cb3bc84f..fc12598b2dd3f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -43,8 +43,6 @@
- 
- #define SDIO_FUNC1_BLOCKSIZE		64
- #define SDIO_FUNC2_BLOCKSIZE		512
--#define SDIO_4373_FUNC2_BLOCKSIZE	256
--#define SDIO_435X_FUNC2_BLOCKSIZE	256
- /* Maximum milliseconds to wait for F2 to come up */
- #define SDIO_WAIT_F2RDY	3000
- 
-@@ -121,7 +119,7 @@ int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev)
- 			brcmf_err("enable_irq_wake failed %d\n", ret);
- 			return ret;
- 		}
--		disable_irq_wake(pdata->oob_irq_nr);
-+		sdiodev->irq_wake = true;
- 
- 		sdio_claim_host(sdiodev->func1);
- 
-@@ -180,6 +178,10 @@ void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev)
- 		sdio_release_host(sdiodev->func1);
- 
- 		sdiodev->oob_irq_requested = false;
-+		if (sdiodev->irq_wake) {
-+			disable_irq_wake(pdata->oob_irq_nr);
-+			sdiodev->irq_wake = false;
-+		}
- 		free_irq(pdata->oob_irq_nr, &sdiodev->func1->dev);
- 		sdiodev->irq_en = false;
- 		sdiodev->oob_irq_requested = false;
-@@ -901,7 +903,6 @@ static void brcmf_sdiod_host_fixup(struct mmc_host *host)
- static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- {
- 	int ret = 0;
--	unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
- 
- 	sdio_claim_host(sdiodev->func1);
- 
-@@ -911,28 +912,11 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		sdio_release_host(sdiodev->func1);
- 		goto out;
- 	}
--	switch (sdiodev->func2->device) {
--	case SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373:
--		f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
--		break;
--	case SDIO_DEVICE_ID_BROADCOM_4359:
--		/* fallthrough */
--	case SDIO_DEVICE_ID_BROADCOM_4354:
--		/* fallthrough */
--	case SDIO_DEVICE_ID_BROADCOM_4356:
--		f2_blksz = SDIO_435X_FUNC2_BLOCKSIZE;
--		break;
--	default:
--		break;
--	}
--
--	ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
-+	ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
- 	if (ret) {
- 		brcmf_err("Failed to set F2 blocksize\n");
- 		sdio_release_host(sdiodev->func1);
- 		goto out;
--	} else {
--		brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz);
- 	}
- 
- 	/* increase F2 timeout */
-@@ -977,7 +961,7 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
--	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364),
-+ 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
-@@ -985,10 +969,8 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
--	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
--	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373),
--	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012),
--	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43012),
- 	{ /* end: all zeroes */ }
- };
- MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
-@@ -1126,8 +1108,7 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
- 	struct sdio_func *func;
- 	struct brcmf_bus *bus_if;
- 	struct brcmf_sdio_dev *sdiodev;
--	mmc_pm_flag_t pm_caps, sdio_flags;
--	int ret = 0;
-+	mmc_pm_flag_t sdio_flags;
- 
- 	func = container_of(dev, struct sdio_func, dev);
- 	brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
-@@ -1138,33 +1119,19 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
- 	bus_if = dev_get_drvdata(dev);
- 	sdiodev = bus_if->bus_priv.sdio;
- 
--	pm_caps = sdio_get_host_pm_caps(func);
--
--	if (pm_caps & MMC_PM_KEEP_POWER) {
--		/* preserve card power during suspend */
--		brcmf_sdiod_freezer_on(sdiodev);
--		brcmf_sdio_wd_timer(sdiodev->bus, 0);
--
--		sdio_flags = MMC_PM_KEEP_POWER;
--		if (sdiodev->wowl_enabled) {
--			if (sdiodev->settings->bus.sdio.oob_irq_supported)
--				enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
--			else
--				sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
--		}
--
--		if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags))
--			brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
-+	brcmf_sdiod_freezer_on(sdiodev);
-+	brcmf_sdio_wd_timer(sdiodev->bus, 0);
- 
--	} else {
--		/* power will be cut so remove device, probe again in resume */
--		brcmf_sdiod_intr_unregister(sdiodev);
--		ret = brcmf_sdiod_remove(sdiodev);
--		if (ret)
--			brcmf_err("Failed to remove device on suspend\n");
-+	sdio_flags = MMC_PM_KEEP_POWER;
-+	if (sdiodev->wowl_enabled) {
-+		if (sdiodev->settings->bus.sdio.oob_irq_supported)
-+			enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
-+		else
-+			sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
- 	}
--
--	return ret;
-+	if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags))
-+		brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
-+	return 0;
- }
- 
- static int brcmf_ops_sdio_resume(struct device *dev)
-@@ -1172,27 +1139,13 @@ static int brcmf_ops_sdio_resume(struct device *dev)
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
- 	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
- 	struct sdio_func *func = container_of(dev, struct sdio_func, dev);
--	mmc_pm_flag_t pm_caps = sdio_get_host_pm_caps(func);
--	int ret = 0;
- 
- 	brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
- 	if (func->num != 2)
- 		return 0;
- 
--	if (!(pm_caps & MMC_PM_KEEP_POWER)) {
--		/* bus was powered off and device removed, probe again */
--		ret = brcmf_sdiod_probe(sdiodev);
--		if (ret)
--			brcmf_err("Failed to probe device on resume\n");
--	} else {
--		if (sdiodev->wowl_enabled &&
--		    sdiodev->settings->bus.sdio.oob_irq_supported)
--			disable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
--
--		brcmf_sdiod_freezer_off(sdiodev);
--	}
--
--	return ret;
-+	brcmf_sdiod_freezer_off(sdiodev);
-+	return 0;
- }
- 
- static const struct dev_pm_ops brcmf_sdio_pm_ops = {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index a757abd7a5999..e3ebb7abbdaed 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -11,7 +11,6 @@
- #include <linux/vmalloc.h>
- #include <net/cfg80211.h>
- #include <net/netlink.h>
--#include <uapi/linux/if_arp.h>
- 
- #include <brcmu_utils.h>
- #include <defs.h>
-@@ -23,7 +22,6 @@
- #include "p2p.h"
- #include "btcoex.h"
- #include "pno.h"
--#include "fwsignal.h"
- #include "cfg80211.h"
- #include "feature.h"
- #include "fwil.h"
-@@ -621,82 +619,6 @@ static bool brcmf_is_ibssmode(struct brcmf_cfg80211_vif *vif)
- 	return vif->wdev.iftype == NL80211_IFTYPE_ADHOC;
- }
- 
--/**
-- * brcmf_mon_add_vif() - create monitor mode virtual interface
-- *
-- * @wiphy: wiphy device of new interface.
-- * @name: name of the new interface.
-- */
--static struct wireless_dev *brcmf_mon_add_vif(struct wiphy *wiphy,
--					      const char *name)
--{
--	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
--	struct brcmf_cfg80211_vif *vif;
--	struct net_device *ndev;
--	struct brcmf_if *ifp;
--	int err;
--
--	if (cfg->pub->mon_if) {
--		err = -EEXIST;
--		goto err_out;
--	}
--
--	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_MONITOR);
--	if (IS_ERR(vif)) {
--		err = PTR_ERR(vif);
--		goto err_out;
--	}
--
--	ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN, ether_setup);
--	if (!ndev) {
--		err = -ENOMEM;
--		goto err_free_vif;
--	}
--	ndev->type = ARPHRD_IEEE80211_RADIOTAP;
--	ndev->ieee80211_ptr = &vif->wdev;
--	ndev->needs_free_netdev = true;
--	ndev->priv_destructor = brcmf_cfg80211_free_netdev;
--	SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
--
--	ifp = netdev_priv(ndev);
--	ifp->vif = vif;
--	ifp->ndev = ndev;
--	ifp->drvr = cfg->pub;
--
--	vif->ifp = ifp;
--	vif->wdev.netdev = ndev;
--
--	err = brcmf_net_mon_attach(ifp);
--	if (err) {
--		brcmf_err("Failed to attach %s device\n", ndev->name);
--		free_netdev(ndev);
--		goto err_free_vif;
--	}
--
--	cfg->pub->mon_if = ifp;
--
--	return &vif->wdev;
--
--err_free_vif:
--	brcmf_free_vif(vif);
--err_out:
--	return ERR_PTR(err);
--}
--
--static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
--{
--	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
--	struct net_device *ndev = wdev->netdev;
--
--	ndev->netdev_ops->ndo_stop(ndev);
--
--	brcmf_net_detach(ndev, true);
--
--	cfg->pub->mon_if = NULL;
--
--	return 0;
--}
--
- static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
- 						     const char *name,
- 						     unsigned char name_assign_type,
-@@ -719,10 +641,9 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
- 	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP_VLAN:
- 	case NL80211_IFTYPE_WDS:
-+	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_MESH_POINT:
- 		return ERR_PTR(-EOPNOTSUPP);
--	case NL80211_IFTYPE_MONITOR:
--		return brcmf_mon_add_vif(wiphy, name);
- 	case NL80211_IFTYPE_AP:
- 		wdev = brcmf_ap_add_vif(wiphy, name, params);
- 		break;
-@@ -905,10 +826,9 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
- 	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP_VLAN:
- 	case NL80211_IFTYPE_WDS:
-+	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_MESH_POINT:
- 		return -EOPNOTSUPP;
--	case NL80211_IFTYPE_MONITOR:
--		return brcmf_mon_del_vif(wiphy, wdev);
- 	case NL80211_IFTYPE_AP:
- 		return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
- 	case NL80211_IFTYPE_P2P_CLIENT:
-@@ -1362,31 +1282,6 @@ static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
- 	return err;
- }
- 
--static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data,
--				  u16 pwd_len)
--{
--	struct brcmf_pub *drvr = ifp->drvr;
--	struct brcmf_wsec_sae_pwd_le sae_pwd;
--	int err;
--
--	if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
--		bphy_err(drvr, "sae_password must be less than %d\n",
--			 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
--		return -EINVAL;
--	}
--
--	sae_pwd.key_len = cpu_to_le16(pwd_len);
--	memcpy(sae_pwd.key, pwd_data, pwd_len);
--
--	err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
--				       sizeof(sae_pwd));
--	if (err < 0)
--		bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
--			 pwd_len);
--
--	return err;
--}
--
- static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
-@@ -1610,8 +1505,6 @@ static s32 brcmf_set_wpa_version(struct net_device *ndev,
- 		val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;
- 	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)
- 		val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;
--	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3)
--		val = WPA3_AUTH_SAE_PSK;
- 	else
- 		val = WPA_AUTH_DISABLED;
- 	brcmf_dbg(CONN, "setting wpa_auth to 0x%0x\n", val);
-@@ -1644,10 +1537,6 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 		val = 1;
- 		brcmf_dbg(CONN, "shared key\n");
- 		break;
--	case NL80211_AUTHTYPE_SAE:
--		val = 3;
--		brcmf_dbg(CONN, "SAE authentication\n");
--		break;
- 	default:
- 		val = 2;
- 		brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type);
-@@ -1758,7 +1647,6 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
- 	u16 count;
- 
- 	profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
--	profile->is_ft = false;
- 
- 	if (!sme->crypto.n_akm_suites)
- 		return 0;
-@@ -1803,27 +1691,11 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
- 			break;
- 		case WLAN_AKM_SUITE_FT_8021X:
- 			val = WPA2_AUTH_UNSPECIFIED | WPA2_AUTH_FT;
--			profile->is_ft = true;
- 			if (sme->want_1x)
- 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
- 			break;
- 		case WLAN_AKM_SUITE_FT_PSK:
- 			val = WPA2_AUTH_PSK | WPA2_AUTH_FT;
--			profile->is_ft = true;
--			break;
--		default:
--			bphy_err(drvr, "invalid cipher group (%d)\n",
--				 sme->crypto.cipher_group);
--			return -EINVAL;
--		}
--	} else if (val & WPA3_AUTH_SAE_PSK) {
--		switch (sme->crypto.akm_suites[0]) {
--		case WLAN_AKM_SUITE_SAE:
--			val = WPA3_AUTH_SAE_PSK;
--			if (sme->crypto.sae_pwd) {
--				brcmf_dbg(INFO, "using SAE offload\n");
--				profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
--			}
- 			break;
- 		default:
- 			bphy_err(drvr, "invalid cipher group (%d)\n",
-@@ -1901,8 +1773,7 @@ brcmf_set_sharedkey(struct net_device *ndev,
- 	brcmf_dbg(CONN, "wpa_versions 0x%x cipher_pairwise 0x%x\n",
- 		  sec->wpa_versions, sec->cipher_pairwise);
- 
--	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2 |
--				 NL80211_WPA_VERSION_3))
-+	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))
- 		return 0;
- 
- 	if (!(sec->cipher_pairwise &
-@@ -2109,8 +1980,7 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
- 		goto done;
- 	}
- 
--	if (sme->crypto.psk &&
--	    profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
-+	if (sme->crypto.psk) {
- 		if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
- 			err = -EINVAL;
- 			goto done;
-@@ -2128,23 +1998,12 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
- 		}
- 	}
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK) {
- 		err = brcmf_set_pmk(ifp, sme->crypto.psk,
- 				    BRCMF_WSEC_MAX_PSK_LEN);
--	else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
--		/* clean up user-space RSNE */
--		if (brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0)) {
--			bphy_err(drvr, "failed to clean up user-space RSNE\n");
-+		if (err)
- 			goto done;
--		}
--		err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
--					     sme->crypto.sae_pwd_len);
--		if (!err && sme->crypto.psk)
--			err = brcmf_set_pmk(ifp, sme->crypto.psk,
--					    BRCMF_WSEC_MAX_PSK_LEN);
- 	}
--	if (err)
--		goto done;
- 
- 	/* Join with specific BSSID and cached SSID
- 	 * If SSID is zero join based on BSSID only
-@@ -2468,17 +2327,6 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
- 	if (!ext_key)
- 		key->flags = BRCMF_PRIMARY_KEY;
- 
--	if (params->seq && params->seq_len == 6) {
--		/* rx iv */
--		u8 *ivptr;
--
--		ivptr = (u8 *)params->seq;
--		key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) |
--			(ivptr[3] << 8) | ivptr[2];
--		key->rxiv.lo = (ivptr[1] << 8) | ivptr[0];
--		key->iv_initialized = true;
--	}
--
- 	switch (params->cipher) {
- 	case WLAN_CIPHER_SUITE_WEP40:
- 		key->algo = CRYPTO_ALGO_WEP1;
-@@ -2964,7 +2812,7 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
- 
- 	if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
- 		bphy_err(drvr, "Bss info is larger than buffer. Discarding\n");
--		return -EINVAL;
-+		return 0;
- 	}
- 
- 	if (!bi->ctl_ch) {
-@@ -4460,11 +4308,6 @@ s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
- 		mgmt_ie_len = &saved_ie->assoc_req_ie_len;
- 		mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie);
- 		break;
--	case BRCMF_VNDR_IE_ASSOCRSP_FLAG:
--		mgmt_ie_buf = saved_ie->assoc_res_ie;
--		mgmt_ie_len = &saved_ie->assoc_res_ie_len;
--		mgmt_ie_buf_len = sizeof(saved_ie->assoc_res_ie);
--		break;
- 	default:
- 		err = -EPERM;
- 		bphy_err(drvr, "not suitable type\n");
-@@ -4611,57 +4454,6 @@ brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif,
- 	else
- 		brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
- 
--	/* Set Assoc Response IEs to FW */
--	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_ASSOCRSP_FLAG,
--				    beacon->assocresp_ies,
--				    beacon->assocresp_ies_len);
--	if (err)
--		brcmf_err("Set Assoc Resp IE Failed\n");
--	else
--		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc Resp\n");
--
--	return err;
--}
--
--static s32
--brcmf_parse_configure_security(struct brcmf_if *ifp,
--			       struct cfg80211_ap_settings *settings,
--			       enum nl80211_iftype dev_role)
--{
--	const struct brcmf_tlv *rsn_ie;
--	const struct brcmf_vs_tlv *wpa_ie;
--	s32 err = 0;
--
--	/* find the RSN_IE */
--	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
--				  settings->beacon.tail_len, WLAN_EID_RSN);
--
--	/* find the WPA_IE */
--	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
--				  settings->beacon.tail_len);
--
--	if (wpa_ie || rsn_ie) {
--		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
--		if (wpa_ie) {
--			/* WPA IE */
--			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
--			if (err < 0)
--				return err;
--		} else {
--			struct brcmf_vs_tlv *tmp_ie;
--
--			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
--
--			/* RSN IE */
--			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
--			if (err < 0)
--				return err;
--		}
--	} else {
--		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
--		brcmf_configure_opensecurity(ifp);
--	}
--
- 	return err;
- }
- 
-@@ -4677,6 +4469,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 	const struct brcmf_tlv *country_ie;
- 	struct brcmf_ssid_le ssid_le;
- 	s32 err = -EPERM;
-+	const struct brcmf_tlv *rsn_ie;
-+	const struct brcmf_vs_tlv *wpa_ie;
- 	struct brcmf_join_params join_params;
- 	enum nl80211_iftype dev_role;
- 	struct brcmf_fil_bss_enable_le bss_enable;
-@@ -4730,6 +4524,36 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 		brcmf_configure_arp_nd_offload(ifp, false);
- 	}
- 
-+	/* find the RSN_IE */
-+	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
-+				  settings->beacon.tail_len, WLAN_EID_RSN);
-+
-+	/* find the WPA_IE */
-+	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
-+				  settings->beacon.tail_len);
-+
-+	if ((wpa_ie != NULL || rsn_ie != NULL)) {
-+		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
-+		if (wpa_ie != NULL) {
-+			/* WPA IE */
-+			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
-+			if (err < 0)
-+				goto exit;
-+		} else {
-+			struct brcmf_vs_tlv *tmp_ie;
-+
-+			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
-+
-+			/* RSN IE */
-+			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
-+			if (err < 0)
-+				goto exit;
-+		}
-+	} else {
-+		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
-+		brcmf_configure_opensecurity(ifp);
-+	}
-+
- 	/* Parameters shared by all radio interfaces */
- 	if (!mbss) {
- 		if ((supports_11d) && (is_11d != ifp->vif->is_11d)) {
-@@ -4762,8 +4586,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 
- 		if ((dev_role == NL80211_IFTYPE_AP) &&
- 		    ((ifp->ifidx == 0) ||
--		     (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB) &&
--		      !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN)))) {
-+		     !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			if (err < 0) {
- 				bphy_err(drvr, "BRCMF_C_DOWN error %d\n",
-@@ -4811,14 +4634,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 			bphy_err(drvr, "BRCMF_C_UP error (%d)\n", err);
- 			goto exit;
- 		}
--
--		err = brcmf_parse_configure_security(ifp, settings,
--						     NL80211_IFTYPE_AP);
--		if (err < 0) {
--			bphy_err(drvr, "brcmf_parse_configure_security error\n");
--			goto exit;
--		}
--
- 		/* On DOWN the firmware removes the WEP keys, reconfigure
- 		 * them if they were set.
- 		 */
-@@ -4851,14 +4666,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 				 chanspec, err);
- 			goto exit;
- 		}
--
--		err = brcmf_parse_configure_security(ifp, settings,
--						     NL80211_IFTYPE_P2P_GO);
--		if (err < 0) {
--			brcmf_err("brcmf_parse_configure_security error\n");
--			goto exit;
--		}
--
- 		err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
- 						sizeof(ssid_le));
- 		if (err < 0) {
-@@ -5031,15 +4838,21 @@ brcmf_cfg80211_change_station(struct wiphy *wiphy, struct net_device *ndev,
- }
- 
- static void
--brcmf_cfg80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
--					       struct wireless_dev *wdev,
--					       struct mgmt_frame_regs *upd)
-+brcmf_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
-+				   struct wireless_dev *wdev,
-+				   u16 frame_type, bool reg)
- {
- 	struct brcmf_cfg80211_vif *vif;
-+	u16 mgmt_type;
- 
--	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
-+	brcmf_dbg(TRACE, "Enter, frame_type %04x, reg=%d\n", frame_type, reg);
- 
--	vif->mgmt_rx_reg = upd->interface_stypes;
-+	mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
-+	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
-+	if (reg)
-+		vif->mgmt_rx_reg |= BIT(mgmt_type);
-+	else
-+		vif->mgmt_rx_reg &= ~BIT(mgmt_type);
- }
- 
- 
-@@ -5454,8 +5267,7 @@ static struct cfg80211_ops brcmf_cfg80211_ops = {
- 	.change_station = brcmf_cfg80211_change_station,
- 	.sched_scan_start = brcmf_cfg80211_sched_scan_start,
- 	.sched_scan_stop = brcmf_cfg80211_sched_scan_stop,
--	.update_mgmt_frame_registrations =
--		brcmf_cfg80211_update_mgmt_frame_registrations,
-+	.mgmt_frame_register = brcmf_cfg80211_mgmt_frame_register,
- 	.mgmt_tx = brcmf_cfg80211_mgmt_tx,
- 	.remain_on_channel = brcmf_p2p_remain_on_channel,
- 	.cancel_remain_on_channel = brcmf_cfg80211_cancel_remain_on_channel,
-@@ -5489,7 +5301,6 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
- 	struct brcmf_cfg80211_vif *vif_walk;
- 	struct brcmf_cfg80211_vif *vif;
- 	bool mbss;
--	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
- 
- 	brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
- 		  sizeof(*vif));
-@@ -5502,8 +5313,7 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
- 
- 	brcmf_init_prof(&vif->profile);
- 
--	if (type == NL80211_IFTYPE_AP &&
--	    brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
-+	if (type == NL80211_IFTYPE_AP) {
- 		mbss = false;
- 		list_for_each_entry(vif_walk, &cfg->vif_list, list) {
- 			if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
-@@ -5542,16 +5352,14 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
- 	u32 event = e->event_code;
- 	u32 status = e->status;
- 
--	if ((vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK ||
--	     vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_SAE) &&
-+	if (vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK &&
- 	    event == BRCMF_E_PSK_SUP &&
- 	    status == BRCMF_E_STATUS_FWSUP_COMPLETED)
- 		set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
- 	if (event == BRCMF_E_SET_SSID && status == BRCMF_E_STATUS_SUCCESS) {
- 		brcmf_dbg(CONN, "Processing set ssid\n");
- 		memcpy(vif->profile.bssid, e->addr, ETH_ALEN);
--		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK &&
--		    vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_SAE)
-+		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK)
- 			return true;
- 
- 		set_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
-@@ -5619,151 +5427,12 @@ static void brcmf_clear_assoc_ies(struct brcmf_cfg80211_info *cfg)
- 	conn_info->resp_ie_len = 0;
- }
- 
--u8 brcmf_map_prio_to_prec(void *config, u8 prio)
--{
--	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
--
--	if (!cfg)
--		return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
--		       (prio ^ 2) : prio;
--
--	/* For those AC(s) with ACM flag set to 1, convert its 4-level priority
--	 * to an 8-level precedence which is the same as BE's
--	 */
--	if (prio > PRIO_8021D_EE &&
--	    cfg->ac_priority[prio] == cfg->ac_priority[PRIO_8021D_BE])
--		return cfg->ac_priority[prio] * 2;
--
--	/* Conversion of 4-level priority to 8-level precedence */
--	if (prio == PRIO_8021D_BE || prio == PRIO_8021D_BK ||
--	    prio == PRIO_8021D_CL || prio == PRIO_8021D_VO)
--		return cfg->ac_priority[prio] * 2;
--	else
--		return cfg->ac_priority[prio] * 2 + 1;
--}
--
--u8 brcmf_map_prio_to_aci(void *config, u8 prio)
--{
--	/* Prio here refers to the 802.1d priority in range of 0 to 7.
--	 * ACI here refers to the WLAN AC Index in range of 0 to 3.
--	 * This function will return ACI corresponding to input prio.
--	 */
--	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
--
--	if (cfg)
--		return cfg->ac_priority[prio];
--
--	return prio;
--}
--
--static void brcmf_init_wmm_prio(u8 *priority)
--{
--	/* Initialize AC priority array to default
--	 * 802.1d priority as per following table:
--	 * 802.1d prio 0,3 maps to BE
--	 * 802.1d prio 1,2 maps to BK
--	 * 802.1d prio 4,5 maps to VI
--	 * 802.1d prio 6,7 maps to VO
--	 */
--	priority[0] = BRCMF_FWS_FIFO_AC_BE;
--	priority[3] = BRCMF_FWS_FIFO_AC_BE;
--	priority[1] = BRCMF_FWS_FIFO_AC_BK;
--	priority[2] = BRCMF_FWS_FIFO_AC_BK;
--	priority[4] = BRCMF_FWS_FIFO_AC_VI;
--	priority[5] = BRCMF_FWS_FIFO_AC_VI;
--	priority[6] = BRCMF_FWS_FIFO_AC_VO;
--	priority[7] = BRCMF_FWS_FIFO_AC_VO;
--}
--
--static void brcmf_wifi_prioritize_acparams(const
--	struct brcmf_cfg80211_edcf_acparam *acp, u8 *priority)
--{
--	u8 aci;
--	u8 aifsn;
--	u8 ecwmin;
--	u8 ecwmax;
--	u8 acm;
--	u8 ranking_basis[EDCF_AC_COUNT];
--	u8 aci_prio[EDCF_AC_COUNT]; /* AC_BE, AC_BK, AC_VI, AC_VO */
--	u8 index;
--
--	for (aci = 0; aci < EDCF_AC_COUNT; aci++, acp++) {
--		aifsn  = acp->ACI & EDCF_AIFSN_MASK;
--		acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0;
--		ecwmin = acp->ECW & EDCF_ECWMIN_MASK;
--		ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT;
--		brcmf_dbg(CONN, "ACI %d aifsn %d acm %d ecwmin %d ecwmax %d\n",
--			  aci, aifsn, acm, ecwmin, ecwmax);
--		/* Default AC_VO will be the lowest ranking value */
--		ranking_basis[aci] = aifsn + ecwmin + ecwmax;
--		/* Initialise priority starting at 0 (AC_BE) */
--		aci_prio[aci] = 0;
--
--		/* If ACM is set, STA can't use this AC as per 802.11.
--		 * Change the ranking to BE
--		 */
--		if (aci != AC_BE && aci != AC_BK && acm == 1)
--			ranking_basis[aci] = ranking_basis[AC_BE];
--	}
--
--	/* Ranking method which works for AC priority
--	 * swapping when values for cwmin, cwmax and aifsn are varied
--	 * Compare each aci_prio against each other aci_prio
--	 */
--	for (aci = 0; aci < EDCF_AC_COUNT; aci++) {
--		for (index = 0; index < EDCF_AC_COUNT; index++) {
--			if (index != aci) {
--				/* Smaller ranking value has higher priority,
--				 * so increment priority for each ACI which has
--				 * a higher ranking value
--				 */
--				if (ranking_basis[aci] < ranking_basis[index])
--					aci_prio[aci]++;
--			}
--		}
--	}
--
--	/* By now, aci_prio[] will be in range of 0 to 3.
--	 * Use ACI prio to get the new priority value for
--	 * each 802.1d traffic type, in this range.
--	 */
--	if (!(aci_prio[AC_BE] == aci_prio[AC_BK] &&
--	      aci_prio[AC_BK] == aci_prio[AC_VI] &&
--	      aci_prio[AC_VI] == aci_prio[AC_VO])) {
--		/* 802.1d 0,3 maps to BE */
--		priority[0] = aci_prio[AC_BE];
--		priority[3] = aci_prio[AC_BE];
--
--		/* 802.1d 1,2 maps to BK */
--		priority[1] = aci_prio[AC_BK];
--		priority[2] = aci_prio[AC_BK];
--
--		/* 802.1d 4,5 maps to VO */
--		priority[4] = aci_prio[AC_VI];
--		priority[5] = aci_prio[AC_VI];
--
--		/* 802.1d 6,7 maps to VO */
--		priority[6] = aci_prio[AC_VO];
--		priority[7] = aci_prio[AC_VO];
--	} else {
--		/* Initialize to default priority */
--		brcmf_init_wmm_prio(priority);
--	}
--
--	brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n",
--		  priority[0], priority[1], priority[2], priority[3]);
--
--	brcmf_dbg(CONN, "Adj prio VI 4->%d, VI 5->%d, VO 6->%d, VO 7->%d\n",
--		  priority[4], priority[5], priority[6], priority[7]);
--}
--
- static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 			       struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct brcmf_cfg80211_assoc_ielen_le *assoc_info;
- 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
--	struct brcmf_cfg80211_edcf_acparam edcf_acparam_info[EDCF_AC_COUNT];
- 	u32 req_len;
- 	u32 resp_len;
- 	s32 err = 0;
-@@ -5812,17 +5481,6 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 			    GFP_KERNEL);
- 		if (!conn_info->resp_ie)
- 			conn_info->resp_ie_len = 0;
--
--		err = brcmf_fil_iovar_data_get(ifp, "wme_ac_sta",
--					       edcf_acparam_info,
--					       sizeof(edcf_acparam_info));
--		if (err) {
--			brcmf_err("could not get wme_ac_sta (%d)\n", err);
--			return err;
--		}
--
--		brcmf_wifi_prioritize_acparams(edcf_acparam_info,
--					       cfg->ac_priority);
- 	} else {
- 		conn_info->resp_ie_len = 0;
- 		conn_info->resp_ie = NULL;
-@@ -5896,11 +5554,6 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
- 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
- 	brcmf_dbg(CONN, "Report roaming result\n");
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) {
--		cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
--		brcmf_dbg(CONN, "Report port authorized\n");
--	}
--
- 	set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
- 	brcmf_dbg(TRACE, "Exit\n");
- 	return err;
-@@ -6239,7 +5892,6 @@ static s32 wl_init_priv(struct brcmf_cfg80211_info *cfg)
- 	mutex_init(&cfg->usr_sync);
- 	brcmf_init_escan(cfg);
- 	brcmf_init_conf(cfg->conf);
--	brcmf_init_wmm_prio(cfg->ac_priority);
- 	init_completion(&cfg->vif_disabled);
- 	return err;
- }
-@@ -6292,17 +5944,19 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
- 	roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL);
- 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_TRIGGER,
- 				     (void *)roamtrigger, sizeof(roamtrigger));
--	if (err)
-+	if (err) {
- 		bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err);
-+		goto roam_setup_done;
-+	}
- 
- 	roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
- 	roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
- 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
- 				     (void *)roam_delta, sizeof(roam_delta));
--	if (err)
-+	if (err) {
- 		bphy_err(drvr, "WLC_SET_ROAM_DELTA error (%d)\n", err);
--
--	return 0;
-+		goto roam_setup_done;
-+	}
- 
- roam_setup_done:
- 	return err;
-@@ -6800,9 +6454,6 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
-  *	#STA <= 1, #AP <= 1, channels = 1, 2 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-  *
-- * no p2p and rsdb:
-- *	#STA <= 2, #AP <= 2, channels = 2, 4 total
-- *
-  * p2p, no mchan, and mbss:
-  *
-  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
-@@ -6814,10 +6465,6 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
-  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-- *
-- * p2p, rsdb, and no mbss:
-- *	#STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-- *	 channels = 2, 4 total
-  */
- static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
-@@ -6825,16 +6472,13 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	struct ieee80211_iface_limit *c0_limits = NULL;
- 	struct ieee80211_iface_limit *p2p_limits = NULL;
- 	struct ieee80211_iface_limit *mbss_limits = NULL;
--	bool mon_flag, mbss, p2p, rsdb, mchan;
--	int i, c, n_combos, n_limits;
-+	bool mbss, p2p;
-+	int i, c, n_combos;
- 
--	mon_flag = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FLAG);
- 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
- 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
--	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
--	mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
- 
--	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
-+	n_combos = 1 + !!p2p + !!mbss;
- 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
- 	if (!combo)
- 		goto err;
-@@ -6842,53 +6486,37 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
- 				 BIT(NL80211_IFTYPE_ADHOC) |
- 				 BIT(NL80211_IFTYPE_AP);
--	if (mon_flag)
--		wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
--	if (p2p)
--		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
--					  BIT(NL80211_IFTYPE_P2P_GO) |
--					  BIT(NL80211_IFTYPE_P2P_DEVICE);
- 
- 	c = 0;
- 	i = 0;
--	n_limits = 1 + mon_flag + (p2p ? 2 : 0) + (rsdb || !p2p);
--	c0_limits = kcalloc(n_limits, sizeof(*c0_limits), GFP_KERNEL);
-+	c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
- 	if (!c0_limits)
- 		goto err;
--
--	combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
--	c0_limits[i].max = 1 + rsdb;
-+	c0_limits[i].max = 1;
- 	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
--	if (mon_flag) {
--		c0_limits[i].max = 1;
--		c0_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
--	}
- 	if (p2p) {
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
-+			combo[c].num_different_channels = 2;
-+		else
-+			combo[c].num_different_channels = 1;
-+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+					  BIT(NL80211_IFTYPE_P2P_GO) |
-+					  BIT(NL80211_IFTYPE_P2P_DEVICE);
- 		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
--		c0_limits[i].max = 1 + rsdb;
-+		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 				       BIT(NL80211_IFTYPE_P2P_GO);
--	}
--	if (p2p && rsdb) {
--		c0_limits[i].max = 2;
--		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
--		combo[c].max_interfaces = 5;
--	} else if (p2p) {
--		combo[c].max_interfaces = i;
--	} else if (rsdb) {
--		c0_limits[i].max = 2;
--		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
--		combo[c].max_interfaces = 3;
- 	} else {
-+		combo[c].num_different_channels = 1;
- 		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
--		combo[c].max_interfaces = i;
- 	}
-+	combo[c].max_interfaces = i;
- 	combo[c].n_limits = i;
- 	combo[c].limits = c0_limits;
- 
--	if (p2p && !rsdb) {
-+	if (p2p) {
- 		c++;
- 		i = 0;
- 		p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
-@@ -6911,20 +6539,14 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	if (mbss) {
- 		c++;
- 		i = 0;
--		n_limits = 1 + mon_flag;
--		mbss_limits = kcalloc(n_limits, sizeof(*mbss_limits),
--				      GFP_KERNEL);
-+		mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
- 		if (!mbss_limits)
- 			goto err;
- 		mbss_limits[i].max = 4;
- 		mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
--		if (mon_flag) {
--			mbss_limits[i].max = 1;
--			mbss_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
--		}
- 		combo[c].beacon_int_infra_match = true;
- 		combo[c].num_different_channels = 1;
--		combo[c].max_interfaces = 4 + mon_flag;
-+		combo[c].max_interfaces = 4;
- 		combo[c].n_limits = i;
- 		combo[c].limits = mbss_limits;
- 	}
-@@ -7042,9 +6664,6 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK);
- 		wiphy_ext_feature_set(wiphy,
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X);
--		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
--			wiphy_ext_feature_set(wiphy,
--					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
- 	}
- 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
- 	wiphy->max_remain_on_channel_duration = 5000;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 333fdf394f95a..14d5bbad1db13 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -23,23 +23,6 @@
- #define WL_ROAM_TRIGGER_LEVEL		-75
- #define WL_ROAM_DELTA			20
- 
--/* WME Access Category Indices (ACIs) */
--#define AC_BE			0	/* Best Effort */
--#define AC_BK			1	/* Background */
--#define AC_VI			2	/* Video */
--#define AC_VO			3	/* Voice */
--#define EDCF_AC_COUNT		4
--#define MAX_8021D_PRIO		8
--
--#define EDCF_ACI_MASK			0x60
--#define EDCF_ACI_SHIFT			5
--#define EDCF_ACM_MASK                  0x10
--#define EDCF_ECWMIN_MASK		0x0f
--#define EDCF_ECWMAX_SHIFT		4
--#define EDCF_AIFSN_MASK			0x0f
--#define EDCF_AIFSN_MAX			15
--#define EDCF_ECWMAX_MASK		0xf0
--
- /* Keep BRCMF_ESCAN_BUF_SIZE below 64K (65536). Allocing over 64K can be
-  * problematic on some systems and should be avoided.
-  */
-@@ -124,8 +107,7 @@ struct brcmf_cfg80211_security {
- enum brcmf_profile_fwsup {
- 	BRCMF_PROFILE_FWSUP_NONE,
- 	BRCMF_PROFILE_FWSUP_PSK,
--	BRCMF_PROFILE_FWSUP_1X,
--	BRCMF_PROFILE_FWSUP_SAE
-+	BRCMF_PROFILE_FWSUP_1X
- };
- 
- /**
-@@ -140,7 +122,6 @@ struct brcmf_cfg80211_profile {
- 	struct brcmf_cfg80211_security sec;
- 	struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
- 	enum brcmf_profile_fwsup use_fwsup;
--	bool is_ft;
- };
- 
- /**
-@@ -170,23 +151,19 @@ enum brcmf_vif_status {
-  * @probe_req_ie: IE info for probe request.
-  * @probe_res_ie: IE info for probe response.
-  * @beacon_ie: IE info for beacon frame.
-- * @assoc_res_ie: IE info for association response frame.
-  * @probe_req_ie_len: IE info length for probe request.
-  * @probe_res_ie_len: IE info length for probe response.
-  * @beacon_ie_len: IE info length for beacon frame.
-- * @assoc_res_ie_len: IE info length for association response frame.
-  */
- struct vif_saved_ie {
- 	u8  probe_req_ie[IE_MAX_LEN];
- 	u8  probe_res_ie[IE_MAX_LEN];
- 	u8  beacon_ie[IE_MAX_LEN];
- 	u8  assoc_req_ie[IE_MAX_LEN];
--	u8  assoc_res_ie[IE_MAX_LEN];
- 	u32 probe_req_ie_len;
- 	u32 probe_res_ie_len;
- 	u32 beacon_ie_len;
- 	u32 assoc_req_ie_len;
--	u32 assoc_res_ie_len;
- };
- 
- /**
-@@ -226,12 +203,6 @@ struct brcmf_cfg80211_assoc_ielen_le {
- 	__le32 resp_len;
- };
- 
--struct brcmf_cfg80211_edcf_acparam {
--	u8 ACI;
--	u8 ECW;
--	u16 TXOP;        /* stored in network order (ls octet first) */
--};
--
- /* dongle escan state */
- enum wl_escan_state {
- 	WL_ESCAN_STATE_IDLE,
-@@ -350,7 +321,6 @@ struct brcmf_cfg80211_info {
- 	struct brcmf_assoclist_le assoclist;
- 	struct brcmf_cfg80211_wowl wowl;
- 	struct brcmf_pno_info *pno;
--	u8 ac_priority[MAX_8021D_PRIO];
- };
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index a3a2570896967..dd586a96b57a6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -433,25 +433,11 @@ static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset,
- {
- 	struct brcmf_chip_priv *ci;
- 	int count;
--	struct brcmf_core *d11core2 = NULL;
--	struct brcmf_core_priv *d11priv2 = NULL;
- 
- 	ci = core->chip;
- 
--	/* special handle two D11 cores reset */
--	if (core->pub.id == BCMA_CORE_80211) {
--		d11core2 = brcmf_chip_get_d11core(&ci->pub, 1);
--		if (d11core2) {
--			brcmf_dbg(INFO, "found two d11 cores, reset both\n");
--			d11priv2 = container_of(d11core2,
--						struct brcmf_core_priv, pub);
--		}
--	}
--
- 	/* must disable first to work for arbitrary current core state */
- 	brcmf_chip_ai_coredisable(core, prereset, reset);
--	if (d11priv2)
--		brcmf_chip_ai_coredisable(d11priv2, prereset, reset);
- 
- 	count = 0;
- 	while (ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL) &
-@@ -463,30 +449,9 @@ static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset,
- 		usleep_range(40, 60);
- 	}
- 
--	if (d11priv2) {
--		count = 0;
--		while (ci->ops->read32(ci->ctx,
--				       d11priv2->wrapbase + BCMA_RESET_CTL) &
--				       BCMA_RESET_CTL_RESET) {
--			ci->ops->write32(ci->ctx,
--					 d11priv2->wrapbase + BCMA_RESET_CTL,
--					 0);
--			count++;
--			if (count > 50)
--				break;
--			usleep_range(40, 60);
--		}
--	}
--
- 	ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
- 			 postreset | BCMA_IOCTL_CLK);
- 	ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL);
--
--	if (d11priv2) {
--		ci->ops->write32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL,
--				 postreset | BCMA_IOCTL_CLK);
--		ci->ops->read32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL);
--	}
- }
- 
- char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
-@@ -712,6 +677,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
- 	case BRCM_CC_43569_CHIP_ID:
- 	case BRCM_CC_43570_CHIP_ID:
- 	case BRCM_CC_4358_CHIP_ID:
-+	case BRCM_CC_4359_CHIP_ID:
- 	case BRCM_CC_43602_CHIP_ID:
- 	case BRCM_CC_4371_CHIP_ID:
- 		return 0x180000;
-@@ -721,9 +687,6 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
- 	case BRCM_CC_4366_CHIP_ID:
- 	case BRCM_CC_43664_CHIP_ID:
- 		return 0x200000;
--	case BRCM_CC_4359_CHIP_ID:
--		return (ci->pub.chiprev < 9) ? 0x180000 : 0x160000;
--	case BRCM_CC_4364_CHIP_ID:
- 	case CY_CC_4373_CHIP_ID:
- 		return 0x160000;
- 	default:
-@@ -815,6 +778,7 @@ static int brcmf_chip_dmp_get_regaddr(struct brcmf_chip_priv *ci, u32 *eromaddr,
- {
- 	u8 desc;
- 	u32 val, szdesc;
-+	u8 mpnum = 0;
- 	u8 stype, sztype, wraptype;
- 
- 	*regbase = 0;
-@@ -822,6 +786,7 @@ static int brcmf_chip_dmp_get_regaddr(struct brcmf_chip_priv *ci, u32 *eromaddr,
- 
- 	val = brcmf_chip_dmp_get_desc(ci, eromaddr, &desc);
- 	if (desc == DMP_DESC_MASTER_PORT) {
-+		mpnum = (val & DMP_MASTER_PORT_NUM) >> DMP_MASTER_PORT_NUM_S;
- 		wraptype = DMP_SLAVE_TYPE_MWRAP;
- 	} else if (desc == DMP_DESC_ADDRESS) {
- 		/* revert erom address */
-@@ -889,7 +854,7 @@ int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv *ci)
- 	u8 desc_type = 0;
- 	u32 val;
- 	u16 id;
--	u8 nmw, nsw, rev;
-+	u8 nmp, nsp, nmw, nsw, rev;
- 	u32 base, wrap;
- 	int err;
- 
-@@ -915,6 +880,8 @@ int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv *ci)
- 			return -EFAULT;
- 
- 		/* only look at cores with master port(s) */
-+		nmp = (val & DMP_COMP_NUM_MPORT) >> DMP_COMP_NUM_MPORT_S;
-+		nsp = (val & DMP_COMP_NUM_SPORT) >> DMP_COMP_NUM_SPORT_S;
- 		nmw = (val & DMP_COMP_NUM_MWRAP) >> DMP_COMP_NUM_MWRAP_S;
- 		nsw = (val & DMP_COMP_NUM_SWRAP) >> DMP_COMP_NUM_SWRAP_S;
- 		rev = (val & DMP_COMP_REVISION) >> DMP_COMP_REVISION_S;
-@@ -1146,21 +1113,6 @@ void brcmf_chip_detach(struct brcmf_chip *pub)
- 	kfree(chip);
- }
- 
--struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit)
--{
--	struct brcmf_chip_priv *chip;
--	struct brcmf_core_priv *core;
--
--	chip = container_of(pub, struct brcmf_chip_priv, pub);
--	list_for_each_entry(core, &chip->cores, list) {
--		if (core->pub.id == BCMA_CORE_80211) {
--			if (unit-- == 0)
--				return &core->pub;
--		}
--	}
--	return NULL;
--}
--
- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *pub, u16 coreid)
- {
- 	struct brcmf_chip_priv *chip;
-@@ -1409,7 +1361,6 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
- 		addr = CORE_CC_REG(base, sr_control0);
- 		reg = chip->ops->read32(chip->ctx, addr);
- 		return (reg & CC_SR_CTL0_ENABLE_MASK) != 0;
--	case BRCM_CC_4359_CHIP_ID:
- 	case CY_CC_43012_CHIP_ID:
- 		addr = CORE_CC_REG(pmu->base, retention_ctl);
- 		reg = chip->ops->read32(chip->ctx, addr);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-index 8fa38658e727a..7b00f6a59e89e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-@@ -74,7 +74,6 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx,
- 				     const struct brcmf_buscore_ops *ops);
- void brcmf_chip_detach(struct brcmf_chip *chip);
- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid);
--struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit);
- struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip);
- struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub);
- bool brcmf_chip_iscoreup(struct brcmf_core *core);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-index 8b5f49997c8b5..144cf4570bc3e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-@@ -72,8 +72,4 @@ static inline void
- brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev) {}
- #endif
- 
--u8 brcmf_map_prio_to_prec(void *cfg, u8 prio);
--
--u8 brcmf_map_prio_to_aci(void *cfg, u8 prio);
--
- #endif /* BRCMFMAC_COMMON_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/commonring.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/commonring.c
-index e44236cb210eb..49db54d23e038 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/commonring.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/commonring.c
-@@ -180,8 +180,14 @@ brcmf_commonring_reserve_for_write_multiple(struct brcmf_commonring *commonring,
- 
- int brcmf_commonring_write_complete(struct brcmf_commonring *commonring)
- {
--	if (commonring->f_ptr > commonring->w_ptr)
-+	void *address;
-+
-+	address = commonring->buf_addr;
-+	address += (commonring->f_ptr * commonring->item_len);
-+	if (commonring->f_ptr > commonring->w_ptr) {
-+		address = commonring->buf_addr;
- 		commonring->f_ptr = 0;
-+	}
- 
- 	commonring->f_ptr = commonring->w_ptr;
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index c88655acc78c7..85cf96461ddeb 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -579,6 +579,9 @@ static int brcmf_netdev_stop(struct net_device *ndev)
- 
- 	brcmf_cfg80211_down(ndev);
- 
-+	if (ifp->drvr->bus_if->state == BRCMF_BUS_UP)
-+		brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0);
-+
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	return 0;
-@@ -658,8 +661,6 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
- 		goto fail;
- 	}
- 
--	netif_carrier_off(ndev);
--
- 	ndev->priv_destructor = brcmf_cfg80211_free_netdev;
- 	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
- 	return 0;
-@@ -670,7 +671,7 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
- 	return -EBADE;
- }
- 
--void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
-+static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
- {
- 	if (ndev->reg_state == NETREG_REGISTERED) {
- 		if (rtnl_locked)
-@@ -683,81 +684,6 @@ void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
- 	}
- }
- 
--static int brcmf_net_mon_open(struct net_device *ndev)
--{
--	struct brcmf_if *ifp = netdev_priv(ndev);
--	struct brcmf_pub *drvr = ifp->drvr;
--	u32 monitor;
--	int err;
--
--	brcmf_dbg(TRACE, "Enter\n");
--
--	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_MONITOR, &monitor);
--	if (err) {
--		bphy_err(drvr, "BRCMF_C_GET_MONITOR error (%d)\n", err);
--		return err;
--	} else if (monitor) {
--		bphy_err(drvr, "Monitor mode is already enabled\n");
--		return -EEXIST;
--	}
--
--	monitor = 3;
--	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
--	if (err)
--		bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
--
--	return err;
--}
--
--static int brcmf_net_mon_stop(struct net_device *ndev)
--{
--	struct brcmf_if *ifp = netdev_priv(ndev);
--	struct brcmf_pub *drvr = ifp->drvr;
--	u32 monitor;
--	int err;
--
--	brcmf_dbg(TRACE, "Enter\n");
--
--	monitor = 0;
--	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_MONITOR, monitor);
--	if (err)
--		bphy_err(drvr, "BRCMF_C_SET_MONITOR error (%d)\n", err);
--
--	return err;
--}
--
--static netdev_tx_t brcmf_net_mon_start_xmit(struct sk_buff *skb,
--					    struct net_device *ndev)
--{
--	dev_kfree_skb_any(skb);
--
--	return NETDEV_TX_OK;
--}
--
--static const struct net_device_ops brcmf_netdev_ops_mon = {
--	.ndo_open = brcmf_net_mon_open,
--	.ndo_stop = brcmf_net_mon_stop,
--	.ndo_start_xmit = brcmf_net_mon_start_xmit,
--};
--
--int brcmf_net_mon_attach(struct brcmf_if *ifp)
--{
--	struct brcmf_pub *drvr = ifp->drvr;
--	struct net_device *ndev;
--	int err;
--
--	brcmf_dbg(TRACE, "Enter\n");
--
--	ndev = ifp->ndev;
--	ndev->netdev_ops = &brcmf_netdev_ops_mon;
--
--	err = register_netdevice(ndev);
--	if (err)
--		bphy_err(drvr, "Failed to register %s device\n", ndev->name);
--
--	return err;
--}
--
- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
- {
- 	struct net_device *ndev;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-index 33b2ab3b54b09..6699637d3bf8c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -210,8 +210,6 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
- void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
- void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
--void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked);
--int brcmf_net_mon_attach(struct brcmf_if *ifp);
- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
- int __init brcmf_core_init(void);
- void __exit brcmf_core_exit(void);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-index eecf8a38d94aa..120515fe8250f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-@@ -47,10 +47,13 @@ struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
- 	return drvr->wiphy->debugfsdir;
- }
- 
--void brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
-+int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
- 			    int (*read_fn)(struct seq_file *seq, void *data))
- {
-+	struct dentry *e;
-+
- 	WARN(!drvr->wiphy->debugfsdir, "wiphy not (yet) registered\n");
--	debugfs_create_devm_seqfile(drvr->bus_if->dev, fn,
--				    drvr->wiphy->debugfsdir, read_fn);
-+	e = debugfs_create_devm_seqfile(drvr->bus_if->dev, fn,
-+					drvr->wiphy->debugfsdir, read_fn);
-+	return PTR_ERR_OR_ZERO(e);
- }
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-index 4146faeed3449..9b221b509ade5 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-@@ -116,8 +116,8 @@ struct brcmf_bus;
- struct brcmf_pub;
- #ifdef DEBUG
- struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
--void brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
--			     int (*read_fn)(struct seq_file *seq, void *data));
-+int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
-+			    int (*read_fn)(struct seq_file *seq, void *data));
- int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 			       size_t len);
- #else
-@@ -126,9 +126,11 @@ static inline struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
- 	return ERR_PTR(-ENOENT);
- }
- static inline
--void brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
--			     int (*read_fn)(struct seq_file *seq, void *data))
--{ }
-+int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
-+			    int (*read_fn)(struct seq_file *seq, void *data))
-+{
-+	return 0;
-+}
- static inline
- int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 			       size_t len)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-index 0dcefbd0c0003..2c3526aeca6fc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-@@ -38,10 +38,8 @@ static const struct brcmf_feat_fwcap brcmf_fwcap_map[] = {
- 	{ BRCMF_FEAT_MCHAN, "mchan" },
- 	{ BRCMF_FEAT_P2P, "p2p" },
- 	{ BRCMF_FEAT_MONITOR, "monitor" },
--	{ BRCMF_FEAT_MONITOR_FLAG, "rtap" },
- 	{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
--	{ BRCMF_FEAT_DOT11H, "802.11h" },
--	{ BRCMF_FEAT_SAE, "sae" },
-+	{ BRCMF_FEAT_DOT11H, "802.11h" }
- };
- 
- #ifdef DEBUG
-@@ -285,14 +283,13 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
- 	if (!err)
- 		ifp->drvr->feat_flags |= BIT(BRCMF_FEAT_SCAN_RANDOM_MAC);
- 
--	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_FWSUP, "sup_wpa");
--
- 	if (drvr->settings->feature_disable) {
- 		brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n",
- 			  ifp->drvr->feat_flags,
- 			  drvr->settings->feature_disable);
- 		ifp->drvr->feat_flags &= ~drvr->settings->feature_disable;
- 	}
-+	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_FWSUP, "sup_wpa");
- 
- 	brcmf_feat_firmware_overrides(drvr);
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-index cda3fc1bab7f3..736a8179f62f6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-@@ -23,11 +23,9 @@
-  * GSCAN: enhanced scan offload feature.
-  * FWSUP: Firmware supplicant.
-  * MONITOR: firmware can pass monitor packets to host.
-- * MONITOR_FLAG: firmware flags monitor packets.
-  * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
-  * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
-  * DOT11H: firmware supports 802.11h
-- * SAE: simultaneous authentication of equals
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
-@@ -45,11 +43,9 @@
- 	BRCMF_FEAT_DEF(GSCAN) \
- 	BRCMF_FEAT_DEF(FWSUP) \
- 	BRCMF_FEAT_DEF(MONITOR) \
--	BRCMF_FEAT_DEF(MONITOR_FLAG) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
--	BRCMF_FEAT_DEF(DOT11H) \
--	BRCMF_FEAT_DEF(SAE)
-+	BRCMF_FEAT_DEF(DOT11H)
- 
- /*
-  * Quirks:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-index 46c66415b4a67..3347439543bb0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-@@ -60,7 +60,7 @@ struct brcmf_fw_request {
- 	u16 bus_nr;
- 	u32 n_items;
- 	const char *board_type;
--	struct brcmf_fw_item items[];
-+	struct brcmf_fw_item items[0];
- };
- 
- struct brcmf_fw_name {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-index 096f6b969dd83..8e9d067bdfed0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-@@ -26,10 +26,10 @@
- #define BRCMF_FLOWRING_HASH_STA(fifo, ifidx) (fifo + ifidx * 16)
- 
- static const u8 brcmf_flowring_prio2fifo[] = {
--	0,
--	1,
- 	1,
- 	0,
-+	0,
-+	1,
- 	2,
- 	2,
- 	3,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-index a5cced2c89ac6..79c8a858b6d6f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-@@ -32,7 +32,7 @@ struct brcmf_fweh_queue_item {
- 	u8 ifaddr[ETH_ALEN];
- 	struct brcmf_event_msg_be emsg;
- 	u32 datalen;
--	u8 data[];
-+	u8 data[0];
- };
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-index ae4cf43729086..0ff6f5212a94d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-@@ -49,8 +49,6 @@
- #define BRCMF_C_GET_PM				85
- #define BRCMF_C_SET_PM				86
- #define BRCMF_C_GET_REVINFO			98
--#define BRCMF_C_GET_MONITOR			107
--#define BRCMF_C_SET_MONITOR			108
- #define BRCMF_C_GET_CURR_RATESET		114
- #define BRCMF_C_GET_AP				117
- #define BRCMF_C_SET_AP				118
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-index de0ef1b545c4f..37c512036e0e3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -61,8 +61,6 @@
- #define BRCMF_WSEC_MAX_PSK_LEN		32
- #define	BRCMF_WSEC_PASSPHRASE		BIT(0)
- 
--#define BRCMF_WSEC_MAX_SAE_PASSWORD_LEN 128
--
- /* primary (ie tx) key */
- #define BRCMF_PRIMARY_KEY		(1 << 1)
- #define DOT11_BSSTYPE_ANY		2
-@@ -520,17 +518,6 @@ struct brcmf_wsec_pmk_le {
- 	u8 key[2 * BRCMF_WSEC_MAX_PSK_LEN + 1];
- };
- 
--/**
-- * struct brcmf_wsec_sae_pwd_le - firmware SAE password material.
-- *
-- * @key_len: number of octets in key materials.
-- * @key: SAE password material.
-- */
--struct brcmf_wsec_sae_pwd_le {
--	__le16 key_len;
--	u8 key[BRCMF_WSEC_MAX_SAE_PASSWORD_LEN];
--};
--
- /* Used to get specific STA parameters */
- struct brcmf_scb_val_le {
- 	__le32 val;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 09701262330d6..2bd892df83cc5 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -311,6 +311,28 @@ struct brcmf_skbuff_cb {
- /* How long to defer borrowing in jiffies */
- #define BRCMF_FWS_BORROW_DEFER_PERIOD		(HZ / 10)
- 
-+/**
-+ * enum brcmf_fws_fifo - fifo indices used by dongle firmware.
-+ *
-+ * @BRCMF_FWS_FIFO_FIRST: first fifo, ie. background.
-+ * @BRCMF_FWS_FIFO_AC_BK: fifo for background traffic.
-+ * @BRCMF_FWS_FIFO_AC_BE: fifo for best-effort traffic.
-+ * @BRCMF_FWS_FIFO_AC_VI: fifo for video traffic.
-+ * @BRCMF_FWS_FIFO_AC_VO: fifo for voice traffic.
-+ * @BRCMF_FWS_FIFO_BCMC: fifo for broadcast/multicast (AP only).
-+ * @BRCMF_FWS_FIFO_ATIM: fifo for ATIM (AP only).
-+ * @BRCMF_FWS_FIFO_COUNT: number of fifos.
-+ */
-+enum brcmf_fws_fifo {
-+	BRCMF_FWS_FIFO_FIRST,
-+	BRCMF_FWS_FIFO_AC_BK = BRCMF_FWS_FIFO_FIRST,
-+	BRCMF_FWS_FIFO_AC_BE,
-+	BRCMF_FWS_FIFO_AC_VI,
-+	BRCMF_FWS_FIFO_AC_VO,
-+	BRCMF_FWS_FIFO_BCMC,
-+	BRCMF_FWS_FIFO_ATIM,
-+	BRCMF_FWS_FIFO_COUNT
-+};
- 
- /**
-  * enum brcmf_fws_txstatus - txstatus flag values.
-@@ -382,7 +404,7 @@ struct brcmf_fws_mac_descriptor {
- 	u8 traffic_lastreported_bmp;
- };
- 
--#define BRCMF_FWS_HANGER_MAXITEMS	3072
-+#define BRCMF_FWS_HANGER_MAXITEMS	1024
- 
- /**
-  * enum brcmf_fws_hanger_item_state - state of hanger item.
-@@ -886,7 +908,7 @@ static u8 brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb)
- 	wlh += wlh[1] + 2;
- 
- 	if (entry->send_tim_signal) {
--		entry->send_tim_signal = false;
-+		entry->send_tim_signal = 0;
- 		wlh[0] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP;
- 		wlh[1] = BRCMF_FWS_TYPE_PENDING_TRAFFIC_BMP_LEN;
- 		wlh[2] = entry->mac_handle;
-@@ -2108,10 +2130,8 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
- 	skcb->if_flags = 0;
- 	skcb->state = BRCMF_FWS_SKBSTATE_NEW;
- 	brcmf_skb_if_flags_set_field(skb, INDEX, ifp->ifidx);
--
--	/* mapping from 802.1d priority to firmware fifo index */
- 	if (!multicast)
--		fifo = brcmf_map_prio_to_aci(drvr->config, skb->priority);
-+		fifo = brcmf_fws_prio2fifo[skb->priority];
- 
- 	brcmf_fws_lock(fws);
- 	if (fifo != BRCMF_FWS_FIFO_AC_BE && fifo < BRCMF_FWS_FIFO_BCMC)
-@@ -2125,7 +2145,8 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
- 		brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb);
- 		brcmf_fws_schedule_deq(fws);
- 	} else {
--		bphy_err(drvr, "no hanger slot available\n");
-+		bphy_err(drvr, "drop skb: no hanger slot\n");
-+		brcmf_txfinalize(ifp, skb, false);
- 		rc = -ENOMEM;
- 	}
- 	brcmf_fws_unlock(fws);
-@@ -2336,7 +2357,7 @@ struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr)
- 	fws->drvr = drvr;
- 	fws->fcmode = drvr->settings->fcmode;
- 
--	if (!drvr->bus_if->always_use_fws_queue &&
-+	if ((drvr->bus_if->always_use_fws_queue == false) &&
- 	    (fws->fcmode == BRCMF_FWS_FCMODE_NONE)) {
- 		fws->avoid_queueing = true;
- 		brcmf_dbg(INFO, "FWS queueing will be avoided\n");
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-index b16a9d1c0508e..b486d578ec963 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-@@ -6,29 +6,6 @@
- #ifndef FWSIGNAL_H_
- #define FWSIGNAL_H_
- 
--/**
-- * enum brcmf_fws_fifo - fifo indices used by dongle firmware.
-- *
-- * @BRCMF_FWS_FIFO_FIRST: first fifo, ie. background.
-- * @BRCMF_FWS_FIFO_AC_BK: fifo for background traffic.
-- * @BRCMF_FWS_FIFO_AC_BE: fifo for best-effort traffic.
-- * @BRCMF_FWS_FIFO_AC_VI: fifo for video traffic.
-- * @BRCMF_FWS_FIFO_AC_VO: fifo for voice traffic.
-- * @BRCMF_FWS_FIFO_BCMC: fifo for broadcast/multicast (AP only).
-- * @BRCMF_FWS_FIFO_ATIM: fifo for ATIM (AP only).
-- * @BRCMF_FWS_FIFO_COUNT: number of fifos.
-- */
--enum brcmf_fws_fifo {
--	BRCMF_FWS_FIFO_FIRST,
--	BRCMF_FWS_FIFO_AC_BK = BRCMF_FWS_FIFO_FIRST,
--	BRCMF_FWS_FIFO_AC_BE,
--	BRCMF_FWS_FIFO_AC_VI,
--	BRCMF_FWS_FIFO_AC_VO,
--	BRCMF_FWS_FIFO_BCMC,
--	BRCMF_FWS_FIFO_ATIM,
--	BRCMF_FWS_FIFO_COUNT
--};
--
- struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
- void brcmf_fws_detach(struct brcmf_fws_info *fws);
- void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index 8bb4f1fa790e7..e3dd8623be4ec 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -365,7 +365,7 @@ brcmf_msgbuf_get_pktid(struct device *dev, struct brcmf_msgbuf_pktids *pktids,
- 	struct brcmf_msgbuf_pktid *pktid;
- 	struct sk_buff *skb;
- 
--	if (idx >= pktids->array_size) {
-+	if (idx < 0 || idx >= pktids->array_size) {
- 		brcmf_err("Invalid packet id %d (max %d)\n", idx,
- 			  pktids->array_size);
- 		return NULL;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index d2795dc17c464..7ba9f6a686459 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -17,7 +17,6 @@
- #include "fwil_types.h"
- #include "p2p.h"
- #include "cfg80211.h"
--#include "feature.h"
- 
- /* parameters used for p2p escan */
- #define P2PAPI_SCAN_NPROBES 1
-@@ -60,13 +59,12 @@
- #define P2P_AF_MIN_DWELL_TIME		100
- #define P2P_AF_MED_DWELL_TIME		400
- #define P2P_AF_LONG_DWELL_TIME		1000
--#define P2P_AF_TX_MAX_RETRY		5
-+#define P2P_AF_TX_MAX_RETRY		1
- #define P2P_AF_MAX_WAIT_TIME		msecs_to_jiffies(2000)
- #define P2P_INVALID_CHANNEL		-1
- #define P2P_CHANNEL_SYNC_RETRY		5
- #define P2P_AF_FRM_SCAN_MAX_WAIT	msecs_to_jiffies(450)
- #define P2P_DEFAULT_SLEEP_TIME_VSDB	200
--#define P2P_AF_RETRY_DELAY_TIME		40
- 
- /* WiFi P2P Public Action Frame OUI Subtypes */
- #define P2P_PAF_GON_REQ		0	/* Group Owner Negotiation Req */
-@@ -94,9 +92,6 @@
- #define P2PSD_ACTION_ID_GAS_CRESP	0x0d	/* GAS Comback Response AF */
- 
- #define BRCMF_P2P_DISABLE_TIMEOUT	msecs_to_jiffies(500)
--
--/* Mask for retry counter of custom dwell time */
--#define CUSTOM_RETRY_MASK 0xff000000
- /**
-  * struct brcmf_p2p_disc_st_le - set discovery state in firmware.
-  *
-@@ -462,21 +457,10 @@ static int brcmf_p2p_set_firmware(struct brcmf_if *ifp, u8 *p2p_mac)
-  */
- static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- {
--	struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
- 	bool random_addr = false;
--	bool local_admin = false;
- 
--	if (!dev_addr || is_zero_ether_addr(dev_addr)) {
--		/* If the primary interface address is already locally
--		 * administered, create a new random address.
--		 */
--		if (pri_ifp->mac_addr[0] & 0x02) {
--			random_addr = true;
--		} else {
--			dev_addr = pri_ifp->mac_addr;
--			local_admin = true;
--		}
--	}
-+	if (!dev_addr || is_zero_ether_addr(dev_addr))
-+		random_addr = true;
- 
- 	/* Generate the P2P Device Address obtaining a random ethernet
- 	 * address with the locally administered bit set.
-@@ -486,20 +470,13 @@ static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- 	else
- 		memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
- 
--	if (local_admin)
--		p2p->dev_addr[0] |= 0x02;
--
- 	/* Generate the P2P Interface Address.  If the discovery and connection
- 	 * BSSCFGs need to simultaneously co-exist, then this address must be
- 	 * different from the P2P Device Address, but also locally administered.
- 	 */
--	memcpy(p2p->conn_int_addr, p2p->dev_addr, ETH_ALEN);
--	p2p->conn_int_addr[0] |= 0x02;
--	p2p->conn_int_addr[4] ^= 0x80;
--
--	memcpy(p2p->conn2_int_addr, p2p->dev_addr, ETH_ALEN);
--	p2p->conn2_int_addr[0] |= 0x02;
--	p2p->conn2_int_addr[4] ^= 0x90;
-+	memcpy(p2p->int_addr, p2p->dev_addr, ETH_ALEN);
-+	p2p->int_addr[0] |= 0x02;
-+	p2p->int_addr[4] ^= 0x80;
- }
- 
- /**
-@@ -1267,30 +1244,6 @@ bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- 	return true;
- }
- 
--/**
-- * brcmf_p2p_abort_action_frame() - abort action frame.
-- *
-- * @cfg: common configuration struct.
-- *
-- */
--static s32 brcmf_p2p_abort_action_frame(struct brcmf_cfg80211_info *cfg)
--{
--	struct brcmf_p2p_info *p2p = &cfg->p2p;
--	struct brcmf_cfg80211_vif *vif;
--	s32 err;
--	s32 int_val = 1;
--
--	brcmf_dbg(TRACE, "Enter\n");
--
--	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
--	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe_abort", &int_val,
--					sizeof(s32));
--	if (err)
--		brcmf_err(" aborting action frame has failed (%d)\n", err);
--
--	return err;
--}
--
- /**
-  * brcmf_p2p_stop_wait_next_action_frame() - finish scan if af tx complete.
-  *
-@@ -1302,7 +1255,6 @@ brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg)
- {
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
- 	struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
--	s32 err;
- 
- 	if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) &&
- 	    (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) ||
-@@ -1311,13 +1263,8 @@ brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg)
- 		/* if channel is not zero, "actfame" uses off channel scan.
- 		 * So abort scan for off channel completion.
- 		 */
--		if (p2p->af_sent_channel) {
--			/* abort actframe using actframe_abort or abort scan */
--			err = brcmf_p2p_abort_action_frame(cfg);
--			if (err)
--				brcmf_notify_escan_complete(cfg, ifp, true,
--							    true);
--		}
-+		if (p2p->af_sent_channel)
-+			brcmf_notify_escan_complete(cfg, ifp, true, true);
- 	} else if (test_bit(BRCMF_P2P_STATUS_WAITING_NEXT_AF_LISTEN,
- 			    &p2p->status)) {
- 		brcmf_dbg(TRACE, "*** Wake UP ** abort listen for next af frame\n");
-@@ -1544,7 +1491,6 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
- {
- 	struct brcmf_pub *drvr = p2p->cfg->pub;
- 	struct brcmf_cfg80211_vif *vif;
--	struct brcmf_p2p_action_frame *p2p_af;
- 	s32 err = 0;
- 	s32 timeout = 0;
- 
-@@ -1554,13 +1500,7 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
- 
--	/* check if it is a p2p_presence response */
--	p2p_af = (struct brcmf_p2p_action_frame *)af_params->action_frame.data;
--	if (p2p_af->subtype == P2P_AF_PRESENCE_RSP)
--		vif = p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif;
--	else
--		vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
--
-+	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
- 	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe", af_params,
- 					sizeof(*af_params));
- 	if (err) {
-@@ -1700,17 +1640,6 @@ static s32 brcmf_p2p_pub_af_tx(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
--static bool brcmf_p2p_check_dwell_overflow(s32 requested_dwell,
--					   unsigned long dwell_jiffies)
--{
--	if ((requested_dwell & CUSTOM_RETRY_MASK) &&
--	    (jiffies_to_msecs(jiffies - dwell_jiffies) >
--	    (requested_dwell & ~CUSTOM_RETRY_MASK))) {
--		brcmf_err("Action frame TX retry time over dwell time!\n");
--		return true;
--	}
--	return false;
--}
- /**
-  * brcmf_p2p_send_action_frame() - send action frame .
-  *
-@@ -1735,10 +1664,6 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	s32 tx_retry;
- 	s32 extra_listen_time;
- 	uint delta_ms;
--	unsigned long dwell_jiffies = 0;
--	bool dwell_overflow = false;
--
--	s32 requested_dwell = af_params->dwell_time;
- 
- 	action_frame = &af_params->action_frame;
- 	action_frame_len = le16_to_cpu(action_frame->len);
-@@ -1850,23 +1775,14 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 		/* update channel */
- 		af_params->channel = cpu_to_le32(afx_hdl->peer_chan);
- 	}
--	dwell_jiffies = jiffies;
--	dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
--							dwell_jiffies);
- 
- 	tx_retry = 0;
- 	while (!p2p->block_gon_req_tx &&
--	       (!ack) && (tx_retry < P2P_AF_TX_MAX_RETRY) &&
--		!dwell_overflow) {
--		if (af_params->channel)
--			msleep(P2P_AF_RETRY_DELAY_TIME);
--
-+	       (ack == false) && (tx_retry < P2P_AF_TX_MAX_RETRY)) {
- 		ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
- 		tx_retry++;
--		dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
--								dwell_jiffies);
- 	}
--	if (!ack) {
-+	if (ack == false) {
- 		bphy_err(drvr, "Failed to send Action Frame(retry %d)\n",
- 			 tx_retry);
- 		clear_bit(BRCMF_P2P_STATUS_GO_NEG_PHASE, &p2p->status);
-@@ -2078,7 +1994,7 @@ int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg,
- 
- 	if_request.type = cpu_to_le16((u16)if_type);
- 	if_request.chspec = cpu_to_le16(chanspec);
--	memcpy(if_request.addr, p2p->conn_int_addr, sizeof(if_request.addr));
-+	memcpy(if_request.addr, p2p->int_addr, sizeof(if_request.addr));
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 	err = brcmf_fil_iovar_data_set(vif->ifp, "p2p_ifupd", &if_request,
-@@ -2176,8 +2092,7 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
- 	/* firmware requires unique mac address for p2pdev interface */
- 	if (addr && ether_addr_equal(addr, pri_ifp->mac_addr)) {
- 		bphy_err(drvr, "discovery vif must be different from primary interface\n");
--		err = -EINVAL;
--		goto fail;
-+		return ERR_PTR(-EINVAL);
- 	}
- 
- 	brcmf_p2p_generate_bss_mac(p2p, addr);
-@@ -2233,27 +2148,6 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
- 	return ERR_PTR(err);
- }
- 
--static int brcmf_p2p_get_conn_idx(struct brcmf_cfg80211_info *cfg)
--{
--	int i;
--	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
--
--	if (!ifp)
--		return -ENODEV;
--
--	for (i = P2PAPI_BSSCFG_CONNECTION; i < P2PAPI_BSSCFG_MAX; i++) {
--		if (!cfg->p2p.bss_idx[i].vif) {
--			if (i == P2PAPI_BSSCFG_CONNECTION2 &&
--			    !(brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
--				brcmf_err("Multi p2p not supported");
--				return -EIO;
--			}
--			return i;
--		}
--	}
--	return -EIO;
--}
--
- /**
-  * brcmf_p2p_add_vif() - create a new P2P virtual interface.
-  *
-@@ -2273,9 +2167,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct brcmf_cfg80211_vif *vif;
- 	enum brcmf_fil_p2p_if_types iftype;
--	int err = 0;
--	int connidx;
--	u8 *p2p_intf_addr;
-+	int err;
- 
- 	if (brcmf_cfg80211_vif_event_armed(cfg))
- 		return ERR_PTR(-EBUSY);
-@@ -2301,21 +2193,9 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 		return (struct wireless_dev *)vif;
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 
--	connidx = brcmf_p2p_get_conn_idx(cfg);
--
--	if (connidx == P2PAPI_BSSCFG_CONNECTION)
--		p2p_intf_addr = cfg->p2p.conn_int_addr;
--	else if (connidx == P2PAPI_BSSCFG_CONNECTION2)
--		p2p_intf_addr = cfg->p2p.conn2_int_addr;
--	else
--		err = -EINVAL;
--
--	if (!err)
--		err =  brcmf_p2p_request_p2p_if(&cfg->p2p, ifp,
--						p2p_intf_addr, iftype);
--
-+	err = brcmf_p2p_request_p2p_if(&cfg->p2p, ifp, cfg->p2p.int_addr,
-+				       iftype);
- 	if (err) {
--		brcmf_err("request p2p interface failed\n");
- 		brcmf_cfg80211_arm_vif_event(cfg, NULL);
- 		goto fail;
- 	}
-@@ -2347,7 +2227,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 		goto fail;
- 	}
- 
--	cfg->p2p.bss_idx[connidx].vif = vif;
-+	cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
- 	/* Disable firmware roaming for P2P interface  */
- 	brcmf_fil_iovar_int_set(ifp, "roam_off", 1);
- 	if (iftype == BRCMF_FIL_P2P_IF_GO) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-index d2ecee565bf2e..64ab9b6a677df 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-@@ -14,15 +14,13 @@ struct brcmf_cfg80211_info;
-  *
-  * @P2PAPI_BSSCFG_PRIMARY: maps to driver's primary bsscfg.
-  * @P2PAPI_BSSCFG_DEVICE: maps to driver's P2P device discovery bsscfg.
-- * @P2PAPI_BSSCFG_CONNECTION: maps to driver's 1st P2P connection bsscfg.
-- * @P2PAPI_BSSCFG_CONNECTION2: maps to driver's 2nd P2P connection bsscfg.
-+ * @P2PAPI_BSSCFG_CONNECTION: maps to driver's P2P connection bsscfg.
-  * @P2PAPI_BSSCFG_MAX: used for range checking.
-  */
- enum p2p_bss_type {
- 	P2PAPI_BSSCFG_PRIMARY, /* maps to driver's primary bsscfg */
- 	P2PAPI_BSSCFG_DEVICE, /* maps to driver's P2P device discovery bsscfg */
--	P2PAPI_BSSCFG_CONNECTION, /* driver's 1st P2P connection bsscfg */
--	P2PAPI_BSSCFG_CONNECTION2, /* driver's 2nd P2P connection bsscfg */
-+	P2PAPI_BSSCFG_CONNECTION, /* maps to driver's P2P connection bsscfg */
- 	P2PAPI_BSSCFG_MAX
- };
- 
-@@ -121,8 +119,7 @@ struct brcmf_p2p_info {
- 	struct brcmf_cfg80211_info *cfg;
- 	unsigned long status;
- 	u8 dev_addr[ETH_ALEN];
--	u8 conn_int_addr[ETH_ALEN];
--	u8 conn2_int_addr[ETH_ALEN];
-+	u8 int_addr[ETH_ALEN];
- 	struct p2p_bss bss_idx[P2PAPI_BSSCFG_MAX];
- 	struct timer_list listen_timer;
- 	u8 listen_channel;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 39381cbde89e6..3be60aef54650 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -52,7 +52,6 @@ BRCMF_FW_DEF(4356, "brcmfmac4356-pcie");
- BRCMF_FW_DEF(43570, "brcmfmac43570-pcie");
- BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
- BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
--BRCMF_FW_DEF(4364, "brcmfmac4364-pcie");
- BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
- BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
- BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
-@@ -71,7 +70,6 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
- 	BRCMF_FW_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
- 	BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
--	BRCMF_FW_ENTRY(BRCM_CC_4364_CHIP_ID, 0xFFFFFFFF, 4364),
- 	BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
- 	BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
- 	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
-@@ -80,7 +78,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
- };
- 
--#define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
-+#define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
- 
- #define BRCMF_PCIE_REG_MAP_SIZE			(32 * 1024)
- 
-@@ -1026,6 +1024,8 @@ brcmf_pcie_init_dmabuffer_for_device(struct brcmf_pciedev_info *devinfo,
- 			       address & 0xffffffff);
- 	brcmf_pcie_write_tcm32(devinfo, tcm_dma_phys_addr + 4, address >> 32);
- 
-+	memset(ring, 0, size);
-+
- 	return (ring);
- }
- 
-@@ -1645,8 +1645,8 @@ static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
- 		return -EINVAL;
- 	}
- 
--	devinfo->regs = ioremap(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
--	devinfo->tcm = ioremap(bar1_addr, bar1_size);
-+	devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
-+	devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
- 
- 	if (!devinfo->regs || !devinfo->tcm) {
- 		brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
-@@ -2107,7 +2107,6 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID),
--	BRCMF_PCIE_DEVICE(BRCM_PCIE_4364_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID),
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-index fabfbb0b40b0c..14e530601ef3f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-@@ -57,10 +57,6 @@ static int brcmf_pno_remove_request(struct brcmf_pno_info *pi, u64 reqid)
- 
- 	mutex_lock(&pi->req_lock);
- 
--	/* Nothing to do if we have no requests */
--	if (pi->n_reqs == 0)
--		goto done;
--
- 	/* find request */
- 	for (i = 0; i < pi->n_reqs; i++) {
- 		if (pi->reqs[i]->reqid == reqid)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 310d8075f5d71..264ad63232f87 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -41,22 +41,7 @@
- /* watermark expressed in number of words */
- #define DEFAULT_F2_WATERMARK    0x8
- #define CY_4373_F2_WATERMARK    0x40
--#define CY_4373_F1_MESBUSYCTRL  (CY_4373_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
- #define CY_43012_F2_WATERMARK    0x60
--#define CY_43012_MES_WATERMARK  0x50
--#define CY_43012_MESBUSYCTRL    (CY_43012_MES_WATERMARK | \
--				 SBSDIO_MESBUSYCTRL_ENAB)
--#define CY_4339_F2_WATERMARK    48
--#define CY_4339_MES_WATERMARK	80
--#define CY_4339_MESBUSYCTRL	(CY_4339_MES_WATERMARK | \
--				 SBSDIO_MESBUSYCTRL_ENAB)
--#define CY_43455_F2_WATERMARK	0x60
--#define CY_43455_MES_WATERMARK	0x50
--#define CY_43455_MESBUSYCTRL	(CY_43455_MES_WATERMARK | \
--				 SBSDIO_MESBUSYCTRL_ENAB)
--#define CY_435X_F2_WATERMARK	0x40
--#define CY_435X_F1_MESBUSYCTRL	(CY_435X_F2_WATERMARK | \
--				 SBSDIO_MESBUSYCTRL_ENAB)
- 
- #ifdef DEBUG
- 
-@@ -328,6 +313,15 @@ struct rte_console {
- #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
- #define BRCMF_SDIO_MAX_ACCESS_ERRORS	5
- 
-+/*
-+ * Conversion of 802.1D priority to precedence level
-+ */
-+static uint prio2prec(u32 prio)
-+{
-+	return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
-+	       (prio^2) : prio;
-+}
-+
- #ifdef DEBUG
- /* Device console log buffer state */
- struct brcmf_console {
-@@ -620,7 +614,6 @@ BRCMF_FW_DEF(43455, "brcmfmac43455-sdio");
- BRCMF_FW_DEF(43456, "brcmfmac43456-sdio");
- BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
- BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
--BRCMF_FW_DEF(4359, "brcmfmac4359-sdio");
- BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
- BRCMF_FW_DEF(43012, "brcmfmac43012-sdio");
- 
-@@ -643,7 +636,6 @@ static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFDC0, 43455),
- 	BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
- 	BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
--	BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
- 	BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
- 	BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012)
- };
-@@ -1942,10 +1934,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
- 			if (brcmf_sdio_hdparse(bus, bus->rxhdr, &rd_new,
- 					       BRCMF_SDIO_FT_NORMAL)) {
- 				rd->len = 0;
--				brcmf_sdio_rxfail(bus, true, true);
--				sdio_release_host(bus->sdiodev->func1);
- 				brcmu_pkt_buf_free_skb(pkt);
--				continue;
- 			}
- 			bus->sdcnt.rx_readahead_cnt++;
- 			if (rd->len != roundup(rd_new.len, 16)) {
-@@ -2778,13 +2767,7 @@ static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
- 	skb_push(pkt, bus->tx_hdrlen);
- 	/* precondition: IS_ALIGNED((unsigned long)(pkt->data), 2) */
- 
--	/* In WLAN, priority is always set by the AP using WMM parameters
--	 * and this need not always follow the standard 802.1d priority.
--	 * Based on AP WMM config, map from 802.1d priority to corresponding
--	 * precedence level.
--	 */
--	prec = brcmf_map_prio_to_prec(bus_if->drvr->config,
--				      (pkt->priority & PRIOMASK));
-+	prec = prio2prec((pkt->priority & PRIOMASK));
- 
- 	/* Check for existing queue, current flow-control,
- 			 pending event, or pending clock */
-@@ -4197,7 +4180,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 				   bus->hostintmask, NULL);
- 
- 		switch (sdiod->func1->device) {
--		case SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373:
-+		case SDIO_DEVICE_ID_CYPRESS_4373:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
- 				  CY_4373_F2_WATERMARK);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-@@ -4208,9 +4191,10 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_4373_F1_MESBUSYCTRL, &err);
-+					   CY_4373_F2_WATERMARK |
-+					   SBSDIO_MESBUSYCTRL_ENAB, &err);
- 			break;
--		case SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012:
-+		case SDIO_DEVICE_ID_CYPRESS_43012:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
- 				  CY_43012_F2_WATERMARK);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-@@ -4220,51 +4204,6 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_43012_MESBUSYCTRL, &err);
--			break;
--		case SDIO_DEVICE_ID_BROADCOM_4339:
--			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 4339\n",
--				  CY_4339_F2_WATERMARK);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--					   CY_4339_F2_WATERMARK, &err);
--			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
--						   &err);
--			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
--			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
--					   &err);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_4339_MESBUSYCTRL, &err);
--			break;
--		case SDIO_DEVICE_ID_BROADCOM_43455:
--			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 43455\n",
--				  CY_43455_F2_WATERMARK);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--					   CY_43455_F2_WATERMARK, &err);
--			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
--						   &err);
--			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
--			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
--					   &err);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_43455_MESBUSYCTRL, &err);
--			break;
--		case SDIO_DEVICE_ID_BROADCOM_4359:
--			/* fallthrough */
--		case SDIO_DEVICE_ID_BROADCOM_4354:
--			/* fallthrough */
--		case SDIO_DEVICE_ID_BROADCOM_4356:
--			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
--				  CY_435X_F2_WATERMARK);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--					   CY_435X_F2_WATERMARK, &err);
--			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
--						   &err);
--			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
--			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
--					   &err);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_435X_F1_MESBUSYCTRL, &err);
- 			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-@@ -4286,12 +4225,6 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 	}
- 
- 	if (err == 0) {
--		/* Assign bus interface call back */
--		sdiod->bus_if->dev = sdiod->dev;
--		sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
--		sdiod->bus_if->chip = bus->ci->chip;
--		sdiod->bus_if->chiprev = bus->ci->chiprev;
--
- 		/* Allow full data communication using DPC from now on. */
- 		brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
- 
-@@ -4308,6 +4241,12 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 
- 	sdio_release_host(sdiod->func1);
- 
-+	/* Assign bus interface call back */
-+	sdiod->bus_if->dev = sdiod->dev;
-+	sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
-+	sdiod->bus_if->chip = bus->ci->chip;
-+	sdiod->bus_if->chiprev = bus->ci->chiprev;
-+
- 	err = brcmf_alloc(sdiod->dev, sdiod->settings);
- 	if (err) {
- 		brcmf_err("brcmf_alloc failed\n");
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-index 163fd664780a0..0bd47c119dae0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-@@ -178,6 +178,7 @@ struct brcmf_sdio_dev {
- 	bool sd_irq_requested;
- 	bool irq_en;			/* irq enable flags */
- 	spinlock_t irq_en_lock;
-+	bool irq_wake;			/* irq wake enable flags */
- 	bool sg_support;
- 	uint max_request_size;
- 	ushort max_segment_count;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index ac5463838fcfb..7cdfde9b3dea9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -164,6 +164,7 @@ struct brcmf_usbdev_info {
- 
- 	struct urb *bulk_urb; /* used for FW download */
- 
-+	bool wowl_enabled;
- 	struct brcmf_mp_device *settings;
- };
- 
-@@ -311,43 +312,27 @@ static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	int err = 0;
- 	int timeout = 0;
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
--	struct usb_interface *intf = to_usb_interface(dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
-+	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
-+		return -EIO;
- 
--	err = usb_autopm_get_interface(intf);
--	if (err)
--		goto out;
--
--	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
--		err = -EIO;
--		goto fail;
--	}
--
--	if (test_and_set_bit(0, &devinfo->ctl_op)) {
--		err = -EIO;
--		goto fail;
--	}
-+	if (test_and_set_bit(0, &devinfo->ctl_op))
-+		return -EIO;
- 
- 	devinfo->ctl_completed = false;
- 	err = brcmf_usb_send_ctl(devinfo, buf, len);
- 	if (err) {
- 		brcmf_err("fail %d bytes: %d\n", err, len);
- 		clear_bit(0, &devinfo->ctl_op);
--		goto fail;
-+		return err;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
-+	clear_bit(0, &devinfo->ctl_op);
- 	if (!timeout) {
- 		brcmf_err("Txctl wait timed out\n");
--		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
--		goto fail;
- 	}
--	clear_bit(0, &devinfo->ctl_op);
--
--fail:
--	usb_autopm_put_interface(intf);
--out:
- 	return err;
- }
- 
-@@ -356,46 +341,32 @@ static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	int err = 0;
- 	int timeout = 0;
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
--	struct usb_interface *intf = to_usb_interface(dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
-+	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
-+		return -EIO;
- 
--	err = usb_autopm_get_interface(intf);
--	if (err)
--		goto out;
--
--	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
--		err = -EIO;
--		goto fail;
--	}
--
--	if (test_and_set_bit(0, &devinfo->ctl_op)) {
--		err = -EIO;
--		goto fail;
--	}
-+	if (test_and_set_bit(0, &devinfo->ctl_op))
-+		return -EIO;
- 
- 	devinfo->ctl_completed = false;
- 	err = brcmf_usb_recv_ctl(devinfo, buf, len);
- 	if (err) {
- 		brcmf_err("fail %d bytes: %d\n", err, len);
- 		clear_bit(0, &devinfo->ctl_op);
--		goto fail;
-+		return err;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
- 	err = devinfo->ctl_urb_status;
-+	clear_bit(0, &devinfo->ctl_op);
- 	if (!timeout) {
- 		brcmf_err("rxctl wait timed out\n");
--		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
--		goto fail;
- 	}
--	clear_bit(0, &devinfo->ctl_op);
--fail:
--	usb_autopm_put_interface(intf);
- 	if (!err)
- 		return devinfo->ctl_urb_actual_length;
--out:
--	return err;
-+	else
-+		return err;
- }
- 
- static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
-@@ -459,7 +430,6 @@ brcmf_usbdev_qinit(struct list_head *q, int qsize)
- 			usb_free_urb(req->urb);
- 		list_del(q->next);
- 	}
--	kfree(reqs);
- 	return NULL;
- 
- }
-@@ -529,12 +499,10 @@ static void brcmf_usb_rx_complete(struct urb *urb)
- 		return;
- 	}
- 
--	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP ||
--	    devinfo->bus_pub.state == BRCMFMAC_USB_STATE_SLEEP) {
-+	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
- 		skb_put(skb, urb->actual_length);
- 		brcmf_rx_frame(devinfo->dev, skb, true);
- 		brcmf_usb_rx_refill(devinfo, req);
--		usb_mark_last_busy(urb->dev);
- 	} else {
- 		brcmu_pkt_buf_free_skb(skb);
- 		brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
-@@ -618,11 +586,6 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 	struct brcmf_usbreq  *req;
- 	int ret;
- 	unsigned long flags;
--	struct usb_interface *intf = to_usb_interface(dev);
--
--	ret = usb_autopm_get_interface(intf);
--	if (ret)
--		goto out;
- 
- 	brcmf_dbg(USB, "Enter, skb=%p\n", skb);
- 	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-@@ -661,10 +624,9 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		devinfo->tx_flowblock = true;
- 	}
- 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
-+	return 0;
- 
- fail:
--	usb_autopm_put_interface(intf);
--out:
- 	return ret;
- }
- 
-@@ -1028,32 +990,20 @@ static int
- brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
- {
- 	int err;
--	struct usb_interface *intf;
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (!devinfo) {
--		err = -ENODEV;
--		goto out;
--	}
-+	if (devinfo == NULL)
-+		return -ENODEV;
- 
- 	if (!devinfo->image) {
- 		brcmf_err("No firmware!\n");
--		err = -ENOENT;
--		goto out;
-+		return -ENOENT;
- 	}
- 
--	intf = to_usb_interface(devinfo->dev);
--	err = usb_autopm_get_interface(intf);
--	if (err)
--		goto out;
--
- 	err = brcmf_usb_dlstart(devinfo,
- 		(u8 *)devinfo->image, devinfo->image_len);
- 	if (err == 0)
- 		err = brcmf_usb_dlrun(devinfo);
--
--	usb_autopm_put_interface(intf);
--out:
- 	return err;
- }
- 
-@@ -1154,6 +1104,18 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
- 	return NULL;
- }
- 
-+static void brcmf_usb_wowl_config(struct device *dev, bool enabled)
-+{
-+	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
-+
-+	brcmf_dbg(USB, "Configuring WOWL, enabled=%d\n", enabled);
-+	devinfo->wowl_enabled = enabled;
-+	if (enabled)
-+		device_set_wakeup_enable(devinfo->dev, true);
-+	else
-+		device_set_wakeup_enable(devinfo->dev, false);
-+}
-+
- static
- int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- {
-@@ -1180,6 +1142,7 @@ static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
- 	.txdata = brcmf_usb_tx,
- 	.txctl = brcmf_usb_tx_ctlpkt,
- 	.rxctl = brcmf_usb_rx_ctlpkt,
-+	.wowl_config = brcmf_usb_wowl_config,
- 	.get_fwname = brcmf_usb_get_fwname,
- };
- 
-@@ -1368,8 +1331,6 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
- 
- 	usb_set_intfdata(intf, devinfo);
- 
--	intf->needs_remote_wakeup = 1;
--
- 	/* Check that the device supports only one configuration */
- 	if (usb->descriptor.bNumConfigurations != 1) {
- 		brcmf_err("Number of configurations: %d not supported\n",
-@@ -1483,8 +1444,12 @@ static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
- 
- 	brcmf_dbg(USB, "Enter\n");
- 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
--	brcmf_cancel_all_urbs(devinfo);
--	device_set_wakeup_enable(devinfo->dev, true);
-+	if (devinfo->wowl_enabled) {
-+		brcmf_cancel_all_urbs(devinfo);
-+	} else {
-+		brcmf_detach(&usb->dev);
-+		brcmf_free(&usb->dev);
-+	}
- 	return 0;
- }
- 
-@@ -1497,10 +1462,22 @@ static int brcmf_usb_resume(struct usb_interface *intf)
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
-+	if (!devinfo->wowl_enabled) {
-+		int err;
-+
-+		err = brcmf_alloc(&usb->dev, devinfo->settings);
-+		if (err)
-+			return err;
-+
-+		err = brcmf_attach(devinfo->dev);
-+		if (err) {
-+			brcmf_free(devinfo->dev);
-+			return err;
-+		}
-+	}
- 
- 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
- 	brcmf_usb_rx_fill_all(devinfo);
--	device_set_wakeup_enable(devinfo->dev, false);
- 	return 0;
- }
- 
-@@ -1557,7 +1534,6 @@ static struct usb_driver brcmf_usbdrvr = {
- 	.suspend = brcmf_usb_suspend,
- 	.resume = brcmf_usb_resume,
- 	.reset_resume = brcmf_usb_reset_resume,
--	.supports_autosuspend = true,
- 	.disable_hub_initiated_lpm = 1,
- };
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
-index 5a6d9c86552a1..db783e94f929e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/channel.c
-@@ -496,11 +496,13 @@ brcms_c_channel_reg_limits(struct brcms_cm_info *wlc_cm, u16 chanspec,
- 	 * table and override CDD later
- 	 */
- 	if (li_mimo == &locale_bn) {
--		maxpwr20 = QDB(16);
--		maxpwr40 = 0;
-+		if (li_mimo == &locale_bn) {
-+			maxpwr20 = QDB(16);
-+			maxpwr40 = 0;
- 
--		if (chan >= 3 && chan <= 11)
--			maxpwr40 = QDB(16);
-+			if (chan >= 3 && chan <= 11)
-+				maxpwr40 = QDB(16);
-+		}
- 
- 		for (i = 0; i < BRCMS_NUM_RATES_MCS_1_STREAM; i++) {
- 			txpwr->mcs_20_siso[i] = (u8) maxpwr20;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
-index 648efcbc819fa..6188275b17e5a 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
-@@ -850,7 +850,8 @@ brcms_ops_ampdu_action(struct ieee80211_hw *hw,
- 				     "START: tid %d is not agg\'able\n", tid);
- 			return -EINVAL;
- 		}
--		return IEEE80211_AMPDU_TX_START_IMMEDIATE;
-+		ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
-+		break;
- 
- 	case IEEE80211_AMPDU_TX_STOP_CONT:
- 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
-@@ -1431,7 +1432,6 @@ int brcms_up(struct brcms_info *wl)
-  * precondition: perimeter lock has been acquired
-  */
- void brcms_down(struct brcms_info *wl)
--	__must_hold(&wl->lock)
- {
- 	uint callbacks, ret_val = 0;
- 
-@@ -1718,7 +1718,6 @@ int brcms_check_firmwares(struct brcms_info *wl)
-  * precondition: perimeter lock has been acquired
-  */
- bool brcms_rfkill_set_hw_state(struct brcms_info *wl)
--	__must_hold(&wl->lock)
- {
- 	bool blocked = brcms_c_check_radio_disabled(wl->wlc);
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c
-index 77494fc30c2c9..080e829da9b30 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.c
-@@ -838,8 +838,9 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)
- 	struct dma_pub *dma = NULL;
- 	struct d11txh *txh = NULL;
- 	struct scb *scb = NULL;
--	int tx_frame_count;
--	uint supr_status;
-+	bool free_pdu;
-+	int tx_rts, tx_frame_count, tx_rts_count;
-+	uint totlen, supr_status;
- 	bool lastframe;
- 	struct ieee80211_hdr *h;
- 	u16 mcl;
-@@ -916,8 +917,11 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)
- 			     CHSPEC_CHANNEL(wlc->default_bss->chanspec));
- 	}
- 
-+	tx_rts = le16_to_cpu(txh->MacTxControlLow) & TXC_SENDRTS;
- 	tx_frame_count =
- 	    (txs->status & TX_STATUS_FRM_RTX_MASK) >> TX_STATUS_FRM_RTX_SHIFT;
-+	tx_rts_count =
-+	    (txs->status & TX_STATUS_RTS_RTX_MASK) >> TX_STATUS_RTS_RTX_SHIFT;
- 
- 	lastframe = !ieee80211_has_morefrags(h->frame_control);
- 
-@@ -985,6 +989,9 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)
- 			tx_info->flags |= IEEE80211_TX_STAT_ACK;
- 	}
- 
-+	totlen = p->len;
-+	free_pdu = true;
-+
- 	if (lastframe) {
- 		/* remove PLCP & Broadcom tx descriptor header */
- 		skb_pull(p, D11_PHY_HDR_LEN);
-@@ -1057,7 +1064,7 @@ brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)
- 		txs->lasttxtime = 0;
- 
- 		*fatal = brcms_c_dotxstatus(wlc_hw->wlc, txs);
--		if (*fatal)
-+		if (*fatal == true)
- 			return false;
- 		n++;
- 	}
-@@ -1809,7 +1816,8 @@ void brcms_b_phy_reset(struct brcms_hardware *wlc_hw)
- 	udelay(2);
- 	brcms_b_core_phy_clk(wlc_hw, ON);
- 
--	wlc_phy_anacore(pih, ON);
-+	if (pih)
-+		wlc_phy_anacore(pih, ON);
- }
- 
- /* switch to and initialize new band */
-@@ -3768,14 +3776,17 @@ static void brcms_c_set_ps_ctrl(struct brcms_c_info *wlc)
-  * Write this BSS config's MAC address to core.
-  * Updates RXE match engine.
-  */
--static void brcms_c_set_mac(struct brcms_bss_cfg *bsscfg)
-+static int brcms_c_set_mac(struct brcms_bss_cfg *bsscfg)
- {
-+	int err = 0;
- 	struct brcms_c_info *wlc = bsscfg->wlc;
- 
- 	/* enter the MAC addr into the RXE match registers */
- 	brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, wlc->pub->cur_etheraddr);
- 
- 	brcms_c_ampdu_macaddr_upd(wlc);
-+
-+	return err;
- }
- 
- /* Write the BSS config's BSSID address to core (set_bssid in d11procs.tcl).
-@@ -5405,7 +5416,7 @@ int brcms_c_set_channel(struct brcms_c_info *wlc, u16 channel)
- {
- 	u16 chspec = ch20mhz_chspec(channel);
- 
--	if (channel > MAXCHANNEL)
-+	if (channel < 0 || channel > MAXCHANNEL)
- 		return -EINVAL;
- 
- 	if (!brcms_c_valid_chanspec_db(wlc->cmi, chspec))
-@@ -7373,7 +7384,9 @@ static void brcms_c_update_beacon_hw(struct brcms_c_info *wlc,
- 				     false, true);
- 		/* mark beacon0 valid */
- 		bcma_set32(core, D11REGOFFS(maccommand), MCMD_BCN1VLD);
-+		return;
- 	}
-+	return;
- }
- 
- /*
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c
-index 79d4a7a4da8b0..0ab865de14918 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.c
-@@ -304,8 +304,9 @@ int brcms_c_stf_txchain_set(struct brcms_c_info *wlc, s32 int_val, bool force)
-  * update wlc->stf->ss_opmode which represents the operational stf_ss mode
-  * we're using
-  */
--void brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band)
-+int brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band)
- {
-+	int ret_code = 0;
- 	u8 prev_stf_ss;
- 	u8 upd_stf_ss;
- 
-@@ -324,7 +325,7 @@ void brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band)
- 				    PHY_TXC1_MODE_SISO : PHY_TXC1_MODE_CDD;
- 	} else {
- 		if (wlc->band != band)
--			return;
-+			return ret_code;
- 		upd_stf_ss = (wlc->stf->txstreams == 1) ?
- 				PHY_TXC1_MODE_SISO : band->band_stf_ss_mode;
- 	}
-@@ -332,6 +333,8 @@ void brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band)
- 		wlc->stf->ss_opmode = upd_stf_ss;
- 		brcms_b_band_stf_ss_set(wlc->hw, upd_stf_ss);
- 	}
-+
-+	return ret_code;
- }
- 
- int brcms_c_stf_attach(struct brcms_c_info *wlc)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.h
-index aa4ab53bf634b..ba9493009a334 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/stf.h
-@@ -25,7 +25,7 @@ void brcms_c_stf_detach(struct brcms_c_info *wlc);
- void brcms_c_tempsense_upd(struct brcms_c_info *wlc);
- void brcms_c_stf_ss_algo_channel_get(struct brcms_c_info *wlc,
- 				     u16 *ss_algo_channel, u16 chanspec);
--void brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band);
-+int brcms_c_stf_ss_update(struct brcms_c_info *wlc, struct brcms_band *band);
- void brcms_c_stf_phy_txant_upd(struct brcms_c_info *wlc);
- int brcms_c_stf_txchain_set(struct brcms_c_info *wlc, s32 int_val, bool force);
- bool brcms_c_stf_stbc_rx_set(struct brcms_c_info *wlc, s32 int_val);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-index c6c4be05159d4..d1037b6ef2d6f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-@@ -44,7 +44,6 @@
- #define BRCM_CC_4358_CHIP_ID		0x4358
- #define BRCM_CC_4359_CHIP_ID		0x4359
- #define BRCM_CC_43602_CHIP_ID		43602
--#define BRCM_CC_4364_CHIP_ID		0x4364
- #define BRCM_CC_4365_CHIP_ID		0x4365
- #define BRCM_CC_4366_CHIP_ID		0x4366
- #define BRCM_CC_43664_CHIP_ID		43664
-@@ -75,7 +74,6 @@
- #define BRCM_PCIE_43602_2G_DEVICE_ID	0x43bb
- #define BRCM_PCIE_43602_5G_DEVICE_ID	0x43bc
- #define BRCM_PCIE_43602_RAW_DEVICE_ID	43602
--#define BRCM_PCIE_4364_DEVICE_ID	0x4464
- #define BRCM_PCIE_4365_DEVICE_ID	0x43ca
- #define BRCM_PCIE_4365_2G_DEVICE_ID	0x43cb
- #define BRCM_PCIE_4365_5G_DEVICE_ID	0x43cc
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-index 7552bdb91991c..7b31c212694da 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-@@ -231,8 +231,6 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec)
- #define WPA2_AUTH_FT		0x4000	/* Fast BSS Transition */
- #define WPA2_AUTH_PSK_SHA256	0x8000	/* PSK with SHA256 key derivation */
- 
--#define WPA3_AUTH_SAE_PSK	0x40000	/* SAE with 4-way handshake */
--
- #define DOT11_DEFAULT_RTS_LEN		2347
- #define DOT11_DEFAULT_FRAG_LEN		2346
- 
-diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
-index 15ed8ce9d3943..08b25c02b5a11 100644
---- a/include/linux/mmc/sdio_ids.h
-+++ b/include/linux/mmc/sdio_ids.h
-@@ -24,101 +24,57 @@
- /*
-  * Vendors and devices.  Sort key: vendor first, device next.
-  */
--
--#define SDIO_VENDOR_ID_STE			0x0020
--#define SDIO_DEVICE_ID_STE_CW1200		0x2280
--
--#define SDIO_VENDOR_ID_INTEL			0x0089
--#define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX	0x1402
--#define SDIO_DEVICE_ID_INTEL_IWMC3200WIFI	0x1403
--#define SDIO_DEVICE_ID_INTEL_IWMC3200TOP	0x1404
--#define SDIO_DEVICE_ID_INTEL_IWMC3200GPS	0x1405
--#define SDIO_DEVICE_ID_INTEL_IWMC3200BT		0x1406
--#define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX_2G5	0x1407
--
--#define SDIO_VENDOR_ID_CGUYS			0x0092
--#define SDIO_DEVICE_ID_CGUYS_EW_CG1102GC	0x0004
--
--#define SDIO_VENDOR_ID_TI			0x0097
--#define SDIO_DEVICE_ID_TI_WL1271		0x4076
--
--#define SDIO_VENDOR_ID_ATHEROS			0x0271
--#define SDIO_DEVICE_ID_ATHEROS_AR6003_00	0x0300
--#define SDIO_DEVICE_ID_ATHEROS_AR6003_01	0x0301
--#define SDIO_DEVICE_ID_ATHEROS_AR6004_00	0x0400
--#define SDIO_DEVICE_ID_ATHEROS_AR6004_01	0x0401
--#define SDIO_DEVICE_ID_ATHEROS_AR6004_02	0x0402
--#define SDIO_DEVICE_ID_ATHEROS_AR6004_18	0x0418
--#define SDIO_DEVICE_ID_ATHEROS_AR6004_19	0x0419
--#define SDIO_DEVICE_ID_ATHEROS_AR6005		0x050A
--#define SDIO_DEVICE_ID_ATHEROS_QCA9377		0x0701
--
- #define SDIO_VENDOR_ID_BROADCOM			0x02d0
--#define SDIO_DEVICE_ID_BROADCOM_NINTENDO_WII	0x044b
-+#define SDIO_DEVICE_ID_BROADCOM_43143		0xa887
- #define SDIO_DEVICE_ID_BROADCOM_43241		0x4324
- #define SDIO_DEVICE_ID_BROADCOM_4329		0x4329
- #define SDIO_DEVICE_ID_BROADCOM_4330		0x4330
- #define SDIO_DEVICE_ID_BROADCOM_4334		0x4334
--#define SDIO_DEVICE_ID_BROADCOM_4335_4339	0x4335
--#define SDIO_DEVICE_ID_BROADCOM_4339		0x4339
--#define SDIO_DEVICE_ID_BROADCOM_4345		0x4345
--#define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
--#define SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359	0x4355
--#define SDIO_DEVICE_ID_BROADCOM_4356		0x4356
--#define SDIO_DEVICE_ID_BROADCOM_4359		0x4359
--#define SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373	0x4373
--#define SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012	0xa804
--#define SDIO_DEVICE_ID_BROADCOM_43143		0xa887
- #define SDIO_DEVICE_ID_BROADCOM_43340		0xa94c
- #define SDIO_DEVICE_ID_BROADCOM_43341		0xa94d
-+#define SDIO_DEVICE_ID_BROADCOM_4335_4339	0x4335
-+#define SDIO_DEVICE_ID_BROADCOM_4339		0x4339
- #define SDIO_DEVICE_ID_BROADCOM_43362		0xa962
- #define SDIO_DEVICE_ID_BROADCOM_43364		0xa9a4
- #define SDIO_DEVICE_ID_BROADCOM_43430		0xa9a6
-+#define SDIO_DEVICE_ID_BROADCOM_4345		0x4345
- #define SDIO_DEVICE_ID_BROADCOM_43455		0xa9bf
-+#define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
-+#define SDIO_DEVICE_ID_BROADCOM_4356		0x4356
-+#define SDIO_DEVICE_ID_CYPRESS_4373		0x4373
-+#define SDIO_DEVICE_ID_CYPRESS_43012		43012
-+
-+#define SDIO_VENDOR_ID_INTEL			0x0089
-+#define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX	0x1402
-+#define SDIO_DEVICE_ID_INTEL_IWMC3200WIFI	0x1403
-+#define SDIO_DEVICE_ID_INTEL_IWMC3200TOP	0x1404
-+#define SDIO_DEVICE_ID_INTEL_IWMC3200GPS	0x1405
-+#define SDIO_DEVICE_ID_INTEL_IWMC3200BT		0x1406
-+#define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX_2G5	0x1407
- 
- #define SDIO_VENDOR_ID_MARVELL			0x02df
- #define SDIO_DEVICE_ID_MARVELL_LIBERTAS		0x9103
--#define SDIO_DEVICE_ID_MARVELL_8688_WLAN	0x9104
--#define SDIO_DEVICE_ID_MARVELL_8688_BT		0x9105
--#define SDIO_DEVICE_ID_MARVELL_8786_WLAN	0x9116
--#define SDIO_DEVICE_ID_MARVELL_8787_WLAN	0x9119
--#define SDIO_DEVICE_ID_MARVELL_8787_BT		0x911a
--#define SDIO_DEVICE_ID_MARVELL_8787_BT_AMP	0x911b
-+#define SDIO_DEVICE_ID_MARVELL_8688WLAN		0x9104
-+#define SDIO_DEVICE_ID_MARVELL_8688BT		0x9105
- #define SDIO_DEVICE_ID_MARVELL_8797_F0		0x9128
--#define SDIO_DEVICE_ID_MARVELL_8797_WLAN	0x9129
--#define SDIO_DEVICE_ID_MARVELL_8797_BT		0x912a
--#define SDIO_DEVICE_ID_MARVELL_8897_WLAN	0x912d
--#define SDIO_DEVICE_ID_MARVELL_8897_BT		0x912e
--#define SDIO_DEVICE_ID_MARVELL_8887_F0		0x9134
--#define SDIO_DEVICE_ID_MARVELL_8887_WLAN	0x9135
--#define SDIO_DEVICE_ID_MARVELL_8887_BT		0x9136
--#define SDIO_DEVICE_ID_MARVELL_8801_WLAN	0x9139
--#define SDIO_DEVICE_ID_MARVELL_8997_F0		0x9140
--#define SDIO_DEVICE_ID_MARVELL_8997_WLAN	0x9141
--#define SDIO_DEVICE_ID_MARVELL_8997_BT		0x9142
--#define SDIO_DEVICE_ID_MARVELL_8977_WLAN	0x9145
--#define SDIO_DEVICE_ID_MARVELL_8977_BT		0x9146
--#define SDIO_DEVICE_ID_MARVELL_8987_WLAN	0x9149
--#define SDIO_DEVICE_ID_MARVELL_8987_BT		0x914a
-+#define SDIO_DEVICE_ID_MARVELL_8887WLAN	0x9134
- 
- #define SDIO_VENDOR_ID_MEDIATEK			0x037a
--#define SDIO_DEVICE_ID_MEDIATEK_MT7663		0x7663
--#define SDIO_DEVICE_ID_MEDIATEK_MT7668		0x7668
- 
- #define SDIO_VENDOR_ID_SIANO			0x039a
- #define SDIO_DEVICE_ID_SIANO_NOVA_B0		0x0201
- #define SDIO_DEVICE_ID_SIANO_NICE		0x0202
- #define SDIO_DEVICE_ID_SIANO_VEGA_A0		0x0300
- #define SDIO_DEVICE_ID_SIANO_VENICE		0x0301
--#define SDIO_DEVICE_ID_SIANO_MING		0x0302
--#define SDIO_DEVICE_ID_SIANO_PELE		0x0500
--#define SDIO_DEVICE_ID_SIANO_RIO		0x0600
--#define SDIO_DEVICE_ID_SIANO_DENVER_2160	0x0700
--#define SDIO_DEVICE_ID_SIANO_DENVER_1530	0x0800
- #define SDIO_DEVICE_ID_SIANO_NOVA_A0		0x1100
- #define SDIO_DEVICE_ID_SIANO_STELLAR 		0x5347
- 
-+#define SDIO_VENDOR_ID_TI			0x0097
-+#define SDIO_DEVICE_ID_TI_WL1271		0x4076
- #define SDIO_VENDOR_ID_TI_WL1251		0x104c
- #define SDIO_DEVICE_ID_TI_WL1251		0x9066
- 
-+#define SDIO_VENDOR_ID_STE			0x0020
-+#define SDIO_DEVICE_ID_STE_CW1200		0x2280
-+
- #endif /* LINUX_MMC_SDIO_IDS_H */
--- 
-2.27.0
-
diff --git a/patches/bcfserial/0001-merge-bcfserial-https-github.com-statropy-bcfserial.patch b/patches/bcfserial/0001-merge-bcfserial-https-github.com-statropy-bcfserial.patch
index 398d9d6a5a23f2e959b9a5c07886ac67bf53ea24..f6537b116c32994b2d710354d867631b130a0d40 100644
--- a/patches/bcfserial/0001-merge-bcfserial-https-github.com-statropy-bcfserial.patch
+++ b/patches/bcfserial/0001-merge-bcfserial-https-github.com-statropy-bcfserial.patch
@@ -1,6 +1,6 @@
-From b24578d1b4af965fcedddc1ee4fd882ce942d746 Mon Sep 17 00:00:00 2001
+From 92e14343a4c5c36d3789993cfd34b29521e62882 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Dec 2021 13:28:26 -0600
+Date: Tue, 7 Dec 2021 19:15:40 -0600
 Subject: [PATCH] merge: bcfserial: https://github.com/statropy/bcfserial
 
 https://github.com/statropy/bcfserial/commit/aded88429a8a00143596b41f4c1f50d9ae3d4069
diff --git a/patches/cypress/0001-cypress-fmac-patchset.patch b/patches/cypress/0001-cypress-fmac-patchset.patch
deleted file mode 100644
index f54a7a62101560a2733dfb25a880628d58ff1875..0000000000000000000000000000000000000000
--- a/patches/cypress/0001-cypress-fmac-patchset.patch
+++ /dev/null
@@ -1,7813 +0,0 @@
-From 7346fec07a12dc884bb527182a09d13806c0c234 Mon Sep 17 00:00:00 2001
-From: Robert Nelson <robertcnelson@gmail.com>
-Date: Thu, 20 May 2021 15:05:06 -0500
-Subject: [PATCH] cypress fmac patchset
-
-v5.4.18-2021_0114
-
-Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
----
- .../net/wireless/broadcom/brcm80211/Kconfig   |   11 +
- .../broadcom/brcm80211/brcmfmac/bcdc.c        |    7 +-
- .../broadcom/brcm80211/brcmfmac/bcmsdh.c      |   46 +-
- .../broadcom/brcm80211/brcmfmac/bus.h         |   12 +-
- .../broadcom/brcm80211/brcmfmac/cfg80211.c    | 1435 ++++++++++++++---
- .../broadcom/brcm80211/brcmfmac/cfg80211.h    |   68 +-
- .../broadcom/brcm80211/brcmfmac/chip.c        |  228 +++
- .../broadcom/brcm80211/brcmfmac/chip.h        |   10 +-
- .../broadcom/brcm80211/brcmfmac/common.c      |   84 +-
- .../broadcom/brcm80211/brcmfmac/common.h      |   10 +
- .../broadcom/brcm80211/brcmfmac/core.c        |  332 +++-
- .../broadcom/brcm80211/brcmfmac/core.h        |   26 +-
- .../broadcom/brcm80211/brcmfmac/debug.c       |   83 +
- .../broadcom/brcm80211/brcmfmac/debug.h       |   25 +
- .../broadcom/brcm80211/brcmfmac/feature.c     |    8 +-
- .../broadcom/brcm80211/brcmfmac/feature.h     |    8 +-
- .../broadcom/brcm80211/brcmfmac/firmware.c    |    7 +-
- .../broadcom/brcm80211/brcmfmac/firmware.h    |    7 +
- .../broadcom/brcm80211/brcmfmac/flowring.c    |    9 +-
- .../broadcom/brcm80211/brcmfmac/fweh.c        |   10 +-
- .../broadcom/brcm80211/brcmfmac/fweh.h        |   28 +-
- .../broadcom/brcm80211/brcmfmac/fwil.h        |    3 +
- .../broadcom/brcm80211/brcmfmac/fwil_types.h  |   30 +-
- .../broadcom/brcm80211/brcmfmac/fwsignal.c    |  163 +-
- .../broadcom/brcm80211/brcmfmac/fwsignal.h    |   26 +-
- .../broadcom/brcm80211/brcmfmac/msgbuf.c      |   61 +-
- .../wireless/broadcom/brcm80211/brcmfmac/of.c |   14 +-
- .../broadcom/brcm80211/brcmfmac/p2p.c         |  223 ++-
- .../broadcom/brcm80211/brcmfmac/p2p.h         |   13 +-
- .../broadcom/brcm80211/brcmfmac/pcie.c        |  421 ++++-
- .../broadcom/brcm80211/brcmfmac/pno.c         |   12 +-
- .../broadcom/brcm80211/brcmfmac/sdio.c        |  467 +++++-
- .../broadcom/brcm80211/brcmfmac/sdio.h        |  113 ++
- .../broadcom/brcm80211/brcmfmac/usb.c         |  169 +-
- .../broadcom/brcm80211/brcmfmac/vendor.c      |   67 +
- .../broadcom/brcm80211/brcmfmac/vendor.h      |   19 +
- .../broadcom/brcm80211/include/brcm_hw_ids.h  |    6 +-
- .../broadcom/brcm80211/include/brcmu_wifi.h   |    7 +
- .../broadcom/brcm80211/include/chipcommon.h   |  195 ++-
- include/linux/mmc/sdio_ids.h                  |    2 +
- include/net/cfg80211.h                        |    7 +
- include/uapi/linux/nl80211.h                  |   56 +-
- net/wireless/nl80211.c                        |   15 +-
- net/wireless/sme.c                            |    2 +
- 44 files changed, 4063 insertions(+), 482 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/Kconfig b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-index a5bf16c4f495..b239e067bba8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
-+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-@@ -37,3 +37,14 @@ config BRCMDBG
- 	select WANT_DEV_COREDUMP if BRCMFMAC
- 	---help---
- 	  Selecting this enables additional code for debug purposes.
-+
-+config BRCMFMAC_PCIE_BARWIN_SZ
-+	bool "Custom PCIE BAR window size support for FullMAC driver"
-+	depends on BRCMFMAC
-+	depends on PCI
-+	default n
-+	---help---
-+	  If you say Y here, the FMAC driver will use custom PCIE BAR
-+	  window size. Say Y to allow developers to use custom PCIE
-+	  BAR window size when HOST PCIE IP can support less then 4MB
-+	  BAR window.
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-index 2c95a08a5871..9ec0c60b6da1 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-@@ -87,6 +87,8 @@ struct brcmf_proto_bcdc_header {
- 					 * plus any space that might be needed
- 					 * for bus alignment padding.
- 					 */
-+#define ROUND_UP_MARGIN 2048
-+
- struct brcmf_bcdc {
- 	u16 reqid;
- 	u8 bus_header[BUS_HEADER_LEN];
-@@ -368,8 +370,7 @@ brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
- 
- 	/* await txstatus signal for firmware if active */
- 	if (brcmf_fws_fc_active(bcdc->fws)) {
--		if (!success)
--			brcmf_fws_bustxfail(bcdc->fws, txp);
-+		brcmf_fws_bustxcomplete(bcdc->fws, txp, success);
- 	} else {
- 		if (brcmf_proto_bcdc_hdrpull(bus_if->drvr, false, txp, &ifp))
- 			brcmu_pkt_buf_free_skb(txp);
-@@ -471,7 +472,7 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
- 
- 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
- 	drvr->bus_if->maxctl = BRCMF_DCMD_MAXLEN +
--			sizeof(struct brcmf_proto_bcdc_dcmd);
-+			sizeof(struct brcmf_proto_bcdc_dcmd) + ROUND_UP_MARGIN;
- 	return 0;
- 
- fail:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index fc12598b2dd3..f41a36bfbb82 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -36,6 +36,7 @@
- #include "sdio.h"
- #include "core.h"
- #include "common.h"
-+#include "cfg80211.h"
- 
- #define SDIOH_API_ACCESS_RETRY_LIMIT	2
- 
-@@ -43,6 +44,8 @@
- 
- #define SDIO_FUNC1_BLOCKSIZE		64
- #define SDIO_FUNC2_BLOCKSIZE		512
-+#define SDIO_4373_FUNC2_BLOCKSIZE	256
-+#define SDIO_435X_FUNC2_BLOCKSIZE	256
- /* Maximum milliseconds to wait for F2 to come up */
- #define SDIO_WAIT_F2RDY	3000
- 
-@@ -865,7 +868,7 @@ static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
- }
- #endif /* CONFIG_PM_SLEEP */
- 
--static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
-+int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
- {
- 	sdiodev->state = BRCMF_SDIOD_DOWN;
- 	if (sdiodev->bus) {
-@@ -900,9 +903,10 @@ static void brcmf_sdiod_host_fixup(struct mmc_host *host)
- 	host->caps |= MMC_CAP_NONREMOVABLE;
- }
- 
--static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
-+int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- {
- 	int ret = 0;
-+	unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
- 
- 	sdio_claim_host(sdiodev->func1);
- 
-@@ -912,11 +916,27 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		sdio_release_host(sdiodev->func1);
- 		goto out;
- 	}
--	ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
-+
-+	switch (sdiodev->func2->device) {
-+	case SDIO_DEVICE_ID_CYPRESS_4373:
-+		f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
-+		break;
-+	case SDIO_DEVICE_ID_BROADCOM_4359:
-+	case SDIO_DEVICE_ID_BROADCOM_4354:
-+	case SDIO_DEVICE_ID_BROADCOM_4356:
-+		f2_blksz = SDIO_435X_FUNC2_BLOCKSIZE;
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
- 	if (ret) {
- 		brcmf_err("Failed to set F2 blocksize\n");
- 		sdio_release_host(sdiodev->func1);
- 		goto out;
-+	} else {
-+		brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz);
- 	}
- 
- 	/* increase F2 timeout */
-@@ -969,8 +989,10 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43012),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_89359),
- 	{ /* end: all zeroes */ }
- };
- MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
-@@ -1039,6 +1061,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
- 	dev_set_drvdata(&func->dev, bus_if);
- 	dev_set_drvdata(&sdiodev->func1->dev, bus_if);
- 	sdiodev->dev = &sdiodev->func1->dev;
-+	dev_set_drvdata(&sdiodev->func2->dev, bus_if);
- 
- 	brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
- 
-@@ -1055,6 +1078,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
- fail:
- 	dev_set_drvdata(&func->dev, NULL);
- 	dev_set_drvdata(&sdiodev->func1->dev, NULL);
-+	dev_set_drvdata(&sdiodev->func2->dev, NULL);
- 	kfree(sdiodev);
- 	kfree(bus_if);
- 	return err;
-@@ -1109,14 +1133,26 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
- 	struct brcmf_bus *bus_if;
- 	struct brcmf_sdio_dev *sdiodev;
- 	mmc_pm_flag_t sdio_flags;
-+	struct brcmf_cfg80211_info *config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	func = container_of(dev, struct sdio_func, dev);
-+	bus_if = dev_get_drvdata(dev);
-+	config = bus_if->drvr->config;
-+
- 	brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
-+
-+	while (retry &&
-+	       config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
-+		usleep_range(10000, 20000);
-+		retry--;
-+	}
-+	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
-+		brcmf_err("timed out wait for cfg80211 suspended\n");
-+
- 	if (func->num != 1)
- 		return 0;
- 
--
--	bus_if = dev_get_drvdata(dev);
- 	sdiodev = bus_if->bus_priv.sdio;
- 
- 	brcmf_sdiod_freezer_on(sdiodev);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-index 623c0168da79..ea0524b8f4e6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -22,6 +22,12 @@
- #define BRCMF_NROF_COMMON_MSGRINGS	(BRCMF_NROF_H2D_COMMON_MSGRINGS + \
- 					 BRCMF_NROF_D2H_COMMON_MSGRINGS)
- 
-+/* The interval to poll console */
-+#define BRCMF_CONSOLE	10
-+
-+/* The maximum console interval value (5 mins) */
-+#define MAX_CONSOLE_INTERVAL	(5 * 60)
-+
- /* The level of bus communication with the dongle */
- enum brcmf_bus_state {
- 	BRCMF_BUS_DOWN,		/* Not ready for frame transfers */
-@@ -152,6 +158,9 @@ struct brcmf_bus {
- 
- 	const struct brcmf_bus_ops *ops;
- 	struct brcmf_bus_msgbuf *msgbuf;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	bool allow_skborphan;
-+#endif
- };
- 
- /*
-@@ -255,7 +264,7 @@ void brcmf_rx_event(struct device *dev, struct sk_buff *rxp);
- 
- int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings);
- /* Indication from bus module regarding presence/insertion of dongle. */
--int brcmf_attach(struct device *dev);
-+int brcmf_attach(struct device *dev, bool start_bus);
- /* Indication from bus module regarding removal/absence of dongle */
- void brcmf_detach(struct device *dev);
- void brcmf_free(struct device *dev);
-@@ -271,6 +280,7 @@ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
- 
- s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len);
- void brcmf_bus_add_txhdrlen(struct device *dev, uint len);
-+int brcmf_fwlog_attach(struct device *dev);
- 
- #ifdef CONFIG_BRCMFMAC_SDIO
- void brcmf_sdio_exit(void);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index e3ebb7abbdae..d38c21584b05 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -22,6 +22,7 @@
- #include "p2p.h"
- #include "btcoex.h"
- #include "pno.h"
-+#include "fwsignal.h"
- #include "cfg80211.h"
- #include "feature.h"
- #include "fwil.h"
-@@ -54,12 +55,16 @@
- #define RSN_AKM_PSK			2	/* Pre-shared Key */
- #define RSN_AKM_SHA256_1X		5	/* SHA256, 802.1X */
- #define RSN_AKM_SHA256_PSK		6	/* SHA256, Pre-shared Key */
-+#define RSN_AKM_SAE			8	/* SAE */
- #define RSN_CAP_LEN			2	/* Length of RSN capabilities */
- #define RSN_CAP_PTK_REPLAY_CNTR_MASK	(BIT(2) | BIT(3))
- #define RSN_CAP_MFPR_MASK		BIT(6)
- #define RSN_CAP_MFPC_MASK		BIT(7)
- #define RSN_PMKID_COUNT_LEN		2
- 
-+#define DPP_AKM_SUITE_TYPE		2
-+#define WLAN_AKM_SUITE_DPP		SUITE(WLAN_OUI_WFA, DPP_AKM_SUITE_TYPE)
-+
- #define VNDR_IE_CMD_LEN			4	/* length of the set command
- 						 * string :"add", "del" (+ NUL)
- 						 */
-@@ -82,9 +87,39 @@
- 
- #define BRCMF_ND_INFO_TIMEOUT		msecs_to_jiffies(2000)
- 
-+/* Dump obss definitions */
-+#define ACS_MSRMNT_DELAY		80
-+#define CHAN_NOISE_DUMMY		(-80)
-+#define OBSS_TOKEN_IDX			15
-+#define IBSS_TOKEN_IDX			15
-+#define TX_TOKEN_IDX			14
-+#define CTG_TOKEN_IDX			13
-+#define PKT_TOKEN_IDX			15
-+#define IDLE_TOKEN_IDX			12
-+
- #define BRCMF_ASSOC_PARAMS_FIXED_SIZE \
- 	(sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
- 
-+struct brcmf_dump_survey {
-+	u32 obss;
-+	u32 ibss;
-+	u32 no_ctg;
-+	u32 no_pckt;
-+	u32 tx;
-+	u32 idle;
-+};
-+
-+struct cca_stats_n_flags {
-+	u32 msrmnt_time; /* Time for Measurement (msec) */
-+	u32 msrmnt_done; /* flag set when measurement complete */
-+	char buf[1];
-+};
-+
-+struct cca_msrmnt_query {
-+	u32 msrmnt_query;
-+	u32 time_req;
-+};
-+
- static bool check_vif_up(struct brcmf_cfg80211_vif *vif)
- {
- 	if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) {
-@@ -228,6 +263,51 @@ struct parsed_vndr_ies {
- 	struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
- };
- 
-+#define WLC_E_IF_ROLE_STA		0	/* Infra STA */
-+#define WLC_E_IF_ROLE_AP		1	/* Access Point */
-+
-+#define WL_INTERFACE_CREATE_VER_1		1
-+#define WL_INTERFACE_CREATE_VER_2		2
-+#define WL_INTERFACE_CREATE_VER_3		3
-+#define WL_INTERFACE_CREATE_VER_MAX		WL_INTERFACE_CREATE_VER_3
-+
-+#define WL_INTERFACE_MAC_DONT_USE	0x0
-+#define WL_INTERFACE_MAC_USE		0x2
-+
-+#define WL_INTERFACE_CREATE_STA		0x0
-+#define WL_INTERFACE_CREATE_AP		0x1
-+
-+struct wl_interface_create_v1 {
-+	u16	ver;			/* structure version */
-+	u32	flags;			/* flags for operation */
-+	u8	mac_addr[ETH_ALEN];	/* MAC address */
-+	u32	wlc_index;		/* optional for wlc index */
-+};
-+
-+struct wl_interface_create_v2 {
-+	u16	ver;			/* structure version */
-+	u8	pad1[2];
-+	u32	flags;			/* flags for operation */
-+	u8	mac_addr[ETH_ALEN];	/* MAC address */
-+	u8	iftype;			/* type of interface created */
-+	u8	pad2;
-+	u32	wlc_index;		/* optional for wlc index */
-+};
-+
-+struct wl_interface_create_v3 {
-+	u16 ver;			/* structure version */
-+	u16 len;			/* length of structure + data */
-+	u16 fixed_len;			/* length of structure */
-+	u8 iftype;			/* type of interface created */
-+	u8 wlc_index;			/* optional for wlc index */
-+	u32 flags;			/* flags for operation */
-+	u8 mac_addr[ETH_ALEN];		/* MAC address */
-+	u8 bssid[ETH_ALEN];		/* optional for BSSID */
-+	u8 if_index;			/* interface index request */
-+	u8 pad[3];
-+	u8 data[];			/* Optional for specific data */
-+};
-+
- static u8 nl80211_band_to_fwil(enum nl80211_band band)
- {
- 	switch (band) {
-@@ -481,7 +561,7 @@ send_key_to_dongle(struct brcmf_if *ifp, struct brcmf_wsec_key *key)
- 	return err;
- }
- 
--static void
-+void
- brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
- {
- 	struct brcmf_cfg80211_vif *vif;
-@@ -515,6 +595,113 @@ static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr)
- 	return -ENOMEM;
- }
- 
-+static void brcmf_set_vif_sta_macaddr(struct brcmf_if *ifp, u8 *mac_addr)
-+{
-+	u8 mac_idx = ifp->drvr->sta_mac_idx;
-+
-+	/* set difference MAC address with locally administered bit */
-+	memcpy(mac_addr, ifp->mac_addr, ETH_ALEN);
-+	mac_addr[0] |= 0x02;
-+	mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0;
-+	mac_idx++;
-+	mac_idx = mac_idx % 2;
-+	ifp->drvr->sta_mac_idx = mac_idx;
-+}
-+
-+static int brcmf_cfg80211_request_sta_if(struct brcmf_if *ifp, u8 *macaddr)
-+{
-+	struct wl_interface_create_v1 iface_v1;
-+	struct wl_interface_create_v2 iface_v2;
-+	struct wl_interface_create_v3 iface_v3;
-+	u32 iface_create_ver;
-+	int err;
-+
-+	/* interface_create version 1 */
-+	memset(&iface_v1, 0, sizeof(iface_v1));
-+	iface_v1.ver = WL_INTERFACE_CREATE_VER_1;
-+	iface_v1.flags = WL_INTERFACE_CREATE_STA |
-+			 WL_INTERFACE_MAC_USE;
-+	if (!is_zero_ether_addr(macaddr))
-+		memcpy(iface_v1.mac_addr, macaddr, ETH_ALEN);
-+	else
-+		brcmf_set_vif_sta_macaddr(ifp, iface_v1.mac_addr);
-+
-+	err = brcmf_fil_iovar_data_get(ifp, "interface_create",
-+				       &iface_v1,
-+				       sizeof(iface_v1));
-+	if (err) {
-+		brcmf_info("failed to create interface(v1), err=%d\n",
-+			   err);
-+	} else {
-+		brcmf_dbg(INFO, "interface created(v1)\n");
-+		return 0;
-+	}
-+
-+	/* interface_create version 2 */
-+	memset(&iface_v2, 0, sizeof(iface_v2));
-+	iface_v2.ver = WL_INTERFACE_CREATE_VER_2;
-+	iface_v2.flags = WL_INTERFACE_MAC_USE;
-+	iface_v2.iftype = WL_INTERFACE_CREATE_STA;
-+	if (!is_zero_ether_addr(macaddr))
-+		memcpy(iface_v2.mac_addr, macaddr, ETH_ALEN);
-+	else
-+		brcmf_set_vif_sta_macaddr(ifp, iface_v2.mac_addr);
-+
-+	err = brcmf_fil_iovar_data_get(ifp, "interface_create",
-+				       &iface_v2,
-+				       sizeof(iface_v2));
-+	if (err) {
-+		brcmf_info("failed to create interface(v2), err=%d\n",
-+			   err);
-+	} else {
-+		brcmf_dbg(INFO, "interface created(v2)\n");
-+		return 0;
-+	}
-+
-+	/* interface_create version 3+ */
-+	/* get supported version from firmware side */
-+	iface_create_ver = 0;
-+	err = brcmf_fil_bsscfg_int_get(ifp, "interface_create",
-+				       &iface_create_ver);
-+	if (err) {
-+		brcmf_err("fail to get supported version, err=%d\n", err);
-+		return -EOPNOTSUPP;
-+	}
-+
-+	switch (iface_create_ver) {
-+	case WL_INTERFACE_CREATE_VER_3:
-+		memset(&iface_v3, 0, sizeof(iface_v3));
-+		iface_v3.ver = WL_INTERFACE_CREATE_VER_3;
-+		iface_v3.flags = WL_INTERFACE_MAC_USE;
-+		iface_v3.iftype = WL_INTERFACE_CREATE_STA;
-+		if (!is_zero_ether_addr(macaddr))
-+			memcpy(iface_v3.mac_addr, macaddr, ETH_ALEN);
-+		else
-+			brcmf_set_vif_sta_macaddr(ifp, iface_v3.mac_addr);
-+
-+		err = brcmf_fil_iovar_data_get(ifp, "interface_create",
-+					       &iface_v3,
-+					       sizeof(iface_v3));
-+
-+		if (!err)
-+			brcmf_dbg(INFO, "interface created(v3)\n");
-+		break;
-+	default:
-+		brcmf_err("not support interface create(v%d)\n",
-+			  iface_create_ver);
-+		err = -EOPNOTSUPP;
-+		break;
-+	}
-+
-+	if (err) {
-+		brcmf_info("station interface creation failed (%d)\n",
-+			   err);
-+		return -EIO;
-+	}
-+
-+	return 0;
-+}
-+
- static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = ifp->drvr;
-@@ -540,15 +727,16 @@ static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
- }
- 
- /**
-- * brcmf_ap_add_vif() - create a new AP virtual interface for multiple BSS
-+ * brcmf_ap_add_vif() - create a new AP or STA virtual interface
-  *
-  * @wiphy: wiphy device of new interface.
-  * @name: name of the new interface.
-- * @params: contains mac address for AP device.
-+ * @params: contains mac address for AP or STA device.
-  */
- static
--struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
--				      struct vif_params *params)
-+struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name,
-+					 struct vif_params *params,
-+					 enum nl80211_iftype type)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-@@ -556,18 +744,24 @@ struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
- 	struct brcmf_cfg80211_vif *vif;
- 	int err;
- 
-+	if (type != NL80211_IFTYPE_STATION && type != NL80211_IFTYPE_AP)
-+		return ERR_PTR(-EINVAL);
-+
- 	if (brcmf_cfg80211_vif_event_armed(cfg))
- 		return ERR_PTR(-EBUSY);
- 
- 	brcmf_dbg(INFO, "Adding vif \"%s\"\n", name);
- 
--	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP);
-+	vif = brcmf_alloc_vif(cfg, type);
- 	if (IS_ERR(vif))
- 		return (struct wireless_dev *)vif;
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 
--	err = brcmf_cfg80211_request_ap_if(ifp);
-+	if (type == NL80211_IFTYPE_STATION)
-+		err = brcmf_cfg80211_request_sta_if(ifp, params->macaddr);
-+	else
-+		err = brcmf_cfg80211_request_ap_if(ifp);
- 	if (err) {
- 		brcmf_cfg80211_arm_vif_event(cfg, NULL);
- 		goto fail;
-@@ -638,14 +832,14 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
- 	}
- 	switch (type) {
- 	case NL80211_IFTYPE_ADHOC:
--	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP_VLAN:
- 	case NL80211_IFTYPE_WDS:
- 	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_MESH_POINT:
- 		return ERR_PTR(-EOPNOTSUPP);
-+	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP:
--		wdev = brcmf_ap_add_vif(wiphy, name, params);
-+		wdev = brcmf_apsta_add_vif(wiphy, name, params, type);
- 		break;
- 	case NL80211_IFTYPE_P2P_CLIENT:
- 	case NL80211_IFTYPE_P2P_GO:
-@@ -687,6 +881,21 @@ void brcmf_set_mpc(struct brcmf_if *ifp, int mpc)
- 	}
- }
- 
-+bool brcmf_is_apmode_operating(struct wiphy *wiphy)
-+{
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_cfg80211_vif *vif;
-+	bool ret = false;
-+
-+	list_for_each_entry(vif, &cfg->vif_list, list) {
-+		if (brcmf_is_apmode(vif) &&
-+		    test_bit(BRCMF_VIF_STATUS_AP_CREATED, &vif->sme_state))
-+			ret = true;
-+	}
-+
-+	return ret;
-+}
-+
- s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- 				struct brcmf_if *ifp, bool aborted,
- 				bool fw_abort)
-@@ -765,8 +974,8 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
--static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy,
--				       struct wireless_dev *wdev)
-+static int brcmf_cfg80211_del_apsta_iface(struct wiphy *wiphy,
-+					  struct wireless_dev *wdev)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct net_device *ndev = wdev->netdev;
-@@ -823,14 +1032,14 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
- 
- 	switch (wdev->iftype) {
- 	case NL80211_IFTYPE_ADHOC:
--	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP_VLAN:
- 	case NL80211_IFTYPE_WDS:
- 	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_MESH_POINT:
- 		return -EOPNOTSUPP;
-+	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP:
--		return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
-+		return brcmf_cfg80211_del_apsta_iface(wiphy, wdev);
- 	case NL80211_IFTYPE_P2P_CLIENT:
- 	case NL80211_IFTYPE_P2P_GO:
- 	case NL80211_IFTYPE_P2P_DEVICE:
-@@ -1128,11 +1337,6 @@ brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
- 	if (err)
- 		goto scan_out;
- 
--	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
--				    request->ie, request->ie_len);
--	if (err)
--		goto scan_out;
--
- 	err = brcmf_do_escan(vif->ifp, request);
- 	if (err)
- 		goto scan_out;
-@@ -1282,7 +1486,33 @@ static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
- 	return err;
- }
- 
--static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
-+static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data,
-+				  u16 pwd_len)
-+{
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_wsec_sae_pwd_le sae_pwd;
-+	int err;
-+
-+	if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
-+		bphy_err(drvr, "sae_password must be less than %d\n",
-+			 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
-+		return -EINVAL;
-+	}
-+
-+	sae_pwd.key_len = cpu_to_le16(pwd_len);
-+	memcpy(sae_pwd.key, pwd_data, pwd_len);
-+
-+	err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
-+				       sizeof(sae_pwd));
-+	if (err < 0)
-+		bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
-+			 pwd_len);
-+
-+	return err;
-+}
-+
-+static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason,
-+			    bool locally_generated)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
- 	struct brcmf_pub *drvr = cfg->pub;
-@@ -1304,9 +1534,11 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
- 		if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
- 		    (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
- 			cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
--					      true, GFP_KERNEL);
-+					      locally_generated, GFP_KERNEL);
- 	}
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
- 	clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
- 	brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
- 	if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
-@@ -1483,7 +1715,7 @@ brcmf_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
- 		return 0;
- 	}
- 
--	brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING);
-+	brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING, true);
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	brcmf_dbg(TRACE, "Exit\n");
-@@ -1505,6 +1737,8 @@ static s32 brcmf_set_wpa_version(struct net_device *ndev,
- 		val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;
- 	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)
- 		val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;
-+	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3)
-+		val = WPA3_AUTH_SAE_PSK;
- 	else
- 		val = WPA_AUTH_DISABLED;
- 	brcmf_dbg(CONN, "setting wpa_auth to 0x%0x\n", val);
-@@ -1537,6 +1771,10 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 		val = 1;
- 		brcmf_dbg(CONN, "shared key\n");
- 		break;
-+	case NL80211_AUTHTYPE_SAE:
-+		val = 3;
-+		brcmf_dbg(CONN, "SAE authentication\n");
-+		break;
- 	default:
- 		val = 2;
- 		brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type);
-@@ -1638,6 +1876,7 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
- 	struct brcmf_pub *drvr = ifp->drvr;
- 	s32 val;
- 	s32 err;
-+	s32 okc_enable;
- 	const struct brcmf_tlv *rsn_ie;
- 	const u8 *ie;
- 	u32 ie_len;
-@@ -1647,6 +1886,8 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
- 	u16 count;
- 
- 	profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
-+	profile->is_ft = false;
-+	profile->is_okc = false;
- 
- 	if (!sme->crypto.n_akm_suites)
- 		return 0;
-@@ -1691,11 +1932,30 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
- 			break;
- 		case WLAN_AKM_SUITE_FT_8021X:
- 			val = WPA2_AUTH_UNSPECIFIED | WPA2_AUTH_FT;
-+			profile->is_ft = true;
- 			if (sme->want_1x)
- 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
- 			break;
- 		case WLAN_AKM_SUITE_FT_PSK:
- 			val = WPA2_AUTH_PSK | WPA2_AUTH_FT;
-+			profile->is_ft = true;
-+			break;
-+		case WLAN_AKM_SUITE_DPP:
-+			val = WFA_AUTH_DPP;
-+			break;
-+		default:
-+			bphy_err(drvr, "invalid cipher group (%d)\n",
-+				 sme->crypto.cipher_group);
-+			return -EINVAL;
-+		}
-+	} else if (val & WPA3_AUTH_SAE_PSK) {
-+		switch (sme->crypto.akm_suites[0]) {
-+		case WLAN_AKM_SUITE_SAE:
-+			val = WPA3_AUTH_SAE_PSK;
-+			if (sme->crypto.sae_pwd) {
-+				brcmf_dbg(INFO, "using SAE offload\n");
-+				profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
-+			}
- 			break;
- 		default:
- 			bphy_err(drvr, "invalid cipher group (%d)\n",
-@@ -1704,8 +1964,17 @@ brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
- 		}
- 	}
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X)
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X) {
- 		brcmf_dbg(INFO, "using 1X offload\n");
-+		err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), "okc_enable",
-+					       &okc_enable);
-+		if (err) {
-+			bphy_err(drvr, "get okc_enable failed (%d)\n", err);
-+		} else {
-+			brcmf_dbg(INFO, "get okc_enable (%d)\n", okc_enable);
-+			profile->is_okc = okc_enable;
-+		}
-+	}
- 
- 	if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
- 		goto skip_mfp_config;
-@@ -1773,7 +2042,8 @@ brcmf_set_sharedkey(struct net_device *ndev,
- 	brcmf_dbg(CONN, "wpa_versions 0x%x cipher_pairwise 0x%x\n",
- 		  sec->wpa_versions, sec->cipher_pairwise);
- 
--	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))
-+	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2 |
-+				 NL80211_WPA_VERSION_3))
- 		return 0;
- 
- 	if (!(sec->cipher_pairwise &
-@@ -1980,31 +2250,50 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
- 		goto done;
- 	}
- 
--	if (sme->crypto.psk) {
--		if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
--			err = -EINVAL;
--			goto done;
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWSUP)) {
-+		if (sme->crypto.psk) {
-+			if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
-+				if (WARN_ON(profile->use_fwsup !=
-+					BRCMF_PROFILE_FWSUP_NONE)) {
-+					err = -EINVAL;
-+					goto done;
-+				}
-+				brcmf_dbg(INFO, "using PSK offload\n");
-+				profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
-+			}
-+		} else {
-+			profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
- 		}
--		brcmf_dbg(INFO, "using PSK offload\n");
--		profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
--	}
- 
--	if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
--		/* enable firmware supplicant for this interface */
--		err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
--		if (err < 0) {
--			bphy_err(drvr, "failed to enable fw supplicant\n");
--			goto done;
-+		if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
-+			/* enable firmware supplicant for this interface */
-+			err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
-+			if (err < 0) {
-+				bphy_err(drvr, "failed to enable fw supplicant\n");
-+				goto done;
-+			}
-+		} else {
-+			err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 0);
- 		}
--	}
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK) {
--		err = brcmf_set_pmk(ifp, sme->crypto.psk,
--				    BRCMF_WSEC_MAX_PSK_LEN);
-+		if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
-+			err = brcmf_set_pmk(ifp, sme->crypto.psk,
-+					    BRCMF_WSEC_MAX_PSK_LEN);
-+		else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
-+			/* clean up user-space RSNE */
-+			if (brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0)) {
-+				bphy_err(drvr, "failed to clean up user-space RSNE\n");
-+				goto done;
-+			}
-+			err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
-+						     sme->crypto.sae_pwd_len);
-+			if (!err && sme->crypto.psk)
-+				err = brcmf_set_pmk(ifp, sme->crypto.psk,
-+						    BRCMF_WSEC_MAX_PSK_LEN);
-+		}
- 		if (err)
- 			goto done;
- 	}
--
- 	/* Join with specific BSSID and cached SSID
- 	 * If SSID is zero join based on BSSID only
- 	 */
-@@ -2114,6 +2403,8 @@ brcmf_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *ndev,
- 
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &ifp->vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &ifp->vif->sme_state);
- 	cfg80211_disconnected(ndev, reason_code, NULL, 0, true, GFP_KERNEL);
- 
- 	memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
-@@ -2327,6 +2618,17 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
- 	if (!ext_key)
- 		key->flags = BRCMF_PRIMARY_KEY;
- 
-+	if (params->seq && params->seq_len == 6) {
-+		/* rx iv */
-+		u8 *ivptr;
-+
-+		ivptr = (u8 *)params->seq;
-+		key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) |
-+			(ivptr[3] << 8) | ivptr[2];
-+		key->rxiv.lo = (ivptr[1] << 8) | ivptr[0];
-+		key->iv_initialized = true;
-+	}
-+
- 	switch (params->cipher) {
- 	case WLAN_CIPHER_SUITE_WEP40:
- 		key->algo = CRYPTO_ALGO_WEP1;
-@@ -2774,7 +3076,7 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
- 		goto done;
- 	}
- 
--	pm = enabled ? PM_FAST : PM_OFF;
-+	pm = enabled ? ifp->drvr->settings->default_pm : PM_OFF;
- 	/* Do not enable the power save after assoc if it is a p2p interface */
- 	if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) {
- 		brcmf_dbg(INFO, "Do not enable power save for P2P clients\n");
-@@ -2812,7 +3114,7 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
- 
- 	if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
- 		bphy_err(drvr, "Bss info is larger than buffer. Discarding\n");
--		return 0;
-+		return -EINVAL;
- 	}
- 
- 	if (!bi->ctl_ch) {
-@@ -2980,10 +3282,7 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
- 				 struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = cfg->pub;
--	struct brcmf_bss_info_le *bi;
--	const struct brcmf_tlv *tim;
--	size_t ie_len;
--	u8 *ie;
-+	struct brcmf_bss_info_le *bi = NULL;
- 	s32 err = 0;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
-@@ -2997,29 +3296,8 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
- 		bphy_err(drvr, "Could not get bss info %d\n", err);
- 		goto update_bss_info_out;
- 	}
--
- 	bi = (struct brcmf_bss_info_le *)(cfg->extra_buf + 4);
- 	err = brcmf_inform_single_bss(cfg, bi);
--	if (err)
--		goto update_bss_info_out;
--
--	ie = ((u8 *)bi) + le16_to_cpu(bi->ie_offset);
--	ie_len = le32_to_cpu(bi->ie_length);
--
--	tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
--	if (!tim) {
--		/*
--		* active scan was done so we could not get dtim
--		* information out of probe response.
--		* so we speficially query dtim information to dongle.
--		*/
--		u32 var;
--		err = brcmf_fil_iovar_int_get(ifp, "dtim_assoc", &var);
--		if (err) {
--			bphy_err(drvr, "wl dtim_assoc failed (%d)\n", err);
--			goto update_bss_info_out;
--		}
--	}
- 
- update_bss_info_out:
- 	brcmf_dbg(TRACE, "Exit");
-@@ -3643,10 +3921,24 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct net_device *ndev = cfg_to_ndev(cfg);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_bus *bus_if = drvr->bus_if;
-+	struct brcmf_cfg80211_info *config = drvr->config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_RESUMING;
-+
- 	if (cfg->wowl.active) {
-+		/* wait for bus resumed */
-+		while (retry && bus_if->state != BRCMF_BUS_UP) {
-+			usleep_range(10000, 20000);
-+			retry--;
-+		}
-+		if (!retry && bus_if->state != BRCMF_BUS_UP)
-+			brcmf_err("timed out wait for bus resume\n");
-+
- 		brcmf_report_wowl_wakeind(wiphy, ifp);
- 		brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
- 		brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
-@@ -3662,7 +3954,12 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
- 					    brcmf_notify_sched_scan_results);
- 			cfg->wowl.nd_enabled = false;
- 		}
-+
-+		/* disable packet filters */
-+		brcmf_pktfilter_enable(ifp->ndev, false);
-+
- 	}
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_RESUMED;
- 	return 0;
- }
- 
-@@ -3720,6 +4017,9 @@ static void brcmf_configure_wowl(struct brcmf_cfg80211_info *cfg,
- 	brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1);
- 	brcmf_bus_wowl_config(cfg->pub->bus_if, true);
- 	cfg->wowl.active = true;
-+
-+	/* enable packet filters */
-+	brcmf_pktfilter_enable(ifp->ndev, true);
- }
- 
- static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
-@@ -3729,9 +4029,12 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 	struct net_device *ndev = cfg_to_ndev(cfg);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	struct brcmf_cfg80211_vif *vif;
-+	struct brcmf_cfg80211_info *config = ifp->drvr->config;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_SUSPENDING;
-+
- 	/* if the primary net_device is not READY there is nothing
- 	 * we can do but pray resume goes smoothly.
- 	 */
-@@ -3746,7 +4049,8 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
- 		brcmf_abort_scanning(cfg);
- 
--	if (wowl == NULL) {
-+	if (!wowl || !test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+			       &ifp->vif->sme_state)) {
- 		brcmf_bus_wowl_config(cfg->pub->bus_if, false);
- 		list_for_each_entry(vif, &cfg->vif_list, list) {
- 			if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state))
-@@ -3755,7 +4059,7 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 			 * disassociate from AP to save power while system is
- 			 * in suspended state
- 			 */
--			brcmf_link_down(vif, WLAN_REASON_UNSPECIFIED);
-+			brcmf_link_down(vif, WLAN_REASON_UNSPECIFIED, true);
- 			/* Make sure WPA_Supplicant receives all the event
- 			 * generated due to DISASSOC call to the fw to keep
- 			 * the state fw and WPA_Supplicant state consistent
-@@ -3766,14 +4070,19 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 		brcmf_set_mpc(ifp, 1);
- 
- 	} else {
--		/* Configure WOWL paramaters */
--		brcmf_configure_wowl(cfg, ifp, wowl);
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
-+			/* Configure WOWL parameters */
-+			brcmf_configure_wowl(cfg, ifp, wowl);
- 	}
- 
- exit:
--	brcmf_dbg(TRACE, "Exit\n");
-+	/* set cfg80211 pm state to cfg80211 suspended state */
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_SUSPENDED;
-+
- 	/* clear any scanning activity */
- 	cfg->scan_status = 0;
-+
-+	brcmf_dbg(TRACE, "Exit\n");
- 	return 0;
- }
- 
-@@ -3942,6 +4251,12 @@ static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
- 	return (memcmp(oui, WPA_OUI, TLV_OUI_LEN) == 0);
- }
- 
-+static bool brcmf_valid_dpp_suite(u8 *oui)
-+{
-+	return (memcmp(oui, WFA_OUI, TLV_OUI_LEN) == 0 &&
-+		*(oui + TLV_OUI_LEN) == DPP_AKM_SUITE_TYPE);
-+}
-+
- static s32
- brcmf_configure_wpaie(struct brcmf_if *ifp,
- 		      const struct brcmf_vs_tlv *wpa_ie,
-@@ -4055,38 +4370,47 @@ brcmf_configure_wpaie(struct brcmf_if *ifp,
- 		goto exit;
- 	}
- 	for (i = 0; i < count; i++) {
--		if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
-+		if (brcmf_valid_dpp_suite(&data[offset])) {
-+			wpa_auth |= WFA_AUTH_DPP;
-+			offset += TLV_OUI_LEN;
-+		} else if (brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
-+			offset += TLV_OUI_LEN;
-+			switch (data[offset]) {
-+			case RSN_AKM_NONE:
-+				brcmf_dbg(TRACE, "RSN_AKM_NONE\n");
-+				wpa_auth |= WPA_AUTH_NONE;
-+				break;
-+			case RSN_AKM_UNSPECIFIED:
-+				brcmf_dbg(TRACE, "RSN_AKM_UNSPECIFIED\n");
-+				is_rsn_ie ?
-+					(wpa_auth |= WPA2_AUTH_UNSPECIFIED) :
-+					(wpa_auth |= WPA_AUTH_UNSPECIFIED);
-+				break;
-+			case RSN_AKM_PSK:
-+				brcmf_dbg(TRACE, "RSN_AKM_PSK\n");
-+				is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) :
-+					    (wpa_auth |= WPA_AUTH_PSK);
-+				break;
-+			case RSN_AKM_SHA256_PSK:
-+				brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n");
-+				wpa_auth |= WPA2_AUTH_PSK_SHA256;
-+				break;
-+			case RSN_AKM_SHA256_1X:
-+				brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
-+				wpa_auth |= WPA2_AUTH_1X_SHA256;
-+				break;
-+			case RSN_AKM_SAE:
-+				brcmf_dbg(TRACE, "RSN_AKM_SAE\n");
-+				wpa_auth |= WPA3_AUTH_SAE_PSK;
-+				break;
-+			default:
-+				bphy_err(drvr, "Invalid key mgmt info\n");
-+			}
-+		} else {
- 			err = -EINVAL;
- 			bphy_err(drvr, "ivalid OUI\n");
- 			goto exit;
- 		}
--		offset += TLV_OUI_LEN;
--		switch (data[offset]) {
--		case RSN_AKM_NONE:
--			brcmf_dbg(TRACE, "RSN_AKM_NONE\n");
--			wpa_auth |= WPA_AUTH_NONE;
--			break;
--		case RSN_AKM_UNSPECIFIED:
--			brcmf_dbg(TRACE, "RSN_AKM_UNSPECIFIED\n");
--			is_rsn_ie ? (wpa_auth |= WPA2_AUTH_UNSPECIFIED) :
--				    (wpa_auth |= WPA_AUTH_UNSPECIFIED);
--			break;
--		case RSN_AKM_PSK:
--			brcmf_dbg(TRACE, "RSN_AKM_PSK\n");
--			is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) :
--				    (wpa_auth |= WPA_AUTH_PSK);
--			break;
--		case RSN_AKM_SHA256_PSK:
--			brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n");
--			wpa_auth |= WPA2_AUTH_PSK_SHA256;
--			break;
--		case RSN_AKM_SHA256_1X:
--			brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
--			wpa_auth |= WPA2_AUTH_1X_SHA256;
--			break;
--		default:
--			bphy_err(drvr, "Invalid key mgmt info\n");
--		}
- 		offset++;
- 	}
- 
-@@ -4101,14 +4425,17 @@ brcmf_configure_wpaie(struct brcmf_if *ifp,
- 				brcmf_dbg(TRACE, "MFP Required\n");
- 				mfp = BRCMF_MFP_REQUIRED;
- 				/* Firmware only supports mfp required in
--				 * combination with WPA2_AUTH_PSK_SHA256 or
--				 * WPA2_AUTH_1X_SHA256.
-+				 * combination with WPA2_AUTH_PSK_SHA256,
-+				 * WPA2_AUTH_1X_SHA256, or WPA3_AUTH_SAE_PSK.
- 				 */
- 				if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 |
--						  WPA2_AUTH_1X_SHA256))) {
-+						  WPA2_AUTH_1X_SHA256 |
-+						  WFA_AUTH_DPP |
-+						  WPA3_AUTH_SAE_PSK))) {
- 					err = -EINVAL;
- 					goto exit;
- 				}
-+
- 				/* Firmware has requirement that WPA2_AUTH_PSK/
- 				 * WPA2_AUTH_UNSPECIFIED be set, if SHA256 OUI
- 				 * is to be included in the rsn ie.
-@@ -4308,6 +4635,11 @@ s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
- 		mgmt_ie_len = &saved_ie->assoc_req_ie_len;
- 		mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie);
- 		break;
-+	case BRCMF_VNDR_IE_ASSOCRSP_FLAG:
-+		mgmt_ie_buf = saved_ie->assoc_res_ie;
-+		mgmt_ie_len = &saved_ie->assoc_res_ie_len;
-+		mgmt_ie_buf_len = sizeof(saved_ie->assoc_res_ie);
-+		break;
- 	default:
- 		err = -EPERM;
- 		bphy_err(drvr, "not suitable type\n");
-@@ -4454,6 +4786,57 @@ brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif,
- 	else
- 		brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
- 
-+	/* Set Assoc Response IEs to FW */
-+	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_ASSOCRSP_FLAG,
-+				    beacon->assocresp_ies,
-+				    beacon->assocresp_ies_len);
-+	if (err)
-+		brcmf_err("Set Assoc Resp IE Failed\n");
-+	else
-+		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc Resp\n");
-+
-+	return err;
-+}
-+
-+static s32
-+brcmf_parse_configure_security(struct brcmf_if *ifp,
-+			       struct cfg80211_ap_settings *settings,
-+			       enum nl80211_iftype dev_role)
-+{
-+	const struct brcmf_tlv *rsn_ie;
-+	const struct brcmf_vs_tlv *wpa_ie;
-+	s32 err = 0;
-+
-+	/* find the RSN_IE */
-+	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
-+				  settings->beacon.tail_len, WLAN_EID_RSN);
-+
-+	/* find the WPA_IE */
-+	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
-+				  settings->beacon.tail_len);
-+
-+	if (wpa_ie || rsn_ie) {
-+		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
-+		if (wpa_ie) {
-+			/* WPA IE */
-+			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
-+			if (err < 0)
-+				return err;
-+		} else {
-+			struct brcmf_vs_tlv *tmp_ie;
-+
-+			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
-+
-+			/* RSN IE */
-+			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
-+			if (err < 0)
-+				return err;
-+		}
-+	} else {
-+		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
-+		brcmf_configure_opensecurity(ifp);
-+	}
-+
- 	return err;
- }
- 
-@@ -4465,12 +4848,12 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	struct brcmf_pub *drvr = cfg->pub;
-+	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
-+	struct cfg80211_crypto_settings *crypto = &settings->crypto;
- 	const struct brcmf_tlv *ssid_ie;
- 	const struct brcmf_tlv *country_ie;
- 	struct brcmf_ssid_le ssid_le;
- 	s32 err = -EPERM;
--	const struct brcmf_tlv *rsn_ie;
--	const struct brcmf_vs_tlv *wpa_ie;
- 	struct brcmf_join_params join_params;
- 	enum nl80211_iftype dev_role;
- 	struct brcmf_fil_bss_enable_le bss_enable;
-@@ -4488,6 +4871,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 		  settings->inactivity_timeout);
- 	dev_role = ifp->vif->wdev.iftype;
- 	mbss = ifp->vif->mbss;
-+	brcmf_dbg(TRACE, "mbss %s\n", mbss ? "enabled" : "disabled");
- 
- 	/* store current 11d setting */
- 	if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY,
-@@ -4524,36 +4908,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 		brcmf_configure_arp_nd_offload(ifp, false);
- 	}
- 
--	/* find the RSN_IE */
--	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
--				  settings->beacon.tail_len, WLAN_EID_RSN);
--
--	/* find the WPA_IE */
--	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
--				  settings->beacon.tail_len);
--
--	if ((wpa_ie != NULL || rsn_ie != NULL)) {
--		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
--		if (wpa_ie != NULL) {
--			/* WPA IE */
--			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
--			if (err < 0)
--				goto exit;
--		} else {
--			struct brcmf_vs_tlv *tmp_ie;
--
--			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
--
--			/* RSN IE */
--			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
--			if (err < 0)
--				goto exit;
--		}
--	} else {
--		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
--		brcmf_configure_opensecurity(ifp);
--	}
--
- 	/* Parameters shared by all radio interfaces */
- 	if (!mbss) {
- 		if ((supports_11d) && (is_11d != ifp->vif->is_11d)) {
-@@ -4584,9 +4938,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 			}
- 		}
- 
--		if ((dev_role == NL80211_IFTYPE_AP) &&
--		    ((ifp->ifidx == 0) ||
--		     !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
-+		if (dev_role == NL80211_IFTYPE_AP && ifp->ifidx == 0) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			if (err < 0) {
- 				bphy_err(drvr, "BRCMF_C_DOWN error %d\n",
-@@ -4606,7 +4958,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 		err = -EINVAL;
- 		goto exit;
- 	}
--
-+	ifp->isap = false;
- 	/* Interface specific setup */
- 	if (dev_role == NL80211_IFTYPE_AP) {
- 		if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss))
-@@ -4634,30 +4986,59 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 			bphy_err(drvr, "BRCMF_C_UP error (%d)\n", err);
- 			goto exit;
- 		}
--		/* On DOWN the firmware removes the WEP keys, reconfigure
--		 * them if they were set.
--		 */
--		brcmf_cfg80211_reconfigure_wep(ifp);
- 
--		memset(&join_params, 0, sizeof(join_params));
--		/* join parameters starts with ssid */
--		memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
--		/* create softap */
--		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
-+		if (crypto->psk) {
-+			brcmf_dbg(INFO, "using PSK offload\n");
-+			profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_PSK);
-+			err = brcmf_set_pmk(ifp, crypto->psk,
-+					    BRCMF_WSEC_MAX_PSK_LEN);
-+			if (err < 0)
-+				goto exit;
-+		}
-+		if (crypto->sae_pwd) {
-+			brcmf_dbg(INFO, "using SAE offload\n");
-+			profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_SAE);
-+			err = brcmf_set_sae_password(ifp, crypto->sae_pwd,
-+						     crypto->sae_pwd_len);
-+			if (err < 0)
-+				goto exit;
-+		}
-+		if (profile->use_fwauth == 0)
-+			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
-+
-+		err = brcmf_parse_configure_security(ifp, settings,
-+						     NL80211_IFTYPE_AP);
-+		if (err < 0) {
-+			bphy_err(drvr, "brcmf_parse_configure_security error\n");
-+			goto exit;
-+		}
-+
-+		/* On DOWN the firmware removes the WEP keys, reconfigure
-+		 * them if they were set.
-+		 */
-+		brcmf_cfg80211_reconfigure_wep(ifp);
-+
-+		memset(&join_params, 0, sizeof(join_params));
-+		/* join parameters starts with ssid */
-+		memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
-+		/* create softap */
-+		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
- 					     &join_params, sizeof(join_params));
- 		if (err < 0) {
- 			bphy_err(drvr, "SET SSID error (%d)\n", err);
- 			goto exit;
- 		}
- 
--		if (settings->hidden_ssid) {
--			err = brcmf_fil_iovar_int_set(ifp, "closednet", 1);
--			if (err) {
--				bphy_err(drvr, "closednet error (%d)\n", err);
--				goto exit;
--			}
-+		err = brcmf_fil_iovar_int_set(ifp, "closednet",
-+					      settings->hidden_ssid);
-+		if (err) {
-+			bphy_err(drvr, "%s closednet error (%d)\n",
-+				 settings->hidden_ssid ?
-+				 "enabled" : "disabled",
-+				 err);
-+			goto exit;
- 		}
--
-+		ifp->isap = true;
- 		brcmf_dbg(TRACE, "AP mode configuration complete\n");
- 	} else if (dev_role == NL80211_IFTYPE_P2P_GO) {
- 		err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
-@@ -4666,6 +5047,14 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 				 chanspec, err);
- 			goto exit;
- 		}
-+
-+		err = brcmf_parse_configure_security(ifp, settings,
-+						     NL80211_IFTYPE_P2P_GO);
-+		if (err < 0) {
-+			brcmf_err("brcmf_parse_configure_security error\n");
-+			goto exit;
-+		}
-+
- 		err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
- 						sizeof(ssid_le));
- 		if (err < 0) {
-@@ -4681,6 +5070,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 			goto exit;
- 		}
- 
-+		ifp->isap = true;
- 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
- 	} else {
- 		WARN_ON(1);
-@@ -4694,6 +5084,9 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 	if ((err) && (!mbss)) {
- 		brcmf_set_mpc(ifp, 1);
- 		brcmf_configure_arp_nd_offload(ifp, true);
-+	} else {
-+		cfg->num_softap++;
-+		brcmf_dbg(TRACE, "Num of SoftAP %u\n", cfg->num_softap);
- 	}
- 	return err;
- }
-@@ -4703,9 +5096,11 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	struct brcmf_pub *drvr = cfg->pub;
-+	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
- 	s32 err;
- 	struct brcmf_fil_bss_enable_le bss_enable;
- 	struct brcmf_join_params join_params;
-+	s32 apsta = 0;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-@@ -4714,6 +5109,35 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 		/* first to make sure they get processed by fw. */
- 		msleep(400);
- 
-+		cfg->num_softap--;
-+
-+		/* Clear bss configuration and SSID */
-+		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
-+		bss_enable.enable = cpu_to_le32(0);
-+		err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
-+					       sizeof(bss_enable));
-+		if (err < 0)
-+			brcmf_err("bss_enable config failed %d\n", err);
-+
-+		memset(&join_params, 0, sizeof(join_params));
-+		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
-+					     &join_params, sizeof(join_params));
-+		if (err < 0)
-+			bphy_err(drvr, "SET SSID error (%d)\n", err);
-+
-+		if (cfg->num_softap) {
-+			brcmf_dbg(TRACE, "Num of SoftAP %u\n", cfg->num_softap);
-+			return 0;
-+		}
-+
-+		if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) {
-+			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK))
-+				brcmf_set_pmk(ifp, NULL, 0);
-+			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_SAE))
-+				brcmf_set_sae_password(ifp, NULL, 0);
-+			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
-+		}
-+
- 		if (ifp->vif->mbss) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			return err;
-@@ -4723,17 +5147,18 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 		if (ifp->bsscfgidx == 0)
- 			brcmf_fil_iovar_int_set(ifp, "closednet", 0);
- 
--		memset(&join_params, 0, sizeof(join_params));
--		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
--					     &join_params, sizeof(join_params));
--		if (err < 0)
--			bphy_err(drvr, "SET SSID error (%d)\n", err);
--		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
-+		err = brcmf_fil_iovar_int_get(ifp, "apsta", &apsta);
- 		if (err < 0)
--			bphy_err(drvr, "BRCMF_C_DOWN error %d\n", err);
--		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
--		if (err < 0)
--			bphy_err(drvr, "setting AP mode failed %d\n", err);
-+			brcmf_err("wl apsta failed (%d)\n", err);
-+
-+		if (!apsta) {
-+			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
-+			if (err < 0)
-+				bphy_err(drvr, "BRCMF_C_DOWN error %d\n", err);
-+			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
-+			if (err < 0)
-+				bphy_err(drvr, "Set AP mode error %d\n", err);
-+		}
- 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
- 			brcmf_fil_iovar_int_set(ifp, "mbss", 0);
- 		brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
-@@ -4753,8 +5178,8 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 			bphy_err(drvr, "bss_enable config failed %d\n", err);
- 	}
- 	brcmf_set_mpc(ifp, 1);
--	brcmf_configure_arp_nd_offload(ifp, true);
- 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
-+	brcmf_configure_arp_nd_offload(ifp, true);
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	return err;
-@@ -4942,7 +5367,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
- 					      &freq);
- 		chan_nr = ieee80211_frequency_to_channel(freq);
- 		af_params->channel = cpu_to_le32(chan_nr);
--
-+		af_params->dwell_time = cpu_to_le32(params->wait);
- 		memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
- 		       le16_to_cpu(action_frame->len));
- 
-@@ -4950,7 +5375,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
- 			  *cookie, le16_to_cpu(action_frame->len), freq);
- 
- 		ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg),
--						  af_params);
-+						  af_params, vif);
- 
- 		cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
- 					GFP_KERNEL);
-@@ -5208,17 +5633,27 @@ static int brcmf_cfg80211_set_pmk(struct wiphy *wiphy, struct net_device *dev,
- 				  const struct cfg80211_pmk_conf *conf)
- {
- 	struct brcmf_if *ifp;
-+	struct brcmf_pub *drvr;
-+	int ret;
- 
- 	brcmf_dbg(TRACE, "enter\n");
- 
- 	/* expect using firmware supplicant for 1X */
- 	ifp = netdev_priv(dev);
-+	drvr = ifp->drvr;
- 	if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X))
- 		return -EINVAL;
- 
- 	if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN)
- 		return -ERANGE;
- 
-+	if (ifp->vif->profile.is_okc) {
-+		ret = brcmf_fil_iovar_data_set(ifp, "okc_info_pmk", conf->pmk,
-+					       conf->pmk_len);
-+		if (ret < 0)
-+			bphy_err(drvr, "okc_info_pmk iovar failed: ret=%d\n", ret);
-+	}
-+
- 	return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len);
- }
- 
-@@ -5235,6 +5670,37 @@ static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
- 	return brcmf_set_pmk(ifp, NULL, 0);
- }
- 
-+static int
-+brcmf_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev,
-+			  struct bss_parameters *params)
-+{
-+	struct brcmf_if *ifp;
-+	int ret = 0;
-+	u32 ap_isolate, val;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+	ifp = netdev_priv(dev);
-+	if (params->ap_isolate >= 0) {
-+		ap_isolate = (u32)params->ap_isolate;
-+		ret = brcmf_fil_iovar_int_set(ifp, "ap_isolate", ap_isolate);
-+		if (ret < 0)
-+			brcmf_err("ap_isolate iovar failed: ret=%d\n", ret);
-+	}
-+
-+	/* Get ap_isolate value from firmware to detemine whether fmac */
-+	/* driver supports packet forwarding. */
-+	if (brcmf_fil_iovar_int_get(ifp, "ap_isolate", &val) == 0) {
-+		ifp->fmac_pkt_fwd_en =
-+			((params->ap_isolate == 0) && (val == 1)) ?
-+			true : false;
-+	} else {
-+		brcmf_err("get ap_isolate iovar failed: ret=%d\n", ret);
-+		ifp->fmac_pkt_fwd_en = false;
-+	}
-+
-+	return ret;
-+}
-+
- static struct cfg80211_ops brcmf_cfg80211_ops = {
- 	.add_virtual_intf = brcmf_cfg80211_add_iface,
- 	.del_virtual_intf = brcmf_cfg80211_del_iface,
-@@ -5280,6 +5746,7 @@ static struct cfg80211_ops brcmf_cfg80211_ops = {
- 	.update_connect_params = brcmf_cfg80211_update_conn_params,
- 	.set_pmk = brcmf_cfg80211_set_pmk,
- 	.del_pmk = brcmf_cfg80211_del_pmk,
-+	.change_bss = brcmf_cfg80211_change_bss,
- };
- 
- struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings)
-@@ -5301,6 +5768,7 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
- 	struct brcmf_cfg80211_vif *vif_walk;
- 	struct brcmf_cfg80211_vif *vif;
- 	bool mbss;
-+	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
- 
- 	brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
- 		  sizeof(*vif));
-@@ -5313,7 +5781,8 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
- 
- 	brcmf_init_prof(&vif->profile);
- 
--	if (type == NL80211_IFTYPE_AP) {
-+	if (type == NL80211_IFTYPE_AP &&
-+	    brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
- 		mbss = false;
- 		list_for_each_entry(vif_walk, &cfg->vif_list, list) {
- 			if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
-@@ -5342,8 +5811,10 @@ void brcmf_cfg80211_free_netdev(struct net_device *ndev)
- 	ifp = netdev_priv(ndev);
- 	vif = ifp->vif;
- 
--	if (vif)
-+	if (vif) {
- 		brcmf_free_vif(vif);
-+		ifp->vif = NULL;
-+	}
- }
- 
- static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
-@@ -5352,14 +5823,16 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
- 	u32 event = e->event_code;
- 	u32 status = e->status;
- 
--	if (vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK &&
-+	if ((vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK ||
-+	     vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_SAE) &&
- 	    event == BRCMF_E_PSK_SUP &&
- 	    status == BRCMF_E_STATUS_FWSUP_COMPLETED)
- 		set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
- 	if (event == BRCMF_E_SET_SSID && status == BRCMF_E_STATUS_SUCCESS) {
- 		brcmf_dbg(CONN, "Processing set ssid\n");
- 		memcpy(vif->profile.bssid, e->addr, ETH_ALEN);
--		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK)
-+		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK &&
-+		    vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_SAE)
- 			return true;
- 
- 		set_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
-@@ -5427,12 +5900,153 @@ static void brcmf_clear_assoc_ies(struct brcmf_cfg80211_info *cfg)
- 	conn_info->resp_ie_len = 0;
- }
- 
-+u8 brcmf_map_prio_to_prec(void *config, u8 prio)
-+{
-+	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
-+
-+	if (!cfg)
-+		return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
-+		       (prio ^ 2) : prio;
-+
-+	/* For those AC(s) with ACM flag set to 1, convert its 4-level priority
-+	 * to an 8-level precedence which is the same as BE's
-+	 */
-+	if (prio > PRIO_8021D_EE &&
-+	    cfg->ac_priority[prio] == cfg->ac_priority[PRIO_8021D_BE])
-+		return cfg->ac_priority[prio] * 2;
-+
-+	/* Conversion of 4-level priority to 8-level precedence */
-+	if (prio == PRIO_8021D_BE || prio == PRIO_8021D_BK ||
-+	    prio == PRIO_8021D_CL || prio == PRIO_8021D_VO)
-+		return cfg->ac_priority[prio] * 2;
-+	else
-+		return cfg->ac_priority[prio] * 2 + 1;
-+}
-+
-+u8 brcmf_map_prio_to_aci(void *config, u8 prio)
-+{
-+	/* Prio here refers to the 802.1d priority in range of 0 to 7.
-+	 * ACI here refers to the WLAN AC Index in range of 0 to 3.
-+	 * This function will return ACI corresponding to input prio.
-+	 */
-+	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
-+
-+	if (cfg)
-+		return cfg->ac_priority[prio];
-+
-+	return prio;
-+}
-+
-+static void brcmf_init_wmm_prio(u8 *priority)
-+{
-+	/* Initialize AC priority array to default
-+	 * 802.1d priority as per following table:
-+	 * 802.1d prio 0,3 maps to BE
-+	 * 802.1d prio 1,2 maps to BK
-+	 * 802.1d prio 4,5 maps to VI
-+	 * 802.1d prio 6,7 maps to VO
-+	 */
-+	priority[0] = BRCMF_FWS_FIFO_AC_BE;
-+	priority[3] = BRCMF_FWS_FIFO_AC_BE;
-+	priority[1] = BRCMF_FWS_FIFO_AC_BK;
-+	priority[2] = BRCMF_FWS_FIFO_AC_BK;
-+	priority[4] = BRCMF_FWS_FIFO_AC_VI;
-+	priority[5] = BRCMF_FWS_FIFO_AC_VI;
-+	priority[6] = BRCMF_FWS_FIFO_AC_VO;
-+	priority[7] = BRCMF_FWS_FIFO_AC_VO;
-+}
-+
-+static void brcmf_wifi_prioritize_acparams(const
-+	struct brcmf_cfg80211_edcf_acparam *acp, u8 *priority)
-+{
-+	u8 aci;
-+	u8 aifsn;
-+	u8 ecwmin;
-+	u8 ecwmax;
-+	u8 acm;
-+	u8 ranking_basis[EDCF_AC_COUNT];
-+	u8 aci_prio[EDCF_AC_COUNT]; /* AC_BE, AC_BK, AC_VI, AC_VO */
-+	u8 index;
-+
-+	for (aci = 0; aci < EDCF_AC_COUNT; aci++, acp++) {
-+		aifsn  = acp->ACI & EDCF_AIFSN_MASK;
-+		acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0;
-+		ecwmin = acp->ECW & EDCF_ECWMIN_MASK;
-+		ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT;
-+		brcmf_dbg(CONN, "ACI %d aifsn %d acm %d ecwmin %d ecwmax %d\n",
-+			  aci, aifsn, acm, ecwmin, ecwmax);
-+		/* Default AC_VO will be the lowest ranking value */
-+		ranking_basis[aci] = aifsn + ecwmin + ecwmax;
-+		/* Initialise priority starting at 0 (AC_BE) */
-+		aci_prio[aci] = 0;
-+
-+		/* If ACM is set, STA can't use this AC as per 802.11.
-+		 * Change the ranking to BE
-+		 */
-+		if (aci != AC_BE && aci != AC_BK && acm == 1)
-+			ranking_basis[aci] = ranking_basis[AC_BE];
-+	}
-+
-+	/* Ranking method which works for AC priority
-+	 * swapping when values for cwmin, cwmax and aifsn are varied
-+	 * Compare each aci_prio against each other aci_prio
-+	 */
-+	for (aci = 0; aci < EDCF_AC_COUNT; aci++) {
-+		for (index = 0; index < EDCF_AC_COUNT; index++) {
-+			if (index != aci) {
-+				/* Smaller ranking value has higher priority,
-+				 * so increment priority for each ACI which has
-+				 * a higher ranking value
-+				 */
-+				if (ranking_basis[aci] < ranking_basis[index])
-+					aci_prio[aci]++;
-+			}
-+		}
-+	}
-+
-+	/* By now, aci_prio[] will be in range of 0 to 3.
-+	 * Use ACI prio to get the new priority value for
-+	 * each 802.1d traffic type, in this range.
-+	 */
-+	if (!(aci_prio[AC_BE] == aci_prio[AC_BK] &&
-+	      aci_prio[AC_BK] == aci_prio[AC_VI] &&
-+	      aci_prio[AC_VI] == aci_prio[AC_VO])) {
-+
-+		/* 802.1d 0,3 maps to BE */
-+		priority[0] = aci_prio[AC_BE];
-+		priority[3] = aci_prio[AC_BE];
-+
-+		/* 802.1d 1,2 maps to BK */
-+		priority[1] = aci_prio[AC_BK];
-+		priority[2] = aci_prio[AC_BK];
-+
-+		/* 802.1d 4,5 maps to VO */
-+		priority[4] = aci_prio[AC_VI];
-+		priority[5] = aci_prio[AC_VI];
-+
-+		/* 802.1d 6,7 maps to VO */
-+		priority[6] = aci_prio[AC_VO];
-+		priority[7] = aci_prio[AC_VO];
-+
-+	} else {
-+		/* Initialize to default priority */
-+		brcmf_init_wmm_prio(priority);
-+	}
-+
-+	brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n",
-+		  priority[0], priority[1], priority[2], priority[3]);
-+
-+	brcmf_dbg(CONN, "Adj prio VI 4->%d, VI 5->%d, VO 6->%d, VO 7->%d\n",
-+		  priority[4], priority[5], priority[6], priority[7]);
-+}
-+
- static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 			       struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct brcmf_cfg80211_assoc_ielen_le *assoc_info;
- 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
-+	struct brcmf_cfg80211_edcf_acparam edcf_acparam_info[EDCF_AC_COUNT];
- 	u32 req_len;
- 	u32 resp_len;
- 	s32 err = 0;
-@@ -5481,6 +6095,17 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 			    GFP_KERNEL);
- 		if (!conn_info->resp_ie)
- 			conn_info->resp_ie_len = 0;
-+
-+		err = brcmf_fil_iovar_data_get(ifp, "wme_ac_sta",
-+					       edcf_acparam_info,
-+					       sizeof(edcf_acparam_info));
-+		if (err) {
-+			brcmf_err("could not get wme_ac_sta (%d)\n", err);
-+			return err;
-+		}
-+
-+		brcmf_wifi_prioritize_acparams(edcf_acparam_info,
-+					       cfg->ac_priority);
- 	} else {
- 		conn_info->resp_ie_len = 0;
- 		conn_info->resp_ie = NULL;
-@@ -5491,6 +6116,47 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
-+static bool
-+brcmf_has_pmkid(const u8 *parse, u32 len)
-+{
-+	const struct brcmf_tlv *rsn_ie;
-+	const u8 *ie;
-+	u32 ie_len;
-+	u32 offset;
-+	u16 count;
-+
-+	rsn_ie = brcmf_parse_tlvs(parse, len, WLAN_EID_RSN);
-+	if (!rsn_ie)
-+		goto done;
-+	ie = (const u8 *)rsn_ie;
-+	ie_len = rsn_ie->len + TLV_HDR_LEN;
-+	/* Skip group data cipher suite */
-+	offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN;
-+	if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
-+		goto done;
-+	/* Skip pairwise cipher suite(s) */
-+	count = ie[offset] + (ie[offset + 1] << 8);
-+	offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
-+	if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
-+		goto done;
-+	/* Skip auth key management suite(s) */
-+	count = ie[offset] + (ie[offset + 1] << 8);
-+	offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
-+	if (offset + RSN_CAP_LEN >= ie_len)
-+		goto done;
-+	/* Skip rsn capabilities */
-+	offset += RSN_CAP_LEN;
-+	if (offset + RSN_PMKID_COUNT_LEN > ie_len)
-+		goto done;
-+	/* Extract PMKID count */
-+	count = ie[offset] + (ie[offset + 1] << 8);
-+	if (count)
-+		return true;
-+
-+done:
-+	return false;
-+}
-+
- static s32
- brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
- 		       struct net_device *ndev,
-@@ -5551,6 +6217,11 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
- 	roam_info.resp_ie = conn_info->resp_ie;
- 	roam_info.resp_ie_len = conn_info->resp_ie_len;
- 
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X &&
-+	    (brcmf_has_pmkid(roam_info.req_ie, roam_info.req_ie_len) ||
-+	     profile->is_ft || profile->is_okc))
-+		roam_info.authorized = true;
-+
- 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
- 	brcmf_dbg(CONN, "Report roaming result\n");
- 
-@@ -5581,6 +6252,10 @@ brcmf_bss_connect_done(struct brcmf_cfg80211_info *cfg,
- 				&ifp->vif->sme_state);
- 			conn_params.status = WLAN_STATUS_SUCCESS;
- 		} else {
-+			clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS,
-+				  &ifp->vif->sme_state);
-+			clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS,
-+				  &ifp->vif->sme_state);
- 			conn_params.status = WLAN_STATUS_AUTH_TIMEOUT;
- 		}
- 		conn_params.bssid = profile->bssid;
-@@ -5588,6 +6263,11 @@ brcmf_bss_connect_done(struct brcmf_cfg80211_info *cfg,
- 		conn_params.req_ie_len = conn_info->req_ie_len;
- 		conn_params.resp_ie = conn_info->resp_ie;
- 		conn_params.resp_ie_len = conn_info->resp_ie_len;
-+
-+		if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X &&
-+		    brcmf_has_pmkid(conn_params.req_ie, conn_params.req_ie_len))
-+			conn_params.authorized = true;
-+
- 		cfg80211_connect_done(ndev, &conn_params, GFP_KERNEL);
- 		brcmf_dbg(CONN, "Report connect result - connection %s\n",
- 			  completed ? "succeeded" : "failed");
-@@ -5660,6 +6340,14 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
- 	}
- 
- 	if (brcmf_is_apmode(ifp->vif)) {
-+		if (e->event_code == BRCMF_E_ASSOC_IND ||
-+		    e->event_code == BRCMF_E_REASSOC_IND) {
-+			brcmf_findadd_sta(ifp, e->addr);
-+		} else if ((e->event_code == BRCMF_E_DISASSOC_IND) ||
-+				(e->event_code == BRCMF_E_DEAUTH_IND) ||
-+				(e->event_code == BRCMF_E_DEAUTH)) {
-+			brcmf_del_sta(ifp, e->addr);
-+		}
- 		err = brcmf_notify_connect_status_ap(cfg, ndev, e, data);
- 	} else if (brcmf_is_linkup(ifp->vif, e)) {
- 		brcmf_dbg(CONN, "Linkup\n");
-@@ -5677,10 +6365,23 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
- 		brcmf_net_setcarrier(ifp, true);
- 	} else if (brcmf_is_linkdown(e)) {
- 		brcmf_dbg(CONN, "Linkdown\n");
--		if (!brcmf_is_ibssmode(ifp->vif)) {
-+		if (!brcmf_is_ibssmode(ifp->vif) &&
-+		    (test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+			      &ifp->vif->sme_state) ||
-+		     test_bit(BRCMF_VIF_STATUS_CONNECTING,
-+			      &ifp->vif->sme_state))) {
-+			if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+				     &ifp->vif->sme_state) &&
-+			    memcmp(profile->bssid, e->addr, ETH_ALEN))
-+				return err;
-+
- 			brcmf_bss_connect_done(cfg, ndev, e, false);
- 			brcmf_link_down(ifp->vif,
--					brcmf_map_fw_linkdown_reason(e));
-+					brcmf_map_fw_linkdown_reason(e),
-+					e->event_code &
-+					(BRCMF_E_DEAUTH_IND |
-+					BRCMF_E_DISASSOC_IND)
-+					? false : true);
- 			brcmf_init_prof(ndev_to_prof(ndev));
- 			if (ndev != cfg_to_ndev(cfg))
- 				complete(&cfg->vif_disabled);
-@@ -5743,6 +6444,9 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
- 	struct brcmf_if_event *ifevent = (struct brcmf_if_event *)data;
- 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
- 	struct brcmf_cfg80211_vif *vif;
-+	enum nl80211_iftype iftype = NL80211_IFTYPE_UNSPECIFIED;
-+	bool vif_pend = false;
-+	int err;
- 
- 	brcmf_dbg(TRACE, "Enter: action %u flags %u ifidx %u bsscfgidx %u\n",
- 		  ifevent->action, ifevent->flags, ifevent->ifidx,
-@@ -5755,9 +6459,28 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
- 	switch (ifevent->action) {
- 	case BRCMF_E_IF_ADD:
- 		/* waiting process may have timed out */
--		if (!cfg->vif_event.vif) {
-+		if (!vif) {
-+			/* handle IF_ADD event from firmware */
- 			spin_unlock(&event->vif_event_lock);
--			return -EBADF;
-+			vif_pend = true;
-+			if (ifevent->role == WLC_E_IF_ROLE_STA)
-+				iftype = NL80211_IFTYPE_STATION;
-+			else if (ifevent->role == WLC_E_IF_ROLE_AP)
-+				iftype = NL80211_IFTYPE_AP;
-+			else
-+				vif_pend = false;
-+
-+			if (vif_pend) {
-+				vif = brcmf_alloc_vif(cfg, iftype);
-+				if (IS_ERR(vif)) {
-+					brcmf_err("Role:%d failed to alloc vif\n",
-+						  ifevent->role);
-+					return PTR_ERR(vif);
-+				}
-+			} else {
-+				brcmf_err("Invalid Role:%d\n", ifevent->role);
-+				return -EBADF;
-+			}
- 		}
- 
- 		ifp->vif = vif;
-@@ -5767,6 +6490,18 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
- 			ifp->ndev->ieee80211_ptr = &vif->wdev;
- 			SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy));
- 		}
-+
-+		if (vif_pend) {
-+			err = brcmf_net_attach(ifp, false);
-+			if (err) {
-+				brcmf_err("netdevice register failed with err:%d\n",
-+					  err);
-+				brcmf_free_vif(vif);
-+				free_netdev(ifp->ndev);
-+			}
-+			return err;
-+		}
-+
- 		spin_unlock(&event->vif_event_lock);
- 		wake_up(&event->vif_wq);
- 		return 0;
-@@ -5892,6 +6627,7 @@ static s32 wl_init_priv(struct brcmf_cfg80211_info *cfg)
- 	mutex_init(&cfg->usr_sync);
- 	brcmf_init_escan(cfg);
- 	brcmf_init_conf(cfg->conf);
-+	brcmf_init_wmm_prio(cfg->ac_priority);
- 	init_completion(&cfg->vif_disabled);
- 	return err;
- }
-@@ -5901,6 +6637,7 @@ static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
- 	cfg->dongle_up = false;	/* dongle down */
- 	brcmf_abort_scanning(cfg);
- 	brcmf_deinit_priv_mem(cfg);
-+	brcmf_clear_assoc_ies(cfg);
- }
- 
- static void init_vif_event(struct brcmf_cfg80211_vif_event *event)
-@@ -6454,6 +7191,9 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
-  *	#STA <= 1, #AP <= 1, channels = 1, 2 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-  *
-+ * no p2p and rsdb:
-+ *	#STA <= 1, #AP <= 2, channels = 2, 3 total
-+ *
-  * p2p, no mchan, and mbss:
-  *
-  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
-@@ -6462,9 +7202,19 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
-  *
-  * p2p, mchan, and mbss:
-  *
-- *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-+ *	#STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-+ *
-+ * p2p, rsdb, and no mbss:
-+ *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-+ *	 channels = 2, 4 total
-+ *
-+ * p2p, rsdb, mbss
-+ *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-+ *	 channels = 2, 4 total
-+ *	#AP <= 4, matching BI, channels = 1, 4 total
-+ *
-  */
- static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
-@@ -6472,13 +7222,15 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	struct ieee80211_iface_limit *c0_limits = NULL;
- 	struct ieee80211_iface_limit *p2p_limits = NULL;
- 	struct ieee80211_iface_limit *mbss_limits = NULL;
--	bool mbss, p2p;
-+	bool mbss, p2p, rsdb, mchan;
- 	int i, c, n_combos;
- 
- 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
- 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
-+	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
-+	mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
- 
--	n_combos = 1 + !!p2p + !!mbss;
-+	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
- 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
- 	if (!combo)
- 		goto err;
-@@ -6489,16 +7241,39 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 
- 	c = 0;
- 	i = 0;
--	c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
-+	if (p2p && rsdb)
-+		c0_limits = kcalloc(4, sizeof(*c0_limits), GFP_KERNEL);
-+	else if (p2p)
-+		c0_limits = kcalloc(3, sizeof(*c0_limits), GFP_KERNEL);
-+	else
-+		c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
- 	if (!c0_limits)
- 		goto err;
--	c0_limits[i].max = 1;
--	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
--	if (p2p) {
--		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
-+	if (p2p && rsdb) {
-+		combo[c].num_different_channels = 2;
-+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+					  BIT(NL80211_IFTYPE_P2P_GO) |
-+					  BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+				       BIT(NL80211_IFTYPE_P2P_GO);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = 4;
-+	} else if (p2p) {
-+		if (mchan) {
- 			combo[c].num_different_channels = 2;
--		else
-+			c0_limits[i].max = 2;
-+			c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		} else {
- 			combo[c].num_different_channels = 1;
-+			c0_limits[i].max = 1;
-+			c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		}
- 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 					  BIT(NL80211_IFTYPE_P2P_GO) |
- 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
-@@ -6507,16 +7282,26 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 				       BIT(NL80211_IFTYPE_P2P_GO);
-+		combo[c].max_interfaces = i;
-+	} else if (rsdb) {
-+		combo[c].num_different_channels = 2;
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = 3;
- 	} else {
- 		combo[c].num_different_channels = 1;
- 		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = i;
- 	}
--	combo[c].max_interfaces = i;
- 	combo[c].n_limits = i;
- 	combo[c].limits = c0_limits;
- 
--	if (p2p) {
-+	if (p2p && !rsdb) {
- 		c++;
- 		i = 0;
- 		p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
-@@ -6579,6 +7364,7 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct wiphy_wowlan_support *wowl;
-+	struct cfg80211_wowlan *brcmf_wowlan_config = NULL;
- 
- 	wowl = kmemdup(&brcmf_wowlan_support, sizeof(brcmf_wowlan_support),
- 		       GFP_KERNEL);
-@@ -6601,12 +7387,34 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	}
- 
- 	wiphy->wowlan = wowl;
-+
-+	/* wowlan_config structure report for kernels */
-+	brcmf_wowlan_config = kzalloc(sizeof(*brcmf_wowlan_config),
-+				      GFP_KERNEL);
-+	if (brcmf_wowlan_config) {
-+		brcmf_wowlan_config->any = false;
-+		brcmf_wowlan_config->disconnect = true;
-+		brcmf_wowlan_config->eap_identity_req = true;
-+		brcmf_wowlan_config->four_way_handshake = true;
-+		brcmf_wowlan_config->rfkill_release = false;
-+		brcmf_wowlan_config->patterns = NULL;
-+		brcmf_wowlan_config->n_patterns = 0;
-+		brcmf_wowlan_config->tcp = NULL;
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
-+			brcmf_wowlan_config->gtk_rekey_failure = true;
-+		else
-+			brcmf_wowlan_config->gtk_rekey_failure = false;
-+	} else {
-+		brcmf_err("Can not allocate memory for brcm_wowlan_config\n");
-+	}
-+	wiphy->wowlan_config = brcmf_wowlan_config;
- #endif
- }
- 
- static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	const struct ieee80211_iface_combination *combo;
- 	struct ieee80211_supported_band *band;
- 	u16 max_interfaces = 0;
-@@ -6664,6 +7472,16 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK);
- 		wiphy_ext_feature_set(wiphy,
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X);
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
-+			wiphy_ext_feature_set(wiphy,
-+					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
-+	}
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH)) {
-+		wiphy_ext_feature_set(wiphy,
-+				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK);
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
-+			wiphy_ext_feature_set(wiphy,
-+					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
- 	}
- 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
- 	wiphy->max_remain_on_channel_duration = 5000;
-@@ -6674,9 +7492,12 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	/* vendor commands/events support */
- 	wiphy->vendor_commands = brcmf_vendor_cmds;
- 	wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1;
-+	wiphy->vendor_events = brcmf_vendor_events;
-+	wiphy->n_vendor_events = BRCMF_VNDR_EVTS_LAST;
-+	brcmf_fweh_register(cfg->pub, BRCMF_E_PHY_TEMP,
-+			    brcmf_wiphy_phy_temp_evt_handler);
- 
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
--		brcmf_wiphy_wowl_params(wiphy, ifp);
-+	brcmf_wiphy_wowl_params(wiphy, ifp);
- 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist,
- 				     sizeof(bandlist));
- 	if (err) {
-@@ -6739,6 +7560,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
- 	struct wireless_dev *wdev;
- 	struct brcmf_if *ifp;
- 	s32 power_mode;
-+	s32 eap_restrict;
- 	s32 err = 0;
- 
- 	if (cfg->dongle_up)
-@@ -6753,7 +7575,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
- 
- 	brcmf_dongle_scantime(ifp);
- 
--	power_mode = cfg->pwr_save ? PM_FAST : PM_OFF;
-+	power_mode = cfg->pwr_save ? ifp->drvr->settings->default_pm : PM_OFF;
- 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, power_mode);
- 	if (err)
- 		goto default_conf_out;
-@@ -6763,6 +7585,14 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
- 	err = brcmf_dongle_roam(ifp);
- 	if (err)
- 		goto default_conf_out;
-+
-+	eap_restrict = ifp->drvr->settings->eap_restrict;
-+	if (eap_restrict) {
-+		err = brcmf_fil_iovar_int_set(ifp, "eap_restrict",
-+					      eap_restrict);
-+		if (err)
-+			brcmf_info("eap_restrict error (%d)\n", err);
-+	}
- 	err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
- 					  NULL);
- 	if (err)
-@@ -6799,7 +7629,7 @@ static s32 __brcmf_cfg80211_down(struct brcmf_if *ifp)
- 	 * from AP to save power
- 	 */
- 	if (check_vif_up(ifp->vif)) {
--		brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED);
-+		brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED, true);
- 
- 		/* Make sure WPA_Supplicant receives all the event
- 		   generated due to DISASSOC call to the fw to keep
-@@ -6948,6 +7778,220 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	return 0;
- }
- 
-+static int
-+brcmf_parse_dump_obss(char *buf, struct brcmf_dump_survey *survey)
-+{
-+	int i;
-+	char *token;
-+	char delim[] = "\n ";
-+	unsigned long val;
-+	int err = 0;
-+
-+	token = strsep(&buf, delim);
-+	while (token) {
-+		if (!strcmp(token, "OBSS")) {
-+			for (i = 0; i < OBSS_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->obss = val;
-+		}
-+
-+		if (!strcmp(token, "IBSS")) {
-+			for (i = 0; i < IBSS_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->ibss = val;
-+		}
-+
-+		if (!strcmp(token, "TXDur")) {
-+			for (i = 0; i < TX_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->tx = val;
-+		}
-+
-+		if (!strcmp(token, "Category")) {
-+			for (i = 0; i < CTG_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->no_ctg = val;
-+		}
-+
-+		if (!strcmp(token, "Packet")) {
-+			for (i = 0; i < PKT_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->no_pckt = val;
-+		}
-+
-+		if (!strcmp(token, "Opp(time):")) {
-+			for (i = 0; i < IDLE_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->idle = val;
-+		}
-+
-+		token = strsep(&buf, delim);
-+
-+		if (err)
-+			return err;
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+brcmf_dump_obss(struct brcmf_if *ifp, struct cca_msrmnt_query req,
-+		struct brcmf_dump_survey *survey)
-+{
-+	struct cca_stats_n_flags *results;
-+	char *buf;
-+	int err;
-+
-+	buf = kzalloc(sizeof(char) * BRCMF_DCMD_MEDLEN, GFP_KERNEL);
-+	if (!buf)
-+		return -ENOMEM;
-+
-+	memcpy(buf, &req, sizeof(struct cca_msrmnt_query));
-+	err = brcmf_fil_iovar_data_get(ifp, "dump_obss",
-+				       buf, BRCMF_DCMD_MEDLEN);
-+	if (err) {
-+		brcmf_err("dump_obss error (%d)\n", err);
-+		err = -EINVAL;
-+		goto exit;
-+	}
-+	results = (struct cca_stats_n_flags *)(buf);
-+
-+	if (req.msrmnt_query)
-+		brcmf_parse_dump_obss(results->buf, survey);
-+
-+exit:
-+	kfree(buf);
-+	return err;
-+}
-+
-+static s32
-+cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
-+		     struct ieee80211_channel *chan,
-+		     enum nl80211_channel_type channel_type)
-+{
-+	u16 chspec = 0;
-+	int err = 0;
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-+
-+	/* set_channel */
-+	chspec = channel_to_chanspec(&cfg->d11inf, chan);
-+	if (chspec != INVCHANSPEC) {
-+		err = brcmf_fil_iovar_int_set(ifp, "chanspec", chspec);
-+		if (err)
-+			err = -EINVAL;
-+	} else {
-+		brcmf_err("failed to convert host chanspec to fw chanspec\n");
-+		err = -EINVAL;
-+	}
-+
-+	return err;
-+}
-+
-+static int
-+brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
-+			   int idx, struct survey_info *info)
-+{
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-+	struct brcmf_dump_survey *survey;
-+	struct ieee80211_supported_band *band;
-+	struct ieee80211_channel *chan;
-+	struct cca_msrmnt_query req;
-+	u32 noise;
-+	int err;
-+
-+	brcmf_dbg(TRACE, "Enter: channel idx=%d\n", idx);
-+
-+	band = wiphy->bands[NL80211_BAND_2GHZ];
-+	if (band && idx >= band->n_channels) {
-+		idx -= band->n_channels;
-+		band = NULL;
-+	}
-+
-+	if (!band || idx >= band->n_channels) {
-+		band = wiphy->bands[NL80211_BAND_5GHZ];
-+		if (idx >= band->n_channels)
-+			return -ENOENT;
-+	}
-+
-+	/* Setting current channel to the requested channel */
-+	chan = &band->channels[idx];
-+	err = cfg80211_set_channel(wiphy, ndev, chan, NL80211_CHAN_HT20);
-+	if (err) {
-+		info->channel = chan;
-+		info->filled = 0;
-+		return 0;
-+	}
-+
-+	survey = kzalloc(sizeof(*survey), GFP_KERNEL);
-+	if (!survey)
-+		return -ENOMEM;
-+
-+	/* Disable mpc */
-+	brcmf_set_mpc(ifp, 0);
-+
-+	/* Set interface up, explicitly. */
-+	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
-+	if (err) {
-+		brcmf_err("set interface up failed, err = %d\n", err);
-+		goto exit;
-+	}
-+
-+	/* Get noise value */
-+	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
-+	if (err) {
-+		brcmf_err("Get Phy Noise failed, use dummy value\n");
-+		noise = CHAN_NOISE_DUMMY;
-+	}
-+
-+
-+	/* Start Measurement for obss stats on current channel */
-+	req.msrmnt_query = 0;
-+	req.time_req = ACS_MSRMNT_DELAY;
-+	err = brcmf_dump_obss(ifp, req, survey);
-+	if (err)
-+		goto exit;
-+
-+	/* Add 10 ms for IOVAR completion */
-+	msleep(ACS_MSRMNT_DELAY + 10);
-+
-+	/* Issue IOVAR to collect measurement results */
-+	req.msrmnt_query = 1;
-+	err = brcmf_dump_obss(ifp, req, survey);
-+	if (err)
-+		goto exit;
-+
-+	info->channel = chan;
-+	info->noise = noise;
-+	info->time = ACS_MSRMNT_DELAY;
-+	info->time_busy = ACS_MSRMNT_DELAY - survey->idle;
-+	info->time_rx = survey->obss + survey->ibss + survey->no_ctg +
-+		survey->no_pckt;
-+	info->time_tx = survey->tx;
-+	info->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME |
-+		SURVEY_INFO_TIME_BUSY | SURVEY_INFO_TIME_RX |
-+		SURVEY_INFO_TIME_TX;
-+
-+	brcmf_dbg(INFO, "OBSS dump: channel %d: survey duration %d\n",
-+		  ieee80211_frequency_to_channel(chan->center_freq),
-+		  ACS_MSRMNT_DELAY);
-+	brcmf_dbg(INFO, "noise(%d) busy(%llu) rx(%llu) tx(%llu)\n",
-+		  info->noise, info->time_busy, info->time_rx, info->time_tx);
-+
-+exit:
-+	if (!brcmf_is_apmode(ifp->vif))
-+		brcmf_set_mpc(ifp, 1);
-+	kfree(survey);
-+	return err;
-+}
-+
- static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
- 					struct regulatory_request *req)
- {
-@@ -7043,6 +8087,8 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
- 
- 	cfg->wiphy = wiphy;
- 	cfg->pub = drvr;
-+	cfg->pm_state = BRCMF_CFG80211_PM_STATE_RESUMED;
-+	cfg->num_softap = 0;
- 	init_vif_event(&cfg->vif_event);
- 	INIT_LIST_HEAD(&cfg->vif_list);
- 
-@@ -7099,6 +8145,11 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
- 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
- 		ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
- #endif
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_DUMP_OBSS))
-+		ops->dump_survey = brcmf_cfg80211_dump_survey;
-+	else
-+		ops->dump_survey = NULL;
-+
- 	err = wiphy_register(wiphy);
- 	if (err < 0) {
- 		bphy_err(drvr, "Could not register wiphy device (%d)\n", err);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 14d5bbad1db1..7db8735de27e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -23,6 +23,23 @@
- #define WL_ROAM_TRIGGER_LEVEL		-75
- #define WL_ROAM_DELTA			20
- 
-+/* WME Access Category Indices (ACIs) */
-+#define AC_BE			0	/* Best Effort */
-+#define AC_BK			1	/* Background */
-+#define AC_VI			2	/* Video */
-+#define AC_VO			3	/* Voice */
-+#define EDCF_AC_COUNT		4
-+#define MAX_8021D_PRIO		8
-+
-+#define EDCF_ACI_MASK			0x60
-+#define EDCF_ACI_SHIFT			5
-+#define EDCF_ACM_MASK                  0x10
-+#define EDCF_ECWMIN_MASK		0x0f
-+#define EDCF_ECWMAX_SHIFT		4
-+#define EDCF_AIFSN_MASK			0x0f
-+#define EDCF_AIFSN_MAX			15
-+#define EDCF_ECWMAX_MASK		0xf0
-+
- /* Keep BRCMF_ESCAN_BUF_SIZE below 64K (65536). Allocing over 64K can be
-  * problematic on some systems and should be avoided.
-  */
-@@ -75,6 +92,15 @@
- 
- #define BRCMF_VIF_EVENT_TIMEOUT		msecs_to_jiffies(1500)
- 
-+#define BRCMF_PM_WAIT_MAXRETRY			100
-+
-+/* cfg80211 wowlan definitions */
-+#define WL_WOWLAN_MAX_PATTERNS			8
-+#define WL_WOWLAN_MIN_PATTERN_LEN		1
-+#define WL_WOWLAN_MAX_PATTERN_LEN		255
-+#define WL_WOWLAN_PKT_FILTER_ID_FIRST	201
-+#define WL_WOWLAN_PKT_FILTER_ID_LAST	(WL_WOWLAN_PKT_FILTER_ID_FIRST + \
-+					WL_WOWLAN_MAX_PATTERNS - 1)
- /**
-  * enum brcmf_scan_status - scan engine status
-  *
-@@ -107,7 +133,21 @@ struct brcmf_cfg80211_security {
- enum brcmf_profile_fwsup {
- 	BRCMF_PROFILE_FWSUP_NONE,
- 	BRCMF_PROFILE_FWSUP_PSK,
--	BRCMF_PROFILE_FWSUP_1X
-+	BRCMF_PROFILE_FWSUP_1X,
-+	BRCMF_PROFILE_FWSUP_SAE
-+};
-+
-+/**
-+ * enum brcmf_profile_fwauth - firmware authenticator profile
-+ *
-+ * @BRCMF_PROFILE_FWAUTH_NONE: no firmware authenticator
-+ * @BRCMF_PROFILE_FWAUTH_PSK: authenticator for WPA/WPA2-PSK
-+ * @BRCMF_PROFILE_FWAUTH_PSK: authenticator for SAE
-+ */
-+enum brcmf_profile_fwauth {
-+	BRCMF_PROFILE_FWAUTH_NONE,
-+	BRCMF_PROFILE_FWAUTH_PSK,
-+	BRCMF_PROFILE_FWAUTH_SAE
- };
- 
- /**
-@@ -122,6 +162,9 @@ struct brcmf_cfg80211_profile {
- 	struct brcmf_cfg80211_security sec;
- 	struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
- 	enum brcmf_profile_fwsup use_fwsup;
-+	u16 use_fwauth;
-+	bool is_ft;
-+	bool is_okc;
- };
- 
- /**
-@@ -145,25 +188,36 @@ enum brcmf_vif_status {
- 	BRCMF_VIF_STATUS_ASSOC_SUCCESS,
- };
- 
-+enum brcmf_cfg80211_pm_state {
-+	BRCMF_CFG80211_PM_STATE_RESUMED,
-+	BRCMF_CFG80211_PM_STATE_RESUMING,
-+	BRCMF_CFG80211_PM_STATE_SUSPENDED,
-+	BRCMF_CFG80211_PM_STATE_SUSPENDING,
-+};
-+
- /**
-  * struct vif_saved_ie - holds saved IEs for a virtual interface.
-  *
-  * @probe_req_ie: IE info for probe request.
-  * @probe_res_ie: IE info for probe response.
-  * @beacon_ie: IE info for beacon frame.
-+ * @assoc_res_ie: IE info for association response frame.
-  * @probe_req_ie_len: IE info length for probe request.
-  * @probe_res_ie_len: IE info length for probe response.
-  * @beacon_ie_len: IE info length for beacon frame.
-+ * @assoc_res_ie_len: IE info length for association response frame.
-  */
- struct vif_saved_ie {
- 	u8  probe_req_ie[IE_MAX_LEN];
- 	u8  probe_res_ie[IE_MAX_LEN];
- 	u8  beacon_ie[IE_MAX_LEN];
- 	u8  assoc_req_ie[IE_MAX_LEN];
-+	u8  assoc_res_ie[IE_MAX_LEN];
- 	u32 probe_req_ie_len;
- 	u32 probe_res_ie_len;
- 	u32 beacon_ie_len;
- 	u32 assoc_req_ie_len;
-+	u32 assoc_res_ie_len;
- };
- 
- /**
-@@ -203,6 +257,12 @@ struct brcmf_cfg80211_assoc_ielen_le {
- 	__le32 resp_len;
- };
- 
-+struct brcmf_cfg80211_edcf_acparam {
-+	u8 ACI;
-+	u8 ECW;
-+	u16 TXOP;        /* stored in network order (ls octet first) */
-+};
-+
- /* dongle escan state */
- enum wl_escan_state {
- 	WL_ESCAN_STATE_IDLE,
-@@ -321,6 +381,9 @@ struct brcmf_cfg80211_info {
- 	struct brcmf_assoclist_le assoclist;
- 	struct brcmf_cfg80211_wowl wowl;
- 	struct brcmf_pno_info *pno;
-+	u8 ac_priority[MAX_8021D_PRIO];
-+	u8 pm_state;
-+	u8 num_softap;
- };
- 
- /**
-@@ -417,5 +480,6 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
- void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
- void brcmf_cfg80211_free_netdev(struct net_device *ndev);
--
-+bool brcmf_is_apmode_operating(struct wiphy *wiphy);
-+void brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev);
- #endif /* BRCMFMAC_CFG80211_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index dd586a96b57a..8285045a9620 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -213,6 +213,24 @@ struct sbsocramregs {
- #define	ARMCR4_BSZ_MASK		0x3f
- #define	ARMCR4_BSZ_MULT		8192
- 
-+/* Minimum PMU resource mask for 43012C0 */
-+#define CY_43012_PMU_MIN_RES_MASK       0xF8BFE77
-+
-+/* PMU STATUS mask for 43012C0 */
-+#define CY_43012_PMU_STATUS_MASK        0x1AC
-+
-+/* PMU CONTROL EXT mask for 43012C0 */
-+#define CY_43012_PMU_CONTROL_EXT_MASK   0x11
-+
-+/* PMU Watchdog Counter Tick value for 43012C0 */
-+#define CY_43012_PMU_WATCHDOG_TICK_VAL  0x04
-+
-+/* PMU Watchdog Counter Tick value for 4373 */
-+#define CY_4373_PMU_WATCHDOG_TICK_VAL  0x04
-+
-+/* Minimum PMU resource mask for 4373 */
-+#define CY_4373_PMU_MIN_RES_MASK       0xFCAFF7F
-+
- struct brcmf_core_priv {
- 	struct brcmf_core pub;
- 	u32 wrapbase;
-@@ -433,11 +451,25 @@ static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset,
- {
- 	struct brcmf_chip_priv *ci;
- 	int count;
-+	struct brcmf_core *d11core2 = NULL;
-+	struct brcmf_core_priv *d11priv2 = NULL;
- 
- 	ci = core->chip;
- 
-+	/* special handle two D11 cores reset */
-+	if (core->pub.id == BCMA_CORE_80211) {
-+		d11core2 = brcmf_chip_get_d11core(&ci->pub, 1);
-+		if (d11core2) {
-+			brcmf_dbg(INFO, "found two d11 cores, reset both\n");
-+			d11priv2 = container_of(d11core2,
-+						struct brcmf_core_priv, pub);
-+		}
-+	}
-+
- 	/* must disable first to work for arbitrary current core state */
- 	brcmf_chip_ai_coredisable(core, prereset, reset);
-+	if (d11priv2)
-+		brcmf_chip_ai_coredisable(d11priv2, prereset, reset);
- 
- 	count = 0;
- 	while (ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL) &
-@@ -449,9 +481,30 @@ static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset,
- 		usleep_range(40, 60);
- 	}
- 
-+	if (d11priv2) {
-+		count = 0;
-+		while (ci->ops->read32(ci->ctx,
-+				       d11priv2->wrapbase + BCMA_RESET_CTL) &
-+				       BCMA_RESET_CTL_RESET) {
-+			ci->ops->write32(ci->ctx,
-+					 d11priv2->wrapbase + BCMA_RESET_CTL,
-+					 0);
-+			count++;
-+			if (count > 50)
-+				break;
-+			usleep_range(40, 60);
-+		}
-+	}
-+
- 	ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
- 			 postreset | BCMA_IOCTL_CLK);
- 	ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL);
-+
-+	if (d11priv2) {
-+		ci->ops->write32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL,
-+				 postreset | BCMA_IOCTL_CLK);
-+		ci->ops->read32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL);
-+	}
- }
- 
- char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
-@@ -689,6 +742,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
- 		return 0x200000;
- 	case CY_CC_4373_CHIP_ID:
- 		return 0x160000;
-+	case CY_CC_89459_CHIP_ID:
-+		return ((ci->pub.chiprev < 9) ? 0x180000 : 0x160000);
- 	default:
- 		brcmf_err("unknown chip: %s\n", ci->pub.name);
- 		break;
-@@ -1113,6 +1168,21 @@ void brcmf_chip_detach(struct brcmf_chip *pub)
- 	kfree(chip);
- }
- 
-+struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit)
-+{
-+	struct brcmf_chip_priv *chip;
-+	struct brcmf_core_priv *core;
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	list_for_each_entry(core, &chip->cores, list) {
-+		if (core->pub.id == BCMA_CORE_80211) {
-+			if (unit-- == 0)
-+				return &core->pub;
-+		}
-+	}
-+	return NULL;
-+}
-+
- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *pub, u16 coreid)
- {
- 	struct brcmf_chip_priv *chip;
-@@ -1155,6 +1225,14 @@ struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub)
- 	return cc;
- }
- 
-+struct brcmf_core *brcmf_chip_get_gci(struct brcmf_chip *pub)
-+{
-+	struct brcmf_core *gci;
-+
-+	gci = brcmf_chip_get_core(pub, BCMA_CORE_GCI);
-+	return gci;
-+}
-+
- bool brcmf_chip_iscoreup(struct brcmf_core *pub)
- {
- 	struct brcmf_core_priv *core;
-@@ -1357,10 +1435,12 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
- 		reg = chip->ops->read32(chip->ctx, addr);
- 		return reg != 0;
- 	case CY_CC_4373_CHIP_ID:
-+	case CY_CC_89459_CHIP_ID:
- 		/* explicitly check SR engine enable bit */
- 		addr = CORE_CC_REG(base, sr_control0);
- 		reg = chip->ops->read32(chip->ctx, addr);
- 		return (reg & CC_SR_CTL0_ENABLE_MASK) != 0;
-+	case BRCM_CC_4359_CHIP_ID:
- 	case CY_CC_43012_CHIP_ID:
- 		addr = CORE_CC_REG(pmu->base, retention_ctl);
- 		reg = chip->ops->read32(chip->ctx, addr);
-@@ -1378,3 +1458,151 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
- 			       PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
- 	}
- }
-+
-+void brcmf_chip_reset_pmu_regs(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 addr;
-+	u32 base;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_pmu(pub)->base;
-+
-+	switch (pub->chip) {
-+	case CY_CC_43012_CHIP_ID:
-+		/* SW scratch */
-+		addr = CORE_CC_REG(base, swscratch);
-+		chip->ops->write32(chip->ctx, addr, 0);
-+
-+		/* PMU status */
-+		addr = CORE_CC_REG(base, pmustatus);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_STATUS_MASK);
-+
-+		/* PMU control ext */
-+		addr = CORE_CC_REG(base, pmucontrol_ext);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_CONTROL_EXT_MASK);
-+		break;
-+
-+	default:
-+		brcmf_err("Unsupported chip id\n");
-+		break;
-+	}
-+}
-+
-+void brcmf_chip_set_default_min_res_mask(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 addr;
-+	u32 base;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_pmu(pub)->base;
-+	switch (pub->chip) {
-+	case CY_CC_43012_CHIP_ID:
-+		addr = CORE_CC_REG(base, min_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_MIN_RES_MASK);
-+		break;
-+
-+	default:
-+		brcmf_err("Unsupported chip id\n");
-+		break;
-+	}
-+}
-+
-+void brcmf_chip_ulp_reset_lhl_regs(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 base;
-+	u32 addr;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_gci(pub)->base;
-+
-+	/* LHL Top Level Power Sequence Control */
-+	addr = CORE_GCI_REG(base, lhl_top_pwrseq_ctl_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* GPIO Interrupt Enable0 */
-+	addr = CORE_GCI_REG(base, gpio_int_en_port_adr[0]);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* GPIO Interrupt Status0 */
-+	addr = CORE_GCI_REG(base, gpio_int_st_port_adr[0]);
-+	chip->ops->write32(chip->ctx, addr, ~0);
-+
-+	/* WL ARM Timer0 Interrupt Mask */
-+	addr = CORE_GCI_REG(base, lhl_wl_armtim0_intrp_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* WL ARM Timer0 Interrupt Status */
-+	addr = CORE_GCI_REG(base, lhl_wl_armtim0_st_adr);
-+	chip->ops->write32(chip->ctx, addr, ~0);
-+
-+	/* WL ARM Timer */
-+	addr = CORE_GCI_REG(base, lhl_wl_armtim0_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* WL MAC Timer0 Interrupt Mask */
-+	addr = CORE_GCI_REG(base, lhl_wl_mactim0_intrp_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* WL MAC Timer0 Interrupt Status */
-+	addr = CORE_GCI_REG(base, lhl_wl_mactim0_st_adr);
-+	chip->ops->write32(chip->ctx, addr, ~0);
-+
-+	/* WL MAC TimerInt0 */
-+	addr = CORE_GCI_REG(base, lhl_wl_mactim_int0_adr);
-+	chip->ops->write32(chip->ctx, addr, 0x0);
-+}
-+
-+void brcmf_chip_reset_watchdog(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 base;
-+	u32 addr;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_pmu(pub)->base;
-+
-+	switch (pub->chip) {
-+	case CY_CC_43012_CHIP_ID:
-+		addr = CORE_CC_REG(base, min_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_MIN_RES_MASK);
-+		/* Watchdog res mask */
-+		addr = CORE_CC_REG(base, watchdog_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_MIN_RES_MASK);
-+		/* PMU watchdog */
-+		addr = CORE_CC_REG(base, pmuwatchdog);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_WATCHDOG_TICK_VAL);
-+		break;
-+	case CY_CC_4373_CHIP_ID:
-+		addr = CORE_CC_REG(base, min_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_4373_PMU_MIN_RES_MASK);
-+		addr = CORE_CC_REG(base, watchdog_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_4373_PMU_MIN_RES_MASK);
-+		addr = CORE_CC_REG(base, pmuwatchdog);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_4373_PMU_WATCHDOG_TICK_VAL);
-+		mdelay(100);
-+		break;
-+	default:
-+		break;
-+	}
-+}
-+
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-index 7b00f6a59e89..216e5540a13c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-@@ -8,7 +8,10 @@
- #include <linux/types.h>
- 
- #define CORE_CC_REG(base, field) \
--		(base + offsetof(struct chipcregs, field))
-+		((base) + offsetof(struct chipcregs, field))
-+
-+#define CORE_GCI_REG(base, field) \
-+		((base) + offsetof(struct chipgciregs, field))
- 
- /**
-  * struct brcmf_chip - chip level information.
-@@ -74,6 +77,7 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx,
- 				     const struct brcmf_buscore_ops *ops);
- void brcmf_chip_detach(struct brcmf_chip *chip);
- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid);
-+struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit);
- struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip);
- struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub);
- bool brcmf_chip_iscoreup(struct brcmf_core *core);
-@@ -84,5 +88,9 @@ void brcmf_chip_set_passive(struct brcmf_chip *ci);
- bool brcmf_chip_set_active(struct brcmf_chip *ci, u32 rstvec);
- bool brcmf_chip_sr_capable(struct brcmf_chip *pub);
- char *brcmf_chip_name(u32 chipid, u32 chiprev, char *buf, uint len);
-+void brcmf_chip_reset_watchdog(struct brcmf_chip *pub);
-+void brcmf_chip_ulp_reset_lhl_regs(struct brcmf_chip *pub);
-+void brcmf_chip_reset_pmu_regs(struct brcmf_chip *pub);
-+void brcmf_chip_set_default_min_res_mask(struct brcmf_chip *pub);
- 
- #endif /* BRCMF_AXIDMP_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index dec25e415619..2825d6575dc1 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -20,6 +20,9 @@
- #include "of.h"
- #include "firmware.h"
- #include "chip.h"
-+#include "defs.h"
-+#include "fweh.h"
-+#include <brcm_hw_ids.h>
- 
- MODULE_AUTHOR("Broadcom Corporation");
- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
-@@ -67,6 +70,18 @@ static int brcmf_iapp_enable;
- module_param_named(iapp, brcmf_iapp_enable, int, 0);
- MODULE_PARM_DESC(iapp, "Enable partial support for the obsoleted Inter-Access Point Protocol");
- 
-+static int brcmf_eap_restrict;
-+module_param_named(eap_restrict, brcmf_eap_restrict, int, 0400);
-+MODULE_PARM_DESC(eap_restrict, "Block non-802.1X frames until auth finished");
-+
-+static int brcmf_sdio_wq_highpri;
-+module_param_named(sdio_wq_highpri, brcmf_sdio_wq_highpri, int, 0);
-+MODULE_PARM_DESC(sdio_wq_highpri, "SDIO workqueue is set to high priority");
-+
-+static int brcmf_max_pm;
-+module_param_named(max_pm, brcmf_max_pm, int, 0);
-+MODULE_PARM_DESC(max_pm, "Use max power management mode by default");
-+
- #ifdef DEBUG
- /* always succeed brcmf_bus_started() */
- static int brcmf_ignore_probe_fail;
-@@ -201,16 +216,18 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 	char *clmver;
- 	char *ptr;
- 	s32 err;
-+	struct eventmsgs_ext *eventmask_msg = NULL;
-+	u8 msglen;
- 
--	/* retreive mac address */
-+	/* retrieve mac addresses */
- 	err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
- 				       sizeof(ifp->mac_addr));
- 	if (err < 0) {
- 		bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
- 		goto done;
- 	}
--	memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
- 	memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
-+	memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
- 
- 	bus = ifp->drvr->bus_if;
- 	ri = &ifp->drvr->revinfo;
-@@ -292,6 +309,11 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 		brcmf_dbg(INFO, "CLM version = %s\n", clmver);
- 	}
- 
-+	/* set apsta */
-+	err = brcmf_fil_iovar_int_set(ifp, "apsta", 1);
-+	if (err)
-+		brcmf_info("failed setting apsta, %d\n", err);
-+
- 	/* set mpc */
- 	err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
- 	if (err) {
-@@ -316,6 +338,43 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 		goto done;
- 	}
- 
-+	/* Enable event_msg_ext specific to 43012 chip */
-+	if (bus->chip == CY_CC_43012_CHIP_ID) {
-+		/* Program event_msg_ext to support event larger than 128 */
-+		msglen = (roundup(BRCMF_E_LAST, NBBY) / NBBY) +
-+				  EVENTMSGS_EXT_STRUCT_SIZE;
-+		/* Allocate buffer for eventmask_msg */
-+		eventmask_msg = kzalloc(msglen, GFP_KERNEL);
-+		if (!eventmask_msg) {
-+			err = -ENOMEM;
-+			goto done;
-+		}
-+
-+		/* Read the current programmed event_msgs_ext */
-+		eventmask_msg->ver = EVENTMSGS_VER;
-+		eventmask_msg->len = roundup(BRCMF_E_LAST, NBBY) / NBBY;
-+		err = brcmf_fil_iovar_data_get(ifp, "event_msgs_ext",
-+					       eventmask_msg,
-+					       msglen);
-+
-+		/* Enable ULP event */
-+		brcmf_dbg(EVENT, "enable event ULP\n");
-+		setbit(eventmask_msg->mask, BRCMF_E_ULP);
-+
-+		/* Write updated Event mask */
-+		eventmask_msg->ver = EVENTMSGS_VER;
-+		eventmask_msg->command = EVENTMSGS_SET_MASK;
-+		eventmask_msg->len = (roundup(BRCMF_E_LAST, NBBY) / NBBY);
-+
-+		err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
-+					       eventmask_msg, msglen);
-+		if (err) {
-+			brcmf_err("Set event_msgs_ext error (%d)\n", err);
-+			kfree(eventmask_msg);
-+			goto done;
-+		}
-+		kfree(eventmask_msg);
-+	}
- 	/* Setup default scan channel time */
- 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
- 				    BRCMF_DEFAULT_SCAN_CHANNEL_TIME);
-@@ -336,6 +395,18 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 
- 	/* Enable tx beamforming, errors can be ignored (not supported) */
- 	(void)brcmf_fil_iovar_int_set(ifp, "txbf", 1);
-+
-+	/* add unicast packet filter */
-+	err = brcmf_pktfilter_add_remove(ifp->ndev,
-+					 BRCMF_UNICAST_FILTER_NUM, true);
-+	if (err == -BRCMF_FW_UNSUPPORTED) {
-+		/* FW not support can be ignored */
-+		err = 0;
-+		goto done;
-+	} else if (err) {
-+		bphy_err(drvr, "Add unicast filter error (%d)\n", err);
-+	}
-+
- done:
- 	return err;
- }
-@@ -407,12 +478,15 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
- 	if (!settings)
- 		return NULL;
- 
--	/* start by using the module paramaters */
-+	/* start by using the module parameters */
- 	settings->p2p_enable = !!brcmf_p2p_enable;
- 	settings->feature_disable = brcmf_feature_disable;
- 	settings->fcmode = brcmf_fcmode;
- 	settings->roamoff = !!brcmf_roamoff;
- 	settings->iapp = !!brcmf_iapp_enable;
-+	settings->eap_restrict = !!brcmf_eap_restrict;
-+	settings->sdio_wq_highpri = !!brcmf_sdio_wq_highpri;
-+	settings->default_pm = !!brcmf_max_pm ? PM_MAX : PM_FAST;
- #ifdef DEBUG
- 	settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;
- #endif
-@@ -460,7 +534,7 @@ static int __init brcmf_common_pd_probe(struct platform_device *pdev)
- 
- 	brcmfmac_pdata = dev_get_platdata(&pdev->dev);
- 
--	if (brcmfmac_pdata->power_on)
-+	if (brcmfmac_pdata && brcmfmac_pdata->power_on)
- 		brcmfmac_pdata->power_on();
- 
- 	return 0;
-@@ -492,7 +566,7 @@ static int __init brcmfmac_module_init(void)
- 	if (err == -ENODEV)
- 		brcmf_dbg(INFO, "No platform data available.\n");
- 
--	/* Initialize global module paramaters */
-+	/* Initialize global module parameters */
- 	brcmf_mp_attach();
- 
- 	/* Continue the initialization by registering the different busses */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-index 144cf4570bc3..c0bf5867af5f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-@@ -37,6 +37,9 @@ extern struct brcmf_mp_global_t brcmf_mp_global;
-  * @feature_disable: Feature_disable bitmask.
-  * @fcmode: FWS flow control.
-  * @roamoff: Firmware roaming off?
-+ * @eap_restrict: Not allow data tx/rx until 802.1X auth succeeds
-+ * @sdio_wq_highpri: Tasks submitted to SDIO workqueue will run immediately.
-+ * @default_pm: default power management (PM) mode.
-  * @ignore_probe_fail: Ignore probe failure.
-  * @country_codes: If available, pointer to struct for translating country codes
-  * @bus: Bus specific platform data. Only SDIO at the mmoment.
-@@ -47,6 +50,9 @@ struct brcmf_mp_device {
- 	int		fcmode;
- 	bool		roamoff;
- 	bool		iapp;
-+	bool		eap_restrict;
-+	bool		sdio_wq_highpri;
-+	int		default_pm;
- 	bool		ignore_probe_fail;
- 	struct brcmfmac_pd_cc *country_codes;
- 	const char	*board_type;
-@@ -72,4 +78,8 @@ static inline void
- brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev) {}
- #endif
- 
-+u8 brcmf_map_prio_to_prec(void *cfg, u8 prio);
-+
-+u8 brcmf_map_prio_to_aci(void *cfg, u8 prio);
-+
- #endif /* BRCMFMAC_COMMON_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 85cf96461dde..b2d5b1fad407 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -5,6 +5,7 @@
- 
- #include <linux/kernel.h>
- #include <linux/etherdevice.h>
-+#include <linux/ethtool.h>
- #include <linux/module.h>
- #include <linux/inetdevice.h>
- #include <net/cfg80211.h>
-@@ -62,6 +63,14 @@ struct wlc_d11rxhdr {
- 	s8 rxpwr[4];
- } __packed;
- 
-+#define BRCMF_IF_STA_LIST_LOCK_INIT(ifp) spin_lock_init(&(ifp)->sta_list_lock)
-+#define BRCMF_IF_STA_LIST_LOCK(ifp, flags) \
-+	spin_lock_irqsave(&(ifp)->sta_list_lock, (flags))
-+#define BRCMF_IF_STA_LIST_UNLOCK(ifp, flags) \
-+	spin_unlock_irqrestore(&(ifp)->sta_list_lock, (flags))
-+
-+#define BRCMF_STA_NULL ((struct brcmf_sta *)NULL)
-+
- char *brcmf_ifname(struct brcmf_if *ifp)
- {
- 	if (!ifp)
-@@ -96,6 +105,11 @@ void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
- 	s32 err;
- 	u32 mode;
- 
-+	if (enable && brcmf_is_apmode_operating(ifp->drvr->wiphy)) {
-+		brcmf_dbg(TRACE, "Skip ARP/ND offload enable when soft AP is running\n");
-+		return;
-+	}
-+
- 	if (enable)
- 		mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
- 	else
-@@ -352,6 +366,9 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
- 	if ((skb->priority == 0) || (skb->priority > 7))
- 		skb->priority = cfg80211_classify8021d(skb, NULL);
- 
-+	/* set pacing shift for packet aggregation */
-+	sk_pacing_shift_update(skb->sk, 8);
-+
- 	ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
- 	if (ret < 0)
- 		brcmf_txfinalize(ifp, skb, false);
-@@ -569,6 +586,7 @@ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
- 
- static const struct ethtool_ops brcmf_ethtool_ops = {
- 	.get_drvinfo = brcmf_ethtool_get_drvinfo,
-+	.get_ts_info = ethtool_op_get_ts_info,
- };
- 
- static int brcmf_netdev_stop(struct net_device *ndev)
-@@ -579,9 +597,6 @@ static int brcmf_netdev_stop(struct net_device *ndev)
- 
- 	brcmf_cfg80211_down(ndev);
- 
--	if (ifp->drvr->bus_if->state == BRCMF_BUS_UP)
--		brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0);
--
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	return 0;
-@@ -817,7 +832,9 @@ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
- 
- 	init_waitqueue_head(&ifp->pend_8021x_wait);
- 	spin_lock_init(&ifp->netif_stop_lock);
--
-+	BRCMF_IF_STA_LIST_LOCK_INIT(ifp);
-+	 /* Initialize STA info list */
-+	INIT_LIST_HEAD(&ifp->sta_list);
- 	if (mac_addr != NULL)
- 		memcpy(ifp->mac_addr, mac_addr, ETH_ALEN);
- 
-@@ -1049,6 +1066,15 @@ static int brcmf_inet6addr_changed(struct notifier_block *nb,
- }
- #endif
- 
-+
-+int brcmf_fwlog_attach(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pub *drvr = bus_if->drvr;
-+
-+	return brcmf_debug_fwlog_init(drvr);
-+}
-+
- static int brcmf_revinfo_read(struct seq_file *s, void *data)
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(s->private);
-@@ -1238,7 +1264,7 @@ int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings)
- 	return 0;
- }
- 
--int brcmf_attach(struct device *dev)
-+int brcmf_attach(struct device *dev, bool start_bus)
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
- 	struct brcmf_pub *drvr = bus_if->drvr;
-@@ -1269,10 +1295,13 @@ int brcmf_attach(struct device *dev)
- 	/* attach firmware event handler */
- 	brcmf_fweh_attach(drvr);
- 
--	ret = brcmf_bus_started(drvr, drvr->ops);
--	if (ret != 0) {
--		bphy_err(drvr, "dongle is not responding: err=%d\n", ret);
--		goto fail;
-+	if (start_bus) {
-+		ret = brcmf_bus_started(drvr, drvr->ops);
-+		if (ret != 0) {
-+			bphy_err(drvr, "dongle is not responding: err=%d\n",
-+				 ret);
-+			goto fail;
-+		}
- 	}
- 
- 	return 0;
-@@ -1322,7 +1351,8 @@ void brcmf_fw_crashed(struct device *dev)
- 
- 	brcmf_dev_coredump(dev);
- 
--	schedule_work(&drvr->bus_reset);
-+	if (drvr->bus_reset.func)
-+		schedule_work(&drvr->bus_reset);
- }
- 
- void brcmf_detach(struct device *dev)
-@@ -1345,6 +1375,11 @@ void brcmf_detach(struct device *dev)
- #endif
- 
- 	brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
-+	/* make sure primary interface removed last */
-+	for (i = BRCMF_MAX_IFS - 1; i > -1; i--) {
-+		if (drvr->iflist[i])
-+			brcmf_remove_interface(drvr->iflist[i], false);
-+	}
- 	brcmf_bus_stop(drvr->bus_if);
- 
- 	brcmf_fweh_detach(drvr);
-@@ -1355,12 +1390,6 @@ void brcmf_detach(struct device *dev)
- 		drvr->mon_if = NULL;
- 	}
- 
--	/* make sure primary interface removed last */
--	for (i = BRCMF_MAX_IFS - 1; i > -1; i--) {
--		if (drvr->iflist[i])
--			brcmf_del_if(drvr, drvr->iflist[i]->bsscfgidx, false);
--	}
--
- 	if (drvr->config) {
- 		brcmf_p2p_detach(&drvr->config->p2p);
- 		brcmf_cfg80211_detach(drvr->config);
-@@ -1405,8 +1434,10 @@ int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp)
- 				 !brcmf_get_pend_8021x_cnt(ifp),
- 				 MAX_WAIT_FOR_8021X_TX);
- 
--	if (!err)
-+	if (!err) {
- 		bphy_err(drvr, "Timed out waiting for no pending 802.1x packets\n");
-+		atomic_set(&ifp->pend_8021x_cnt, 0);
-+	}
- 
- 	return !err;
- }
-@@ -1475,3 +1506,270 @@ void __exit brcmf_core_exit(void)
- #endif
- }
- 
-+int
-+brcmf_pktfilter_add_remove(struct net_device *ndev, int filter_num, bool add)
-+{
-+	struct brcmf_if *ifp =  netdev_priv(ndev);
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_pkt_filter_le *pkt_filter;
-+	int filter_fixed_len = offsetof(struct brcmf_pkt_filter_le, u);
-+	int pattern_fixed_len = offsetof(struct brcmf_pkt_filter_pattern_le,
-+				  mask_and_pattern);
-+	u16 mask_and_pattern[MAX_PKTFILTER_PATTERN_SIZE];
-+	int buflen = 0;
-+	int ret = 0;
-+
-+	brcmf_dbg(INFO, "%s packet filter number %d\n",
-+		  (add ? "add" : "remove"), filter_num);
-+
-+	pkt_filter = kzalloc(sizeof(*pkt_filter) +
-+			(MAX_PKTFILTER_PATTERN_SIZE * 2), GFP_ATOMIC);
-+	if (!pkt_filter)
-+		return -ENOMEM;
-+
-+	switch (filter_num) {
-+	case BRCMF_UNICAST_FILTER_NUM:
-+		pkt_filter->id = 100;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 1;
-+		mask_and_pattern[0] = 0x0001;
-+		break;
-+	case BRCMF_BROADCAST_FILTER_NUM:
-+		//filter_pattern = "101 0 0 0 0xFFFFFFFFFFFF 0xFFFFFFFFFFFF";
-+		pkt_filter->id = 101;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 6;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0xFFFF;
-+		mask_and_pattern[2] = 0xFFFF;
-+		mask_and_pattern[3] = 0xFFFF;
-+		mask_and_pattern[4] = 0xFFFF;
-+		mask_and_pattern[5] = 0xFFFF;
-+		break;
-+	case BRCMF_MULTICAST4_FILTER_NUM:
-+		//filter_pattern = "102 0 0 0 0xFFFFFF 0x01005E";
-+		pkt_filter->id = 102;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 3;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0x01FF;
-+		mask_and_pattern[2] = 0x5E00;
-+		break;
-+	case BRCMF_MULTICAST6_FILTER_NUM:
-+		//filter_pattern = "103 0 0 0 0xFFFF 0x3333";
-+		pkt_filter->id = 103;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 2;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0x3333;
-+		break;
-+	case BRCMF_MDNS_FILTER_NUM:
-+		//filter_pattern = "104 0 0 0 0xFFFFFFFFFFFF 0x01005E0000FB";
-+		pkt_filter->id = 104;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 6;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0xFFFF;
-+		mask_and_pattern[2] = 0xFFFF;
-+		mask_and_pattern[3] = 0x0001;
-+		mask_and_pattern[4] = 0x005E;
-+		mask_and_pattern[5] = 0xFB00;
-+		break;
-+	case BRCMF_ARP_FILTER_NUM:
-+		//filter_pattern = "105 0 0 12 0xFFFF 0x0806";
-+		pkt_filter->id = 105;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 12;
-+		pkt_filter->u.pattern.size_bytes = 2;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0x0608;
-+		break;
-+	case BRCMF_BROADCAST_ARP_FILTER_NUM:
-+		//filter_pattern = "106 0 0 0
-+		//0xFFFFFFFFFFFF0000000000000806
-+		//0xFFFFFFFFFFFF0000000000000806";
-+		pkt_filter->id = 106;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 14;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0xFFFF;
-+		mask_and_pattern[2] = 0xFFFF;
-+		mask_and_pattern[3] = 0x0000;
-+		mask_and_pattern[4] = 0x0000;
-+		mask_and_pattern[5] = 0x0000;
-+		mask_and_pattern[6] = 0x0608;
-+		mask_and_pattern[7] = 0xFFFF;
-+		mask_and_pattern[8] = 0xFFFF;
-+		mask_and_pattern[9] = 0xFFFF;
-+		mask_and_pattern[10] = 0x0000;
-+		mask_and_pattern[11] = 0x0000;
-+		mask_and_pattern[12] = 0x0000;
-+		mask_and_pattern[13] = 0x0608;
-+		break;
-+	default:
-+		ret = -EINVAL;
-+		goto failed;
-+	}
-+	memcpy(pkt_filter->u.pattern.mask_and_pattern, mask_and_pattern,
-+	       pkt_filter->u.pattern.size_bytes * 2);
-+	buflen = filter_fixed_len + pattern_fixed_len +
-+		  pkt_filter->u.pattern.size_bytes * 2;
-+
-+	if (add) {
-+		/* Add filter */
-+		ifp->fwil_fwerr = true;
-+		ret = brcmf_fil_iovar_data_set(ifp, "pkt_filter_add",
-+					       pkt_filter, buflen);
-+		ifp->fwil_fwerr = false;
-+		if (ret)
-+			goto failed;
-+		drvr->pkt_filter[filter_num].id = pkt_filter->id;
-+		drvr->pkt_filter[filter_num].enable  = 0;
-+
-+	} else {
-+		/* Delete filter */
-+		ifp->fwil_fwerr = true;
-+		ret = brcmf_fil_iovar_int_set(ifp, "pkt_filter_delete",
-+					      pkt_filter->id);
-+		ifp->fwil_fwerr = false;
-+		if (ret == -BRCMF_FW_BADARG)
-+			ret = 0;
-+		if (ret)
-+			goto failed;
-+
-+		drvr->pkt_filter[filter_num].id = 0;
-+		drvr->pkt_filter[filter_num].enable  = 0;
-+	}
-+failed:
-+	if (ret)
-+		brcmf_err("%s packet filter failed, ret=%d\n",
-+			  (add ? "add" : "remove"), ret);
-+
-+	kfree(pkt_filter);
-+	return ret;
-+}
-+
-+int brcmf_pktfilter_enable(struct net_device *ndev, bool enable)
-+{
-+	struct brcmf_if *ifp =  netdev_priv(ndev);
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	int ret = 0;
-+	int idx = 0;
-+
-+	for (idx = 0; idx < MAX_PKT_FILTER_COUNT; ++idx) {
-+		if (drvr->pkt_filter[idx].id != 0) {
-+			drvr->pkt_filter[idx].enable = enable;
-+			ret = brcmf_fil_iovar_data_set(ifp, "pkt_filter_enable",
-+						       &drvr->pkt_filter[idx],
-+				sizeof(struct brcmf_pkt_filter_enable_le));
-+			if (ret) {
-+				brcmf_err("%s packet filter id(%d) failed, ret=%d\n",
-+					  (enable ? "enable" : "disable"),
-+					  drvr->pkt_filter[idx].id, ret);
-+			}
-+		}
-+	}
-+	return ret;
-+}
-+
-+/** Find STA with MAC address ea in an interface's STA list. */
-+struct brcmf_sta *
-+brcmf_find_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta  *sta;
-+	unsigned long flags;
-+
-+	BRCMF_IF_STA_LIST_LOCK(ifp, flags);
-+	list_for_each_entry(sta, &ifp->sta_list, list) {
-+		if (!memcmp(sta->ea.octet, ea, ETH_ALEN)) {
-+			brcmf_dbg(INFO, "Found STA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x into sta list\n",
-+				  sta->ea.octet[0], sta->ea.octet[1],
-+				  sta->ea.octet[2], sta->ea.octet[3],
-+				  sta->ea.octet[4], sta->ea.octet[5]);
-+			BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+			return sta;
-+		}
-+	}
-+	BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+
-+	return BRCMF_STA_NULL;
-+}
-+
-+/** Add STA into the interface's STA list. */
-+struct brcmf_sta *
-+brcmf_add_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta *sta;
-+	unsigned long flags;
-+
-+	sta =  kzalloc(sizeof(*sta), GFP_KERNEL);
-+	if (sta == BRCMF_STA_NULL) {
-+		brcmf_err("Alloc failed\n");
-+		return BRCMF_STA_NULL;
-+	}
-+	memcpy(sta->ea.octet, ea, ETH_ALEN);
-+	brcmf_dbg(INFO, "Add STA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x into sta list\n",
-+		  sta->ea.octet[0], sta->ea.octet[1],
-+		  sta->ea.octet[2], sta->ea.octet[3],
-+		  sta->ea.octet[4], sta->ea.octet[5]);
-+
-+	/* link the sta and the dhd interface */
-+	sta->ifp = ifp;
-+	INIT_LIST_HEAD(&sta->list);
-+
-+	BRCMF_IF_STA_LIST_LOCK(ifp, flags);
-+
-+	list_add_tail(&sta->list, &ifp->sta_list);
-+
-+	BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+	return sta;
-+}
-+
-+/** Delete STA from the interface's STA list. */
-+void
-+brcmf_del_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta *sta, *next;
-+	unsigned long flags;
-+
-+	BRCMF_IF_STA_LIST_LOCK(ifp, flags);
-+	list_for_each_entry_safe(sta, next, &ifp->sta_list, list) {
-+		if (!memcmp(sta->ea.octet, ea, ETH_ALEN)) {
-+			brcmf_dbg(INFO, "del STA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x from sta list\n",
-+				  ea[0], ea[1], ea[2], ea[3],
-+				  ea[4], ea[5]);
-+			list_del(&sta->list);
-+			kfree(sta);
-+		}
-+	}
-+
-+	BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+}
-+
-+/** Add STA if it doesn't exist. Not reentrant. */
-+struct brcmf_sta*
-+brcmf_findadd_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta *sta = NULL;
-+
-+	sta = brcmf_find_sta(ifp, ea);
-+
-+	if (!sta) {
-+		/* Add entry */
-+		sta = brcmf_add_sta(ifp, ea);
-+	}
-+	return sta;
-+}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-index 6699637d3bf8..3b91b9700d3c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -12,6 +12,7 @@
- 
- #include <net/cfg80211.h>
- #include "fweh.h"
-+#include "fwil_types.h"
- 
- #define TOE_TX_CSUM_OL		0x00000001
- #define TOE_RX_CSUM_OL		0x00000002
-@@ -136,6 +137,9 @@ struct brcmf_pub {
- 	struct work_struct bus_reset;
- 
- 	u8 clmver[BRCMF_DCMD_SMLEN];
-+	struct brcmf_pkt_filter_enable_le pkt_filter[MAX_PKT_FILTER_COUNT];
-+	u8 sta_mac_idx;
-+
- };
- 
- /* forward declarations */
-@@ -185,6 +189,7 @@ struct brcmf_if {
- 	struct brcmf_fws_mac_descriptor *fws_desc;
- 	int ifidx;
- 	s32 bsscfgidx;
-+	bool isap;
- 	u8 mac_addr[ETH_ALEN];
- 	u8 netif_stop;
- 	spinlock_t netif_stop_lock;
-@@ -193,6 +198,20 @@ struct brcmf_if {
- 	struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES];
- 	u8 ipv6addr_idx;
- 	bool fwil_fwerr;
-+	struct list_head sta_list;              /* sll of associated stations */
-+	spinlock_t sta_list_lock;
-+	bool fmac_pkt_fwd_en;
-+};
-+
-+struct ether_addr {
-+	u8 octet[ETH_ALEN];
-+};
-+
-+/** Per STA params. A list of dhd_sta objects are managed in dhd_if */
-+struct brcmf_sta {
-+	void *ifp;             /* associated brcm_if */
-+	struct ether_addr ea;   /* stations ethernet mac address */
-+	struct list_head list;  /* link into brcmf_if::sta_list */
- };
- 
- int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp);
-@@ -213,5 +232,10 @@ void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb);
- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
- int __init brcmf_core_init(void);
- void __exit brcmf_core_exit(void);
--
-+int brcmf_pktfilter_add_remove(struct net_device *ndev, int filter_num,
-+			       bool add);
-+int brcmf_pktfilter_enable(struct net_device *ndev, bool enable);
-+void brcmf_del_sta(struct brcmf_if *ifp, const u8 *ea);
-+struct brcmf_sta *brcmf_find_sta(struct brcmf_if *ifp, const u8 *ea);
-+struct brcmf_sta *brcmf_findadd_sta(struct brcmf_if *ifp, const u8 *ea);
- #endif /* BRCMFMAC_CORE_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-index 120515fe8250..26efe50160c2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-@@ -14,6 +14,82 @@
- #include "fweh.h"
- #include "debug.h"
- 
-+static int
-+brcmf_debug_msgtrace_seqchk(u32 *prev, u32 cur)
-+{
-+	if ((cur == 0 && *prev == 0xFFFFFFFF) || ((cur - *prev) == 1)) {
-+		goto done;
-+	} else if (cur == *prev) {
-+		brcmf_dbg(FWCON, "duplicate trace\n");
-+		return -1;
-+	} else if (cur > *prev) {
-+		brcmf_dbg(FWCON, "lost %d packets\n", cur - *prev);
-+	} else {
-+		brcmf_dbg(FWCON, "seq out of order, host %d, dongle %d\n",
-+			  *prev, cur);
-+	}
-+done:
-+	*prev = cur;
-+	return 0;
-+}
-+
-+static int
-+brcmf_debug_msg_parser(void *event_data)
-+{
-+	int err = 0;
-+	struct msgtrace_hdr *hdr;
-+	char *data, *s;
-+	static u32 seqnum_prev;
-+
-+	hdr = (struct msgtrace_hdr *)event_data;
-+	data = (char *)event_data + MSGTRACE_HDRLEN;
-+
-+	/* There are 2 bytes available at the end of data */
-+	data[ntohs(hdr->len)] = '\0';
-+
-+	if (ntohl(hdr->discarded_bytes) || ntohl(hdr->discarded_printf)) {
-+		brcmf_dbg(FWCON, "Discarded_bytes %d discarded_printf %d\n",
-+			  ntohl(hdr->discarded_bytes),
-+				ntohl(hdr->discarded_printf));
-+	}
-+
-+	err = brcmf_debug_msgtrace_seqchk(&seqnum_prev, ntohl(hdr->seqnum));
-+	if (err)
-+		return err;
-+
-+	while (*data != '\0' && (s = strstr(data, "\n")) != NULL) {
-+		*s = '\0';
-+		brcmf_dbg(FWCON, "CONSOLE: %s\n", data);
-+		data = s + 1;
-+	}
-+	if (*data)
-+		brcmf_dbg(FWCON, "CONSOLE: %s", data);
-+
-+	return err;
-+}
-+
-+static int
-+brcmf_debug_trace_parser(struct brcmf_if *ifp,
-+			 const struct brcmf_event_msg *evtmsg,
-+			 void *event_data)
-+{
-+	int err = 0;
-+	struct msgtrace_hdr *hdr;
-+
-+	hdr = (struct msgtrace_hdr *)event_data;
-+	if (hdr->version != MSGTRACE_VERSION) {
-+		brcmf_dbg(FWCON, "trace version mismatch host %d dngl %d\n",
-+			  MSGTRACE_VERSION, hdr->version);
-+		err = -EPROTO;
-+		return err;
-+	}
-+
-+	if (hdr->trace_type == MSGTRACE_HDR_TYPE_MSG)
-+		err = brcmf_debug_msg_parser(event_data);
-+
-+	return err;
-+}
-+
- int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 			       size_t len)
- {
-@@ -42,6 +118,13 @@ int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 	return 0;
- }
- 
-+
-+int brcmf_debug_fwlog_init(struct brcmf_pub *drvr)
-+{
-+	return brcmf_fweh_register(drvr, BRCMF_E_TRACE,
-+				brcmf_debug_trace_parser);
-+}
-+
- struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
- {
- 	return drvr->wiphy->debugfsdir;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-index 9b221b509ade..f67f54c30d9e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-@@ -29,6 +29,7 @@
- #define BRCMF_MSGBUF_VAL	0x00040000
- #define BRCMF_PCIE_VAL		0x00080000
- #define BRCMF_FWCON_VAL		0x00100000
-+#define BRCMF_ULP_VAL		0x00200000
- 
- /* set default print format */
- #undef pr_fmt
-@@ -103,6 +104,10 @@ do {								\
- 
- #endif /* defined(DEBUG) || defined(CONFIG_BRCM_TRACING) */
- 
-+#define MSGTRACE_VERSION 1
-+#define MSGTRACE_HDR_TYPE_MSG 0
-+#define MSGTRACE_HDR_TYPE_LOG 1
-+
- #define brcmf_dbg_hex_dump(test, data, len, fmt, ...)			\
- do {									\
- 	trace_brcmf_hexdump((void *)data, len);				\
-@@ -120,6 +125,7 @@ int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
- 			    int (*read_fn)(struct seq_file *seq, void *data));
- int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 			       size_t len);
-+int brcmf_debug_fwlog_init(struct brcmf_pub *drvr);
- #else
- static inline struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
- {
-@@ -137,6 +143,25 @@ int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- {
- 	return 0;
- }
-+
-+static inline
-+int brcmf_debug_fwlog_init(struct brcmf_pub *drvr)
-+{
-+	return 0;
-+}
- #endif
- 
-+/* Message trace header */
-+struct msgtrace_hdr {
-+	u8	version;
-+	u8	trace_type;
-+	u16	len;    /* Len of the trace */
-+	u32	seqnum; /* Sequence number of message */
-+	/* Number of discarded bytes because of trace overflow  */
-+	u32	discarded_bytes;
-+	/* Number of discarded printf because of trace overflow */
-+	u32	discarded_printf;
-+};
-+
-+#define MSGTRACE_HDRLEN		sizeof(struct msgtrace_hdr)
- #endif /* BRCMFMAC_DEBUG_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-index 2c3526aeca6f..e22a7c3142e4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-@@ -16,7 +16,6 @@
- #include "feature.h"
- #include "common.h"
- 
--#define BRCMF_FW_UNSUPPORTED	23
- 
- /*
-  * expand feature list to array of feature strings.
-@@ -39,7 +38,9 @@ static const struct brcmf_feat_fwcap brcmf_fwcap_map[] = {
- 	{ BRCMF_FEAT_P2P, "p2p" },
- 	{ BRCMF_FEAT_MONITOR, "monitor" },
- 	{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
--	{ BRCMF_FEAT_DOT11H, "802.11h" }
-+	{ BRCMF_FEAT_DOT11H, "802.11h" },
-+	{ BRCMF_FEAT_SAE, "sae" },
-+	{ BRCMF_FEAT_FWAUTH, "idauth" },
- };
- 
- #ifdef DEBUG
-@@ -140,7 +141,7 @@ static void brcmf_feat_iovar_int_get(struct brcmf_if *ifp,
- 	ifp->fwil_fwerr = true;
- 
- 	err = brcmf_fil_iovar_int_get(ifp, name, &data);
--	if (err == 0) {
-+	if (err != -BRCMF_FW_UNSUPPORTED) {
- 		brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]);
- 		ifp->drvr->feat_flags |= BIT(id);
- 	} else {
-@@ -276,6 +277,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp");
-+	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_DUMP_OBSS, "dump_obss");
- 
- 	pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
- 	err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-index 736a8179f62f..8bd4b7569b2b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-@@ -26,6 +26,9 @@
-  * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
-  * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
-  * DOT11H: firmware supports 802.11h
-+ * SAE: simultaneous authentication of equals
-+ * FWAUTH: Firmware authenticator
-+ * DUMP_OBSS: Firmware has capable to dump obss info to support ACS
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
-@@ -45,7 +48,10 @@
- 	BRCMF_FEAT_DEF(MONITOR) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
--	BRCMF_FEAT_DEF(DOT11H)
-+	BRCMF_FEAT_DEF(DOT11H) \
-+	BRCMF_FEAT_DEF(SAE) \
-+	BRCMF_FEAT_DEF(FWAUTH) \
-+	BRCMF_FEAT_DEF(DUMP_OBSS)
- 
- /*
-  * Quirks:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-index 3aed4c4b887a..33bfcdb41895 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-@@ -613,8 +613,11 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
- 		strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN);
- 		strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN);
- 
--		ret = request_firmware(fw, alt_path, fwctx->dev);
--		if (ret == 0)
-+		ret = firmware_request_nowarn(fw, alt_path, fwctx->dev);
-+		if (ret)
-+			brcmf_info("no board-specific nvram available (err=%d), device will use %s\n",
-+				   ret, cur->path);
-+		else
- 			return ret;
- 	}
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-index 3347439543bb..51bb88a0c021 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-@@ -11,6 +11,8 @@
- 
- #define BRCMF_FW_DEFAULT_PATH		"brcm/"
- 
-+#define CY_FW_DEFAULT_PATH		"cypress/"
-+
- /**
-  * struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware
-  *	filename and nvram filename. Each bus type implementation should create
-@@ -32,6 +34,11 @@ static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
- 	BRCMF_FW_DEFAULT_PATH fw_base; \
- MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".bin")
- 
-+#define CY_FW_DEF(fw_name, fw_base) \
-+static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
-+	CY_FW_DEFAULT_PATH fw_base; \
-+MODULE_FIRMWARE(CY_FW_DEFAULT_PATH fw_base ".bin")
-+
- #define BRCMF_FW_ENTRY(chipid, mask, name) \
- 	{ chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME }
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-index 8e9d067bdfed..e1127d7e086d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-@@ -26,10 +26,10 @@
- #define BRCMF_FLOWRING_HASH_STA(fifo, ifidx) (fifo + ifidx * 16)
- 
- static const u8 brcmf_flowring_prio2fifo[] = {
--	1,
--	0,
- 	0,
- 	1,
-+	1,
-+	0,
- 	2,
- 	2,
- 	3,
-@@ -419,7 +419,6 @@ void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx,
- 				flowid = flow->hash[i].flowid;
- 				if (flow->rings[flowid]->status != RING_OPEN)
- 					continue;
--				flow->rings[flowid]->status = RING_CLOSING;
- 				brcmf_msgbuf_delete_flowring(drvr, flowid);
- 			}
- 		}
-@@ -458,10 +457,8 @@ void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx,
- 		if ((sta || (memcmp(hash[i].mac, peer, ETH_ALEN) == 0)) &&
- 		    (hash[i].ifidx == ifidx)) {
- 			flowid = flow->hash[i].flowid;
--			if (flow->rings[flowid]->status == RING_OPEN) {
--				flow->rings[flowid]->status = RING_CLOSING;
-+			if (flow->rings[flowid]->status == RING_OPEN)
- 				brcmf_msgbuf_delete_flowring(drvr, flowid);
--			}
- 		}
- 	}
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-index 79c8a858b6d6..a30fcfbf2ee7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-@@ -304,10 +304,12 @@ void brcmf_fweh_detach(struct brcmf_pub *drvr)
- {
- 	struct brcmf_fweh_info *fweh = &drvr->fweh;
- 
--	/* cancel the worker */
--	cancel_work_sync(&fweh->event_work);
--	WARN_ON(!list_empty(&fweh->event_q));
--	memset(fweh->evt_handler, 0, sizeof(fweh->evt_handler));
-+	/* cancel the worker if initialized */
-+	if (fweh->event_work.func) {
-+		cancel_work_sync(&fweh->event_work);
-+		WARN_ON(!list_empty(&fweh->event_q));
-+		memset(fweh->evt_handler, 0, sizeof(fweh->evt_handler));
-+	}
- }
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-index a82f51bc1e69..e740c2f00d3b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-@@ -90,7 +90,9 @@ struct brcmf_cfg80211_info;
- 	BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \
- 	BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \
- 	BRCMF_ENUM_DEF(TDLS_PEER_EVENT, 92) \
--	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127)
-+	BRCMF_ENUM_DEF(PHY_TEMP, 111) \
-+	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \
-+	BRCMF_ENUM_DEF(ULP, 146)
- 
- #define BRCMF_ENUM_DEF(id, val) \
- 	BRCMF_E_##id = (val),
-@@ -102,7 +104,7 @@ enum brcmf_fweh_event_code {
- 	 * minimum length check in device firmware so it is
- 	 * hard-coded here.
- 	 */
--	BRCMF_E_LAST = 139
-+	BRCMF_E_LAST = 147
- };
- #undef BRCMF_ENUM_DEF
- 
-@@ -283,6 +285,28 @@ struct brcmf_if_event {
- 	u8 role;
- };
- 
-+enum event_msgs_ext_command {
-+	EVENTMSGS_NONE		=	0,
-+	EVENTMSGS_SET_BIT	=	1,
-+	EVENTMSGS_RESET_BIT	=	2,
-+	EVENTMSGS_SET_MASK	=	3
-+};
-+
-+#define EVENTMSGS_VER 1
-+#define EVENTMSGS_EXT_STRUCT_SIZE	offsetof(struct eventmsgs_ext, mask[0])
-+
-+/* len-	for SET it would be mask size from the application to the firmware */
-+/*		for GET it would be actual firmware mask size */
-+/* maxgetsize -	is only used for GET. indicate max mask size that the */
-+/*				application can read from the firmware */
-+struct eventmsgs_ext {
-+	u8	ver;
-+	u8	command;
-+	u8	len;
-+	u8	maxgetsize;
-+	u8	mask[1];
-+};
-+
- typedef int (*brcmf_fweh_handler_t)(struct brcmf_if *ifp,
- 				    const struct brcmf_event_msg *evtmsg,
- 				    void *data);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-index 0ff6f5212a94..a0c776cb1c9b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-@@ -77,6 +77,9 @@
- #define BRCMF_C_SET_VAR				263
- #define BRCMF_C_SET_WSEC_PMK			268
- 
-+#define BRCMF_FW_BADARG				2
-+#define BRCMF_FW_UNSUPPORTED			23
-+
- s32 brcmf_fil_cmd_data_set(struct brcmf_if *ifp, u32 cmd, void *data, u32 len);
- s32 brcmf_fil_cmd_data_get(struct brcmf_if *ifp, u32 cmd, void *data, u32 len);
- s32 brcmf_fil_cmd_int_set(struct brcmf_if *ifp, u32 cmd, u32 data);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-index 37c512036e0e..b7c16dc605c4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -19,7 +19,7 @@
- #define BRCMF_ARP_OL_PEER_AUTO_REPLY	0x00000008
- 
- #define	BRCMF_BSS_INFO_VERSION	109 /* curr ver of brcmf_bss_info_le struct */
--#define BRCMF_BSS_RSSI_ON_CHANNEL	0x0002
-+#define BRCMF_BSS_RSSI_ON_CHANNEL	0x0004
- 
- #define BRCMF_STA_BRCM			0x00000001	/* Running a Broadcom driver */
- #define BRCMF_STA_WME			0x00000002	/* WMM association */
-@@ -61,6 +61,8 @@
- #define BRCMF_WSEC_MAX_PSK_LEN		32
- #define	BRCMF_WSEC_PASSPHRASE		BIT(0)
- 
-+#define BRCMF_WSEC_MAX_SAE_PASSWORD_LEN 128
-+
- /* primary (ie tx) key */
- #define BRCMF_PRIMARY_KEY		(1 << 1)
- #define DOT11_BSSTYPE_ANY		2
-@@ -133,9 +135,22 @@
- /* Link Down indication in WoWL mode: */
- #define BRCMF_WOWL_LINKDOWN		(1 << 31)
- 
--#define BRCMF_WOWL_MAXPATTERNS		8
-+#define BRCMF_WOWL_MAXPATTERNS		16
- #define BRCMF_WOWL_MAXPATTERNSIZE	128
- 
-+enum {
-+	BRCMF_UNICAST_FILTER_NUM = 0,
-+	BRCMF_BROADCAST_FILTER_NUM,
-+	BRCMF_MULTICAST4_FILTER_NUM,
-+	BRCMF_MULTICAST6_FILTER_NUM,
-+	BRCMF_MDNS_FILTER_NUM,
-+	BRCMF_ARP_FILTER_NUM,
-+	BRCMF_BROADCAST_ARP_FILTER_NUM,
-+	MAX_PKT_FILTER_COUNT
-+};
-+
-+#define MAX_PKTFILTER_PATTERN_SIZE		16
-+
- #define BRCMF_COUNTRY_BUF_SZ		4
- #define BRCMF_ANT_MAX			4
- 
-@@ -518,6 +533,17 @@ struct brcmf_wsec_pmk_le {
- 	u8 key[2 * BRCMF_WSEC_MAX_PSK_LEN + 1];
- };
- 
-+/**
-+ * struct brcmf_wsec_sae_pwd_le - firmware SAE password material.
-+ *
-+ * @key_len: number of octets in key materials.
-+ * @key: SAE password material.
-+ */
-+struct brcmf_wsec_sae_pwd_le {
-+	__le16 key_len;
-+	u8 key[BRCMF_WSEC_MAX_SAE_PASSWORD_LEN];
-+};
-+
- /* Used to get specific STA parameters */
- struct brcmf_scb_val_le {
- 	__le32 val;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 2bd892df83cc..c29eb944f931 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -311,28 +311,6 @@ struct brcmf_skbuff_cb {
- /* How long to defer borrowing in jiffies */
- #define BRCMF_FWS_BORROW_DEFER_PERIOD		(HZ / 10)
- 
--/**
-- * enum brcmf_fws_fifo - fifo indices used by dongle firmware.
-- *
-- * @BRCMF_FWS_FIFO_FIRST: first fifo, ie. background.
-- * @BRCMF_FWS_FIFO_AC_BK: fifo for background traffic.
-- * @BRCMF_FWS_FIFO_AC_BE: fifo for best-effort traffic.
-- * @BRCMF_FWS_FIFO_AC_VI: fifo for video traffic.
-- * @BRCMF_FWS_FIFO_AC_VO: fifo for voice traffic.
-- * @BRCMF_FWS_FIFO_BCMC: fifo for broadcast/multicast (AP only).
-- * @BRCMF_FWS_FIFO_ATIM: fifo for ATIM (AP only).
-- * @BRCMF_FWS_FIFO_COUNT: number of fifos.
-- */
--enum brcmf_fws_fifo {
--	BRCMF_FWS_FIFO_FIRST,
--	BRCMF_FWS_FIFO_AC_BK = BRCMF_FWS_FIFO_FIRST,
--	BRCMF_FWS_FIFO_AC_BE,
--	BRCMF_FWS_FIFO_AC_VI,
--	BRCMF_FWS_FIFO_AC_VO,
--	BRCMF_FWS_FIFO_BCMC,
--	BRCMF_FWS_FIFO_ATIM,
--	BRCMF_FWS_FIFO_COUNT
--};
- 
- /**
-  * enum brcmf_fws_txstatus - txstatus flag values.
-@@ -345,6 +323,10 @@ enum brcmf_fws_fifo {
-  *	firmware suppress the packet as device is already in PS mode.
-  * @BRCMF_FWS_TXSTATUS_FW_TOSSED:
-  *	firmware tossed the packet.
-+ * @BRCMF_FWS_TXSTATUS_FW_DISCARD_NOACK:
-+ *	firmware tossed the packet after retries.
-+ * @BRCMF_FWS_TXSTATUS_FW_SUPPRESS_ACKED:
-+ *	firmware wrongly reported suppressed previously, now fixing to acked.
-  * @BRCMF_FWS_TXSTATUS_HOST_TOSSED:
-  *	host tossed the packet.
-  */
-@@ -353,6 +335,8 @@ enum brcmf_fws_txstatus {
- 	BRCMF_FWS_TXSTATUS_CORE_SUPPRESS,
- 	BRCMF_FWS_TXSTATUS_FW_PS_SUPPRESS,
- 	BRCMF_FWS_TXSTATUS_FW_TOSSED,
-+	BRCMF_FWS_TXSTATUS_FW_DISCARD_NOACK,
-+	BRCMF_FWS_TXSTATUS_FW_SUPPRESS_ACKED,
- 	BRCMF_FWS_TXSTATUS_HOST_TOSSED
- };
- 
-@@ -404,7 +388,8 @@ struct brcmf_fws_mac_descriptor {
- 	u8 traffic_lastreported_bmp;
- };
- 
--#define BRCMF_FWS_HANGER_MAXITEMS	1024
-+#define BRCMF_FWS_HANGER_MAXITEMS	3072
-+#define BRCMF_BORROW_RATIO			3
- 
- /**
-  * enum brcmf_fws_hanger_item_state - state of hanger item.
-@@ -501,7 +486,8 @@ struct brcmf_fws_info {
- 	u32 fifo_enqpkt[BRCMF_FWS_FIFO_COUNT];
- 	int fifo_credit[BRCMF_FWS_FIFO_COUNT];
- 	int init_fifo_credit[BRCMF_FWS_FIFO_COUNT];
--	int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1];
-+	int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1]
-+		[BRCMF_FWS_FIFO_AC_VO + 1];
- 	int deq_node_pos[BRCMF_FWS_FIFO_COUNT];
- 	u32 fifo_credit_map;
- 	u32 fifo_delay_map;
-@@ -510,6 +496,9 @@ struct brcmf_fws_info {
- 	bool creditmap_received;
- 	u8 mode;
- 	bool avoid_queueing;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	int fifo_init_credit[BRCMF_FWS_FIFO_COUNT];
-+#endif
- };
- 
- /*
-@@ -1209,11 +1198,11 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
- 
- 	fws->fifo_credit_map |= 1 << fifo;
- 
--	if ((fifo == BRCMF_FWS_FIFO_AC_BE) &&
--	    (fws->credits_borrowed[0])) {
-+	if (fifo > BRCMF_FWS_FIFO_AC_BK &&
-+	    fifo <= BRCMF_FWS_FIFO_AC_VO) {
- 		for (lender_ac = BRCMF_FWS_FIFO_AC_VO; lender_ac >= 0;
- 		     lender_ac--) {
--			borrowed = &fws->credits_borrowed[lender_ac];
-+			borrowed = &fws->credits_borrowed[fifo][lender_ac];
- 			if (*borrowed) {
- 				fws->fifo_credit_map |= (1 << lender_ac);
- 				fifo_credit = &fws->fifo_credit[lender_ac];
-@@ -1230,7 +1219,10 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
- 		}
- 	}
- 
--	fws->fifo_credit[fifo] += credits;
-+	if (credits) {
-+		fws->fifo_credit[fifo] += credits;
-+	}
-+
- 	if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo])
- 		fws->fifo_credit[fifo] = fws->init_fifo_credit[fifo];
- 
-@@ -1473,6 +1465,10 @@ brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot,
- 		remove_from_hanger = false;
- 	} else if (flags == BRCMF_FWS_TXSTATUS_FW_TOSSED)
- 		fws->stats.txs_tossed += compcnt;
-+	else if (flags == BRCMF_FWS_TXSTATUS_FW_DISCARD_NOACK)
-+		fws->stats.txs_discard += compcnt;
-+	else if (flags == BRCMF_FWS_TXSTATUS_FW_SUPPRESS_ACKED)
-+		fws->stats.txs_discard += compcnt;
- 	else if (flags == BRCMF_FWS_TXSTATUS_HOST_TOSSED)
- 		fws->stats.txs_host_tossed += compcnt;
- 	else
-@@ -1628,9 +1624,13 @@ static int brcmf_fws_notify_credit_map(struct brcmf_if *ifp,
- 			fws->fifo_credit_map |= 1 << i;
- 		else
- 			fws->fifo_credit_map &= ~(1 << i);
-+
- 		WARN_ONCE(fws->fifo_credit[i] < 0,
- 			  "fifo_credit[%d] is negative(%d)\n", i,
- 			  fws->fifo_credit[i]);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+		fws->fifo_init_credit[i] = fws->fifo_credit[i];
-+#endif
- 	}
- 	brcmf_fws_schedule_deq(fws);
- 	brcmf_fws_unlock(fws);
-@@ -1865,6 +1865,9 @@ void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb)
- 
- 	WARN_ON(siglen > skb->len);
- 
-+	if (siglen > skb->len)
-+		siglen = skb->len;
-+
- 	if (!siglen)
- 		return;
- 	/* if flow control disabled, skip to packet data and leave */
-@@ -2027,27 +2030,31 @@ static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws,
- 	}
- }
- 
--static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws)
-+static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws,
-+				   int highest_lender_ac, int borrower_ac,
-+				   bool borrow_all)
- {
--	int lender_ac;
-+	int lender_ac, borrow_limit = 0;
- 
--	if (time_after(fws->borrow_defer_timestamp, jiffies)) {
--		fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE);
--		return -ENAVAIL;
--	}
-+	for (lender_ac = 0; lender_ac <= highest_lender_ac; lender_ac++) {
- 
--	for (lender_ac = 0; lender_ac <= BRCMF_FWS_FIFO_AC_VO; lender_ac++) {
--		if (fws->fifo_credit[lender_ac] > 0) {
--			fws->credits_borrowed[lender_ac]++;
-+		if (!borrow_all)
-+			borrow_limit =
-+			  fws->init_fifo_credit[lender_ac] / BRCMF_BORROW_RATIO;
-+		else
-+			borrow_limit = 0;
-+
-+		if (fws->fifo_credit[lender_ac] > borrow_limit) {
-+			fws->credits_borrowed[borrower_ac][lender_ac]++;
- 			fws->fifo_credit[lender_ac]--;
- 			if (fws->fifo_credit[lender_ac] == 0)
- 				fws->fifo_credit_map &= ~(1 << lender_ac);
--			fws->fifo_credit_map |= (1 << BRCMF_FWS_FIFO_AC_BE);
-+			fws->fifo_credit_map |= (1 << borrower_ac);
- 			brcmf_dbg(DATA, "borrow credit from: %d\n", lender_ac);
- 			return 0;
- 		}
- 	}
--	fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE);
-+	fws->fifo_credit_map &= ~(1 << borrower_ac);
- 	return -ENAVAIL;
- }
- 
-@@ -2130,8 +2137,10 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
- 	skcb->if_flags = 0;
- 	skcb->state = BRCMF_FWS_SKBSTATE_NEW;
- 	brcmf_skb_if_flags_set_field(skb, INDEX, ifp->ifidx);
-+
-+	/* mapping from 802.1d priority to firmware fifo index */
- 	if (!multicast)
--		fifo = brcmf_fws_prio2fifo[skb->priority];
-+		fifo = brcmf_map_prio_to_aci(drvr->config, skb->priority);
- 
- 	brcmf_fws_lock(fws);
- 	if (fifo != BRCMF_FWS_FIFO_AC_BE && fifo < BRCMF_FWS_FIFO_BCMC)
-@@ -2145,8 +2154,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
- 		brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb);
- 		brcmf_fws_schedule_deq(fws);
- 	} else {
--		bphy_err(drvr, "drop skb: no hanger slot\n");
--		brcmf_txfinalize(ifp, skb, false);
-+		bphy_err(drvr, "no hanger slot available\n");
- 		rc = -ENOMEM;
- 	}
- 	brcmf_fws_unlock(fws);
-@@ -2200,6 +2208,38 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp)
- 	brcmf_fws_unlock(fws);
- }
- 
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+static bool brcmf_fws_ismultistream(struct brcmf_fws_info *fws)
-+{
-+	bool ret = false;
-+	u8 credit_usage = 0;
-+
-+	/* Check only for BE, VI and VO traffic */
-+	u32 delay_map = fws->fifo_delay_map &
-+		((1 << BRCMF_FWS_FIFO_AC_BE) |
-+		 (1 << BRCMF_FWS_FIFO_AC_VI) |
-+		 (1 << BRCMF_FWS_FIFO_AC_VO));
-+
-+	if (hweight_long(delay_map) > 1) {
-+		ret = true;
-+	} else {
-+		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_BE] <
-+			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_BE])
-+			credit_usage++;
-+		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_VI] <
-+			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_VI])
-+			credit_usage++;
-+		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_VO] <
-+			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_VO])
-+			credit_usage++;
-+
-+		if (credit_usage > 1)
-+			ret = true;
-+	}
-+	return ret;
-+}
-+#endif
-+
- static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- {
- 	struct brcmf_fws_info *fws;
-@@ -2213,6 +2253,13 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 	fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work);
- 	drvr = fws->drvr;
- 
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	if (brcmf_fws_ismultistream(fws))
-+		drvr->bus_if->allow_skborphan = false;
-+	else
-+		drvr->bus_if->allow_skborphan = true;
-+#endif
-+
- 	brcmf_fws_lock(fws);
- 	for (fifo = BRCMF_FWS_FIFO_BCMC; fifo >= 0 && !fws->bus_flow_blocked;
- 	     fifo--) {
-@@ -2237,9 +2284,10 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 			}
- 			continue;
- 		}
--		while ((fws->fifo_credit[fifo] > 0) ||
-+
-+		while ((fws->fifo_credit[fifo]) ||
- 		       ((!fws->bcmc_credit_check) &&
--			(fifo == BRCMF_FWS_FIFO_BCMC))) {
-+				(fifo == BRCMF_FWS_FIFO_BCMC))) {
- 			skb = brcmf_fws_deq(fws, fifo);
- 			if (!skb)
- 				break;
-@@ -2249,10 +2297,14 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 			if (fws->bus_flow_blocked)
- 				break;
- 		}
--		if ((fifo == BRCMF_FWS_FIFO_AC_BE) &&
--		    (fws->fifo_credit[fifo] <= 0) &&
--		    (!fws->bus_flow_blocked)) {
--			while (brcmf_fws_borrow_credit(fws) == 0) {
-+
-+		if (fifo >= BRCMF_FWS_FIFO_AC_BE &&
-+		    fifo <= BRCMF_FWS_FIFO_AC_VO &&
-+		    fws->fifo_credit[fifo] == 0 &&
-+		    !fws->bus_flow_blocked) {
-+			while (brcmf_fws_borrow_credit(fws,
-+						       fifo - 1, fifo,
-+						       true) == 0) {
- 				skb = brcmf_fws_deq(fws, fifo);
- 				if (!skb) {
- 					brcmf_fws_return_credits(fws, fifo, 1);
-@@ -2473,7 +2525,8 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
- 	return fws->fcmode != BRCMF_FWS_FCMODE_NONE;
- }
- 
--void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
-+void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb,
-+			     bool success)
- {
- 	u32 hslot;
- 
-@@ -2481,11 +2534,13 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
- 		brcmu_pkt_buf_free_skb(skb);
- 		return;
- 	}
--	brcmf_fws_lock(fws);
--	hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
--	brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0,
--			      1);
--	brcmf_fws_unlock(fws);
-+	if (!success) {
-+		brcmf_fws_lock(fws);
-+		hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
-+		brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED,
-+				      hslot, 0, 0, 1);
-+		brcmf_fws_unlock(fws);
-+	}
- }
- 
- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-index b486d578ec96..f9c36cd8f1de 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-@@ -6,6 +6,29 @@
- #ifndef FWSIGNAL_H_
- #define FWSIGNAL_H_
- 
-+/**
-+ * enum brcmf_fws_fifo - fifo indices used by dongle firmware.
-+ *
-+ * @BRCMF_FWS_FIFO_FIRST: first fifo, ie. background.
-+ * @BRCMF_FWS_FIFO_AC_BK: fifo for background traffic.
-+ * @BRCMF_FWS_FIFO_AC_BE: fifo for best-effort traffic.
-+ * @BRCMF_FWS_FIFO_AC_VI: fifo for video traffic.
-+ * @BRCMF_FWS_FIFO_AC_VO: fifo for voice traffic.
-+ * @BRCMF_FWS_FIFO_BCMC: fifo for broadcast/multicast (AP only).
-+ * @BRCMF_FWS_FIFO_ATIM: fifo for ATIM (AP only).
-+ * @BRCMF_FWS_FIFO_COUNT: number of fifos.
-+ */
-+enum brcmf_fws_fifo {
-+	BRCMF_FWS_FIFO_FIRST,
-+	BRCMF_FWS_FIFO_AC_BK = BRCMF_FWS_FIFO_FIRST,
-+	BRCMF_FWS_FIFO_AC_BE,
-+	BRCMF_FWS_FIFO_AC_VI,
-+	BRCMF_FWS_FIFO_AC_VO,
-+	BRCMF_FWS_FIFO_BCMC,
-+	BRCMF_FWS_FIFO_ATIM,
-+	BRCMF_FWS_FIFO_COUNT
-+};
-+
- struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
- void brcmf_fws_detach(struct brcmf_fws_info *fws);
- void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
-@@ -17,7 +40,8 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
- void brcmf_fws_reset_interface(struct brcmf_if *ifp);
- void brcmf_fws_add_interface(struct brcmf_if *ifp);
- void brcmf_fws_del_interface(struct brcmf_if *ifp);
--void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb);
-+void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb,
-+			     bool success);
- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked);
- void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb);
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index e3dd8623be4e..33fd145d9a2b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -11,6 +11,7 @@
- #include <linux/types.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
-+#include <linux/net_tstamp.h>
- 
- #include <brcmu_utils.h>
- #include <brcmu_wifi.h>
-@@ -54,6 +55,7 @@
- #define BRCMF_IOCTL_REQ_PKTID			0xFFFE
- 
- #define BRCMF_MSGBUF_MAX_PKT_SIZE		2048
-+#define BRCMF_MSGBUF_MAX_CTL_PKT_SIZE           8192
- #define BRCMF_MSGBUF_RXBUFPOST_THRESHOLD	32
- #define BRCMF_MSGBUF_MAX_IOCTLRESPBUF_POST	8
- #define BRCMF_MSGBUF_MAX_EVENTBUF_POST		8
-@@ -70,6 +72,7 @@
- #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS	32
- #define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS		48
- 
-+#define BRCMF_MAX_TXSTATUS_WAIT_RETRIES		10
- 
- struct msgbuf_common_hdr {
- 	u8				msgtype;
-@@ -717,6 +720,7 @@ static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u16 flowid)
- 				 brcmf_flowring_qlen(flow, flowid));
- 			break;
- 		}
-+		skb_tx_timestamp(skb);
- 		skb_orphan(skb);
- 		if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev,
- 					     msgbuf->tx_pktids, skb, ETH_HLEN,
-@@ -805,8 +809,12 @@ static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
- 	flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
- 	if (flowid == BRCMF_FLOWRING_INVALID_ID) {
- 		flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb);
--		if (flowid == BRCMF_FLOWRING_INVALID_ID)
-+		if (flowid == BRCMF_FLOWRING_INVALID_ID) {
- 			return -ENOMEM;
-+		} else {
-+			brcmf_flowring_enqueue(flow, flowid, skb);
-+			return 0;
-+		}
- 	}
- 	queue_count = brcmf_flowring_enqueue(flow, flowid, skb);
- 	force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0);
-@@ -1028,7 +1036,7 @@ brcmf_msgbuf_rxbuf_ctrl_post(struct brcmf_msgbuf *msgbuf, bool event_buf,
- 		rx_bufpost = (struct msgbuf_rx_ioctl_resp_or_event *)ret_ptr;
- 		memset(rx_bufpost, 0, sizeof(*rx_bufpost));
- 
--		skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_PKT_SIZE);
-+		skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_CTL_PKT_SIZE);
- 
- 		if (skb == NULL) {
- 			bphy_err(drvr, "Failed to alloc SKB\n");
-@@ -1139,7 +1147,8 @@ brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf)
- {
- 	struct brcmf_pub *drvr = msgbuf->drvr;
- 	struct msgbuf_rx_complete *rx_complete;
--	struct sk_buff *skb;
-+	struct sk_buff *skb, *cpskb = NULL;
-+	struct ethhdr *eh;
- 	u16 data_offset;
- 	u16 buflen;
- 	u16 flags;
-@@ -1188,6 +1197,34 @@ brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf)
- 		return;
- 	}
- 
-+	if (ifp->isap && ifp->fmac_pkt_fwd_en) {
-+		eh = (struct ethhdr *)(skb->data);
-+		skb_set_network_header(skb, sizeof(struct ethhdr));
-+		skb->protocol = eh->h_proto;
-+		skb->priority = cfg80211_classify8021d(skb, NULL);
-+		if (is_unicast_ether_addr(eh->h_dest)) {
-+			if (brcmf_find_sta(ifp, eh->h_dest)) {
-+				 /* determine the priority */
-+				if (skb->priority == 0 || skb->priority > 7) {
-+					skb->priority =
-+						cfg80211_classify8021d(skb,
-+								       NULL);
-+				}
-+				brcmf_proto_tx_queue_data(ifp->drvr,
-+							  ifp->ifidx, skb);
-+				return;
-+			}
-+		} else {
-+			cpskb = pskb_copy(skb, GFP_ATOMIC);
-+			if (cpskb) {
-+				brcmf_proto_tx_queue_data(ifp->drvr,
-+							  ifp->ifidx,
-+							  cpskb);
-+			} else {
-+				brcmf_err("Unable to do skb copy\n");
-+			}
-+		}
-+	}
- 	skb->protocol = eth_type_trans(skb, ifp->ndev);
- 	brcmf_netif_rx(ifp, skb);
- }
-@@ -1394,9 +1431,27 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
- 	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
- 	struct msgbuf_tx_flowring_delete_req *delete;
- 	struct brcmf_commonring *commonring;
-+	struct brcmf_commonring *commonring_del = msgbuf->flowrings[flowid];
-+	struct brcmf_flowring *flow = msgbuf->flow;
- 	void *ret_ptr;
- 	u8 ifidx;
- 	int err;
-+	int retry = BRCMF_MAX_TXSTATUS_WAIT_RETRIES;
-+
-+	/* make sure it is not in txflow */
-+	brcmf_commonring_lock(commonring_del);
-+	flow->rings[flowid]->status = RING_CLOSING;
-+	brcmf_commonring_unlock(commonring_del);
-+
-+	/* wait for commonring txflow finished */
-+	while (retry && atomic_read(&commonring_del->outstanding_tx)) {
-+		usleep_range(5000, 10000);
-+		retry--;
-+	}
-+	if (!retry) {
-+		brcmf_err("timed out waiting for txstatus\n");
-+		atomic_set(&commonring_del->outstanding_tx, 0);
-+	}
- 
- 	/* no need to submit if firmware can not be reached */
- 	if (drvr->bus_if->state != BRCMF_BUS_UP) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-index b886b56a5e5a..e4f3493a5d6e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-@@ -20,7 +20,8 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
- 	struct property *prop;
- 	int irq;
- 	u32 irqf;
--	u32 val;
-+	u32 val32;
-+	u16 val16;
- 
- 	/* Set board-type to the first string of the machine compatible prop */
- 	root = of_find_node_by_path("/");
-@@ -34,8 +35,15 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
- 	    !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
- 		return;
- 
--	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
--		sdio->drive_strength = val;
-+	if (of_property_read_u32(np, "brcm,drive-strength", &val32) == 0)
-+		sdio->drive_strength = val32;
-+
-+	sdio->broken_sg_support = of_property_read_bool(np,
-+			"brcm,broken_sg_support");
-+	if (of_property_read_u16(np, "brcm,sd_head_align", &val16) == 0)
-+		sdio->sd_head_align = val16;
-+	if (of_property_read_u16(np, "brcm,sd_sgentry_align", &val16) == 0)
-+		sdio->sd_sgentry_align = val16;
- 
- 	/* make sure there are interrupts defined in the node */
- 	if (!of_find_property(np, "interrupts", NULL))
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 7ba9f6a68645..c4a5f9df310f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -17,6 +17,7 @@
- #include "fwil_types.h"
- #include "p2p.h"
- #include "cfg80211.h"
-+#include "feature.h"
- 
- /* parameters used for p2p escan */
- #define P2PAPI_SCAN_NPROBES 1
-@@ -59,12 +60,13 @@
- #define P2P_AF_MIN_DWELL_TIME		100
- #define P2P_AF_MED_DWELL_TIME		400
- #define P2P_AF_LONG_DWELL_TIME		1000
--#define P2P_AF_TX_MAX_RETRY		1
-+#define P2P_AF_TX_MAX_RETRY		5
- #define P2P_AF_MAX_WAIT_TIME		msecs_to_jiffies(2000)
- #define P2P_INVALID_CHANNEL		-1
- #define P2P_CHANNEL_SYNC_RETRY		5
- #define P2P_AF_FRM_SCAN_MAX_WAIT	msecs_to_jiffies(450)
- #define P2P_DEFAULT_SLEEP_TIME_VSDB	200
-+#define P2P_AF_RETRY_DELAY_TIME		40
- 
- /* WiFi P2P Public Action Frame OUI Subtypes */
- #define P2P_PAF_GON_REQ		0	/* Group Owner Negotiation Req */
-@@ -92,6 +94,9 @@
- #define P2PSD_ACTION_ID_GAS_CRESP	0x0d	/* GAS Comback Response AF */
- 
- #define BRCMF_P2P_DISABLE_TIMEOUT	msecs_to_jiffies(500)
-+
-+/* Mask for retry counter of custom dwell time */
-+#define CUSTOM_RETRY_MASK 0xff000000
- /**
-  * struct brcmf_p2p_disc_st_le - set discovery state in firmware.
-  *
-@@ -226,7 +231,35 @@ static bool brcmf_p2p_is_pub_action(void *frame, u32 frame_len)
- 	if (pact_frm->category == P2P_PUB_AF_CATEGORY &&
- 	    pact_frm->action == P2P_PUB_AF_ACTION &&
- 	    pact_frm->oui_type == P2P_VER &&
--	    memcmp(pact_frm->oui, P2P_OUI, P2P_OUI_LEN) == 0)
-+	    memcmp(pact_frm->oui, WFA_OUI, P2P_OUI_LEN) == 0)
-+		return true;
-+
-+	return false;
-+}
-+
-+/**
-+ * brcmf_p2p_is_dpp_pub_action() - true if dpp public type frame.
-+ *
-+ * @frame: action frame data.
-+ * @frame_len: length of action frame data.
-+ *
-+ * Determine if action frame is dpp public action type
-+ */
-+static bool brcmf_p2p_is_dpp_pub_action(void *frame, u32 frame_len)
-+{
-+	struct brcmf_p2p_pub_act_frame *pact_frm;
-+
-+	if (!frame)
-+		return false;
-+
-+	pact_frm = (struct brcmf_p2p_pub_act_frame *)frame;
-+	if (frame_len < sizeof(struct brcmf_p2p_pub_act_frame) - 1)
-+		return false;
-+
-+	if (pact_frm->category == WLAN_CATEGORY_PUBLIC &&
-+	    pact_frm->action == WLAN_PUB_ACTION_VENDOR_SPECIFIC &&
-+	    pact_frm->oui_type == DPP_VER &&
-+	    memcmp(pact_frm->oui, WFA_OUI, TLV_OUI_LEN) == 0)
- 		return true;
- 
- 	return false;
-@@ -457,10 +490,21 @@ static int brcmf_p2p_set_firmware(struct brcmf_if *ifp, u8 *p2p_mac)
-  */
- static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- {
-+	struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
- 	bool random_addr = false;
-+	bool local_admin = false;
- 
--	if (!dev_addr || is_zero_ether_addr(dev_addr))
--		random_addr = true;
-+	if (!dev_addr || is_zero_ether_addr(dev_addr)) {
-+		/* If the primary interface address is already locally
-+		 * administered, create a new random address.
-+		 */
-+		if (pri_ifp->mac_addr[0] & 0x02) {
-+			random_addr = true;
-+		} else {
-+			dev_addr = pri_ifp->mac_addr;
-+			local_admin = true;
-+		}
-+	}
- 
- 	/* Generate the P2P Device Address obtaining a random ethernet
- 	 * address with the locally administered bit set.
-@@ -470,13 +514,20 @@ static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- 	else
- 		memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
- 
-+	if (local_admin)
-+		p2p->dev_addr[0] |= 0x02;
-+
- 	/* Generate the P2P Interface Address.  If the discovery and connection
- 	 * BSSCFGs need to simultaneously co-exist, then this address must be
- 	 * different from the P2P Device Address, but also locally administered.
- 	 */
--	memcpy(p2p->int_addr, p2p->dev_addr, ETH_ALEN);
--	p2p->int_addr[0] |= 0x02;
--	p2p->int_addr[4] ^= 0x80;
-+	memcpy(p2p->conn_int_addr, p2p->dev_addr, ETH_ALEN);
-+	p2p->conn_int_addr[0] |= 0x02;
-+	p2p->conn_int_addr[4] ^= 0x80;
-+
-+	memcpy(p2p->conn2_int_addr, p2p->dev_addr, ETH_ALEN);
-+	p2p->conn2_int_addr[0] |= 0x02;
-+	p2p->conn2_int_addr[4] ^= 0x90;
- }
- 
- /**
-@@ -872,7 +923,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wiphy,
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
--	int err;
-+	int err = 0;
- 
- 	if (brcmf_p2p_scan_is_p2p_request(request)) {
- 		/* find my listen channel */
-@@ -895,7 +946,9 @@ int brcmf_p2p_scan_prep(struct wiphy *wiphy,
- 		/* override .run_escan() callback. */
- 		cfg->escan_info.run = brcmf_p2p_run_escan;
- 	}
--	return 0;
-+	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
-+				    request->ie, request->ie_len);
-+	return err;
- }
- 
- 
-@@ -970,6 +1023,8 @@ int brcmf_p2p_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	if (err)
- 		goto exit;
- 
-+	p2p->remin_on_channel_wdev = wdev;
-+
- 	memcpy(&p2p->remain_on_channel, channel, sizeof(*channel));
- 	*cookie = p2p->remain_on_channel_cookie;
- 	cfg80211_ready_on_channel(wdev, *cookie, channel, duration, GFP_KERNEL);
-@@ -993,6 +1048,7 @@ int brcmf_p2p_notify_listen_complete(struct brcmf_if *ifp,
- {
- 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
-+	struct wireless_dev *wdev = p2p->remin_on_channel_wdev;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 	if (test_and_clear_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN,
-@@ -1005,10 +1061,16 @@ int brcmf_p2p_notify_listen_complete(struct brcmf_if *ifp,
- 			complete(&p2p->wait_next_af);
- 		}
- 
--		cfg80211_remain_on_channel_expired(&ifp->vif->wdev,
-+		wdev = p2p->remin_on_channel_wdev ?
-+			p2p->remin_on_channel_wdev :
-+			&ifp->vif->wdev;
-+
-+		cfg80211_remain_on_channel_expired(wdev,
- 						   p2p->remain_on_channel_cookie,
- 						   &p2p->remain_on_channel,
- 						   GFP_KERNEL);
-+		p2p->remin_on_channel_wdev = NULL;
-+
- 	}
- 	return 0;
- }
-@@ -1244,6 +1306,34 @@ bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- 	return true;
- }
- 
-+/**
-+ * brcmf_p2p_abort_action_frame() - abort action frame.
-+ *
-+ * @cfg: common configuration struct.
-+ *
-+ */
-+static s32 brcmf_p2p_abort_action_frame(struct brcmf_cfg80211_info *cfg)
-+{
-+	struct brcmf_p2p_info *p2p = &cfg->p2p;
-+	struct brcmf_cfg80211_vif *vif;
-+	s32 err;
-+	s32 int_val = 1;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
-+
-+	if (!vif)
-+		vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
-+
-+	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe_abort", &int_val,
-+					sizeof(s32));
-+	if (err)
-+		brcmf_err(" aborting action frame has failed (%d)\n", err);
-+
-+	return err;
-+}
-+
- /**
-  * brcmf_p2p_stop_wait_next_action_frame() - finish scan if af tx complete.
-  *
-@@ -1255,6 +1345,7 @@ brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg)
- {
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
- 	struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
-+	s32 err;
- 
- 	if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) &&
- 	    (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) ||
-@@ -1263,8 +1354,13 @@ brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg)
- 		/* if channel is not zero, "actfame" uses off channel scan.
- 		 * So abort scan for off channel completion.
- 		 */
--		if (p2p->af_sent_channel)
--			brcmf_notify_escan_complete(cfg, ifp, true, true);
-+		if (p2p->af_sent_channel) {
-+			/* abort actframe using actframe_abort or abort scan */
-+			err = brcmf_p2p_abort_action_frame(cfg);
-+			if (err)
-+				brcmf_notify_escan_complete(cfg, ifp, true,
-+							    true);
-+		}
- 	} else if (test_bit(BRCMF_P2P_STATUS_WAITING_NEXT_AF_LISTEN,
- 			    &p2p->status)) {
- 		brcmf_dbg(TRACE, "*** Wake UP ** abort listen for next af frame\n");
-@@ -1479,6 +1575,7 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
-  *
-  * @p2p: p2p info struct for vif.
-  * @af_params: action frame data/info.
-+ * @vif: vif to send
-  *
-  * Send an action frame immediately without doing channel synchronization.
-  *
-@@ -1487,12 +1584,18 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
-  * frame is transmitted.
-  */
- static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
--				     struct brcmf_fil_af_params_le *af_params)
-+				     struct brcmf_fil_af_params_le *af_params,
-+				     struct brcmf_cfg80211_vif *vif
-+				     )
- {
- 	struct brcmf_pub *drvr = p2p->cfg->pub;
--	struct brcmf_cfg80211_vif *vif;
- 	s32 err = 0;
- 	s32 timeout = 0;
-+	struct brcmf_fil_action_frame_le *action_frame;
-+	u16 action_frame_len;
-+
-+	action_frame = &af_params->action_frame;
-+	action_frame_len = le16_to_cpu(action_frame->len);
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-@@ -1500,7 +1603,6 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
- 
--	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
- 	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe", af_params,
- 					sizeof(*af_params));
- 	if (err) {
-@@ -1640,16 +1742,30 @@ static s32 brcmf_p2p_pub_af_tx(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
-+static bool brcmf_p2p_check_dwell_overflow(u32 requested_dwell,
-+					   unsigned long dwell_jiffies)
-+{
-+	if ((requested_dwell & CUSTOM_RETRY_MASK) &&
-+	    (jiffies_to_msecs(jiffies - dwell_jiffies) >
-+	    (requested_dwell & ~CUSTOM_RETRY_MASK))) {
-+		brcmf_err("Action frame TX retry time over dwell time!\n");
-+		return true;
-+	}
-+	return false;
-+}
- /**
-  * brcmf_p2p_send_action_frame() - send action frame .
-  *
-  * @cfg: driver private data for cfg80211 interface.
-  * @ndev: net device to transmit on.
-  * @af_params: configuration data for action frame.
-+ * @vif: virtual interface to send
-  */
- bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 				 struct net_device *ndev,
--				 struct brcmf_fil_af_params_le *af_params)
-+				 struct brcmf_fil_af_params_le *af_params,
-+				 struct brcmf_cfg80211_vif *vif
-+				 )
- {
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
- 	struct brcmf_if *ifp = netdev_priv(ndev);
-@@ -1664,7 +1780,10 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	s32 tx_retry;
- 	s32 extra_listen_time;
- 	uint delta_ms;
-+	unsigned long dwell_jiffies = 0;
-+	bool dwell_overflow = false;
- 
-+	u32 requested_dwell = le32_to_cpu(af_params->dwell_time);
- 	action_frame = &af_params->action_frame;
- 	action_frame_len = le16_to_cpu(action_frame->len);
- 
-@@ -1718,7 +1837,9 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 			goto exit;
- 		}
- 	} else if (brcmf_p2p_is_p2p_action(action_frame->data,
--					   action_frame_len)) {
-+					   action_frame_len) ||
-+		   brcmf_p2p_is_dpp_pub_action(action_frame->data,
-+					       action_frame_len)) {
- 		/* do not configure anything. it will be */
- 		/* sent with a default configuration     */
- 	} else {
-@@ -1755,6 +1876,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	/* validate channel and p2p ies */
- 	if (config_af_params.search_channel &&
- 	    IS_P2P_SOCIAL_CHANNEL(le32_to_cpu(af_params->channel)) &&
-+	    p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif &&
- 	    p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif->saved_ie.probe_req_ie_len) {
- 		afx_hdl = &p2p->afx_hdl;
- 		afx_hdl->peer_listen_chan = le32_to_cpu(af_params->channel);
-@@ -1775,12 +1897,21 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 		/* update channel */
- 		af_params->channel = cpu_to_le32(afx_hdl->peer_chan);
- 	}
-+	dwell_jiffies = jiffies;
-+	dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
-+							dwell_jiffies);
- 
- 	tx_retry = 0;
- 	while (!p2p->block_gon_req_tx &&
--	       (ack == false) && (tx_retry < P2P_AF_TX_MAX_RETRY)) {
--		ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
-+	       (!ack) && (tx_retry < P2P_AF_TX_MAX_RETRY) &&
-+		!dwell_overflow) {
-+		if (af_params->channel)
-+			msleep(P2P_AF_RETRY_DELAY_TIME);
-+
-+		ack = !brcmf_p2p_tx_action_frame(p2p, af_params, vif);
- 		tx_retry++;
-+		dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
-+								dwell_jiffies);
- 	}
- 	if (ack == false) {
- 		bphy_err(drvr, "Failed to send Action Frame(retry %d)\n",
-@@ -1994,7 +2125,7 @@ int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg,
- 
- 	if_request.type = cpu_to_le16((u16)if_type);
- 	if_request.chspec = cpu_to_le16(chanspec);
--	memcpy(if_request.addr, p2p->int_addr, sizeof(if_request.addr));
-+	memcpy(if_request.addr, p2p->conn_int_addr, sizeof(if_request.addr));
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 	err = brcmf_fil_iovar_data_set(vif->ifp, "p2p_ifupd", &if_request,
-@@ -2148,6 +2279,27 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
- 	return ERR_PTR(err);
- }
- 
-+int brcmf_p2p_get_conn_idx(struct brcmf_cfg80211_info *cfg)
-+{
-+	int i;
-+	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-+
-+	if (!ifp)
-+		return -ENODEV;
-+
-+	for (i = P2PAPI_BSSCFG_CONNECTION; i < P2PAPI_BSSCFG_MAX; i++) {
-+		if (!cfg->p2p.bss_idx[i].vif) {
-+			if (i == P2PAPI_BSSCFG_CONNECTION2 &&
-+			    !(brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
-+				brcmf_err("Multi p2p not supported");
-+				return -EIO;
-+			}
-+			return i;
-+		}
-+	}
-+	return -EIO;
-+}
-+
- /**
-  * brcmf_p2p_add_vif() - create a new P2P virtual interface.
-  *
-@@ -2167,7 +2319,9 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct brcmf_cfg80211_vif *vif;
- 	enum brcmf_fil_p2p_if_types iftype;
--	int err;
-+	int err = 0;
-+	int connidx;
-+	u8 *p2p_intf_addr;
- 
- 	if (brcmf_cfg80211_vif_event_armed(cfg))
- 		return ERR_PTR(-EBUSY);
-@@ -2193,9 +2347,21 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 		return (struct wireless_dev *)vif;
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 
--	err = brcmf_p2p_request_p2p_if(&cfg->p2p, ifp, cfg->p2p.int_addr,
--				       iftype);
-+	connidx = brcmf_p2p_get_conn_idx(cfg);
-+
-+	if (connidx == P2PAPI_BSSCFG_CONNECTION)
-+		p2p_intf_addr = cfg->p2p.conn_int_addr;
-+	else if (connidx == P2PAPI_BSSCFG_CONNECTION2)
-+		p2p_intf_addr = cfg->p2p.conn2_int_addr;
-+	else
-+		err = -EINVAL;
-+
-+	if (!err)
-+		err =  brcmf_p2p_request_p2p_if(&cfg->p2p, ifp,
-+						p2p_intf_addr, iftype);
-+
- 	if (err) {
-+		brcmf_err("request p2p interface failed\n");
- 		brcmf_cfg80211_arm_vif_event(cfg, NULL);
- 		goto fail;
- 	}
-@@ -2227,7 +2393,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 		goto fail;
- 	}
- 
--	cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
-+	cfg->p2p.bss_idx[connidx].vif = vif;
- 	/* Disable firmware roaming for P2P interface  */
- 	brcmf_fil_iovar_int_set(ifp, "roam_off", 1);
- 	if (iftype == BRCMF_FIL_P2P_IF_GO) {
-@@ -2308,8 +2474,12 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
- 	brcmf_remove_interface(vif->ifp, true);
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, NULL);
--	if (iftype != NL80211_IFTYPE_P2P_DEVICE)
--		p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
-+	if (iftype != NL80211_IFTYPE_P2P_DEVICE) {
-+		if (vif == p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif)
-+			p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
-+		if (vif == p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION2].vif)
-+			p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION2].vif = NULL;
-+	}
- 
- 	return err;
- }
-@@ -2388,6 +2558,7 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
- 
- 	pri_ifp = brcmf_get_ifp(cfg->pub, 0);
- 	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
-+	init_completion(&p2p->send_af_done);
- 
- 	if (p2pdev_forced) {
- 		err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-index 64ab9b6a677d..bbc455238707 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-@@ -14,13 +14,15 @@ struct brcmf_cfg80211_info;
-  *
-  * @P2PAPI_BSSCFG_PRIMARY: maps to driver's primary bsscfg.
-  * @P2PAPI_BSSCFG_DEVICE: maps to driver's P2P device discovery bsscfg.
-- * @P2PAPI_BSSCFG_CONNECTION: maps to driver's P2P connection bsscfg.
-+ * @P2PAPI_BSSCFG_CONNECTION: maps to driver's 1st P2P connection bsscfg.
-+ * @P2PAPI_BSSCFG_CONNECTION2: maps to driver's 2nd P2P connection bsscfg.
-  * @P2PAPI_BSSCFG_MAX: used for range checking.
-  */
- enum p2p_bss_type {
- 	P2PAPI_BSSCFG_PRIMARY, /* maps to driver's primary bsscfg */
- 	P2PAPI_BSSCFG_DEVICE, /* maps to driver's P2P device discovery bsscfg */
--	P2PAPI_BSSCFG_CONNECTION, /* maps to driver's P2P connection bsscfg */
-+	P2PAPI_BSSCFG_CONNECTION, /* driver's 1st P2P connection bsscfg */
-+	P2PAPI_BSSCFG_CONNECTION2, /* driver's 2nd P2P connection bsscfg */
- 	P2PAPI_BSSCFG_MAX
- };
- 
-@@ -119,7 +121,8 @@ struct brcmf_p2p_info {
- 	struct brcmf_cfg80211_info *cfg;
- 	unsigned long status;
- 	u8 dev_addr[ETH_ALEN];
--	u8 int_addr[ETH_ALEN];
-+	u8 conn_int_addr[ETH_ALEN];
-+	u8 conn2_int_addr[ETH_ALEN];
- 	struct p2p_bss bss_idx[P2PAPI_BSSCFG_MAX];
- 	struct timer_list listen_timer;
- 	u8 listen_channel;
-@@ -135,6 +138,7 @@ struct brcmf_p2p_info {
- 	bool block_gon_req_tx;
- 	bool p2pdev_dynamically;
- 	bool wait_for_offchan_complete;
-+	struct wireless_dev *remin_on_channel_wdev;
- };
- 
- s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced);
-@@ -167,7 +171,8 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
- 					void *data);
- bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 				 struct net_device *ndev,
--				 struct brcmf_fil_af_params_le *af_params);
-+				 struct brcmf_fil_af_params_le *af_params,
-+				 struct brcmf_cfg80211_vif *vif);
- bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- 					   struct brcmf_bss_info_le *bi);
- s32 brcmf_p2p_notify_rx_mgmt_p2p_probereq(struct brcmf_if *ifp,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 3be60aef5465..13126b42992d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -12,6 +12,8 @@
- #include <linux/interrupt.h>
- #include <linux/bcma/bcma.h>
- #include <linux/sched.h>
-+#include <linux/sched/signal.h>
-+#include <linux/kthread.h>
- #include <asm/unaligned.h>
- 
- #include <soc.h>
-@@ -38,6 +40,7 @@
- #include "chip.h"
- #include "core.h"
- #include "common.h"
-+#include "cfg80211.h"
- 
- 
- enum brcmf_pcie_state {
-@@ -48,15 +51,16 @@ enum brcmf_pcie_state {
- BRCMF_FW_DEF(43602, "brcmfmac43602-pcie");
- BRCMF_FW_DEF(4350, "brcmfmac4350-pcie");
- BRCMF_FW_DEF(4350C, "brcmfmac4350c2-pcie");
--BRCMF_FW_DEF(4356, "brcmfmac4356-pcie");
--BRCMF_FW_DEF(43570, "brcmfmac43570-pcie");
-+CY_FW_DEF(4356, "cyfmac4356-pcie");
-+CY_FW_DEF(43570, "cyfmac43570-pcie");
- BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
--BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
-+CY_FW_DEF(4359, "cyfmac4359-pcie");
- BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
- BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
- BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
- BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
- BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
-+CY_FW_DEF(4355, "cyfmac54591-pcie");
- 
- static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
-@@ -76,9 +80,10 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
- 	BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
- 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
-+	BRCMF_FW_ENTRY(CY_CC_89459_CHIP_ID, 0xFFFFFFFF, 4355),
- };
- 
--#define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
-+#define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
- 
- #define BRCMF_PCIE_REG_MAP_SIZE			(32 * 1024)
- 
-@@ -269,6 +274,14 @@ struct brcmf_pciedev_info {
- 	void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 			  u16 value);
- 	struct brcmf_mp_device *settings;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	ulong bar1_size;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-+#ifdef DEBUG
-+	u32 console_interval;
-+	bool console_active;
-+	struct timer_list timer;
-+#endif
- };
- 
- struct brcmf_pcie_ringbuf {
-@@ -340,6 +353,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- static struct brcmf_fw_request *
- brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
- 
-+static void
-+brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active);
-+static void brcmf_pcie_debugfs_create(struct device *dev);
-+
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+DEFINE_RAW_SPINLOCK(pcie_lock);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-+
- static u32
- brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
- {
-@@ -363,8 +384,24 @@ static u8
- brcmf_pcie_read_tcm8(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+	u8 value;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread8(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
-+	return value;
-+#else
- 	return (ioread8(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -372,8 +409,24 @@ static u16
- brcmf_pcie_read_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	u16 value;
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread16(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
-+	return value;
-+#else
- 	return (ioread16(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -382,8 +435,22 @@ brcmf_pcie_write_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 		       u16 value)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
- 
- 	iowrite16(value, address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#else
-+	iowrite16(value, address);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -410,8 +477,24 @@ static u32
- brcmf_pcie_read_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	u32 value;
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread32(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
-+	return value;
-+#else
- 	return (ioread32(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -420,17 +503,47 @@ brcmf_pcie_write_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 		       u32 value)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
--
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
- 	iowrite32(value, address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#else
-+	iowrite32(value, address);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
- static u32
- brcmf_pcie_read_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
--	void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset;
-+	void __iomem *address = devinfo->tcm + devinfo->ci->rambase
-+		+ mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	u32 value;
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread32(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
--	return (ioread32(addr));
-+	return value;
-+#else
-+	return (ioread32(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -438,9 +551,23 @@ static void
- brcmf_pcie_write_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 		       u32 value)
- {
--	void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset;
-+	void __iomem *address = devinfo->tcm + devinfo->ci->rambase
-+		+ mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
- 
--	iowrite32(value, addr);
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	iowrite32(value, address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#else
-+	iowrite32(value, address);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -452,12 +579,30 @@ brcmf_pcie_copy_mem_todev(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 	__le32 *src32;
- 	__le16 *src16;
- 	u8 *src8;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 
- 	if (((ulong)address & 4) || ((ulong)srcaddr & 4) || (len & 4)) {
- 		if (((ulong)address & 2) || ((ulong)srcaddr & 2) || (len & 2)) {
- 			src8 = (u8 *)srcaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+				    devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						 BCMA_PCI_BAR1_WIN,
-+						 devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				iowrite8(*src8, address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address++;
- 				src8++;
- 				len--;
-@@ -466,7 +611,22 @@ brcmf_pcie_copy_mem_todev(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 			len = len / 2;
- 			src16 = (__le16 *)srcaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+					devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						BCMA_PCI_BAR1_WIN,
-+						devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				iowrite16(le16_to_cpu(*src16), address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address += 2;
- 				src16++;
- 				len--;
-@@ -476,12 +636,29 @@ brcmf_pcie_copy_mem_todev(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 		len = len / 4;
- 		src32 = (__le32 *)srcaddr;
- 		while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_lock_irqsave(&pcie_lock, flags);
-+			if ((address - devinfo->tcm) >=
-+			    devinfo->bar1_size) {
-+				pci_write_config_dword
-+					(devinfo->pdev,
-+					 BCMA_PCI_BAR1_WIN,
-+					 devinfo->bar1_size);
-+				address = address - devinfo->bar1_size;
-+			}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			iowrite32(le32_to_cpu(*src32), address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			address += 4;
- 			src32++;
- 			len--;
- 		}
- 	}
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -493,12 +670,30 @@ brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 	__le32 *dst32;
- 	__le16 *dst16;
- 	u8 *dst8;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 
- 	if (((ulong)address & 4) || ((ulong)dstaddr & 4) || (len & 4)) {
- 		if (((ulong)address & 2) || ((ulong)dstaddr & 2) || (len & 2)) {
- 			dst8 = (u8 *)dstaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+				    devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						BCMA_PCI_BAR1_WIN,
-+						devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				*dst8 = ioread8(address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address++;
- 				dst8++;
- 				len--;
-@@ -507,7 +702,22 @@ brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 			len = len / 2;
- 			dst16 = (__le16 *)dstaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+				    devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						BCMA_PCI_BAR1_WIN,
-+						devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				*dst16 = cpu_to_le16(ioread16(address));
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address += 2;
- 				dst16++;
- 				len--;
-@@ -517,12 +727,29 @@ brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 		len = len / 4;
- 		dst32 = (__le32 *)dstaddr;
- 		while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_lock_irqsave(&pcie_lock, flags);
-+			if ((address - devinfo->tcm) >=
-+			    devinfo->bar1_size) {
-+				pci_write_config_dword
-+					(devinfo->pdev,
-+					BCMA_PCI_BAR1_WIN,
-+					devinfo->bar1_size);
-+				address = address - devinfo->bar1_size;
-+			}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			*dst32 = cpu_to_le32(ioread32(address));
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			address += 4;
- 			dst32++;
- 			len--;
- 		}
- 	}
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -566,6 +793,9 @@ static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
- 			     BRCMF_PCIE_CFGREG_MSI_ADDR_L,
- 			     BRCMF_PCIE_CFGREG_MSI_ADDR_H,
- 			     BRCMF_PCIE_CFGREG_MSI_DATA,
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			     BCMA_PCI_BAR1_WIN,
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			     BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL2,
- 			     BRCMF_PCIE_CFGREG_RBAR_CTRL,
- 			     BRCMF_PCIE_CFGREG_PML1_SUB_CTRL1,
-@@ -1136,9 +1366,14 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
- 	u16 max_flowrings;
- 	u16 max_submissionrings;
- 	u16 max_completionrings;
--
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	brcmf_pcie_copy_dev_tomem(devinfo, devinfo->shared.ring_info_addr,
-+				  &ringinfo, sizeof(ringinfo));
-+#else
- 	memcpy_fromio(&ringinfo, devinfo->tcm + devinfo->shared.ring_info_addr,
- 		      sizeof(ringinfo));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-+
- 	if (devinfo->shared.version >= 6) {
- 		max_submissionrings = le16_to_cpu(ringinfo.max_submissionrings);
- 		max_flowrings = le16_to_cpu(ringinfo.max_flowrings);
-@@ -1149,6 +1384,10 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
- 				BRCMF_NROF_H2D_COMMON_MSGRINGS;
- 		max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS;
- 	}
-+	if (max_flowrings > 256) {
-+		brcmf_err(bus, "invalid max_flowrings(%d)\n", max_flowrings);
-+		return -EIO;
-+	}
- 
- 	if (devinfo->dma_idx_sz != 0) {
- 		bufsz = (max_submissionrings + max_completionrings) *
-@@ -1207,8 +1446,14 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
- 		ringinfo.d2h_r_idx_hostaddr.high_addr =
- 			cpu_to_le32(address >> 32);
- 
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+		brcmf_pcie_copy_mem_todev(devinfo,
-+					  devinfo->shared.ring_info_addr,
-+					  &ringinfo, sizeof(ringinfo));
-+#else
- 		memcpy_toio(devinfo->tcm + devinfo->shared.ring_info_addr,
- 			    &ringinfo, sizeof(ringinfo));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 		brcmf_dbg(PCIE, "Using host memory indices\n");
- 	}
- 
-@@ -1344,6 +1589,11 @@ static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
- 
- static void brcmf_pcie_down(struct device *dev)
- {
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
-+
-+	brcmf_pcie_fwcon_timer(devinfo, false);
- }
- 
- 
-@@ -1403,12 +1653,16 @@ static
- int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
- 	struct brcmf_fw_request *fwreq;
- 	struct brcmf_fw_name fwnames[] = {
- 		{ ext, fw_name },
- 	};
-+	u32 chip;
- 
--	fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
-+	chip = bus_if->chip;
-+	fwreq = brcmf_fw_alloc_request(chip, bus_if->chiprev,
- 				       brcmf_pcie_fwnames,
- 				       ARRAY_SIZE(brcmf_pcie_fwnames),
- 				       fwnames, ARRAY_SIZE(fwnames));
-@@ -1463,6 +1717,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
- 	.get_memdump = brcmf_pcie_get_memdump,
- 	.get_fwname = brcmf_pcie_get_fwname,
- 	.reset = brcmf_pcie_reset,
-+	.debugfs_create = brcmf_pcie_debugfs_create,
- };
- 
- 
-@@ -1647,6 +1902,9 @@ static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
- 
- 	devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
- 	devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	devinfo->bar1_size = bar1_size;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 
- 	if (!devinfo->regs || !devinfo->tcm) {
- 		brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
-@@ -1758,13 +2016,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	struct brcmf_commonring **flowrings;
- 	u32 i, nvram_len;
- 
-+	bus = dev_get_drvdata(dev);
-+	pcie_bus_dev = bus->bus_priv.pcie;
-+	devinfo = pcie_bus_dev->devinfo;
-+
- 	/* check firmware loading result */
- 	if (ret)
- 		goto fail;
- 
--	bus = dev_get_drvdata(dev);
--	pcie_bus_dev = bus->bus_priv.pcie;
--	devinfo = pcie_bus_dev->devinfo;
- 	brcmf_pcie_attach(devinfo);
- 
- 	fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
-@@ -1827,15 +2086,20 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	brcmf_pcie_intr_enable(devinfo);
- 	brcmf_pcie_hostready(devinfo);
- 
--	ret = brcmf_attach(&devinfo->pdev->dev);
-+	ret = brcmf_attach(&devinfo->pdev->dev, true);
- 	if (ret)
- 		goto fail;
- 
- 	brcmf_pcie_bus_console_read(devinfo, false);
- 
-+	brcmf_pcie_fwcon_timer(devinfo, true);
-+
- 	return;
- 
- fail:
-+	brcmf_err(bus, "Dongle setup failed\n");
-+	brcmf_pcie_bus_console_read(devinfo, true);
-+	brcmf_dev_coredump(dev);
- 	device_release_driver(dev);
- }
- 
-@@ -1847,8 +2111,10 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
- 		{ ".bin", devinfo->fw_name },
- 		{ ".txt", devinfo->nvram_name },
- 	};
-+	u32 chip;
- 
--	fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev,
-+	chip = devinfo->ci->chip;
-+	fwreq = brcmf_fw_alloc_request(chip, devinfo->ci->chiprev,
- 				       brcmf_pcie_fwnames,
- 				       ARRAY_SIZE(brcmf_pcie_fwnames),
- 				       fwnames, ARRAY_SIZE(fwnames));
-@@ -1866,6 +2132,105 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
- 	return fwreq;
- }
- 
-+#ifdef DEBUG
-+static void
-+brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
-+{
-+	if (!active) {
-+		if (devinfo->console_active) {
-+			del_timer_sync(&devinfo->timer);
-+			devinfo->console_active = false;
-+		}
-+		return;
-+	}
-+
-+	/* don't start the timer */
-+	if (devinfo->state != BRCMFMAC_PCIE_STATE_UP ||
-+	    !devinfo->console_interval || !BRCMF_FWCON_ON())
-+		return;
-+
-+	if (!devinfo->console_active) {
-+		devinfo->timer.expires = jiffies + devinfo->console_interval;
-+		add_timer(&devinfo->timer);
-+		devinfo->console_active = true;
-+	} else {
-+		/* Reschedule the timer */
-+		mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
-+	}
-+}
-+
-+static void
-+brcmf_pcie_fwcon(struct timer_list *t)
-+{
-+	struct brcmf_pciedev_info *devinfo = from_timer(devinfo, t, timer);
-+
-+	if (!devinfo->console_active)
-+		return;
-+
-+	brcmf_pcie_bus_console_read(devinfo, false);
-+
-+	/* Reschedule the timer if console interval is not zero */
-+	mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
-+}
-+
-+static int brcmf_pcie_console_interval_get(void *data, u64 *val)
-+{
-+	struct brcmf_pciedev_info *devinfo = data;
-+
-+	*val = devinfo->console_interval;
-+
-+	return 0;
-+}
-+
-+static int brcmf_pcie_console_interval_set(void *data, u64 val)
-+{
-+	struct brcmf_pciedev_info *devinfo = data;
-+
-+	if (val > MAX_CONSOLE_INTERVAL)
-+		return -EINVAL;
-+
-+	devinfo->console_interval = val;
-+
-+	if (!val && devinfo->console_active)
-+		brcmf_pcie_fwcon_timer(devinfo, false);
-+	else if (val)
-+		brcmf_pcie_fwcon_timer(devinfo, true);
-+
-+	return 0;
-+}
-+
-+DEFINE_SIMPLE_ATTRIBUTE(brcmf_pcie_console_interval_fops,
-+			brcmf_pcie_console_interval_get,
-+			brcmf_pcie_console_interval_set,
-+			"%llu\n");
-+
-+static void brcmf_pcie_debugfs_create(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pub *drvr = bus_if->drvr;
-+	struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
-+	struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
-+
-+	if (IS_ERR_OR_NULL(dentry))
-+		return;
-+
-+	devinfo->console_interval = BRCMF_CONSOLE;
-+
-+	debugfs_create_file("console_interval", 0644, dentry, devinfo,
-+			    &brcmf_pcie_console_interval_fops);
-+}
-+
-+#else
-+void brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
-+{
-+}
-+
-+static void brcmf_pcie_debugfs_create(struct device *dev)
-+{
-+}
-+#endif
-+
- static int
- brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
- {
-@@ -1933,6 +2298,10 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
- 	if (ret)
- 		goto fail_bus;
- 
-+#ifdef DEBUG
-+	/* Set up the fwcon timer */
-+	timer_setup(&devinfo->timer, brcmf_pcie_fwcon, 0);
-+#endif
- 	fwreq = brcmf_pcie_prepare_fw_request(devinfo);
- 	if (!fwreq) {
- 		ret = -ENOMEM;
-@@ -1976,6 +2345,8 @@ brcmf_pcie_remove(struct pci_dev *pdev)
- 
- 	devinfo = bus->bus_priv.pcie->devinfo;
- 
-+	brcmf_pcie_fwcon_timer(devinfo, false);
-+
- 	devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
- 	if (devinfo->ci)
- 		brcmf_pcie_intr_disable(devinfo);
-@@ -2011,11 +2382,24 @@ static int brcmf_pcie_pm_enter_D3(struct device *dev)
- {
- 	struct brcmf_pciedev_info *devinfo;
- 	struct brcmf_bus *bus;
-+	struct brcmf_cfg80211_info *config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	brcmf_dbg(PCIE, "Enter\n");
- 
- 	bus = dev_get_drvdata(dev);
- 	devinfo = bus->bus_priv.pcie->devinfo;
-+	config = bus->drvr->config;
-+
-+	while (retry &&
-+	       config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
-+		usleep_range(10000, 20000);
-+		retry--;
-+	}
-+	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
-+		brcmf_err(bus, "timed out wait for cfg80211 suspended\n");
-+
-+	brcmf_pcie_fwcon_timer(devinfo, false);
- 
- 	brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
- 
-@@ -2060,6 +2444,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
- 		brcmf_bus_change_state(bus, BRCMF_BUS_UP);
- 		brcmf_pcie_intr_enable(devinfo);
- 		brcmf_pcie_hostready(devinfo);
-+		brcmf_pcie_fwcon_timer(devinfo, true);
- 		return 0;
- 	}
- 
-@@ -2101,6 +2486,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_RAW_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4358_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4359_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
-@@ -2115,6 +2501,9 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(CY_PCIE_89459_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(CY_PCIE_89459_RAW_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(CY_PCIE_54591_DEVICE_ID),
- 	{ /* end: all zeroes */ }
- };
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-index 14e530601ef3..7ec1630d9095 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-@@ -154,12 +154,12 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
- 	struct brcmf_pno_macaddr_le pfn_mac;
- 	u8 *mac_addr = NULL;
- 	u8 *mac_mask = NULL;
--	int err, i;
-+	int err, i, ri;
- 
--	for (i = 0; i < pi->n_reqs; i++)
--		if (pi->reqs[i]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
--			mac_addr = pi->reqs[i]->mac_addr;
--			mac_mask = pi->reqs[i]->mac_addr_mask;
-+	for (ri = 0; ri < pi->n_reqs; ri++)
-+		if (pi->reqs[ri]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
-+			mac_addr = pi->reqs[ri]->mac_addr;
-+			mac_mask = pi->reqs[ri]->mac_addr_mask;
- 			break;
- 		}
- 
-@@ -181,7 +181,7 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
- 	pfn_mac.mac[0] |= 0x02;
- 
- 	brcmf_dbg(SCAN, "enabling random mac: reqid=%llu mac=%pM\n",
--		  pi->reqs[i]->reqid, pfn_mac.mac);
-+		  pi->reqs[ri]->reqid, pfn_mac.mac);
- 	err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
- 				       sizeof(pfn_mac));
- 	if (err)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 264ad63232f8..d85f1aa671e8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -16,12 +16,14 @@
- #include <linux/mmc/sdio_ids.h>
- #include <linux/mmc/sdio_func.h>
- #include <linux/mmc/card.h>
-+#include <linux/mmc/core.h>
- #include <linux/semaphore.h>
- #include <linux/firmware.h>
- #include <linux/module.h>
- #include <linux/bcma/bcma.h>
- #include <linux/debugfs.h>
- #include <linux/vmalloc.h>
-+#include <linux/net_tstamp.h>
- #include <asm/unaligned.h>
- #include <defs.h>
- #include <brcmu_wifi.h>
-@@ -34,15 +36,33 @@
- #include "core.h"
- #include "common.h"
- #include "bcdc.h"
-+#include "fwil.h"
- 
- #define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2500)
- #define CTL_DONE_TIMEOUT	msecs_to_jiffies(2500)
-+#define ULP_HUDI_PROC_DONE_TIME	msecs_to_jiffies(2500)
- 
- /* watermark expressed in number of words */
- #define DEFAULT_F2_WATERMARK    0x8
--#define CY_4373_F2_WATERMARK    0x40
-+#define CY_4373_F2_WATERMARK    0x4C
-+#define CY_4373_MES_WATERMARK    0x44
-+#define CY_4373_MESBUSYCTRL    (CY_4373_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- #define CY_43012_F2_WATERMARK    0x60
--
-+#define CY_43012_MES_WATERMARK  0x50
-+#define CY_43012_MESBUSYCTRL    (CY_43012_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
-+#define CY_4339_F2_WATERMARK    48
-+#define CY_4339_MES_WATERMARK	80
-+#define CY_4339_MESBUSYCTRL	(CY_4339_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
-+#define CY_43455_F2_WATERMARK	0x60
-+#define CY_43455_MES_WATERMARK	0x50
-+#define CY_43455_MESBUSYCTRL	(CY_43455_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
-+#define CY_435X_F2_WATERMARK	0x40
-+#define CY_435X_F1_MESBUSYCTRL	(CY_435X_F2_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- #ifdef DEBUG
- 
- #define BRCMF_TRAP_INFO_SIZE	80
-@@ -119,8 +139,6 @@ struct rte_console {
- 
- #define BRCMF_FIRSTREAD	(1 << 6)
- 
--#define BRCMF_CONSOLE	10	/* watchdog interval to poll console */
--
- /* SBSDIO_DEVICE_CTL */
- 
- /* 1: device will assert busy signal when receiving CMD53 */
-@@ -311,16 +329,16 @@ struct rte_console {
- 
- #define KSO_WAIT_US 50
- #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
--#define BRCMF_SDIO_MAX_ACCESS_ERRORS	5
-+#define BRCMF_SDIO_MAX_ACCESS_ERRORS	20
- 
--/*
-- * Conversion of 802.1D priority to precedence level
-- */
--static uint prio2prec(u32 prio)
--{
--	return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
--	       (prio^2) : prio;
--}
-+static void brcmf_sdio_firmware_callback(struct device *dev, int err,
-+					 struct brcmf_fw_request *fwreq);
-+static struct brcmf_fw_request *
-+	brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus);
-+static int brcmf_sdio_f2_ready(struct brcmf_sdio *bus);
-+static int brcmf_ulp_event_notify(struct brcmf_if *ifp,
-+				  const struct brcmf_event_msg *evtmsg,
-+				  void *data);
- 
- #ifdef DEBUG
- /* Device console log buffer state */
-@@ -603,19 +621,20 @@ BRCMF_FW_DEF(43241B5, "brcmfmac43241b5-sdio");
- BRCMF_FW_DEF(4329, "brcmfmac4329-sdio");
- BRCMF_FW_DEF(4330, "brcmfmac4330-sdio");
- BRCMF_FW_DEF(4334, "brcmfmac4334-sdio");
--BRCMF_FW_DEF(43340, "brcmfmac43340-sdio");
-+CY_FW_DEF(43340, "cyfmac43340-sdio");
- BRCMF_FW_DEF(4335, "brcmfmac4335-sdio");
--BRCMF_FW_DEF(43362, "brcmfmac43362-sdio");
--BRCMF_FW_DEF(4339, "brcmfmac4339-sdio");
-+CY_FW_DEF(43362, "cyfmac43362-sdio");
-+CY_FW_DEF(4339, "cyfmac4339-sdio");
- BRCMF_FW_DEF(43430A0, "brcmfmac43430a0-sdio");
- /* Note the names are not postfixed with a1 for backward compatibility */
--BRCMF_FW_DEF(43430A1, "brcmfmac43430-sdio");
--BRCMF_FW_DEF(43455, "brcmfmac43455-sdio");
-+CY_FW_DEF(43430A1, "cyfmac43430-sdio");
-+CY_FW_DEF(43455, "cyfmac43455-sdio");
- BRCMF_FW_DEF(43456, "brcmfmac43456-sdio");
--BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
--BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
--BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
--BRCMF_FW_DEF(43012, "brcmfmac43012-sdio");
-+CY_FW_DEF(4354, "cyfmac4354-sdio");
-+CY_FW_DEF(4356, "cyfmac4356-sdio");
-+CY_FW_DEF(4359, "cyfmac4359-sdio");
-+CY_FW_DEF(4373, "cyfmac4373-sdio");
-+CY_FW_DEF(43012, "cyfmac43012-sdio");
- 
- static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
-@@ -636,10 +655,13 @@ static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFDC0, 43455),
- 	BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
- 	BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
-+	BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
- 	BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
- 	BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012)
- };
- 
-+#define TXCTL_CREDITS	2
-+
- static void pkt_align(struct sk_buff *p, int len, int align)
- {
- 	uint datalign;
-@@ -652,6 +674,19 @@ static void pkt_align(struct sk_buff *p, int len, int align)
- 
- /* To check if there's window offered */
- static bool data_ok(struct brcmf_sdio *bus)
-+{
-+	u8 tx_rsv = 0;
-+
-+	/* Reserve TXCTL_CREDITS credits for txctl when it is ready to send */
-+	if (bus->ctrl_frame_stat)
-+		tx_rsv = TXCTL_CREDITS;
-+
-+	return (bus->tx_max - bus->tx_seq - tx_rsv) != 0 &&
-+	       ((bus->tx_max - bus->tx_seq - tx_rsv) & 0x80) == 0;
-+}
-+
-+/* To check if there's window offered */
-+static bool txctl_ok(struct brcmf_sdio *bus)
- {
- 	return (u8)(bus->tx_max - bus->tx_seq) != 0 &&
- 	       ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0;
-@@ -1068,7 +1103,7 @@ static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)
- }
- #endif /* DEBUG */
- 
--static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
-+static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus, u32 *hmbd)
- {
- 	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
- 	struct brcmf_core *core = bus->sdio_core;
-@@ -1157,6 +1192,9 @@ static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
- 			 HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
- 		brcmf_err("Unknown mailbox data content: 0x%02x\n",
- 			  hmb_data);
-+	/* Populate hmb_data if argument is passed for DS1 check later */
-+	if (hmbd)
-+		*hmbd = hmb_data;
- 
- 	return intstatus;
- }
-@@ -2317,6 +2355,9 @@ static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
- 					      &prec_out);
- 			if (pkt == NULL)
- 				break;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+			skb_orphan(pkt);
-+#endif
- 			__skb_queue_tail(&pktq, pkt);
- 		}
- 		spin_unlock_bh(&bus->txq_lock);
-@@ -2540,6 +2581,182 @@ static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
- 	return ret;
- }
- 
-+/* This Function is used to retrieve important
-+ * details from dongle related to ULP mode Mostly
-+ * values/SHM details that will be vary depending
-+ * on the firmware branches
-+ */
-+static void
-+brcmf_sdio_ulp_preinit(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
-+	struct brcmf_if *ifp = bus_if->drvr->iflist[0];
-+
-+	brcmf_dbg(ULP, "Enter\n");
-+
-+	/* Query ulp_sdioctrl iovar to get the ULP related SHM offsets */
-+	brcmf_fil_iovar_data_get(ifp, "ulp_sdioctrl",
-+				 &sdiodev->fmac_ulp.ulp_shm_offset,
-+				 sizeof(sdiodev->fmac_ulp.ulp_shm_offset));
-+
-+	sdiodev->ulp = false;
-+
-+	brcmf_dbg(ULP, "m_ulp_ctrl_sdio[%x] m_ulp_wakeevt_ind [%x]\n",
-+		  M_DS1_CTRL_SDIO(sdiodev->fmac_ulp),
-+		  M_WAKEEVENT_IND(sdiodev->fmac_ulp));
-+	brcmf_dbg(ULP, "m_ulp_wakeind [%x]\n",
-+		  M_ULP_WAKE_IND(sdiodev->fmac_ulp));
-+}
-+
-+/* Reinitialize ARM because In DS1 mode ARM got off */
-+static int
-+brcmf_sdio_ulp_reinit_fw(struct brcmf_sdio *bus)
-+{
-+	struct brcmf_sdio_dev *sdiodev = bus->sdiodev;
-+	struct brcmf_fw_request *fwreq;
-+	int err = 0;
-+
-+	/* After firmware redownload tx/rx seq are reset accordingly
-+	 * these values are reset on FMAC side tx_max is initially set to 4,
-+	 * which later is updated by FW.
-+	 */
-+	bus->tx_seq = 0;
-+	bus->rx_seq = 0;
-+	bus->tx_max = 4;
-+
-+	fwreq = brcmf_sdio_prepare_fw_request(bus);
-+	if (!fwreq)
-+		return -ENOMEM;
-+
-+	err = brcmf_fw_get_firmwares(sdiodev->dev, fwreq,
-+				     brcmf_sdio_firmware_callback);
-+	if (err != 0) {
-+		brcmf_err("async firmware request failed: %d\n", err);
-+		kfree(fwreq);
-+	}
-+
-+	return err;
-+}
-+
-+/* Check if device is in DS1 mode and handshake with ULP UCODE */
-+static bool
-+brcmf_sdio_ulp_pre_redownload_check(struct brcmf_sdio *bus, u32 hmb_data)
-+{
-+	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
-+	int err = 0;
-+	u32 value = 0;
-+	u32 val32, ulp_wake_ind, wowl_wake_ind;
-+	int reg_addr;
-+	unsigned long timeout;
-+	struct brcmf_ulp *fmac_ulp = &bus->sdiodev->fmac_ulp;
-+	int i = 0;
-+
-+	/* If any host mail box data is present, ignore DS1 exit sequence */
-+	if (hmb_data)
-+		return false;
-+	/* Skip if DS1 Exit is already in progress
-+	 * This can happen if firmware download is taking more time
-+	 */
-+	if (fmac_ulp->ulp_state == FMAC_ULP_TRIGGERED)
-+		return false;
-+
-+	value = brcmf_sdiod_func0_rb(sdiod, SDIO_CCCR_IOEx, &err);
-+
-+	if (value == SDIO_FUNC_ENABLE_1) {
-+		brcmf_dbg(ULP, "GOT THE INTERRUPT FROM UCODE\n");
-+		sdiod->ulp = true;
-+		fmac_ulp->ulp_state = FMAC_ULP_TRIGGERED;
-+		ulp_wake_ind = D11SHM_RDW(sdiod,
-+					  M_ULP_WAKE_IND(sdiod->fmac_ulp),
-+					  &err);
-+		wowl_wake_ind = D11SHM_RDW(sdiod,
-+					   M_WAKEEVENT_IND(sdiod->fmac_ulp),
-+					   &err);
-+
-+		brcmf_dbg(ULP, "wowl_wake_ind: 0x%08x, ulp_wake_ind: 0x%08x state %s\n",
-+			  wowl_wake_ind, ulp_wake_ind, (fmac_ulp->ulp_state) ?
-+			  "DS1 Exit Triggered" : "IDLE State");
-+
-+		if (wowl_wake_ind || ulp_wake_ind) {
-+			/* RX wake Don't do anything.
-+			 * Just bail out and re-download firmware.
-+			 */
-+			 /* Print out PHY TX error block when bit 9 set */
-+			if ((ulp_wake_ind & C_DS1_PHY_TXERR) &&
-+			    M_DS1_PHYTX_ERR_BLK(sdiod->fmac_ulp)) {
-+				brcmf_err("Dump PHY TX Error SHM Locations\n");
-+				for (i = 0; i < PHYTX_ERR_BLK_SIZE; i++) {
-+					pr_err("0x%x",
-+					       D11SHM_RDW(sdiod,
-+					       (M_DS1_PHYTX_ERR_BLK(sdiod->fmac_ulp) +
-+						(i * 2)), &err));
-+				}
-+				brcmf_err("\n");
-+			}
-+		} else {
-+			/* TX wake negotiate with MAC */
-+			brcmf_dbg(ULP, "M_DS1_CTRL_SDIO: 0x%08x\n",
-+				  (u32)D11SHM_RDW(sdiod,
-+				  M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+				  &err));
-+			val32 = D11SHM_RD(sdiod,
-+					  M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+					  &err);
-+			D11SHM_WR(sdiod, M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+				  val32, (C_DS1_CTRL_SDIO_DS1_EXIT |
-+				  C_DS1_CTRL_REQ_VALID), &err);
-+			val32 = D11REG_RD(sdiod, D11_MACCONTROL_REG, &err);
-+			val32 = val32 | D11_MACCONTROL_REG_WAKE;
-+			D11REG_WR(sdiod, D11_MACCONTROL_REG, val32, &err);
-+
-+			/* Poll for PROC_DONE to be set by ucode */
-+			value = D11SHM_RDW(sdiod,
-+					   M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+					   &err);
-+			/* Wait here (polling) for C_DS1_CTRL_PROC_DONE */
-+			timeout = jiffies + ULP_HUDI_PROC_DONE_TIME;
-+			while (!(value & C_DS1_CTRL_PROC_DONE)) {
-+				value = D11SHM_RDW(sdiod,
-+						   M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+						   &err);
-+				if (time_after(jiffies, timeout))
-+					break;
-+				usleep_range(1000, 2000);
-+			}
-+			brcmf_dbg(ULP, "M_DS1_CTRL_SDIO: 0x%08x\n",
-+				  (u32)D11SHM_RDW(sdiod,
-+				  M_DS1_CTRL_SDIO(sdiod->fmac_ulp), &err));
-+			value = D11SHM_RDW(sdiod,
-+					   M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+					   &err);
-+			if (!(value & C_DS1_CTRL_PROC_DONE)) {
-+				brcmf_err("Timeout Failed to enter DS1 Exit state!\n");
-+				return false;
-+			}
-+		}
-+
-+		ulp_wake_ind = D11SHM_RDW(sdiod,
-+					  M_ULP_WAKE_IND(sdiod->fmac_ulp),
-+					  &err);
-+		wowl_wake_ind = D11SHM_RDW(sdiod,
-+					   M_WAKEEVENT_IND(sdiod->fmac_ulp),
-+					   &err);
-+		brcmf_dbg(ULP, "wowl_wake_ind: 0x%08x, ulp_wake_ind: 0x%08x\n",
-+			  wowl_wake_ind, ulp_wake_ind);
-+		reg_addr = CORE_CC_REG(
-+			  brcmf_chip_get_pmu(bus->ci)->base, min_res_mask);
-+		brcmf_sdiod_writel(sdiod, reg_addr,
-+				   DEFAULT_43012_MIN_RES_MASK, &err);
-+		if (err)
-+			brcmf_err("min_res_mask failed\n");
-+
-+		return true;
-+	}
-+
-+	return false;
-+}
-+
- static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- {
- 	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
-@@ -2611,8 +2828,11 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 
- 	/* Handle host mailbox indication */
- 	if (intstatus & I_HMB_HOST_INT) {
-+		u32 hmb_data = 0;
- 		intstatus &= ~I_HMB_HOST_INT;
--		intstatus |= brcmf_sdio_hostmail(bus);
-+		intstatus |= brcmf_sdio_hostmail(bus, &hmb_data);
-+		if (brcmf_sdio_ulp_pre_redownload_check(bus, hmb_data))
-+			brcmf_sdio_ulp_reinit_fw(bus);
- 	}
- 
- 	sdio_release_host(bus->sdiodev->func1);
-@@ -2657,7 +2877,7 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 	brcmf_sdio_clrintr(bus);
- 
- 	if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
--	    data_ok(bus)) {
-+	    txctl_ok(bus) && brcmf_sdio_f2_ready(bus)) {
- 		sdio_claim_host(bus->sdiodev->func1);
- 		if (bus->ctrl_frame_stat) {
- 			err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
-@@ -2665,6 +2885,9 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 			bus->ctrl_frame_err = err;
- 			wmb();
- 			bus->ctrl_frame_stat = false;
-+			if (err)
-+				brcmf_err("sdio ctrlframe tx failed err=%d\n",
-+					  err);
- 		}
- 		sdio_release_host(bus->sdiodev->func1);
- 		brcmf_sdio_wait_event_wakeup(bus);
-@@ -2767,13 +2990,21 @@ static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
- 	skb_push(pkt, bus->tx_hdrlen);
- 	/* precondition: IS_ALIGNED((unsigned long)(pkt->data), 2) */
- 
--	prec = prio2prec((pkt->priority & PRIOMASK));
-+	/* In WLAN, priority is always set by the AP using WMM parameters
-+	 * and this need not always follow the standard 802.1d priority.
-+	 * Based on AP WMM config, map from 802.1d priority to corresponding
-+	 * precedence level.
-+	 */
-+	prec = brcmf_map_prio_to_prec(bus_if->drvr->config,
-+				      (pkt->priority & PRIOMASK));
- 
- 	/* Check for existing queue, current flow-control,
- 			 pending event, or pending clock */
- 	brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq));
- 	bus->sdcnt.fcqueued++;
- 
-+	skb_tx_timestamp(pkt);
-+
- 	/* Priority based enq */
- 	spin_lock_bh(&bus->txq_lock);
- 	/* reset bus_flags in packet cb */
-@@ -3375,7 +3606,12 @@ static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
- 
- static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
- {
--	if (bus->ci->chip == CY_CC_43012_CHIP_ID)
-+	if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
-+	    bus->ci->chip == CY_CC_4373_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4339_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4345_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4354_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4356_CHIP_ID)
- 		return true;
- 	else
- 		return false;
-@@ -3515,6 +3751,10 @@ static int brcmf_sdio_bus_preinit(struct device *dev)
- 	if (err < 0)
- 		goto done;
- 
-+	/* initialize SHM address from firmware for DS1 */
-+	if (!bus->sdiodev->ulp)
-+		brcmf_sdio_ulp_preinit(dev);
-+
- 	bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
- 	if (sdiodev->sg_support) {
- 		bus->txglom = false;
-@@ -3682,7 +3922,11 @@ static void brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
- 			if (bus->idlecount > bus->idletime) {
- 				brcmf_dbg(SDIO, "idle\n");
- 				sdio_claim_host(bus->sdiodev->func1);
--				brcmf_sdio_wd_timer(bus, false);
-+#ifdef DEBUG
-+				if (!BRCMF_FWCON_ON() ||
-+				    bus->console_interval == 0)
-+#endif
-+					brcmf_sdio_wd_timer(bus, false);
- 				bus->idlecount = 0;
- 				brcmf_sdio_bus_sleep(bus, true, false);
- 				sdio_release_host(bus->sdiodev->func1);
-@@ -4092,6 +4336,36 @@ int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- 	return 0;
- }
- 
-+static int brcmf_sdio_bus_reset(struct device *dev)
-+{
-+	int ret = 0;
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
-+
-+	brcmf_dbg(SDIO, "Enter\n");
-+
-+	/* start by unregistering irqs */
-+	brcmf_sdiod_intr_unregister(sdiodev);
-+
-+	brcmf_sdiod_remove(sdiodev);
-+
-+	/* reset the adapter */
-+	sdio_claim_host(sdiodev->func1);
-+	mmc_hw_reset(sdiodev->func1->card->host);
-+	sdio_release_host(sdiodev->func1);
-+
-+	brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
-+
-+	ret = brcmf_sdiod_probe(sdiodev);
-+	if (ret) {
-+		brcmf_err("Failed to probe after sdio device reset: ret %d\n",
-+			  ret);
-+		brcmf_sdiod_remove(sdiodev);
-+	}
-+
-+	return ret;
-+}
-+
- static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
- 	.stop = brcmf_sdio_bus_stop,
- 	.preinit = brcmf_sdio_bus_preinit,
-@@ -4103,7 +4377,8 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
- 	.get_ramsize = brcmf_sdio_bus_get_ramsize,
- 	.get_memdump = brcmf_sdio_bus_get_memdump,
- 	.get_fwname = brcmf_sdio_get_fwname,
--	.debugfs_create = brcmf_sdio_debugfs_create
-+	.debugfs_create = brcmf_sdio_debugfs_create,
-+	.reset = brcmf_sdio_bus_reset
- };
- 
- #define BRCMF_SDIO_FW_CODE	0
-@@ -4122,7 +4397,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 	u8 saveclk, bpreq;
- 	u8 devctl;
- 
--	brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
-+	brcmf_dbg(ULP, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
- 
- 	if (err)
- 		goto fail;
-@@ -4191,8 +4466,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_4373_F2_WATERMARK |
--					   SBSDIO_MESBUSYCTRL_ENAB, &err);
-+					   CY_4373_MESBUSYCTRL, &err);
- 			break;
- 		case SDIO_DEVICE_ID_CYPRESS_43012:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
-@@ -4204,6 +4478,49 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_43012_MESBUSYCTRL, &err);
-+			break;
-+		case SDIO_DEVICE_ID_BROADCOM_4339:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 4339\n",
-+				  CY_4339_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_4339_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_4339_MESBUSYCTRL, &err);
-+			break;
-+		case SDIO_DEVICE_ID_BROADCOM_43455:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 43455\n",
-+				  CY_43455_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_43455_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_43455_MESBUSYCTRL, &err);
-+			break;
-+		case SDIO_DEVICE_ID_BROADCOM_4359:
-+		case SDIO_DEVICE_ID_BROADCOM_4354:
-+		case SDIO_DEVICE_ID_BROADCOM_4356:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
-+				  CY_435X_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_435X_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_435X_F1_MESBUSYCTRL, &err);
- 			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-@@ -4254,12 +4571,25 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 	}
- 
- 	/* Attach to the common layer, reserve hdr space */
--	err = brcmf_attach(sdiod->dev);
-+	err = brcmf_attach(sdiod->dev, !bus->sdiodev->ulp);
- 	if (err != 0) {
- 		brcmf_err("brcmf_attach failed\n");
- 		goto free;
- 	}
- 
-+	/* Register for ULP events */
-+	if (sdiod->func1->device == SDIO_DEVICE_ID_CYPRESS_43012)
-+		brcmf_fweh_register(bus_if->drvr, BRCMF_E_ULP,
-+				    brcmf_ulp_event_notify);
-+
-+	if (bus->sdiodev->ulp) {
-+		/* For ULP, after firmware redownload complete
-+		 * set ULP state to IDLE
-+		 */
-+		if (bus->sdiodev->fmac_ulp.ulp_state == FMAC_ULP_TRIGGERED)
-+			bus->sdiodev->fmac_ulp.ulp_state = FMAC_ULP_IDLE;
-+	}
-+
- 	/* ready */
- 	return;
- 
-@@ -4322,9 +4652,21 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
- 	bus->txminmax = BRCMF_TXMINMAX;
- 	bus->tx_seq = SDPCM_SEQ_WRAP - 1;
- 
-+	/* attempt to attach to the dongle */
-+	if (!(brcmf_sdio_probe_attach(bus))) {
-+		brcmf_err("brcmf_sdio_probe_attach failed\n");
-+		goto fail;
-+	}
-+
- 	/* single-threaded workqueue */
--	wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
--				     dev_name(&sdiodev->func1->dev));
-+	if (sdiodev->settings->sdio_wq_highpri) {
-+		wq = alloc_workqueue("brcmf_wq/%s",
-+				     WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND,
-+				     1, dev_name(&sdiodev->func1->dev));
-+	} else {
-+		wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
-+					     dev_name(&sdiodev->func1->dev));
-+	}
- 	if (!wq) {
- 		brcmf_err("insufficient memory to create txworkqueue\n");
- 		goto fail;
-@@ -4333,12 +4675,6 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
- 	INIT_WORK(&bus->datawork, brcmf_sdio_dataworker);
- 	bus->brcmf_wq = wq;
- 
--	/* attempt to attach to the dongle */
--	if (!(brcmf_sdio_probe_attach(bus))) {
--		brcmf_err("brcmf_sdio_probe_attach failed\n");
--		goto fail;
--	}
--
- 	spin_lock_init(&bus->rxctl_lock);
- 	spin_lock_init(&bus->txq_lock);
- 	init_waitqueue_head(&bus->ctrl_wait);
-@@ -4426,6 +4762,7 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
- 		brcmf_sdiod_intr_unregister(bus->sdiodev);
- 
- 		brcmf_detach(bus->sdiodev->dev);
-+		brcmf_free(bus->sdiodev->dev);
- 
- 		cancel_work_sync(&bus->datawork);
- 		if (bus->brcmf_wq)
-@@ -4441,7 +4778,17 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
- 				 * necessary cores.
- 				 */
- 				msleep(20);
--				brcmf_chip_set_passive(bus->ci);
-+				if (bus->sdiodev->fmac_ulp.ulp_state ==
-+					FMAC_ULP_ENTRY_RECV) {
-+					brcmf_chip_ulp_reset_lhl_regs(bus->ci);
-+					brcmf_chip_reset_pmu_regs(bus->ci);
-+				} else {
-+					brcmf_chip_set_passive(bus->ci);
-+				}
-+				/* Reset the PMU, backplane and all the
-+				 * cores by using the PMUWatchdogCounter.
-+				 */
-+				brcmf_chip_reset_watchdog(bus->ci);
- 				brcmf_sdio_clkctl(bus, CLK_NONE, false);
- 				sdio_release_host(bus->sdiodev->func1);
- 			}
-@@ -4497,3 +4844,39 @@ int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep)
- 	return ret;
- }
- 
-+/* Check F2 Ready bit before sending data to Firmware */
-+static int
-+brcmf_sdio_f2_ready(struct brcmf_sdio *bus)
-+{
-+	int ret = -1;
-+	int iordy_status = 0;
-+
-+	sdio_claim_host(bus->sdiodev->func1);
-+	/* Read the status of IOR2 */
-+	iordy_status = brcmf_sdiod_func0_rb(bus->sdiodev, SDIO_CCCR_IORx, NULL);
-+
-+	sdio_release_host(bus->sdiodev->func1);
-+	ret = iordy_status & SDIO_FUNC_ENABLE_2;
-+	return ret;
-+}
-+
-+static int brcmf_ulp_event_notify(struct brcmf_if *ifp,
-+				  const struct brcmf_event_msg *evtmsg,
-+				  void *data)
-+{
-+	int err = 0;
-+	struct brcmf_bus *bus_if = ifp->drvr->bus_if;
-+	struct brcmf_sdio_dev *sdiodev;
-+	struct brcmf_sdio *bus;
-+	struct brcmf_ulp_event *ulp_event = (struct brcmf_ulp_event *)data;
-+
-+	sdiodev = bus_if->bus_priv.sdio;
-+	bus = sdiodev->bus;
-+
-+	brcmf_dbg(ULP, "Chip went to DS1 state : action %d\n",
-+		  ulp_event->ulp_dongle_action);
-+	if (ulp_event->ulp_dongle_action == FMAC_ULP_ENTRY)
-+		bus->sdiodev->fmac_ulp.ulp_state = FMAC_ULP_ENTRY_RECV;
-+
-+	return err;
-+}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-index 0bd47c119dae..d008689d0d24 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-@@ -165,6 +165,35 @@ struct brcmf_sdreg {
- struct brcmf_sdio;
- struct brcmf_sdiod_freezer;
- 
-+/* ULP SHM Offsets info */
-+struct ulp_shm_info {
-+	u32 m_ulp_ctrl_sdio;
-+	u32 m_ulp_wakeevt_ind;
-+	u32 m_ulp_wakeind;
-+	u32 m_ulp_phytxblk;
-+};
-+
-+/* FMAC ULP state machine */
-+#define FMAC_ULP_IDLE		(0)
-+#define FMAC_ULP_ENTRY_RECV		(1)
-+#define FMAC_ULP_TRIGGERED		(2)
-+
-+/* BRCMF_E_ULP event data */
-+#define FMAC_ULP_EVENT_VERSION		1
-+#define FMAC_ULP_DISABLE_CONSOLE		1 /* Disable console */
-+#define FMAC_ULP_UCODE_DOWNLOAD		2 /* Download ULP ucode file */
-+#define FMAC_ULP_ENTRY		3 /* Inform ulp entry to Host */
-+
-+struct brcmf_ulp {
-+	uint ulp_state;
-+	struct ulp_shm_info ulp_shm_offset;
-+};
-+
-+struct brcmf_ulp_event {
-+	u16 version;
-+	u16 ulp_dongle_action;
-+};
-+
- struct brcmf_sdio_dev {
- 	struct sdio_func *func1;
- 	struct sdio_func *func2;
-@@ -190,6 +219,8 @@ struct brcmf_sdio_dev {
- 	bool wowl_enabled;
- 	enum brcmf_sdiod_state state;
- 	struct brcmf_sdiod_freezer *freezer;
-+	struct brcmf_ulp fmac_ulp;
-+	bool ulp;
- };
- 
- /* sdio core registers */
-@@ -368,6 +399,9 @@ static inline void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
- }
- #endif /* CONFIG_PM_SLEEP */
- 
-+int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev);
-+int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev);
-+
- struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
- void brcmf_sdio_remove(struct brcmf_sdio *bus);
- void brcmf_sdio_isr(struct brcmf_sdio *bus);
-@@ -377,4 +411,83 @@ void brcmf_sdio_wowl_config(struct device *dev, bool enabled);
- int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
- void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
- 
-+/* SHM offsets */
-+#define M_DS1_CTRL_SDIO(ptr)	((ptr).ulp_shm_offset.m_ulp_ctrl_sdio)
-+#define M_WAKEEVENT_IND(ptr)	((ptr).ulp_shm_offset.m_ulp_wakeevt_ind)
-+#define M_ULP_WAKE_IND(ptr)		((ptr).ulp_shm_offset.m_ulp_wakeind)
-+#define M_DS1_PHYTX_ERR_BLK(ptr)	((ptr).ulp_shm_offset.m_ulp_phytxblk)
-+
-+#define D11_BASE_ADDR			0x18001000
-+#define D11_AXI_BASE_ADDR		0xE8000000
-+#define D11_SHM_BASE_ADDR		(D11_AXI_BASE_ADDR + 0x4000)
-+
-+#define D11REG_ADDR(offset)	(D11_BASE_ADDR + (offset))
-+#define D11IHR_ADDR(offset)	(D11_AXI_BASE_ADDR + 0x400 + (2 * (offset)))
-+#define D11SHM_ADDR(offset)	(D11_SHM_BASE_ADDR + (offset))
-+
-+/* MacControl register */
-+#define D11_MACCONTROL_REG			D11REG_ADDR(0x120)
-+#define D11_MACCONTROL_REG_WAKE		0x4000000
-+
-+/* HUDI Sequence SHM bits */
-+#define	C_DS1_CTRL_SDIO_DS1_SLEEP		0x1
-+#define	C_DS1_CTRL_SDIO_MAC_ON			0x2
-+#define	C_DS1_CTRL_SDIO_RADIO_PHY_ON	0x4
-+#define	C_DS1_CTRL_SDIO_DS1_EXIT		0x8
-+#define	C_DS1_CTRL_PROC_DONE			0x100
-+#define	C_DS1_CTRL_REQ_VALID			0x200
-+
-+/* M_ULP_WAKEIND bits */
-+#define	C_WATCHDOG_EXPIRY	BIT(0)
-+#define	C_FCBS_ERROR		BIT(1)
-+#define	C_RETX_FAILURE		BIT(2)
-+#define	C_HOST_WAKEUP		BIT(3)
-+#define	C_INVALID_FCBS_BLOCK	BIT(4)
-+#define	C_HUDI_DS1_EXIT		BIT(5)
-+#define	C_LOB_SLEEP		BIT(6)
-+#define	C_DS1_PHY_TXERR		BIT(9)
-+#define	C_DS1_WAKE_TIMER	BIT(10)
-+
-+#define PHYTX_ERR_BLK_SIZE		18
-+#define D11SHM_FIRST2BYTE_MASK		0xFFFF0000
-+#define D11SHM_SECOND2BYTE_MASK		0x0000FFFF
-+#define D11SHM_2BYTE_SHIFT		16
-+
-+#define D11SHM_RD(sdh, offset, ret) \
-+	brcmf_sdiod_readl(sdh, D11SHM_ADDR(offset), ret)
-+
-+/* SHM Read is motified based on SHM 4 byte alignment as SHM size is 2 bytes and
-+ * 2 byte is currently not working on FMAC
-+ * If SHM address is not 4 byte aligned, then right shift by 16
-+ * otherwise, mask the first two MSB bytes
-+ * Suppose data in address 7260 is 0x440002 and it is 4 byte aligned
-+ * Correct SHM value is 0x2 for this SHM offset and next SHM value is 0x44
-+ */
-+#define D11SHM_RDW(sdh, offset, ret) \
-+	((offset % 4) ? \
-+		(brcmf_sdiod_readl(sdh, D11SHM_ADDR(offset), ret) \
-+		>> D11SHM_2BYTE_SHIFT) : \
-+		(brcmf_sdiod_readl(sdh, D11SHM_ADDR(offset), ret) \
-+		& D11SHM_SECOND2BYTE_MASK))
-+
-+/* SHM is of size 2 bytes, 4 bytes write will overwrite other SHM's
-+ * First read 4 bytes and then clear the required two bytes based on
-+ * 4 byte alignment, then update the required value and write the
-+ * 4 byte value now
-+ */
-+#define D11SHM_WR(sdh, offset, val, mask, ret) \
-+	do { \
-+		if ((offset) % 4) \
-+			val = (val & D11SHM_SECOND2BYTE_MASK) | \
-+				((mask) << D11SHM_2BYTE_SHIFT); \
-+		else \
-+			val = (mask) | (val & D11SHM_FIRST2BYTE_MASK); \
-+		brcmf_sdiod_writel(sdh, D11SHM_ADDR(offset), val, ret); \
-+	} while (0)
-+#define D11REG_WR(sdh, addr, val, ret) \
-+	brcmf_sdiod_writel(sdh, addr, val, ret)
-+
-+#define D11REG_RD(sdh, addr, ret) \
-+	brcmf_sdiod_readl(sdh, addr, ret)
-+
- #endif /* BRCMFMAC_SDIO_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index 7cdfde9b3dea..24d3897058e2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -19,6 +19,7 @@
- #include "core.h"
- #include "common.h"
- #include "bcdc.h"
-+#include "cfg80211.h"
- 
- 
- #define IOCTL_RESP_TIMEOUT		msecs_to_jiffies(2000)
-@@ -39,7 +40,7 @@ BRCMF_FW_DEF(43143, "brcmfmac43143");
- BRCMF_FW_DEF(43236B, "brcmfmac43236b");
- BRCMF_FW_DEF(43242A, "brcmfmac43242a");
- BRCMF_FW_DEF(43569, "brcmfmac43569");
--BRCMF_FW_DEF(4373, "brcmfmac4373");
-+CY_FW_DEF(4373, "cyfmac4373");
- 
- static const struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
-@@ -164,7 +165,6 @@ struct brcmf_usbdev_info {
- 
- 	struct urb *bulk_urb; /* used for FW download */
- 
--	bool wowl_enabled;
- 	struct brcmf_mp_device *settings;
- };
- 
-@@ -312,27 +312,43 @@ static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	int err = 0;
- 	int timeout = 0;
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
-+	struct usb_interface *intf = to_usb_interface(dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
--		return -EIO;
- 
--	if (test_and_set_bit(0, &devinfo->ctl_op))
--		return -EIO;
-+	err = usb_autopm_get_interface(intf);
-+	if (err)
-+		goto out;
-+
-+	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-+		err = -EIO;
-+		goto fail;
-+	}
-+
-+	if (test_and_set_bit(0, &devinfo->ctl_op)) {
-+		err = -EIO;
-+		goto fail;
-+	}
- 
- 	devinfo->ctl_completed = false;
- 	err = brcmf_usb_send_ctl(devinfo, buf, len);
- 	if (err) {
- 		brcmf_err("fail %d bytes: %d\n", err, len);
- 		clear_bit(0, &devinfo->ctl_op);
--		return err;
-+		goto fail;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
--	clear_bit(0, &devinfo->ctl_op);
- 	if (!timeout) {
- 		brcmf_err("Txctl wait timed out\n");
-+		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
-+		goto fail;
- 	}
-+	clear_bit(0, &devinfo->ctl_op);
-+
-+fail:
-+	usb_autopm_put_interface(intf);
-+out:
- 	return err;
- }
- 
-@@ -341,32 +357,46 @@ static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	int err = 0;
- 	int timeout = 0;
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
-+	struct usb_interface *intf = to_usb_interface(dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
--		return -EIO;
- 
--	if (test_and_set_bit(0, &devinfo->ctl_op))
--		return -EIO;
-+	err = usb_autopm_get_interface(intf);
-+	if (err)
-+		goto out;
-+
-+	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-+		err = -EIO;
-+		goto fail;
-+	}
-+
-+	if (test_and_set_bit(0, &devinfo->ctl_op)) {
-+		err = -EIO;
-+		goto fail;
-+	}
- 
- 	devinfo->ctl_completed = false;
- 	err = brcmf_usb_recv_ctl(devinfo, buf, len);
- 	if (err) {
- 		brcmf_err("fail %d bytes: %d\n", err, len);
- 		clear_bit(0, &devinfo->ctl_op);
--		return err;
-+		goto fail;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
- 	err = devinfo->ctl_urb_status;
--	clear_bit(0, &devinfo->ctl_op);
- 	if (!timeout) {
- 		brcmf_err("rxctl wait timed out\n");
-+		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
-+		goto fail;
- 	}
-+	clear_bit(0, &devinfo->ctl_op);
-+fail:
-+	usb_autopm_put_interface(intf);
- 	if (!err)
- 		return devinfo->ctl_urb_actual_length;
--	else
--		return err;
-+out:
-+	return err;
- }
- 
- static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
-@@ -499,10 +529,12 @@ static void brcmf_usb_rx_complete(struct urb *urb)
- 		return;
- 	}
- 
--	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
-+	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP ||
-+	    devinfo->bus_pub.state == BRCMFMAC_USB_STATE_SLEEP) {
- 		skb_put(skb, urb->actual_length);
- 		brcmf_rx_frame(devinfo->dev, skb, true);
- 		brcmf_usb_rx_refill(devinfo, req);
-+		usb_mark_last_busy(urb->dev);
- 	} else {
- 		brcmu_pkt_buf_free_skb(skb);
- 		brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
-@@ -586,6 +618,11 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 	struct brcmf_usbreq  *req;
- 	int ret;
- 	unsigned long flags;
-+	struct usb_interface *intf = to_usb_interface(dev);
-+
-+	ret = usb_autopm_get_interface(intf);
-+	if (ret)
-+		goto out;
- 
- 	brcmf_dbg(USB, "Enter, skb=%p\n", skb);
- 	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-@@ -601,6 +638,10 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		goto fail;
- 	}
- 
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	if (devinfo->bus_pub.bus->allow_skborphan)
-+		skb_orphan(skb);
-+#endif
- 	req->skb = skb;
- 	req->devinfo = devinfo;
- 	usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
-@@ -624,9 +665,10 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		devinfo->tx_flowblock = true;
- 	}
- 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
--	return 0;
- 
- fail:
-+	usb_autopm_put_interface(intf);
-+out:
- 	return ret;
- }
- 
-@@ -990,20 +1032,32 @@ static int
- brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
- {
- 	int err;
-+	struct usb_interface *intf;
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (devinfo == NULL)
--		return -ENODEV;
-+	if (!devinfo) {
-+		err = -ENODEV;
-+		goto out;
-+	}
- 
- 	if (!devinfo->image) {
- 		brcmf_err("No firmware!\n");
--		return -ENOENT;
-+		err = -ENOENT;
-+		goto out;
- 	}
- 
-+	intf = to_usb_interface(devinfo->dev);
-+	err = usb_autopm_get_interface(intf);
-+	if (err)
-+		goto out;
-+
- 	err = brcmf_usb_dlstart(devinfo,
- 		(u8 *)devinfo->image, devinfo->image_len);
- 	if (err == 0)
- 		err = brcmf_usb_dlrun(devinfo);
-+
-+	usb_autopm_put_interface(intf);
-+out:
- 	return err;
- }
- 
-@@ -1104,18 +1158,6 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
- 	return NULL;
- }
- 
--static void brcmf_usb_wowl_config(struct device *dev, bool enabled)
--{
--	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
--
--	brcmf_dbg(USB, "Configuring WOWL, enabled=%d\n", enabled);
--	devinfo->wowl_enabled = enabled;
--	if (enabled)
--		device_set_wakeup_enable(devinfo->dev, true);
--	else
--		device_set_wakeup_enable(devinfo->dev, false);
--}
--
- static
- int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- {
-@@ -1142,7 +1184,6 @@ static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
- 	.txdata = brcmf_usb_tx,
- 	.txctl = brcmf_usb_tx_ctlpkt,
- 	.rxctl = brcmf_usb_rx_ctlpkt,
--	.wowl_config = brcmf_usb_wowl_config,
- 	.get_fwname = brcmf_usb_get_fwname,
- };
- 
-@@ -1182,8 +1223,14 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
- 	if (ret)
- 		goto error;
- 
-+	if (BRCMF_FWCON_ON()) {
-+		ret = brcmf_fwlog_attach(devinfo->dev);
-+		if (ret)
-+			goto error;
-+	}
-+
- 	/* Attach to the common driver interface */
--	ret = brcmf_attach(devinfo->dev);
-+	ret = brcmf_attach(devinfo->dev, true);
- 	if (ret)
- 		goto error;
- 
-@@ -1242,6 +1289,9 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 	bus->ops = &brcmf_usb_bus_ops;
- 	bus->proto_type = BRCMF_PROTO_BCDC;
- 	bus->always_use_fws_queue = true;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	bus->allow_skborphan = true;
-+#endif
- #ifdef CONFIG_PM
- 	bus->wowl_supported = true;
- #endif
-@@ -1258,9 +1308,17 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 		ret = brcmf_alloc(devinfo->dev, devinfo->settings);
- 		if (ret)
- 			goto fail;
--		ret = brcmf_attach(devinfo->dev);
-+
-+		if (BRCMF_FWCON_ON()) {
-+			ret = brcmf_fwlog_attach(devinfo->dev);
-+			if (ret)
-+				goto fail;
-+		}
-+
-+		ret = brcmf_attach(devinfo->dev, true);
- 		if (ret)
- 			goto fail;
-+
- 		/* we are done */
- 		complete(&devinfo->dev_init_done);
- 		return 0;
-@@ -1331,6 +1389,8 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
- 
- 	usb_set_intfdata(intf, devinfo);
- 
-+	intf->needs_remote_wakeup = 1;
-+
- 	/* Check that the device supports only one configuration */
- 	if (usb->descriptor.bNumConfigurations != 1) {
- 		brcmf_err("Number of configurations: %d not supported\n",
-@@ -1441,15 +1501,25 @@ static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
- {
- 	struct usb_device *usb = interface_to_usbdev(intf);
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
-+	struct brcmf_bus *bus;
-+	struct brcmf_cfg80211_info *config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	brcmf_dbg(USB, "Enter\n");
--	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
--	if (devinfo->wowl_enabled) {
--		brcmf_cancel_all_urbs(devinfo);
--	} else {
--		brcmf_detach(&usb->dev);
--		brcmf_free(&usb->dev);
-+
-+	bus = devinfo->bus_pub.bus;
-+	config = bus->drvr->config;
-+	while (retry &&
-+	       config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
-+		usleep_range(10000, 20000);
-+		retry--;
- 	}
-+	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
-+		brcmf_err("timed out wait for cfg80211 suspended\n");
-+
-+	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
-+	brcmf_cancel_all_urbs(devinfo);
-+	device_set_wakeup_enable(devinfo->dev, true);
- 	return 0;
- }
- 
-@@ -1462,22 +1532,10 @@ static int brcmf_usb_resume(struct usb_interface *intf)
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (!devinfo->wowl_enabled) {
--		int err;
--
--		err = brcmf_alloc(&usb->dev, devinfo->settings);
--		if (err)
--			return err;
--
--		err = brcmf_attach(devinfo->dev);
--		if (err) {
--			brcmf_free(devinfo->dev);
--			return err;
--		}
--	}
- 
- 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
- 	brcmf_usb_rx_fill_all(devinfo);
-+	device_set_wakeup_enable(devinfo->dev, false);
- 	return 0;
- }
- 
-@@ -1534,6 +1592,7 @@ static struct usb_driver brcmf_usbdrvr = {
- 	.suspend = brcmf_usb_suspend,
- 	.resume = brcmf_usb_resume,
- 	.reset_resume = brcmf_usb_reset_resume,
-+	.supports_autosuspend = true,
- 	.disable_hub_initiated_lpm = 1,
- };
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-index d07e7c7355d9..bf425d2c27bf 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-@@ -64,6 +64,16 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
- 		*(char *)(dcmd_buf + len)  = '\0';
- 	}
- 
-+	if (cmdhdr->cmd == BRCMF_C_SET_AP) {
-+		if (*(int *)(dcmd_buf) == 1) {
-+			ifp->vif->wdev.iftype = NL80211_IFTYPE_AP;
-+			brcmf_net_setcarrier(ifp, true);
-+		} else {
-+			ifp->vif->wdev.iftype = NL80211_IFTYPE_STATION;
-+		}
-+		brcmf_cfg80211_update_proto_addr_mode(&vif->wdev);
-+	}
-+
- 	if (cmdhdr->set)
- 		ret = brcmf_fil_cmd_data_set(ifp, cmdhdr->cmd, dcmd_buf,
- 					     ret_len);
-@@ -104,6 +114,56 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
- 	return ret;
- }
- 
-+s32
-+brcmf_wiphy_phy_temp_evt_handler(struct brcmf_if *ifp,
-+				 const struct brcmf_event_msg *e, void *data)
-+
-+{
-+	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
-+	struct wiphy *wiphy = cfg_to_wiphy(cfg);
-+	struct sk_buff *skb;
-+	struct nlattr *phy_temp_data;
-+	u32 version, temp, tempdelta;
-+	struct brcmf_phy_temp_evt *phy_temp_evt;
-+
-+	phy_temp_evt = (struct brcmf_phy_temp_evt *)data;
-+
-+	version = le32_to_cpu(phy_temp_evt->version);
-+	temp = le32_to_cpu(phy_temp_evt->temp);
-+	tempdelta = le32_to_cpu(phy_temp_evt->tempdelta);
-+
-+	skb = cfg80211_vendor_event_alloc(wiphy, NULL,
-+					  sizeof(*phy_temp_evt),
-+					  BRCMF_VNDR_EVTS_PHY_TEMP,
-+					  GFP_KERNEL);
-+
-+	if (!skb) {
-+		brcmf_dbg(EVENT, "NO MEM: can't allocate skb for vendor PHY_TEMP_EVENT\n");
-+		return -ENOMEM;
-+	}
-+
-+	phy_temp_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_EVENTS);
-+	if (!phy_temp_data) {
-+		nla_nest_cancel(skb, phy_temp_data);
-+		kfree_skb(skb);
-+		brcmf_dbg(EVENT, "skb could not nest vendor attributes\n");
-+		return -EMSGSIZE;
-+	}
-+
-+	if (nla_put_u32(skb, BRCMF_NLATTR_VERS, version) ||
-+	    nla_put_u32(skb, BRCMF_NLATTR_PHY_TEMP, temp) ||
-+	    nla_put_u32(skb, BRCMF_NLATTR_PHY_TEMPDELTA, tempdelta)) {
-+		kfree_skb(skb);
-+		brcmf_dbg(EVENT, "NO ROOM in skb for vendor PHY_TEMP_EVENT\n");
-+		return -EMSGSIZE;
-+	}
-+
-+	nla_nest_end(skb, phy_temp_data);
-+
-+	cfg80211_vendor_event(skb, GFP_KERNEL);
-+	return 0;
-+}
-+
- const struct wiphy_vendor_command brcmf_vendor_cmds[] = {
- 	{
- 		{
-@@ -116,3 +176,10 @@ const struct wiphy_vendor_command brcmf_vendor_cmds[] = {
- 		.doit = brcmf_cfg80211_vndr_cmds_dcmd_handler
- 	},
- };
-+
-+const struct nl80211_vendor_cmd_info brcmf_vendor_events[] = {
-+	{
-+		.vendor_id = BROADCOM_OUI,
-+		.subcmd = BRCMF_VNDR_EVTS_PHY_TEMP,
-+	},
-+};
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h
-index 418f33ea6fd3..3bdf47369788 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h
-@@ -14,6 +14,11 @@ enum brcmf_vndr_cmds {
- 	BRCMF_VNDR_CMDS_LAST
- };
- 
-+enum brcmf_vndr_evts {
-+	BRCMF_VNDR_EVTS_PHY_TEMP,
-+	BRCMF_VNDR_EVTS_LAST
-+};
-+
- /**
-  * enum brcmf_nlattrs - nl80211 message attributes
-  *
-@@ -25,11 +30,21 @@ enum brcmf_nlattrs {
- 
- 	BRCMF_NLATTR_LEN,
- 	BRCMF_NLATTR_DATA,
-+	BRCMF_NLATTR_VERS,
-+	BRCMF_NLATTR_PHY_TEMP,
-+	BRCMF_NLATTR_PHY_TEMPDELTA,
- 
- 	__BRCMF_NLATTR_AFTER_LAST,
- 	BRCMF_NLATTR_MAX = __BRCMF_NLATTR_AFTER_LAST - 1
- };
- 
-+/* structure of event sent up by firmware: is this the right place for it? */
-+struct brcmf_phy_temp_evt {
-+	__le32 version;
-+	__le32 temp;
-+	__le32 tempdelta;
-+} __packed;
-+
- /**
-  * struct brcmf_vndr_dcmd_hdr - message header for cfg80211 vendor command dcmd
-  *				support
-@@ -49,5 +64,9 @@ struct brcmf_vndr_dcmd_hdr {
- };
- 
- extern const struct wiphy_vendor_command brcmf_vendor_cmds[];
-+extern const struct nl80211_vendor_cmd_info brcmf_vendor_events[];
-+s32 brcmf_wiphy_phy_temp_evt_handler(struct brcmf_if *ifp,
-+				     const struct brcmf_event_msg *e,
-+				     void *data);
- 
- #endif /* _vendor_h_ */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-index d1037b6ef2d6..01da8f89df6f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-@@ -50,6 +50,7 @@
- #define BRCM_CC_4371_CHIP_ID		0x4371
- #define CY_CC_4373_CHIP_ID		0x4373
- #define CY_CC_43012_CHIP_ID		43012
-+#define CY_CC_89459_CHIP_ID             0x4355
- 
- /* USB Device IDs */
- #define BRCM_USB_43143_DEVICE_ID	0xbd1e
-@@ -68,6 +69,7 @@
- #define BRCM_PCIE_4356_DEVICE_ID	0x43ec
- #define BRCM_PCIE_43567_DEVICE_ID	0x43d3
- #define BRCM_PCIE_43570_DEVICE_ID	0x43d9
-+#define BRCM_PCIE_43570_RAW_DEVICE_ID	0xaa31
- #define BRCM_PCIE_4358_DEVICE_ID	0x43e9
- #define BRCM_PCIE_4359_DEVICE_ID	0x43ef
- #define BRCM_PCIE_43602_DEVICE_ID	0x43ba
-@@ -81,7 +83,9 @@
- #define BRCM_PCIE_4366_2G_DEVICE_ID	0x43c4
- #define BRCM_PCIE_4366_5G_DEVICE_ID	0x43c5
- #define BRCM_PCIE_4371_DEVICE_ID	0x440d
--
-+#define CY_PCIE_89459_DEVICE_ID         0x4415
-+#define CY_PCIE_89459_RAW_DEVICE_ID     0x4355
-+#define CY_PCIE_54591_DEVICE_ID         0x4417
- 
- /* brcmsmac IDs */
- #define BCM4313_D11N2G_ID	0x4727	/* 4313 802.11n 2.4G device */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-index 7b31c212694d..3a9cad3730b8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-@@ -231,6 +231,13 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec)
- #define WPA2_AUTH_FT		0x4000	/* Fast BSS Transition */
- #define WPA2_AUTH_PSK_SHA256	0x8000	/* PSK with SHA256 key derivation */
- 
-+#define WPA3_AUTH_SAE_PSK	0x40000	/* SAE with 4-way handshake */
-+
-+#define WFA_AUTH_DPP		0x200000 /* WFA DPP AUTH */
-+
-+#define WFA_OUI			"\x50\x6F\x9A"	/* WFA OUI */
-+#define DPP_VER			0x1A	/* WFA DPP v1.0 */
-+
- #define DOT11_DEFAULT_RTS_LEN		2347
- #define DOT11_DEFAULT_FRAG_LEN		2346
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-index 0340bba96868..39cd34c22628 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-@@ -214,8 +214,197 @@ struct chipcregs {
- 	u32 PAD[3];
- 	u32 retention_grpidx;       /* 0x680 */
- 	u32 retention_grpctl;       /* 0x684 */
--	u32 PAD[94];
--	u16 sromotp[768];
-+	u32 mac_res_req_timer;      /* 0x688 */
-+	u32 mac_res_req_mask;       /* 0x68c */
-+	u32 PAD[18];
-+	u32 pmucontrol_ext;         /* 0x6d8 */
-+	u32 slowclkperiod;          /* 0x6dc */
-+	u32 PAD[8];
-+	u32 pmuintmask0;            /* 0x700 */
-+	u32 pmuintmask1;            /* 0x704 */
-+	u32 PAD[14];
-+	u32 pmuintstatus;           /* 0x740 */
-+	u32 extwakeupstatus;        /* 0x744 */
-+	u32 watchdog_res_mask;      /* 0x748 */
-+	u32 swscratch;              /* 0x750 */
-+	u32 PAD[3];
-+	u32 extwakemask[2];         /* 0x760-0x764 */
-+	u32 PAD[2];
-+	u32 extwakereqmask[2];      /* 0x770-0x774 */
-+	u32 PAD[2];
-+	u32 pmuintctrl0;            /* 0x780 */
-+	u32 pmuintctrl1;            /* 0x784 */
-+	u32 PAD[2];
-+	u32 extwakectrl[2];         /* 0x790 */
-+};
-+
-+#define CHIPGCIREGOFFS(field) offsetof(struct chipgciregs, field)
-+
-+struct chipgciregs {
-+	u32 gci_corecaps0;                             /* 0x000 */
-+	u32 gci_corecaps1;                             /* 0x004 */
-+	u32 gci_corecaps2;                             /* 0x008 */
-+	u32 gci_corectrl;                              /* 0x00c */
-+	u32 gci_corestat;                              /* 0x010 */
-+	u32 gci_intstat;                               /* 0x014 */
-+	u32 gci_intmask;                               /* 0x018 */
-+	u32 gci_wakemask;                              /* 0x01c */
-+	u32 gci_levelintstat;                          /* 0x020 */
-+	u32 gci_eventintstat;                          /* 0x024 */
-+	u32 gci_wakelevelintstat;                      /* 0x028 */
-+	u32 gci_wakeeventintstat;                      /* 0x02c */
-+	u32 semaphoreintstatus;                        /* 0x030 */
-+	u32 semaphoreintmask;                          /* 0x034 */
-+	u32 semaphorerequest;                          /* 0x038 */
-+	u32 semaphorereserve;                          /* 0x03c */
-+	u32 gci_indirect_addr;                         /* 0x040 */
-+	u32 gci_gpioctl;                               /* 0x044 */
-+	u32 gci_gpiostatus;                            /* 0x048 */
-+	u32 gci_gpiomask;                              /* 0x04c */
-+	u32 eventsummary;                              /* 0x050 */
-+	u32 gci_miscctl;                               /* 0x054 */
-+	u32 gci_gpiointmask;                           /* 0x058 */
-+	u32 gci_gpiowakemask;                          /* 0x05c */
-+	u32 gci_input[32];                             /* 0x060 */
-+	u32 gci_event[32];                             /* 0x0e0 */
-+	u32 gci_output[4];                             /* 0x160 */
-+	u32 gci_control_0;                             /* 0x170 */
-+	u32 gci_control_1;                             /* 0x174 */
-+	u32 gci_intpolreg;                             /* 0x178 */
-+	u32 gci_levelintmask;                          /* 0x17c */
-+	u32 gci_eventintmask;                          /* 0x180 */
-+	u32 wakelevelintmask;                          /* 0x184 */
-+	u32 wakeeventintmask;                          /* 0x188 */
-+	u32 hwmask;                                    /* 0x18c */
-+	u32 PAD;
-+	u32 gci_inbandeventintmask;                    /* 0x194 */
-+	u32 PAD;
-+	u32 gci_inbandeventstatus;                     /* 0x19c */
-+	u32 gci_seciauxtx;                             /* 0x1a0 */
-+	u32 gci_seciauxrx;                             /* 0x1a4 */
-+	u32 gci_secitx_datatag;                        /* 0x1a8 */
-+	u32 gci_secirx_datatag;                        /* 0x1ac */
-+	u32 gci_secitx_datamask;                       /* 0x1b0 */
-+	u32 gci_seciusef0tx_reg;                       /* 0x1b4 */
-+	u32 gci_secif0tx_offset;                       /* 0x1b8 */
-+	u32 gci_secif0rx_offset;                       /* 0x1bc */
-+	u32 gci_secif1tx_offset;                       /* 0x1c0 */
-+	u32 gci_rxfifo_common_ctrl;                    /* 0x1c4 */
-+	u32 gci_rxfifoctrl;                            /* 0x1c8 */
-+	u32 gci_hw_sema_status;                        /* 0x1cc */
-+	u32 gci_seciuartescval;                        /* 0x1d0 */
-+	u32 gic_seciuartautobaudctr;                   /* 0x1d4 */
-+	u32 gci_secififolevel;                         /* 0x1d8 */
-+	u32 gci_seciuartdata;                          /* 0x1dc */
-+	u32 gci_secibauddiv;                           /* 0x1e0 */
-+	u32 gci_secifcr;                               /* 0x1e4 */
-+	u32 gci_secilcr;                               /* 0x1e8 */
-+	u32 gci_secimcr;                               /* 0x1ec */
-+	u32 gci_secilsr;                               /* 0x1f0 */
-+	u32 gci_secimsr;                               /* 0x1f4 */
-+	u32 gci_baudadj;                               /* 0x1f8 */
-+	u32 gci_inbandintmask;                         /* 0x1fc */
-+	u32 gci_chipctrl;                              /* 0x200 */
-+	u32 gci_chipsts;                               /* 0x204 */
-+	u32 gci_gpioout;                               /* 0x208 */
-+	u32 gci_gpioout_read;                          /* 0x20C */
-+	u32 gci_mpwaketx;                              /* 0x210 */
-+	u32 gci_mpwakedetect;                          /* 0x214 */
-+	u32 gci_seciin_ctrl;                           /* 0x218 */
-+	u32 gci_seciout_ctrl;                          /* 0x21C */
-+	u32 gci_seciin_auxfifo_en;                     /* 0x220 */
-+	u32 gci_seciout_txen_txbr;                     /* 0x224 */
-+	u32 gci_seciin_rxbrstatus;                     /* 0x228 */
-+	u32 gci_seciin_rxerrstatus;                    /* 0x22C */
-+	u32 gci_seciin_fcstatus;                       /* 0x230 */
-+	u32 gci_seciout_txstatus;                      /* 0x234 */
-+	u32 gci_seciout_txbrstatus;                    /* 0x238 */
-+	u32 wlan_mem_info;                             /* 0x23C */
-+	u32 wlan_bankxinfo;                            /* 0x240 */
-+	u32 bt_smem_select;                            /* 0x244 */
-+	u32 bt_smem_stby;                              /* 0x248 */
-+	u32 bt_smem_status;                            /* 0x24C */
-+	u32 wlan_bankxactivepda;                       /* 0x250 */
-+	u32 wlan_bankxsleeppda;                        /* 0x254 */
-+	u32 wlan_bankxkill;                            /* 0x258 */
-+	u32 PAD[41];
-+	u32 gci_chipid;                                /* 0x300 */
-+	u32 PAD[3];
-+	u32 otpstatus;                                 /* 0x310 */
-+	u32 otpcontrol;                                /* 0x314 */
-+	u32 otpprog;                                   /* 0x318 */
-+	u32 otplayout;                                 /* 0x31c */
-+	u32 otplayoutextension;                        /* 0x320 */
-+	u32 otpcontrol1;                               /* 0x324 */
-+	u32 otpprogdata;                               /* 0x328 */
-+	u32 PAD[52];
-+	u32 otpECCstatus;                              /* 0x3FC */
-+	u32 PAD[512];
-+	u32 lhl_core_capab_adr;                        /* 0xC00 */
-+	u32 lhl_main_ctl_adr;                          /* 0xC04 */
-+	u32 lhl_pmu_ctl_adr;                           /* 0xC08 */
-+	u32 lhl_extlpo_ctl_adr;                        /* 0xC0C */
-+	u32 lpo_ctl_adr;                               /* 0xC10 */
-+	u32 lhl_lpo2_ctl_adr;                          /* 0xC14 */
-+	u32 lhl_osc32k_ctl_adr;                        /* 0xC18 */
-+	u32 lhl_clk_status_adr;                        /* 0xC1C */
-+	u32 lhl_clk_det_ctl_adr;                       /* 0xC20 */
-+	u32 lhl_clk_sel_adr;                           /* 0xC24 */
-+	u32 hidoff_cnt_adr[2];                         /* 0xC28-0xC2C */
-+	u32 lhl_autoclk_ctl_adr;                       /* 0xC30 */
-+	u32 PAD;
-+	u32 lhl_hibtim_adr;                            /* 0xC38 */
-+	u32 lhl_wl_ilp_val_adr;                        /* 0xC3C */
-+	u32 lhl_wl_armtim0_intrp_adr;                  /* 0xC40 */
-+	u32 lhl_wl_armtim0_st_adr;                     /* 0xC44 */
-+	u32 lhl_wl_armtim0_adr;                        /* 0xC48 */
-+	u32 PAD[9];
-+	u32 lhl_wl_mactim0_intrp_adr;                  /* 0xC70 */
-+	u32 lhl_wl_mactim0_st_adr;                     /* 0xC74 */
-+	u32 lhl_wl_mactim_int0_adr;                    /* 0xC78 */
-+	u32 lhl_wl_mactim_frac0_adr;                   /* 0xC7C */
-+	u32 lhl_wl_mactim1_intrp_adr;                  /* 0xC80 */
-+	u32 lhl_wl_mactim1_st_adr;                     /* 0xC84 */
-+	u32 lhl_wl_mactim_int1_adr;                    /* 0xC88 */
-+	u32 lhl_wl_mactim_frac1_adr;                   /* 0xC8C */
-+	u32 PAD[8];
-+	u32 gpio_int_en_port_adr[4];                   /* 0xCB0-0xCBC */
-+	u32 gpio_int_st_port_adr[4];                   /* 0xCC0-0xCCC */
-+	u32 gpio_ctrl_iocfg_p_adr[64];                 /* 0xCD0-0xDCC */
-+	u32 gpio_gctrl_iocfg_p0_p39_adr;               /* 0xDD0 */
-+	u32 gpio_gdsctrl_iocfg_p0_p25_p30_p39_adr;     /* 0xDD4 */
-+	u32 gpio_gdsctrl_iocfg_p26_p29_adr;            /* 0xDD8 */
-+	u32 PAD[8];
-+	u32 lhl_gpio_din0_adr;                         /* 0xDFC */
-+	u32 lhl_gpio_din1_adr;                         /* 0xE00 */
-+	u32 lhl_wkup_status_adr;                       /* 0xE04 */
-+	u32 lhl_ctl_adr;                               /* 0xE08 */
-+	u32 lhl_adc_ctl_adr;                           /* 0xE0C */
-+	u32 lhl_qdxyz_in_dly_adr;                      /* 0xE10 */
-+	u32 lhl_optctl_adr;                            /* 0xE14 */
-+	u32 lhl_optct2_adr;                            /* 0xE18 */
-+	u32 lhl_scanp_cntr_init_val_adr;               /* 0xE1C */
-+	u32 lhl_opt_togg_val_adr[6];                   /* 0xE20-0xE34 */
-+	u32 lhl_optx_smp_val_adr;                      /* 0xE38 */
-+	u32 lhl_opty_smp_val_adr;                      /* 0xE3C */
-+	u32 lhl_optz_smp_val_adr;                      /* 0xE40 */
-+	u32 lhl_hidoff_keepstate_adr[3];               /* 0xE44-0xE4C */
-+	u32 lhl_bt_slmboot_ctl0_adr[4];                /* 0xE50-0xE5C */
-+	u32 lhl_wl_fw_ctl;                             /* 0xE60 */
-+	u32 lhl_wl_hw_ctl_adr[2];                      /* 0xE64-0xE68 */
-+	u32 lhl_bt_hw_ctl_adr;                         /* 0xE6C */
-+	u32 lhl_top_pwrseq_en_adr;                     /* 0xE70 */
-+	u32 lhl_top_pwrdn_ctl_adr;                     /* 0xE74 */
-+	u32 lhl_top_pwrup_ctl_adr;                     /* 0xE78 */
-+	u32 lhl_top_pwrseq_ctl_adr;                    /* 0xE7C */
-+	u32 lhl_top_pwrdn2_ctl_adr;                    /* 0xE80 */
-+	u32 lhl_top_pwrup2_ctl_adr;                    /* 0xE84 */
-+	u32 wpt_regon_intrp_cfg_adr;                   /* 0xE88 */
-+	u32 bt_regon_intrp_cfg_adr;                    /* 0xE8C */
-+	u32 wl_regon_intrp_cfg_adr;                    /* 0xE90 */
-+	u32 regon_intrp_st_adr;                        /* 0xE94 */
-+	u32 regon_intrp_en_adr;                        /* 0xE98 */
-+
- };
- 
- /* chipid */
-@@ -308,4 +497,6 @@ struct chipcregs {
- */
- #define PMU_MAX_TRANSITION_DLY	15000
- 
-+#define DEFAULT_43012_MIN_RES_MASK 0x0f8bfe77
-+
- #endif				/* _SBCHIPC_H */
-diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
-index 08b25c02b5a1..2e9a6e4634eb 100644
---- a/include/linux/mmc/sdio_ids.h
-+++ b/include/linux/mmc/sdio_ids.h
-@@ -41,8 +41,10 @@
- #define SDIO_DEVICE_ID_BROADCOM_43455		0xa9bf
- #define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
- #define SDIO_DEVICE_ID_BROADCOM_4356		0x4356
-+#define SDIO_DEVICE_ID_BROADCOM_4359		0x4359
- #define SDIO_DEVICE_ID_CYPRESS_4373		0x4373
- #define SDIO_DEVICE_ID_CYPRESS_43012		43012
-+#define SDIO_DEVICE_ID_CYPRESS_89359		0x4355
- 
- #define SDIO_VENDOR_ID_INTEL			0x0089
- #define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX	0x1402
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index fc7e8807838d..6a096f783ae6 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6706,6 +6706,8 @@ struct cfg80211_fils_resp_params {
-  *	not known. This value is used only if @status < 0 to indicate that the
-  *	failure is due to a timeout and not due to explicit rejection by the AP.
-  *	This value is ignored in other cases (@status >= 0).
-+ * @authorized: Indicates whether the connection is ready to transport
-+ *	data packets.
-  */
- struct cfg80211_connect_resp_params {
- 	int status;
-@@ -6717,6 +6719,7 @@ struct cfg80211_connect_resp_params {
- 	size_t resp_ie_len;
- 	struct cfg80211_fils_resp_params fils;
- 	enum nl80211_timeout_reason timeout_reason;
-+	bool authorized;
- };
- 
- /**
-@@ -6866,6 +6869,9 @@ cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid,
-  * @resp_ie: association response IEs (may be %NULL)
-  * @resp_ie_len: assoc response IEs length
-  * @fils: FILS related roaming information.
-+ * @authorized: true if the 802.1X authentication was done by the driver or is
-+ *	not needed (e.g., when Fast Transition protocol was used), false
-+ *	otherwise. Ignored for networks that don't use 802.1X authentication.
-  */
- struct cfg80211_roam_info {
- 	struct ieee80211_channel *channel;
-@@ -6876,6 +6882,7 @@ struct cfg80211_roam_info {
- 	const u8 *resp_ie;
- 	size_t resp_ie_len;
- 	struct cfg80211_fils_resp_params fils;
-+	bool authorized;
- };
- 
- /**
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index beee59c831a7..b660fb0e251b 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -183,18 +183,27 @@
-  *
-  * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK flag drivers
-  * can indicate they support offloading EAPOL handshakes for WPA/WPA2
-- * preshared key authentication. In %NL80211_CMD_CONNECT the preshared
-- * key should be specified using %NL80211_ATTR_PMK. Drivers supporting
-- * this offload may reject the %NL80211_CMD_CONNECT when no preshared
-- * key material is provided, for example when that driver does not
-- * support setting the temporal keys through %CMD_NEW_KEY.
-+ * preshared key authentication in station mode. In %NL80211_CMD_CONNECT
-+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
-+ * supporting this offload may reject the %NL80211_CMD_CONNECT when no
-+ * preshared key material is provided, for example when that driver does
-+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
-  *
-  * Similarly @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X flag can be
-  * set by drivers indicating offload support of the PTK/GTK EAPOL
-- * handshakes during 802.1X authentication. In order to use the offload
-- * the %NL80211_CMD_CONNECT should have %NL80211_ATTR_WANT_1X_4WAY_HS
-- * attribute flag. Drivers supporting this offload may reject the
-- * %NL80211_CMD_CONNECT when the attribute flag is not present.
-+ * handshakes during 802.1X authentication in station mode. In order to
-+ * use the offload the %NL80211_CMD_CONNECT should have
-+ * %NL80211_ATTR_WANT_1X_4WAY_HS attribute flag. Drivers supporting this
-+ * offload may reject the %NL80211_CMD_CONNECT when the attribute flag is
-+ * not present.
-+ *
-+ * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK flag drivers
-+ * can indicate they support offloading EAPOL handshakes for WPA/WPA2
-+ * preshared key authentication in AP mode. In %NL80211_CMD_START_AP
-+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
-+ * supporting this offload may reject the %NL80211_CMD_START_AP when no
-+ * preshared key material is provided, for example when that driver does
-+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
-  *
-  * For 802.1X the PMK or PMK-R0 are set by providing %NL80211_ATTR_PMK
-  * using %NL80211_CMD_SET_PMK. For offloaded FT support also
-@@ -243,9 +252,10 @@
-  * DOC: SAE authentication offload
-  *
-  * By setting @NL80211_EXT_FEATURE_SAE_OFFLOAD flag drivers can indicate they
-- * support offloading SAE authentication for WPA3-Personal networks. In
-- * %NL80211_CMD_CONNECT the password for SAE should be specified using
-- * %NL80211_ATTR_SAE_PASSWORD.
-+ * support offloading SAE authentication for WPA3-Personal networks. The
-+ * password for SAE should be specified using %NL80211_ATTR_SAE_PASSWORD in
-+ * %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP for station and AP mode
-+ * respectively.
-  */
- 
- /**
-@@ -2285,10 +2295,11 @@ enum nl80211_commands {
-  *
-  * @NL80211_ATTR_PMK: attribute for passing PMK key material. Used with
-  *	%NL80211_CMD_SET_PMKSA for the PMKSA identified by %NL80211_ATTR_PMKID.
-- *	For %NL80211_CMD_CONNECT it is used to provide PSK for offloading 4-way
-- *	handshake for WPA/WPA2-PSK networks. For 802.1X authentication it is
-- *	used with %NL80211_CMD_SET_PMK. For offloaded FT support this attribute
-- *	specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME is included as well.
-+ *	For %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP it is used to provide
-+ *	PSK for offloading 4-way handshake for WPA/WPA2-PSK networks. For 802.1X
-+ *	authentication it is used with %NL80211_CMD_SET_PMK. For offloaded FT
-+ *	support this attribute specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME
-+ *	is included as well.
-  *
-  * @NL80211_ATTR_SCHED_SCAN_MULTI: flag attribute which user-space shall use to
-  *	indicate that it supports multiple active scheduled scan requests.
-@@ -2299,7 +2310,10 @@ enum nl80211_commands {
-  *	in %NL80211_CMD_CONNECT to indicate that for 802.1X authentication it
-  *	wants to use the supported offload of the 4-way handshake.
-  * @NL80211_ATTR_PMKR0_NAME: PMK-R0 Name for offloaded FT.
-- * @NL80211_ATTR_PORT_AUTHORIZED: (reserved)
-+ * @NL80211_ATTR_PORT_AUTHORIZED: flag attribute used in %NL80211_CMD_ROAMED
-+ *	notification indicating that that 802.1X authentication was done by
-+ *	the driver or is not needed (because roaming used the Fast Transition
-+ *	protocol).
-  *
-  * @NL80211_ATTR_EXTERNAL_AUTH_ACTION: Identify the requested external
-  *     authentication operation (u32 attribute with an
-@@ -5482,7 +5496,12 @@ enum nl80211_feature_flags {
-  *	to a station.
-  *
-  * @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in
-- *	station mode (SAE password is passed as part of the connect command).
-+ *	station mode (SAE password is passed as part of the connect command)
-+ *	or AP mode (SAE password is passed as part of the start AP command).
-+ *
-+ * @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK: Device wants to do 4-way
-+ *	handshake with PSK in AP mode (PSK is passed as part of the start AP
-+ *	command).
-  *
-  * @NUM_NL80211_EXT_FEATURES: number of extended features.
-  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-@@ -5529,6 +5548,7 @@ enum nl80211_ext_feature_index {
- 	NL80211_EXT_FEATURE_EXT_KEY_ID,
- 	NL80211_EXT_FEATURE_STA_TX_PWR,
- 	NL80211_EXT_FEATURE_SAE_OFFLOAD,
-+	NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK,
- 
- 	/* add new features before the definition below */
- 	NUM_NL80211_EXT_FEATURES,
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 47ab86ee192a..e933df43612b 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -4835,8 +4835,9 @@ static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
- 			return false;
- 		return true;
- 	case NL80211_CMD_START_AP:
--		/* SAE not supported yet */
--		if (auth_type == NL80211_AUTHTYPE_SAE)
-+		if (!wiphy_ext_feature_isset(&rdev->wiphy,
-+					     NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
-+		    auth_type == NL80211_AUTHTYPE_SAE)
- 			return false;
- 		/* FILS not supported yet */
- 		if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
-@@ -9442,7 +9443,9 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
- 		if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
- 			return -EINVAL;
- 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
--					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
-+					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) &&
-+		    !wiphy_ext_feature_isset(&rdev->wiphy,
-+					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK))
- 			return -EINVAL;
- 		settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
- 	}
-@@ -15761,6 +15764,8 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
- 	     (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
- 	      nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
- 			  cr->timeout_reason))) ||
-+	    (cr->authorized &&
-+	     nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)) ||
- 	    (cr->req_ie &&
- 	     nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
- 	    (cr->resp_ie &&
-@@ -15827,7 +15832,9 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
- 	    (info->fils.pmk &&
- 	     nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
- 	    (info->fils.pmkid &&
--	     nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
-+	     nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)) ||
-+	    (info->authorized &&
-+	     nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)))
- 		goto nla_put_failure;
- 
- 	genlmsg_end(msg, hdr);
-diff --git a/net/wireless/sme.c b/net/wireless/sme.c
-index 15595cf401de..53414c02dcf1 100644
---- a/net/wireless/sme.c
-+++ b/net/wireless/sme.c
-@@ -888,6 +888,7 @@ void cfg80211_connect_done(struct net_device *dev,
- 	ev->cr.bss = params->bss;
- 	ev->cr.status = params->status;
- 	ev->cr.timeout_reason = params->timeout_reason;
-+	ev->cr.authorized = params->authorized;
- 
- 	spin_lock_irqsave(&wdev->event_lock, flags);
- 	list_add_tail(&ev->list, &wdev->event_list);
-@@ -1022,6 +1023,7 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
- 	if (info->fils.update_erp_next_seq_num)
- 		ev->rm.fils.erp_next_seq_num = info->fils.erp_next_seq_num;
- 	ev->rm.bss = info->bss;
-+	ev->rm.authorized = info->authorized;
- 
- 	spin_lock_irqsave(&wdev->event_lock, flags);
- 	list_add_tail(&ev->list, &wdev->event_list);
--- 
-2.30.2
-
diff --git a/patches/cypress/0002-cleanup-brcmfmac-patchset.patch b/patches/cypress/0002-cleanup-brcmfmac-patchset.patch
deleted file mode 100644
index c27647c401e21c795d8e69af68b53c6c0e3b5fb5..0000000000000000000000000000000000000000
--- a/patches/cypress/0002-cleanup-brcmfmac-patchset.patch
+++ /dev/null
@@ -1,769 +0,0 @@
-From dad51f296ef62582ce6ff8a4ab3d91221da4d891 Mon Sep 17 00:00:00 2001
-From: Robert Nelson <robertcnelson@gmail.com>
-Date: Thu, 20 May 2021 11:17:27 -0500
-Subject: [PATCH 2/2] cleanup brcmfmac patchset
-
-Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
----
- .../broadcom/brcm80211/brcmfmac/bus.h         |   3 -
- .../broadcom/brcm80211/brcmfmac/fwsignal.c    |  45 ---
- .../broadcom/brcm80211/brcmfmac/sdio.c        |   3 -
- .../broadcom/brcm80211/brcmfmac/usb.c         |   7 -
- include/uapi/linux/nl80211.h                  | 375 +++++++++++++++++-
- 5 files changed, 371 insertions(+), 62 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-index ea0524b8f4e6..695b14506143 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -158,9 +158,6 @@ struct brcmf_bus {
- 
- 	const struct brcmf_bus_ops *ops;
- 	struct brcmf_bus_msgbuf *msgbuf;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--	bool allow_skborphan;
--#endif
- };
- 
- /*
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index c29eb944f931..8dfa5ccb55c7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -496,9 +496,6 @@ struct brcmf_fws_info {
- 	bool creditmap_received;
- 	u8 mode;
- 	bool avoid_queueing;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--	int fifo_init_credit[BRCMF_FWS_FIFO_COUNT];
--#endif
- };
- 
- /*
-@@ -1628,9 +1625,6 @@ static int brcmf_fws_notify_credit_map(struct brcmf_if *ifp,
- 		WARN_ONCE(fws->fifo_credit[i] < 0,
- 			  "fifo_credit[%d] is negative(%d)\n", i,
- 			  fws->fifo_credit[i]);
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--		fws->fifo_init_credit[i] = fws->fifo_credit[i];
--#endif
- 	}
- 	brcmf_fws_schedule_deq(fws);
- 	brcmf_fws_unlock(fws);
-@@ -2208,38 +2202,6 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp)
- 	brcmf_fws_unlock(fws);
- }
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--static bool brcmf_fws_ismultistream(struct brcmf_fws_info *fws)
--{
--	bool ret = false;
--	u8 credit_usage = 0;
--
--	/* Check only for BE, VI and VO traffic */
--	u32 delay_map = fws->fifo_delay_map &
--		((1 << BRCMF_FWS_FIFO_AC_BE) |
--		 (1 << BRCMF_FWS_FIFO_AC_VI) |
--		 (1 << BRCMF_FWS_FIFO_AC_VO));
--
--	if (hweight_long(delay_map) > 1) {
--		ret = true;
--	} else {
--		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_BE] <
--			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_BE])
--			credit_usage++;
--		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_VI] <
--			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_VI])
--			credit_usage++;
--		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_VO] <
--			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_VO])
--			credit_usage++;
--
--		if (credit_usage > 1)
--			ret = true;
--	}
--	return ret;
--}
--#endif
--
- static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- {
- 	struct brcmf_fws_info *fws;
-@@ -2253,13 +2215,6 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 	fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work);
- 	drvr = fws->drvr;
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--	if (brcmf_fws_ismultistream(fws))
--		drvr->bus_if->allow_skborphan = false;
--	else
--		drvr->bus_if->allow_skborphan = true;
--#endif
--
- 	brcmf_fws_lock(fws);
- 	for (fifo = BRCMF_FWS_FIFO_BCMC; fifo >= 0 && !fws->bus_flow_blocked;
- 	     fifo--) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index d85f1aa671e8..8095ad6a453f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -2355,9 +2355,6 @@ static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
- 					      &prec_out);
- 			if (pkt == NULL)
- 				break;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--			skb_orphan(pkt);
--#endif
- 			__skb_queue_tail(&pktq, pkt);
- 		}
- 		spin_unlock_bh(&bus->txq_lock);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index 24d3897058e2..a1bb13959503 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -638,10 +638,6 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		goto fail;
- 	}
- 
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--	if (devinfo->bus_pub.bus->allow_skborphan)
--		skb_orphan(skb);
--#endif
- 	req->skb = skb;
- 	req->devinfo = devinfo;
- 	usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
-@@ -1289,9 +1285,6 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 	bus->ops = &brcmf_usb_bus_ops;
- 	bus->proto_type = BRCMF_PROTO_BCDC;
- 	bus->always_use_fws_queue = true;
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
--	bus->allow_skborphan = true;
--#endif
- #ifdef CONFIG_PM
- 	bus->wowl_supported = true;
- #endif
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index b660fb0e251b..9e5812025c1b 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -11,7 +11,7 @@
-  * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
-  * Copyright 2008 Colin McCabe <colin@cozybit.com>
-  * Copyright 2015-2017	Intel Deutschland GmbH
-- * Copyright (C) 2018-2019 Intel Corporation
-+ * Copyright (C) 2018-2020 Intel Corporation
-  *
-  * Permission to use, copy, modify, and/or distribute this software for any
-  * purpose with or without fee is hereby granted, provided that the above
-@@ -256,6 +256,45 @@
-  * password for SAE should be specified using %NL80211_ATTR_SAE_PASSWORD in
-  * %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP for station and AP mode
-  * respectively.
-+  */
-+
-+/**
-+ * DOC: VLAN offload support for setting group keys and binding STAs to VLANs
-+ *
-+ * By setting @NL80211_EXT_FEATURE_VLAN_OFFLOAD flag drivers can indicate they
-+ * support offloading VLAN functionality in a manner where the driver exposes a
-+ * single netdev that uses VLAN tagged frames and separate VLAN-specific netdevs
-+ * can then be added using RTM_NEWLINK/IFLA_VLAN_ID similarly to the Ethernet
-+ * case. Frames received from stations that are not assigned to any VLAN are
-+ * delivered on the main netdev and frames to such stations can be sent through
-+ * that main netdev.
-+ *
-+ * %NL80211_CMD_NEW_KEY (for group keys), %NL80211_CMD_NEW_STATION, and
-+ * %NL80211_CMD_SET_STATION will optionally specify vlan_id using
-+ * %NL80211_ATTR_VLAN_ID.
-+ */
-+
-+/**
-+ * DOC: TID configuration
-+ *
-+ * TID config support can be checked in the %NL80211_ATTR_TID_CONFIG
-+ * attribute given in wiphy capabilities.
-+ *
-+ * The necessary configuration parameters are mentioned in
-+ * &enum nl80211_tid_config_attr and it will be passed to the
-+ * %NL80211_CMD_SET_TID_CONFIG command in %NL80211_ATTR_TID_CONFIG.
-+ *
-+ * If the configuration needs to be applied for specific peer then the MAC
-+ * address of the peer needs to be passed in %NL80211_ATTR_MAC, otherwise the
-+ * configuration will be applied for all the connected peers in the vif except
-+ * any peers that have peer specific configuration for the TID by default; if
-+ * the %NL80211_TID_CONFIG_ATTR_OVERRIDE flag is set, peer specific values
-+ * will be overwritten.
-+ *
-+ * All this configuration is valid only for STA's current connection
-+ * i.e. the configuration will be reset to default when the STA connects back
-+ * after disconnection/roaming, and this configuration will be cleared when
-+ * the interface goes down.
-  */
- 
- /**
-@@ -581,6 +620,14 @@
-  *	set of BSSID,frequency parameters is used (i.e., either the enforcing
-  *	%NL80211_ATTR_MAC,%NL80211_ATTR_WIPHY_FREQ or the less strict
-  *	%NL80211_ATTR_MAC_HINT and %NL80211_ATTR_WIPHY_FREQ_HINT).
-+ *	Driver shall not modify the IEs specified through %NL80211_ATTR_IE if
-+ *	%NL80211_ATTR_MAC is included. However, if %NL80211_ATTR_MAC_HINT is
-+ *	included, these IEs through %NL80211_ATTR_IE are specified by the user
-+ *	space based on the best possible BSS selected. Thus, if the driver ends
-+ *	up selecting a different BSS, it can modify these IEs accordingly (e.g.
-+ *	userspace asks the driver to perform PMKSA caching with BSS1 and the
-+ *	driver ends up selecting BSS2 with different PMKSA cache entry; RSNIE
-+ *	has to get updated with the apt PMKID).
-  *	%NL80211_ATTR_PREV_BSSID can be used to request a reassociation within
-  *	the ESS in case the device is already associated and an association with
-  *	a different BSS is desired.
-@@ -749,7 +796,7 @@
-  *	various triggers. These triggers can be configured through this
-  *	command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For
-  *	more background information, see
-- *	http://wireless.kernel.org/en/users/Documentation/WoWLAN.
-+ *	https://wireless.wiki.kernel.org/en/users/Documentation/WoWLAN.
-  *	The @NL80211_CMD_SET_WOWLAN command can also be used as a notification
-  *	from the driver reporting the wakeup reason. In this case, the
-  *	@NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason
-@@ -1111,6 +1158,20 @@
-  *	peer MAC address and %NL80211_ATTR_FRAME is used to specify the frame
-  *	content. The frame is ethernet data.
-  *
-+ * @NL80211_CMD_SET_TID_CONFIG: Data frame TID specific configuration
-+ *	is passed using %NL80211_ATTR_TID_CONFIG attribute.
-+ *
-+ * @NL80211_CMD_UNPROT_BEACON: Unprotected or incorrectly protected Beacon
-+ *	frame. This event is used to indicate that a received Beacon frame was
-+ *	dropped because it did not include a valid MME MIC while beacon
-+ *	protection was enabled (BIGTK configured in station mode).
-+ *
-+ * @NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS: Report TX status of a control
-+ *	port frame transmitted with %NL80211_CMD_CONTROL_PORT_FRAME.
-+ *	%NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME
-+ *	includes the contents of the frame. %NL80211_ATTR_ACK flag is included
-+ *	if the recipient acknowledged the frame.
-+ *
-  * @NL80211_CMD_MAX: highest used command number
-  * @__NL80211_CMD_AFTER_LAST: internal use
-  */
-@@ -1335,6 +1396,12 @@ enum nl80211_commands {
- 
- 	NL80211_CMD_PROBE_MESH_LINK,
- 
-+	NL80211_CMD_SET_TID_CONFIG,
-+
-+	NL80211_CMD_UNPROT_BEACON,
-+
-+	NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS,
-+
- 	/* add new commands above here */
- 
- 	/* used to define NL80211_CMD_MAX below */
-@@ -1380,7 +1447,8 @@ enum nl80211_commands {
-  *	of &enum nl80211_chan_width, describing the channel width. See the
-  *	documentation of the enum for more information.
-  * @NL80211_ATTR_CENTER_FREQ1: Center frequency of the first part of the
-- *	channel, used for anything but 20 MHz bandwidth
-+ *	channel, used for anything but 20 MHz bandwidth. In S1G this is the
-+ *	operating channel center frequency.
-  * @NL80211_ATTR_CENTER_FREQ2: Center frequency of the second part of the
-  *	channel, used only for 80+80 MHz bandwidth
-  * @NL80211_ATTR_WIPHY_CHANNEL_TYPE: included with NL80211_ATTR_WIPHY_FREQ
-@@ -1590,7 +1658,8 @@ enum nl80211_commands {
-  *	flag is included, then control port frames are sent over NL80211 instead
-  *	using %CMD_CONTROL_PORT_FRAME.  If control port routing over NL80211 is
-  *	to be used then userspace must also use the %NL80211_ATTR_SOCKET_OWNER
-- *	flag.
-+ *	flag. When used with %NL80211_ATTR_CONTROL_PORT_NO_PREAUTH, pre-auth
-+ *	frames are not forwared over the control port.
-  *
-  * @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver.
-  *	We recommend using nested, driver-specific attributes within this.
-@@ -2387,6 +2456,61 @@ enum nl80211_commands {
-  *	the allowed channel bandwidth configurations. (u8 attribute)
-  *	Defined by IEEE P802.11ay/D4.0 section 9.4.2.251, Table 13.
-  *
-+ * @NL80211_ATTR_VLAN_ID: VLAN ID (1..4094) for the station and VLAN group key
-+ *	(u16).
-+ *
-+ * @NL80211_ATTR_HE_BSS_COLOR: nested attribute for BSS Color Settings.
-+ *
-+ * @NL80211_ATTR_IFTYPE_AKM_SUITES: nested array attribute, with each entry
-+ *	using attributes from &enum nl80211_iftype_akm_attributes. This
-+ *	attribute is sent in a response to %NL80211_CMD_GET_WIPHY indicating
-+ *	supported AKM suites capability per interface. AKMs advertised in
-+ *	%NL80211_ATTR_AKM_SUITES are default capabilities if AKM suites not
-+ *	advertised for a specific interface type.
-+ *
-+ * @NL80211_ATTR_TID_CONFIG: TID specific configuration in a
-+ *	nested attribute with &enum nl80211_tid_config_attr sub-attributes;
-+ *	on output (in wiphy attributes) it contains only the feature sub-
-+ *	attributes.
-+ *
-+ * @NL80211_ATTR_CONTROL_PORT_NO_PREAUTH: disable preauth frame rx on control
-+ *	port in order to forward/receive them as ordinary data frames.
-+ *
-+ * @NL80211_ATTR_PMK_LIFETIME: Maximum lifetime for PMKSA in seconds (u32,
-+ *	dot11RSNAConfigPMKReauthThreshold; 0 is not a valid value).
-+ *	An optional parameter configured through %NL80211_CMD_SET_PMKSA.
-+ *	Drivers that trigger roaming need to know the lifetime of the
-+ *	configured PMKSA for triggering the full vs. PMKSA caching based
-+ *	authentication. This timeout helps authentication methods like SAE,
-+ *	where PMK gets updated only by going through a full (new SAE)
-+ *	authentication instead of getting updated during an association for EAP
-+ *	authentication. No new full authentication within the PMK expiry shall
-+ *	result in a disassociation at the end of the lifetime.
-+ *
-+ * @NL80211_ATTR_PMK_REAUTH_THRESHOLD: Reauthentication threshold time, in
-+ *	terms of percentage of %NL80211_ATTR_PMK_LIFETIME
-+ *	(u8, dot11RSNAConfigPMKReauthThreshold, 1..100). This is an optional
-+ *	parameter configured through %NL80211_CMD_SET_PMKSA. Requests the
-+ *	driver to trigger a full authentication roam (without PMKSA caching)
-+ *	after the reauthentication threshold time, but before the PMK lifetime
-+ *	has expired.
-+ *
-+ *	Authentication methods like SAE need to be able to generate a new PMKSA
-+ *	entry without having to force a disconnection after the PMK timeout. If
-+ *	no roaming occurs between the reauth threshold and PMK expiration,
-+ *	disassociation is still forced.
-+ * @NL80211_ATTR_RECEIVE_MULTICAST: multicast flag for the
-+ *	%NL80211_CMD_REGISTER_FRAME command, see the description there.
-+ * @NL80211_ATTR_WIPHY_FREQ_OFFSET: offset of the associated
-+ *	%NL80211_ATTR_WIPHY_FREQ in positive KHz. Only valid when supplied with
-+ *	an %NL80211_ATTR_WIPHY_FREQ_OFFSET.
-+ * @NL80211_ATTR_CENTER_FREQ1_OFFSET: Center frequency offset in KHz for the
-+ *	first channel segment specified in %NL80211_ATTR_CENTER_FREQ1.
-+ * @NL80211_ATTR_SCAN_FREQ_KHZ: nested attribute with KHz frequencies
-+ *
-+ * @NL80211_ATTR_HE_6GHZ_CAPABILITY: HE 6 GHz Band Capability element (from
-+ *	association request when used with NL80211_CMD_NEW_STATION).
-+ *
-  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-  * @NL80211_ATTR_MAX: highest attribute number currently defined
-  * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -2849,6 +2973,26 @@ enum nl80211_attrs {
- 	NL80211_ATTR_WIPHY_EDMG_CHANNELS,
- 	NL80211_ATTR_WIPHY_EDMG_BW_CONFIG,
- 
-+	NL80211_ATTR_VLAN_ID,
-+
-+	NL80211_ATTR_HE_BSS_COLOR,
-+
-+	NL80211_ATTR_IFTYPE_AKM_SUITES,
-+
-+	NL80211_ATTR_TID_CONFIG,
-+
-+	NL80211_ATTR_CONTROL_PORT_NO_PREAUTH,
-+
-+	NL80211_ATTR_PMK_LIFETIME,
-+	NL80211_ATTR_PMK_REAUTH_THRESHOLD,
-+
-+	NL80211_ATTR_RECEIVE_MULTICAST,
-+	NL80211_ATTR_WIPHY_FREQ_OFFSET,
-+	NL80211_ATTR_CENTER_FREQ1_OFFSET,
-+	NL80211_ATTR_SCAN_FREQ_KHZ,
-+
-+	NL80211_ATTR_HE_6GHZ_CAPABILITY,
-+
- 	/* add attributes here, update the policy in nl80211.c */
- 
- 	__NL80211_ATTR_AFTER_LAST,
-@@ -3427,6 +3571,8 @@ enum nl80211_mpath_info {
-  *     defined in HE capabilities IE
-  * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently
-  *     defined
-+ * @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
-+ *	given for all 6 GHz band channels
-  * @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
-  */
- enum nl80211_band_iftype_attr {
-@@ -3437,6 +3583,7 @@ enum nl80211_band_iftype_attr {
- 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
- 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
- 	NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
-+	NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
- 
- 	/* keep last */
- 	__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
-@@ -3568,6 +3715,9 @@ enum nl80211_wmm_rule {
-  * @NL80211_FREQUENCY_ATTR_WMM: this channel has wmm limitations.
-  *	This is a nested attribute that contains the wmm limitation per AC.
-  *	(see &enum nl80211_wmm_rule)
-+ * @NL80211_FREQUENCY_ATTR_NO_HE: HE operation is not allowed on this channel
-+ *	in current regulatory domain.
-+ * @NL80211_FREQUENCY_ATTR_OFFSET: frequency offset in KHz
-  * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
-  *	currently defined
-  * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
-@@ -3597,6 +3747,8 @@ enum nl80211_frequency_attr {
- 	NL80211_FREQUENCY_ATTR_NO_20MHZ,
- 	NL80211_FREQUENCY_ATTR_NO_10MHZ,
- 	NL80211_FREQUENCY_ATTR_WMM,
-+	NL80211_FREQUENCY_ATTR_NO_HE,
-+	NL80211_FREQUENCY_ATTR_OFFSET,
- 
- 	/* keep last */
- 	__NL80211_FREQUENCY_ATTR_AFTER_LAST,
-@@ -3794,6 +3946,7 @@ enum nl80211_sched_scan_match_attr {
-  * @NL80211_RRF_NO_HT40PLUS: channels can't be used in HT40+ operation
-  * @NL80211_RRF_NO_80MHZ: 80MHz operation not allowed
-  * @NL80211_RRF_NO_160MHZ: 160MHz operation not allowed
-+ * @NL80211_RRF_NO_HE: HE operation not allowed
-  */
- enum nl80211_reg_rule_flags {
- 	NL80211_RRF_NO_OFDM		= 1<<0,
-@@ -3811,6 +3964,7 @@ enum nl80211_reg_rule_flags {
- 	NL80211_RRF_NO_HT40PLUS		= 1<<14,
- 	NL80211_RRF_NO_80MHZ		= 1<<15,
- 	NL80211_RRF_NO_160MHZ		= 1<<16,
-+	NL80211_RRF_NO_HE		= 1<<17,
- };
- 
- #define NL80211_RRF_PASSIVE_SCAN	NL80211_RRF_NO_IR
-@@ -4365,6 +4519,7 @@ enum nl80211_bss_scan_width {
-  * @NL80211_BSS_CHAIN_SIGNAL: per-chain signal strength of last BSS update.
-  *	Contains a nested array of signal strength attributes (u8, dBm),
-  *	using the nesting index as the antenna number.
-+ * @NL80211_BSS_FREQUENCY_OFFSET: frequency offset in KHz
-  * @__NL80211_BSS_AFTER_LAST: internal
-  * @NL80211_BSS_MAX: highest BSS attribute
-  */
-@@ -4389,6 +4544,7 @@ enum nl80211_bss {
- 	NL80211_BSS_PARENT_TSF,
- 	NL80211_BSS_PARENT_BSSID,
- 	NL80211_BSS_CHAIN_SIGNAL,
-+	NL80211_BSS_FREQUENCY_OFFSET,
- 
- 	/* keep last */
- 	__NL80211_BSS_AFTER_LAST,
-@@ -4517,6 +4673,7 @@ enum nl80211_key_default_types {
-  *	See &enum nl80211_key_default_types.
-  * @NL80211_KEY_MODE: the mode from enum nl80211_key_mode.
-  *	Defaults to @NL80211_KEY_RX_TX.
-+ * @NL80211_KEY_DEFAULT_BEACON: flag indicating default Beacon frame key
-  *
-  * @__NL80211_KEY_AFTER_LAST: internal
-  * @NL80211_KEY_MAX: highest key attribute
-@@ -4532,6 +4689,7 @@ enum nl80211_key_attributes {
- 	NL80211_KEY_TYPE,
- 	NL80211_KEY_DEFAULT_TYPES,
- 	NL80211_KEY_MODE,
-+	NL80211_KEY_DEFAULT_BEACON,
- 
- 	/* keep last */
- 	__NL80211_KEY_AFTER_LAST,
-@@ -4687,6 +4845,94 @@ enum nl80211_tx_power_setting {
- 	NL80211_TX_POWER_FIXED,
- };
- 
-+/**
-+ * enum nl80211_tid_config - TID config state
-+ * @NL80211_TID_CONFIG_ENABLE: Enable config for the TID
-+ * @NL80211_TID_CONFIG_DISABLE: Disable config for the TID
-+ */
-+enum nl80211_tid_config {
-+	NL80211_TID_CONFIG_ENABLE,
-+	NL80211_TID_CONFIG_DISABLE,
-+};
-+
-+/* enum nl80211_tx_rate_setting - TX rate configuration type
-+ * @NL80211_TX_RATE_AUTOMATIC: automatically determine TX rate
-+ * @NL80211_TX_RATE_LIMITED: limit the TX rate by the TX rate parameter
-+ * @NL80211_TX_RATE_FIXED: fix TX rate to the TX rate parameter
-+ */
-+enum nl80211_tx_rate_setting {
-+	NL80211_TX_RATE_AUTOMATIC,
-+	NL80211_TX_RATE_LIMITED,
-+	NL80211_TX_RATE_FIXED,
-+};
-+
-+/* enum nl80211_tid_config_attr - TID specific configuration.
-+ * @NL80211_TID_CONFIG_ATTR_PAD: pad attribute for 64-bit values
-+ * @NL80211_TID_CONFIG_ATTR_VIF_SUPP: a bitmap (u64) of attributes supported
-+ *	for per-vif configuration; doesn't list the ones that are generic
-+ *	(%NL80211_TID_CONFIG_ATTR_TIDS, %NL80211_TID_CONFIG_ATTR_OVERRIDE).
-+ * @NL80211_TID_CONFIG_ATTR_PEER_SUPP: same as the previous per-vif one, but
-+ *	per peer instead.
-+ * @NL80211_TID_CONFIG_ATTR_OVERRIDE: flag attribue, if no peer
-+ *	is selected, if set indicates that the new configuration overrides
-+ *	all previous peer configurations, otherwise previous peer specific
-+ *	configurations should be left untouched. If peer is selected then
-+ *	it will reset particular TID configuration of that peer and it will
-+ *	not accept other TID config attributes along with peer.
-+ * @NL80211_TID_CONFIG_ATTR_TIDS: a bitmask value of TIDs (bit 0 to 7)
-+ *	Its type is u16.
-+ * @NL80211_TID_CONFIG_ATTR_NOACK: Configure ack policy for the TID.
-+ *	specified in %NL80211_TID_CONFIG_ATTR_TID. see %enum nl80211_tid_config.
-+ *	Its type is u8.
-+ * @NL80211_TID_CONFIG_ATTR_RETRY_SHORT: Number of retries used with data frame
-+ *	transmission, user-space sets this configuration in
-+ *	&NL80211_CMD_SET_TID_CONFIG. It is u8 type, min value is 1 and
-+ *	the max value is advertised by the driver in this attribute on
-+ *	output in wiphy capabilities.
-+ * @NL80211_TID_CONFIG_ATTR_RETRY_LONG: Number of retries used with data frame
-+ *	transmission, user-space sets this configuration in
-+ *	&NL80211_CMD_SET_TID_CONFIG. Its type is u8, min value is 1 and
-+ *	the max value is advertised by the driver in this attribute on
-+ *	output in wiphy capabilities.
-+ * @NL80211_TID_CONFIG_ATTR_AMPDU_CTRL: Enable/Disable aggregation for the TIDs
-+ *	specified in %NL80211_TID_CONFIG_ATTR_TIDS. Its type is u8, using
-+ *	the values from &nl80211_tid_config.
-+ * @NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL: Enable/Disable RTS_CTS for the TIDs
-+ *	specified in %NL80211_TID_CONFIG_ATTR_TIDS. It is u8 type, using
-+ *	the values from &nl80211_tid_config.
-+ * @NL80211_TID_CONFIG_ATTR_AMSDU_CTRL: Enable/Disable MSDU aggregation
-+ *	for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS.
-+ *	Its type is u8, using the values from &nl80211_tid_config.
-+ * @NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE: This attribute will be useful
-+ *	to notfiy the driver that what type of txrate should be used
-+ *	for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS. using
-+ *	the values form &nl80211_tx_rate_setting.
-+ * @NL80211_TID_CONFIG_ATTR_TX_RATE: Data frame TX rate mask should be applied
-+ *	with the parameters passed through %NL80211_ATTR_TX_RATES.
-+ *	configuration is applied to the data frame for the tid to that connected
-+ *	station.
-+ */
-+enum nl80211_tid_config_attr {
-+	__NL80211_TID_CONFIG_ATTR_INVALID,
-+	NL80211_TID_CONFIG_ATTR_PAD,
-+	NL80211_TID_CONFIG_ATTR_VIF_SUPP,
-+	NL80211_TID_CONFIG_ATTR_PEER_SUPP,
-+	NL80211_TID_CONFIG_ATTR_OVERRIDE,
-+	NL80211_TID_CONFIG_ATTR_TIDS,
-+	NL80211_TID_CONFIG_ATTR_NOACK,
-+	NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
-+	NL80211_TID_CONFIG_ATTR_RETRY_LONG,
-+	NL80211_TID_CONFIG_ATTR_AMPDU_CTRL,
-+	NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL,
-+	NL80211_TID_CONFIG_ATTR_AMSDU_CTRL,
-+	NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE,
-+	NL80211_TID_CONFIG_ATTR_TX_RATE,
-+
-+	/* keep last */
-+	__NL80211_TID_CONFIG_ATTR_AFTER_LAST,
-+	NL80211_TID_CONFIG_ATTR_MAX = __NL80211_TID_CONFIG_ATTR_AFTER_LAST - 1
-+};
-+
- /**
-  * enum nl80211_packet_pattern_attr - packet pattern attribute
-  * @__NL80211_PKTPAT_INVALID: invalid number for nested attribute
-@@ -5158,6 +5404,8 @@ enum plink_actions {
- 
- #define NL80211_KCK_LEN			16
- #define NL80211_KEK_LEN			16
-+#define NL80211_KCK_EXT_LEN		24
-+#define NL80211_KEK_EXT_LEN		32
- #define NL80211_REPLAY_CTR_LEN		8
- 
- /**
-@@ -5166,6 +5414,7 @@ enum plink_actions {
-  * @NL80211_REKEY_DATA_KEK: key encryption key (binary)
-  * @NL80211_REKEY_DATA_KCK: key confirmation key (binary)
-  * @NL80211_REKEY_DATA_REPLAY_CTR: replay counter (binary)
-+ * @NL80211_REKEY_DATA_AKM: AKM data (OUI, suite type)
-  * @NUM_NL80211_REKEY_DATA: number of rekey attributes (internal)
-  * @MAX_NL80211_REKEY_DATA: highest rekey attribute (internal)
-  */
-@@ -5174,6 +5423,7 @@ enum nl80211_rekey_data {
- 	NL80211_REKEY_DATA_KEK,
- 	NL80211_REKEY_DATA_KCK,
- 	NL80211_REKEY_DATA_REPLAY_CTR,
-+	NL80211_REKEY_DATA_AKM,
- 
- 	/* keep last */
- 	NUM_NL80211_REKEY_DATA,
-@@ -5503,6 +5753,39 @@ enum nl80211_feature_flags {
-  *	handshake with PSK in AP mode (PSK is passed as part of the start AP
-  *	command).
-  *
-+ * @NL80211_EXT_FEATURE_VLAN_OFFLOAD: The driver supports a single netdev
-+ *	with VLAN tagged frames and separate VLAN-specific netdevs added using
-+ *	vconfig similarly to the Ethernet case.
-+ *
-+ * @NL80211_EXT_FEATURE_AQL: The driver supports the Airtime Queue Limit (AQL)
-+ *	feature, which prevents bufferbloat by using the expected transmission
-+ *	time to limit the amount of data buffered in the hardware.
-+ *
-+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION: The driver supports Beacon protection
-+ *	and can receive key configuration for BIGTK using key indexes 6 and 7.
-+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT: The driver supports Beacon
-+ *	protection as a client only and cannot transmit protected beacons.
-+ *
-+ * @NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH: The driver can disable the
-+ *	forwarding of preauth frames over the control port. They are then
-+ *	handled as ordinary data frames.
-+ *
-+ * @NL80211_EXT_FEATURE_PROTECTED_TWT: Driver supports protected TWT frames
-+ *
-+ * @NL80211_EXT_FEATURE_DEL_IBSS_STA: The driver supports removing stations
-+ *      in IBSS mode, essentially by dropping their state.
-+ *
-+ * @NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS: management frame registrations
-+ *	are possible for multicast frames and those will be reported properly.
-+ *
-+ * @NL80211_EXT_FEATURE_SCAN_FREQ_KHZ: This driver supports receiving and
-+ *	reporting scan request with %NL80211_ATTR_SCAN_FREQ_KHZ. In order to
-+ *	report %NL80211_ATTR_SCAN_FREQ_KHZ, %NL80211_SCAN_FLAG_FREQ_KHZ must be
-+ *	included in the scan request.
-+ *
-+ * @NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS: The driver
-+ *	can report tx status for control port over nl80211 tx operations.
-+ *
-  * @NUM_NL80211_EXT_FEATURES: number of extended features.
-  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-  */
-@@ -5549,6 +5832,16 @@ enum nl80211_ext_feature_index {
- 	NL80211_EXT_FEATURE_STA_TX_PWR,
- 	NL80211_EXT_FEATURE_SAE_OFFLOAD,
- 	NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK,
-+	NL80211_EXT_FEATURE_VLAN_OFFLOAD,
-+	NL80211_EXT_FEATURE_AQL,
-+	NL80211_EXT_FEATURE_BEACON_PROTECTION,
-+	NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH,
-+	NL80211_EXT_FEATURE_PROTECTED_TWT,
-+	NL80211_EXT_FEATURE_DEL_IBSS_STA,
-+	NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS,
-+	NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT,
-+	NL80211_EXT_FEATURE_SCAN_FREQ_KHZ,
-+	NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS,
- 
- 	/* add new features before the definition below */
- 	NUM_NL80211_EXT_FEATURES,
-@@ -5660,6 +5953,9 @@ enum nl80211_timeout_reason {
-  * @NL80211_SCAN_FLAG_MIN_PREQ_CONTENT: minimize probe request content to
-  *	only have supported rates and no additional capabilities (unless
-  *	added by userspace explicitly.)
-+ * @NL80211_SCAN_FLAG_FREQ_KHZ: report scan results with
-+ *	%NL80211_ATTR_SCAN_FREQ_KHZ. This also means
-+ *	%NL80211_ATTR_SCAN_FREQUENCIES will not be included.
-  */
- enum nl80211_scan_flags {
- 	NL80211_SCAN_FLAG_LOW_PRIORITY				= 1<<0,
-@@ -5675,6 +5971,7 @@ enum nl80211_scan_flags {
- 	NL80211_SCAN_FLAG_HIGH_ACCURACY				= 1<<10,
- 	NL80211_SCAN_FLAG_RANDOM_SN				= 1<<11,
- 	NL80211_SCAN_FLAG_MIN_PREQ_CONTENT			= 1<<12,
-+	NL80211_SCAN_FLAG_FREQ_KHZ				= 1<<13,
- };
- 
- /**
-@@ -6171,12 +6468,14 @@ enum nl80211_ftm_responder_stats {
-  * @NL80211_PREAMBLE_HT: HT preamble
-  * @NL80211_PREAMBLE_VHT: VHT preamble
-  * @NL80211_PREAMBLE_DMG: DMG preamble
-+ * @NL80211_PREAMBLE_HE: HE preamble
-  */
- enum nl80211_preamble {
- 	NL80211_PREAMBLE_LEGACY,
- 	NL80211_PREAMBLE_HT,
- 	NL80211_PREAMBLE_VHT,
- 	NL80211_PREAMBLE_DMG,
-+	NL80211_PREAMBLE_HE,
- };
- 
- /**
-@@ -6369,6 +6668,10 @@ enum nl80211_peer_measurement_attrs {
-  *	is valid)
-  * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST: u32 attribute indicating
-  *	the maximum FTMs per burst (if not present anything is valid)
-+ * @NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED: flag attribute indicating if
-+ *	trigger based ranging measurement is supported
-+ * @NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED: flag attribute indicating
-+ *	if non trigger based ranging measurement is supported
-  *
-  * @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal
-  * @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number
-@@ -6384,6 +6687,8 @@ enum nl80211_peer_measurement_ftm_capa {
- 	NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
- 	NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
- 	NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
-+	NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED,
-+	NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED,
- 
- 	/* keep last */
- 	NUM_NL80211_PMSR_FTM_CAPA_ATTR,
-@@ -6413,6 +6718,20 @@ enum nl80211_peer_measurement_ftm_capa {
-  * @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI: request LCI data (flag)
-  * @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC: request civic location data
-  *	(flag)
-+ * @NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED: request trigger based ranging
-+ *	measurement (flag).
-+ *	This attribute and %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED are
-+ *	mutually exclusive.
-+ *      if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
-+ *	%NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
-+ *	ranging will be used.
-+ * @NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED: request non trigger based
-+ *	ranging measurement (flag)
-+ *	This attribute and %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED are
-+ *	mutually exclusive.
-+ *      if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
-+ *	%NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
-+ *	ranging will be used.
-  *
-  * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
-  * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
-@@ -6429,6 +6748,8 @@ enum nl80211_peer_measurement_ftm_req {
- 	NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES,
- 	NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI,
- 	NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
-+	NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
-+	NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
- 
- 	/* keep last */
- 	NUM_NL80211_PMSR_FTM_REQ_ATTR,
-@@ -6568,5 +6889,51 @@ enum nl80211_obss_pd_attributes {
- 	NL80211_HE_OBSS_PD_ATTR_MAX = __NL80211_HE_OBSS_PD_ATTR_LAST - 1,
- };
- 
-+/**
-+ * enum nl80211_bss_color_attributes - BSS Color attributes
-+ * @__NL80211_HE_BSS_COLOR_ATTR_INVALID: Invalid
-+ *
-+ * @NL80211_HE_BSS_COLOR_ATTR_COLOR: the current BSS Color.
-+ * @NL80211_HE_BSS_COLOR_ATTR_DISABLED: is BSS coloring disabled.
-+ * @NL80211_HE_BSS_COLOR_ATTR_PARTIAL: the AID equation to be used..
-+ *
-+ * @__NL80211_HE_BSS_COLOR_ATTR_LAST: Internal
-+ * @NL80211_HE_BSS_COLOR_ATTR_MAX: highest BSS Color attribute.
-+ */
-+enum nl80211_bss_color_attributes {
-+	__NL80211_HE_BSS_COLOR_ATTR_INVALID,
-+
-+	NL80211_HE_BSS_COLOR_ATTR_COLOR,
-+	NL80211_HE_BSS_COLOR_ATTR_DISABLED,
-+	NL80211_HE_BSS_COLOR_ATTR_PARTIAL,
-+
-+	/* keep last */
-+	__NL80211_HE_BSS_COLOR_ATTR_LAST,
-+	NL80211_HE_BSS_COLOR_ATTR_MAX = __NL80211_HE_BSS_COLOR_ATTR_LAST - 1,
-+};
-+
-+/**
-+ * enum nl80211_iftype_akm_attributes - interface type AKM attributes
-+ * @__NL80211_IFTYPE_AKM_ATTR_INVALID: Invalid
-+ *
-+ * @NL80211_IFTYPE_AKM_ATTR_IFTYPES: nested attribute containing a flag
-+ *	attribute for each interface type that supports AKM suites specified in
-+ *	%NL80211_IFTYPE_AKM_ATTR_SUITES
-+ * @NL80211_IFTYPE_AKM_ATTR_SUITES: an array of u32. Used to indicate supported
-+ *	AKM suites for the specified interface types.
-+ *
-+ * @__NL80211_IFTYPE_AKM_ATTR_LAST: Internal
-+ * @NL80211_IFTYPE_AKM_ATTR_MAX: highest interface type AKM attribute.
-+ */
-+enum nl80211_iftype_akm_attributes {
-+	__NL80211_IFTYPE_AKM_ATTR_INVALID,
-+
-+	NL80211_IFTYPE_AKM_ATTR_IFTYPES,
-+	NL80211_IFTYPE_AKM_ATTR_SUITES,
-+
-+	/* keep last */
-+	__NL80211_IFTYPE_AKM_ATTR_LAST,
-+	NL80211_IFTYPE_AKM_ATTR_MAX = __NL80211_IFTYPE_AKM_ATTR_LAST - 1,
-+};
- 
- #endif /* __LINUX_NL80211_H */
--- 
-2.30.2
-
diff --git a/patches/cypress/brcmfmac/0001-brcmfmac-set-F2-blocksize-and-watermark-for-4373.patch b/patches/cypress/brcmfmac/0001-brcmfmac-set-F2-blocksize-and-watermark-for-4373.patch
deleted file mode 100644
index e29a9c6fcc26690ef775fb5eb162640eca973781..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0001-brcmfmac-set-F2-blocksize-and-watermark-for-4373.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 9f90c2d3a78758115c072f2aa2fbf05b7e3dd5da Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 20 Jun 2017 05:11:24 -0500
-Subject: [PATCH 001/138] brcmfmac: set F2 blocksize and watermark for 4373
-
-Set F2 blocksize to 256 bytes for 4373. It fixes DMA error while having
-UDP bi-directional traffic.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 10 +++++++++-
- 1 file changed, 9 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index fc12598..b646002 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -43,6 +43,7 @@
- 
- #define SDIO_FUNC1_BLOCKSIZE		64
- #define SDIO_FUNC2_BLOCKSIZE		512
-+#define SDIO_4373_FUNC2_BLOCKSIZE	256
- /* Maximum milliseconds to wait for F2 to come up */
- #define SDIO_WAIT_F2RDY	3000
- 
-@@ -903,6 +904,7 @@ static void brcmf_sdiod_host_fixup(struct mmc_host *host)
- static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- {
- 	int ret = 0;
-+	unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
- 
- 	sdio_claim_host(sdiodev->func1);
- 
-@@ -912,11 +914,17 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		sdio_release_host(sdiodev->func1);
- 		goto out;
- 	}
--	ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
-+
-+	if (sdiodev->func2->device == SDIO_DEVICE_ID_CYPRESS_4373)
-+		f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
-+
-+	ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
- 	if (ret) {
- 		brcmf_err("Failed to set F2 blocksize\n");
- 		sdio_release_host(sdiodev->func1);
- 		goto out;
-+	} else {
-+		brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz);
- 	}
- 
- 	/* increase F2 timeout */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0002-non-upstream-add-sg-parameters-dts-parsing.patch b/patches/cypress/brcmfmac/0002-non-upstream-add-sg-parameters-dts-parsing.patch
deleted file mode 100644
index d6609168503c9834633fe5fd34ba3651d948a70e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0002-non-upstream-add-sg-parameters-dts-parsing.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From e3159988b054f43ccdd477ea1b360581f68b4064 Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Tue, 15 Aug 2017 00:25:14 -0500
-Subject: [PATCH 002/138] non-upstream: add sg parameters dts parsing
-
-broken_sg_support, sd_head_align, and sd_sgentry_align are used in
-brcmfmac code but not configurable in dts file. Add the parsing logic.
-Now they can be configured like below in dts:
-	brcm,broken_sg_support;
-	brcm,sd_head_align = /bits/ 16 <4>;
-	brcm,sd_sgentry_align = /bits/ 16 <4>;
-
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c | 14 +++++++++++---
- 1 file changed, 11 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-index b886b56..e4f3493 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-@@ -20,7 +20,8 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
- 	struct property *prop;
- 	int irq;
- 	u32 irqf;
--	u32 val;
-+	u32 val32;
-+	u16 val16;
- 
- 	/* Set board-type to the first string of the machine compatible prop */
- 	root = of_find_node_by_path("/");
-@@ -34,8 +35,15 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
- 	    !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
- 		return;
- 
--	if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
--		sdio->drive_strength = val;
-+	if (of_property_read_u32(np, "brcm,drive-strength", &val32) == 0)
-+		sdio->drive_strength = val32;
-+
-+	sdio->broken_sg_support = of_property_read_bool(np,
-+			"brcm,broken_sg_support");
-+	if (of_property_read_u16(np, "brcm,sd_head_align", &val16) == 0)
-+		sdio->sd_head_align = val16;
-+	if (of_property_read_u16(np, "brcm,sd_sgentry_align", &val16) == 0)
-+		sdio->sd_sgentry_align = val16;
- 
- 	/* make sure there are interrupts defined in the node */
- 	if (!of_find_property(np, "interrupts", NULL))
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0003-brcmfmac-set-apsta-to-0-when-AP-starts-on-primary-in.patch b/patches/cypress/brcmfmac/0003-brcmfmac-set-apsta-to-0-when-AP-starts-on-primary-in.patch
deleted file mode 100644
index c6be046fa49320f187a063061fddbf7820d9360b..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0003-brcmfmac-set-apsta-to-0-when-AP-starts-on-primary-in.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From bb367a9d3e8f735270a98bb6dd35524576e2fe5d Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Mon, 11 Sep 2017 02:48:57 -0500
-Subject: [PATCH 003/138] brcmfmac: set apsta to 0 when AP starts on primary
- interface
-
-APSTA can work on two band concurrently with using VSDB(Virtual
-Simultaneous Dual-Band) or RSDB(Real Simultaneous Dual-Band) features.
-In this case, we have to keep apsta is 1 in firmware side.
-If we start wpa_supplicant on wlan0 and then start hostapd on wlan1, the
-apsta will be set to 0, and data will be stall on wlan0(station).
-Because that, we only set apsta to 0 when AP start on primary interface.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index e3ebb7a..7d2855a 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4584,9 +4584,7 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 			}
- 		}
- 
--		if ((dev_role == NL80211_IFTYPE_AP) &&
--		    ((ifp->ifidx == 0) ||
--		     !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
-+		if (dev_role == NL80211_IFTYPE_AP && ifp->ifidx == 0) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			if (err < 0) {
- 				bphy_err(drvr, "BRCMF_C_DOWN error %d\n",
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0004-brcmfmac-support-AP-isolation.patch b/patches/cypress/brcmfmac/0004-brcmfmac-support-AP-isolation.patch
deleted file mode 100644
index 0177462213515560c504a5bf0fa960e78be2e475..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0004-brcmfmac-support-AP-isolation.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 0e20f4d65b35c1348cc56d04804853d10fd4f6dd Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 31 Jan 2018 04:07:12 -0600
-Subject: [PATCH 004/138] brcmfmac: support AP isolation
-
-Hostap daemon has a parameter "ap_isolate which is used to prevent
-low-level bridging of frames between associated stations in the BSS.
-For driver side, we add cfg80211 ops method change_bss to support
-setting AP isolation from user space.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 21 +++++++++++++++++++++
- 1 file changed, 21 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 7d2855a..17a3df6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5233,6 +5233,26 @@ static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
- 	return brcmf_set_pmk(ifp, NULL, 0);
- }
- 
-+static int
-+brcmf_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev,
-+			  struct bss_parameters *params)
-+{
-+	struct brcmf_if *ifp;
-+	int ret = 0;
-+	u32 ap_isolate;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+	ifp = netdev_priv(dev);
-+	if (params->ap_isolate >= 0) {
-+		ap_isolate = (u32)params->ap_isolate;
-+		ret = brcmf_fil_iovar_int_set(ifp, "ap_isolate", ap_isolate);
-+		if (ret < 0)
-+			brcmf_err("ap_isolate iovar failed: ret=%d\n", ret);
-+	}
-+
-+	return ret;
-+}
-+
- static struct cfg80211_ops brcmf_cfg80211_ops = {
- 	.add_virtual_intf = brcmf_cfg80211_add_iface,
- 	.del_virtual_intf = brcmf_cfg80211_del_iface,
-@@ -5278,6 +5298,7 @@ static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
- 	.update_connect_params = brcmf_cfg80211_update_conn_params,
- 	.set_pmk = brcmf_cfg80211_set_pmk,
- 	.del_pmk = brcmf_cfg80211_del_pmk,
-+	.change_bss = brcmf_cfg80211_change_bss,
- };
- 
- struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0005-brcmfmac-make-firmware-eap_restrict-a-module-paramet.patch b/patches/cypress/brcmfmac/0005-brcmfmac-make-firmware-eap_restrict-a-module-paramet.patch
deleted file mode 100644
index f89e0163282296e9f1d1d724fa3368186066c5e6..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0005-brcmfmac-make-firmware-eap_restrict-a-module-paramet.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 58e4c55d4a0dfcc8f43774a5154903f72c478f4d Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 2 Mar 2018 00:45:32 -0600
-Subject: [PATCH 005/138] brcmfmac: make firmware eap_restrict a module
- parameter
-
-When eap_restrict is enabled, firmware will toss non-802.1x frames from
-tx/rx data path if station not yet authorized.
-Internal firmware eap_restrict is disabled by default. This patch makes
-it possible to enable firmware eap_restrict by specifying
-eap_restrict=1 as module parameter.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 +++++++++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c   | 5 +++++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h   | 2 ++
- 3 files changed, 16 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 17a3df6..9d2a382 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6758,6 +6758,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
- 	struct wireless_dev *wdev;
- 	struct brcmf_if *ifp;
- 	s32 power_mode;
-+	s32 eap_restrict;
- 	s32 err = 0;
- 
- 	if (cfg->dongle_up)
-@@ -6782,6 +6783,14 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
- 	err = brcmf_dongle_roam(ifp);
- 	if (err)
- 		goto default_conf_out;
-+
-+	eap_restrict = ifp->drvr->settings->eap_restrict;
-+	if (eap_restrict) {
-+		err = brcmf_fil_iovar_int_set(ifp, "eap_restrict",
-+					      eap_restrict);
-+		if (err)
-+			brcmf_info("eap_restrict error (%d)\n", err);
-+	}
- 	err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
- 					  NULL);
- 	if (err)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index dec25e4..cda6bef 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -67,6 +67,10 @@
- module_param_named(iapp, brcmf_iapp_enable, int, 0);
- MODULE_PARM_DESC(iapp, "Enable partial support for the obsoleted Inter-Access Point Protocol");
- 
-+static int brcmf_eap_restrict;
-+module_param_named(eap_restrict, brcmf_eap_restrict, int, 0400);
-+MODULE_PARM_DESC(eap_restrict, "Block non-802.1X frames until auth finished");
-+
- #ifdef DEBUG
- /* always succeed brcmf_bus_started() */
- static int brcmf_ignore_probe_fail;
-@@ -413,6 +417,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
- 	settings->fcmode = brcmf_fcmode;
- 	settings->roamoff = !!brcmf_roamoff;
- 	settings->iapp = !!brcmf_iapp_enable;
-+	settings->eap_restrict = !!brcmf_eap_restrict;
- #ifdef DEBUG
- 	settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;
- #endif
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-index 144cf45..059f09c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-@@ -37,6 +37,7 @@ struct brcmf_mp_global_t {
-  * @feature_disable: Feature_disable bitmask.
-  * @fcmode: FWS flow control.
-  * @roamoff: Firmware roaming off?
-+ * @eap_restrict: Not allow data tx/rx until 802.1X auth succeeds
-  * @ignore_probe_fail: Ignore probe failure.
-  * @country_codes: If available, pointer to struct for translating country codes
-  * @bus: Bus specific platform data. Only SDIO at the mmoment.
-@@ -47,6 +48,7 @@ struct brcmf_mp_device {
- 	int		fcmode;
- 	bool		roamoff;
- 	bool		iapp;
-+	bool		eap_restrict;
- 	bool		ignore_probe_fail;
- 	struct brcmfmac_pd_cc *country_codes;
- 	const char	*board_type;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0006-non-upstream-support-wake-on-ping-packet.patch b/patches/cypress/brcmfmac/0006-non-upstream-support-wake-on-ping-packet.patch
deleted file mode 100644
index 41a654bbbb1ca1f35e63c0f1c5c886c881139a07..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0006-non-upstream-support-wake-on-ping-packet.patch
+++ /dev/null
@@ -1,431 +0,0 @@
-From 9eb31dbff7611b815fd9f7ed75cbed7649b4884a Mon Sep 17 00:00:00 2001
-From: Double Lo <dblo@cypress.com>
-Date: Tue, 6 Feb 2018 05:07:05 -0600
-Subject: [PATCH 006/138] non-upstream: support wake on ping packet
-
-Host driver needs to provide a dummy wowlan filter for kernel and
-provided the the well configured wowlan stack. So the system will
-keep driver in connected state in suspend mode and can be wake
-up by ping packet.
-
-Enable unicast packet filter before system suspend and disable it after
-resume.
-
-Signed-off-by: Double Lo <dblo@cypress.com>
-Signed-off-by: Double Lo <double.lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  31 +++-
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         |   7 +
- .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  18 ++-
- .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 176 +++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/core.h    |   7 +-
- .../wireless/broadcom/brcm80211/brcmfmac/feature.c |   1 -
- .../wireless/broadcom/brcm80211/brcmfmac/fwil.h    |   2 +
- .../broadcom/brcm80211/brcmfmac/fwil_types.h       |  13 ++
- 8 files changed, 249 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 9d2a382..3815f14 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -3662,6 +3662,10 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
- 					    brcmf_notify_sched_scan_results);
- 			cfg->wowl.nd_enabled = false;
- 		}
-+
-+		/* disable packet filters */
-+		brcmf_pktfilter_enable(ifp->ndev, false);
-+
- 	}
- 	return 0;
- }
-@@ -3720,6 +3724,9 @@ static void brcmf_configure_wowl(struct brcmf_cfg80211_info *cfg,
- 	brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1);
- 	brcmf_bus_wowl_config(cfg->pub->bus_if, true);
- 	cfg->wowl.active = true;
-+
-+	/* enable packet filters */
-+	brcmf_pktfilter_enable(ifp->ndev, true);
- }
- 
- static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
-@@ -3766,7 +3773,7 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 		brcmf_set_mpc(ifp, 1);
- 
- 	} else {
--		/* Configure WOWL paramaters */
-+		/* Configure WOWL parameters */
- 		brcmf_configure_wowl(cfg, ifp, wowl);
- 	}
- 
-@@ -6598,6 +6605,7 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct wiphy_wowlan_support *wowl;
-+	struct cfg80211_wowlan *brcmf_wowlan_config = NULL;
- 
- 	wowl = kmemdup(&brcmf_wowlan_support, sizeof(brcmf_wowlan_support),
- 		       GFP_KERNEL);
-@@ -6620,6 +6628,27 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	}
- 
- 	wiphy->wowlan = wowl;
-+
-+	/* wowlan_config structure report for kernels */
-+	brcmf_wowlan_config = kzalloc(sizeof(*brcmf_wowlan_config),
-+				      GFP_KERNEL);
-+	if (brcmf_wowlan_config) {
-+		brcmf_wowlan_config->any = false;
-+		brcmf_wowlan_config->disconnect = true;
-+		brcmf_wowlan_config->eap_identity_req = true;
-+		brcmf_wowlan_config->four_way_handshake = true;
-+		brcmf_wowlan_config->rfkill_release = false;
-+		brcmf_wowlan_config->patterns = NULL;
-+		brcmf_wowlan_config->n_patterns = 0;
-+		brcmf_wowlan_config->tcp = NULL;
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
-+			brcmf_wowlan_config->gtk_rekey_failure = true;
-+		else
-+			brcmf_wowlan_config->gtk_rekey_failure = false;
-+	} else {
-+		brcmf_err("Can not allocate memory for brcm_wowlan_config\n");
-+	}
-+	wiphy->wowlan_config = brcmf_wowlan_config;
- #endif
- }
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 14d5bba..2e95ad4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -75,6 +75,13 @@
- 
- #define BRCMF_VIF_EVENT_TIMEOUT		msecs_to_jiffies(1500)
- 
-+/* cfg80211 wowlan definitions */
-+#define WL_WOWLAN_MAX_PATTERNS			8
-+#define WL_WOWLAN_MIN_PATTERN_LEN		1
-+#define WL_WOWLAN_MAX_PATTERN_LEN		255
-+#define WL_WOWLAN_PKT_FILTER_ID_FIRST	201
-+#define WL_WOWLAN_PKT_FILTER_ID_LAST	(WL_WOWLAN_PKT_FILTER_ID_FIRST + \
-+					WL_WOWLAN_MAX_PATTERNS - 1)
- /**
-  * enum brcmf_scan_status - scan engine status
-  *
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index cda6bef..3926d1e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -206,7 +206,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 	char *ptr;
- 	s32 err;
- 
--	/* retreive mac address */
-+	/* retrieve mac addresses */
- 	err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
- 				       sizeof(ifp->mac_addr));
- 	if (err < 0) {
-@@ -340,6 +340,18 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 
- 	/* Enable tx beamforming, errors can be ignored (not supported) */
- 	(void)brcmf_fil_iovar_int_set(ifp, "txbf", 1);
-+
-+	/* add unicast packet filter */
-+	err = brcmf_pktfilter_add_remove(ifp->ndev,
-+					 BRCMF_UNICAST_FILTER_NUM, true);
-+	if (err == -BRCMF_FW_UNSUPPORTED) {
-+		/* FW not support can be ignored */
-+		err = 0;
-+		goto done;
-+	} else if (err) {
-+		bphy_err(drvr, "Add unicast filter error (%d)\n", err);
-+	}
-+
- done:
- 	return err;
- }
-@@ -411,7 +423,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
- 	if (!settings)
- 		return NULL;
- 
--	/* start by using the module paramaters */
-+	/* start by using the module parameters */
- 	settings->p2p_enable = !!brcmf_p2p_enable;
- 	settings->feature_disable = brcmf_feature_disable;
- 	settings->fcmode = brcmf_fcmode;
-@@ -497,7 +509,7 @@ static int __init brcmfmac_module_init(void)
- 	if (err == -ENODEV)
- 		brcmf_dbg(INFO, "No platform data available.\n");
- 
--	/* Initialize global module paramaters */
-+	/* Initialize global module parameters */
- 	brcmf_mp_attach();
- 
- 	/* Continue the initialization by registering the different busses */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 85cf964..1b473f0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1475,3 +1475,179 @@ void __exit brcmf_core_exit(void)
- #endif
- }
- 
-+int
-+brcmf_pktfilter_add_remove(struct net_device *ndev, int filter_num, bool add)
-+{
-+	struct brcmf_if *ifp =  netdev_priv(ndev);
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_pkt_filter_le *pkt_filter;
-+	int filter_fixed_len = offsetof(struct brcmf_pkt_filter_le, u);
-+	int pattern_fixed_len = offsetof(struct brcmf_pkt_filter_pattern_le,
-+				  mask_and_pattern);
-+	u16 mask_and_pattern[MAX_PKTFILTER_PATTERN_SIZE];
-+	int buflen = 0;
-+	int ret = 0;
-+
-+	brcmf_dbg(INFO, "%s packet filter number %d\n",
-+		  (add ? "add" : "remove"), filter_num);
-+
-+	pkt_filter = kzalloc(sizeof(*pkt_filter) +
-+			(MAX_PKTFILTER_PATTERN_SIZE * 2), GFP_ATOMIC);
-+	if (!pkt_filter)
-+		return -ENOMEM;
-+
-+	switch (filter_num) {
-+	case BRCMF_UNICAST_FILTER_NUM:
-+		pkt_filter->id = 100;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 1;
-+		mask_and_pattern[0] = 0x0001;
-+		break;
-+	case BRCMF_BROADCAST_FILTER_NUM:
-+		//filter_pattern = "101 0 0 0 0xFFFFFFFFFFFF 0xFFFFFFFFFFFF";
-+		pkt_filter->id = 101;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 6;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0xFFFF;
-+		mask_and_pattern[2] = 0xFFFF;
-+		mask_and_pattern[3] = 0xFFFF;
-+		mask_and_pattern[4] = 0xFFFF;
-+		mask_and_pattern[5] = 0xFFFF;
-+		break;
-+	case BRCMF_MULTICAST4_FILTER_NUM:
-+		//filter_pattern = "102 0 0 0 0xFFFFFF 0x01005E";
-+		pkt_filter->id = 102;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 3;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0x01FF;
-+		mask_and_pattern[2] = 0x5E00;
-+		break;
-+	case BRCMF_MULTICAST6_FILTER_NUM:
-+		//filter_pattern = "103 0 0 0 0xFFFF 0x3333";
-+		pkt_filter->id = 103;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 2;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0x3333;
-+		break;
-+	case BRCMF_MDNS_FILTER_NUM:
-+		//filter_pattern = "104 0 0 0 0xFFFFFFFFFFFF 0x01005E0000FB";
-+		pkt_filter->id = 104;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 6;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0xFFFF;
-+		mask_and_pattern[2] = 0xFFFF;
-+		mask_and_pattern[3] = 0x0001;
-+		mask_and_pattern[4] = 0x005E;
-+		mask_and_pattern[5] = 0xFB00;
-+		break;
-+	case BRCMF_ARP_FILTER_NUM:
-+		//filter_pattern = "105 0 0 12 0xFFFF 0x0806";
-+		pkt_filter->id = 105;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 12;
-+		pkt_filter->u.pattern.size_bytes = 2;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0x0608;
-+		break;
-+	case BRCMF_BROADCAST_ARP_FILTER_NUM:
-+		//filter_pattern = "106 0 0 0
-+		//0xFFFFFFFFFFFF0000000000000806
-+		//0xFFFFFFFFFFFF0000000000000806";
-+		pkt_filter->id = 106;
-+		pkt_filter->type = 0;
-+		pkt_filter->negate_match = 0;
-+		pkt_filter->u.pattern.offset = 0;
-+		pkt_filter->u.pattern.size_bytes = 14;
-+		mask_and_pattern[0] = 0xFFFF;
-+		mask_and_pattern[1] = 0xFFFF;
-+		mask_and_pattern[2] = 0xFFFF;
-+		mask_and_pattern[3] = 0x0000;
-+		mask_and_pattern[4] = 0x0000;
-+		mask_and_pattern[5] = 0x0000;
-+		mask_and_pattern[6] = 0x0608;
-+		mask_and_pattern[7] = 0xFFFF;
-+		mask_and_pattern[8] = 0xFFFF;
-+		mask_and_pattern[9] = 0xFFFF;
-+		mask_and_pattern[10] = 0x0000;
-+		mask_and_pattern[11] = 0x0000;
-+		mask_and_pattern[12] = 0x0000;
-+		mask_and_pattern[13] = 0x0608;
-+		break;
-+	default:
-+		ret = -EINVAL;
-+		goto failed;
-+	}
-+	memcpy(pkt_filter->u.pattern.mask_and_pattern, mask_and_pattern,
-+	       pkt_filter->u.pattern.size_bytes * 2);
-+	buflen = filter_fixed_len + pattern_fixed_len +
-+		  pkt_filter->u.pattern.size_bytes * 2;
-+
-+	if (add) {
-+		/* Add filter */
-+		ifp->fwil_fwerr = true;
-+		ret = brcmf_fil_iovar_data_set(ifp, "pkt_filter_add",
-+					       pkt_filter, buflen);
-+		ifp->fwil_fwerr = false;
-+		if (ret)
-+			goto failed;
-+		drvr->pkt_filter[filter_num].id = pkt_filter->id;
-+		drvr->pkt_filter[filter_num].enable  = 0;
-+
-+	} else {
-+		/* Delete filter */
-+		ret = brcmf_fil_iovar_int_set(ifp, "pkt_filter_delete",
-+					      pkt_filter->id);
-+		if (ret == -ENOENT)
-+			ret = 0;
-+		if (ret)
-+			goto failed;
-+
-+		drvr->pkt_filter[filter_num].id = 0;
-+		drvr->pkt_filter[filter_num].enable  = 0;
-+	}
-+failed:
-+	if (ret)
-+		brcmf_err("%s packet filter failed, ret=%d\n",
-+			  (add ? "add" : "remove"), ret);
-+
-+	kfree(pkt_filter);
-+	return ret;
-+}
-+
-+int brcmf_pktfilter_enable(struct net_device *ndev, bool enable)
-+{
-+	struct brcmf_if *ifp =  netdev_priv(ndev);
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	int ret = 0;
-+	int idx = 0;
-+
-+	for (idx = 0; idx < MAX_PKT_FILTER_COUNT; ++idx) {
-+		if (drvr->pkt_filter[idx].id != 0) {
-+			drvr->pkt_filter[idx].enable = enable;
-+			ret = brcmf_fil_iovar_data_set(ifp, "pkt_filter_enable",
-+						       &drvr->pkt_filter[idx],
-+				sizeof(struct brcmf_pkt_filter_enable_le));
-+			if (ret) {
-+				brcmf_err("%s packet filter id(%d) failed, ret=%d\n",
-+					  (enable ? "enable" : "disable"),
-+					  drvr->pkt_filter[idx].id, ret);
-+			}
-+		}
-+	}
-+	return ret;
-+}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-index 6699637..6def862 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -12,6 +12,7 @@
- 
- #include <net/cfg80211.h>
- #include "fweh.h"
-+#include "fwil_types.h"
- 
- #define TOE_TX_CSUM_OL		0x00000001
- #define TOE_RX_CSUM_OL		0x00000002
-@@ -136,6 +137,8 @@ struct brcmf_pub {
- 	struct work_struct bus_reset;
- 
- 	u8 clmver[BRCMF_DCMD_SMLEN];
-+	struct brcmf_pkt_filter_enable_le pkt_filter[MAX_PKT_FILTER_COUNT];
-+
- };
- 
- /* forward declarations */
-@@ -213,5 +216,7 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
- int __init brcmf_core_init(void);
- void __exit brcmf_core_exit(void);
--
-+int brcmf_pktfilter_add_remove(struct net_device *ndev, int filter_num,
-+			       bool add);
-+int brcmf_pktfilter_enable(struct net_device *ndev, bool enable);
- #endif /* BRCMFMAC_CORE_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-index 2c3526a..565db6c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-@@ -16,7 +16,6 @@
- #include "feature.h"
- #include "common.h"
- 
--#define BRCMF_FW_UNSUPPORTED	23
- 
- /*
-  * expand feature list to array of feature strings.
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-index 0ff6f52..f2e00a3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-@@ -77,6 +77,8 @@
- #define BRCMF_C_SET_VAR				263
- #define BRCMF_C_SET_WSEC_PMK			268
- 
-+#define BRCMF_FW_UNSUPPORTED			23
-+
- s32 brcmf_fil_cmd_data_set(struct brcmf_if *ifp, u32 cmd, void *data, u32 len);
- s32 brcmf_fil_cmd_data_get(struct brcmf_if *ifp, u32 cmd, void *data, u32 len);
- s32 brcmf_fil_cmd_int_set(struct brcmf_if *ifp, u32 cmd, u32 data);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-index 37c5120..f3f7b15 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -136,6 +136,19 @@
- #define BRCMF_WOWL_MAXPATTERNS		8
- #define BRCMF_WOWL_MAXPATTERNSIZE	128
- 
-+enum {
-+	BRCMF_UNICAST_FILTER_NUM = 0,
-+	BRCMF_BROADCAST_FILTER_NUM,
-+	BRCMF_MULTICAST4_FILTER_NUM,
-+	BRCMF_MULTICAST6_FILTER_NUM,
-+	BRCMF_MDNS_FILTER_NUM,
-+	BRCMF_ARP_FILTER_NUM,
-+	BRCMF_BROADCAST_ARP_FILTER_NUM,
-+	MAX_PKT_FILTER_COUNT
-+};
-+
-+#define MAX_PKTFILTER_PATTERN_SIZE		16
-+
- #define BRCMF_COUNTRY_BUF_SZ		4
- #define BRCMF_ANT_MAX			4
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0007-non-upstream-remove-WOWL-configuration-in-disconnect.patch b/patches/cypress/brcmfmac/0007-non-upstream-remove-WOWL-configuration-in-disconnect.patch
deleted file mode 100644
index d10f89f00f7f6b41c5626a000593ffd5dcacedf4..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0007-non-upstream-remove-WOWL-configuration-in-disconnect.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From bb0a9d219769a0d7e2661c73366b99c1094b3dd0 Mon Sep 17 00:00:00 2001
-From: Double Lo <dblo@cypress.com>
-Date: Tue, 13 Mar 2018 03:22:20 -0500
-Subject: [PATCH 007/138] non-upstream: remove WOWL configuration in disconnect
- state
-
-Set wowl configuration in disconnect state is redundant.
-Remove it to fix no scan result issue after resume.
-
-Signed-off-by: Double Lo <dblo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 3815f14..d34448d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -3753,7 +3753,8 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
- 		brcmf_abort_scanning(cfg);
- 
--	if (wowl == NULL) {
-+	if (!wowl || !test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+			       &ifp->vif->sme_state)) {
- 		brcmf_bus_wowl_config(cfg->pub->bus_if, false);
- 		list_for_each_entry(vif, &cfg->vif_list, list) {
- 			if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state))
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0008-brcmfmac-make-setting-SDIO-workqueue-WQ_HIGHPRI-a-mo.patch b/patches/cypress/brcmfmac/0008-brcmfmac-make-setting-SDIO-workqueue-WQ_HIGHPRI-a-mo.patch
deleted file mode 100644
index 5851fbf9a6044c3ff8032379fe289c5b5df5ab3e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0008-brcmfmac-make-setting-SDIO-workqueue-WQ_HIGHPRI-a-mo.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-From 01bd17e3fb2a91767c8e622b4526538084b6385e Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Sun, 25 Mar 2018 21:53:42 -0500
-Subject: [PATCH 008/138] brcmfmac: make setting SDIO workqueue WQ_HIGHPRI a
- module parameter
-
-With setting sdio_wq_highpri=1 in module parameters, tasks submitted to
-SDIO workqueue will put at the head of the queue and run immediately.
-This parameter is for getting higher TX/RX throughput with SDIO bus.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  5 +++++
- .../wireless/broadcom/brcm80211/brcmfmac/common.h  |  2 ++
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 22 ++++++++++++++--------
- 3 files changed, 21 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index 3926d1e..41169bf 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -71,6 +71,10 @@
- module_param_named(eap_restrict, brcmf_eap_restrict, int, 0400);
- MODULE_PARM_DESC(eap_restrict, "Block non-802.1X frames until auth finished");
- 
-+static int brcmf_sdio_wq_highpri;
-+module_param_named(sdio_wq_highpri, brcmf_sdio_wq_highpri, int, 0);
-+MODULE_PARM_DESC(sdio_wq_highpri, "SDIO workqueue is set to high priority");
-+
- #ifdef DEBUG
- /* always succeed brcmf_bus_started() */
- static int brcmf_ignore_probe_fail;
-@@ -430,6 +434,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
- 	settings->roamoff = !!brcmf_roamoff;
- 	settings->iapp = !!brcmf_iapp_enable;
- 	settings->eap_restrict = !!brcmf_eap_restrict;
-+	settings->sdio_wq_highpri = !!brcmf_sdio_wq_highpri;
- #ifdef DEBUG
- 	settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;
- #endif
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-index 059f09c..0cb39b6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-@@ -38,6 +38,7 @@ struct brcmf_mp_global_t {
-  * @fcmode: FWS flow control.
-  * @roamoff: Firmware roaming off?
-  * @eap_restrict: Not allow data tx/rx until 802.1X auth succeeds
-+ * @sdio_wq_highpri: Tasks submitted to SDIO workqueue will run immediately.
-  * @ignore_probe_fail: Ignore probe failure.
-  * @country_codes: If available, pointer to struct for translating country codes
-  * @bus: Bus specific platform data. Only SDIO at the mmoment.
-@@ -49,6 +50,7 @@ struct brcmf_mp_device {
- 	bool		roamoff;
- 	bool		iapp;
- 	bool		eap_restrict;
-+	bool		sdio_wq_highpri;
- 	bool		ignore_probe_fail;
- 	struct brcmfmac_pd_cc *country_codes;
- 	const char	*board_type;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 264ad63..fbababf 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4322,9 +4322,21 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
- 	bus->txminmax = BRCMF_TXMINMAX;
- 	bus->tx_seq = SDPCM_SEQ_WRAP - 1;
- 
-+	/* attempt to attach to the dongle */
-+	if (!(brcmf_sdio_probe_attach(bus))) {
-+		brcmf_err("brcmf_sdio_probe_attach failed\n");
-+		goto fail;
-+	}
-+
- 	/* single-threaded workqueue */
--	wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
--				     dev_name(&sdiodev->func1->dev));
-+	if (sdiodev->settings->sdio_wq_highpri) {
-+		wq = alloc_workqueue("brcmf_wq/%s",
-+				     WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND,
-+				     1, dev_name(&sdiodev->func1->dev));
-+	} else {
-+		wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
-+					     dev_name(&sdiodev->func1->dev));
-+	}
- 	if (!wq) {
- 		brcmf_err("insufficient memory to create txworkqueue\n");
- 		goto fail;
-@@ -4333,12 +4345,6 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
- 	INIT_WORK(&bus->datawork, brcmf_sdio_dataworker);
- 	bus->brcmf_wq = wq;
- 
--	/* attempt to attach to the dongle */
--	if (!(brcmf_sdio_probe_attach(bus))) {
--		brcmf_err("brcmf_sdio_probe_attach failed\n");
--		goto fail;
--	}
--
- 	spin_lock_init(&bus->rxctl_lock);
- 	spin_lock_init(&bus->txq_lock);
- 	init_waitqueue_head(&bus->ctrl_wait);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0009-brcmfmac-remove-arp_hostip_clear-from-brcmf_netdev_s.patch b/patches/cypress/brcmfmac/0009-brcmfmac-remove-arp_hostip_clear-from-brcmf_netdev_s.patch
deleted file mode 100644
index 180b9ddd485da37908dc7ede44c981a45d08c70c..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0009-brcmfmac-remove-arp_hostip_clear-from-brcmf_netdev_s.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 931893fa6605f30a868c4f615eef40cd55c93a03 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 25 May 2018 02:02:04 -0500
-Subject: [PATCH 009/138] brcmfmac: remove "arp_hostip_clear" from
- "brcmf_netdev_stop"
-
-The firmware does not respond ARP request and causes ping failed with
-following steps.
-
-1. Bring up interface
-   ifconfig wlan0 up or start wpa_supplicant
-2. Set the IP address
-   ifconfig wlan0 192.168.100.10
-3. Bring down interface or
-   ifconfig wlan0 down or kill wpa_supplicant
-4. Bring up interface again and set the same IP address
-5. Connect to AP(192.168.100.1) and ping to AP will be failed.
-
-FMAC clears arp_hostip when bringing down the interface, but not set it
-back if setting the same IP address. We are able to see the IP address
-in interface info(inconfig wlan0) but the ping still cannot work because
-the firmware ARP offload does not respond the ARP request.
-Because of that, we remove "arp_hostip_clear" from function
-"brcmf_netdev_stop"
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 ---
- 1 file changed, 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 1b473f0..c4857a0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -579,9 +579,6 @@ static int brcmf_netdev_stop(struct net_device *ndev)
- 
- 	brcmf_cfg80211_down(ndev);
- 
--	if (ifp->drvr->bus_if->state == BRCMF_BUS_UP)
--		brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0);
--
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	return 0;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0010-brcmfmac-P2P-CERT-6.1.9-Support-GOUT-handling-P2P-Pr.patch b/patches/cypress/brcmfmac/0010-brcmfmac-P2P-CERT-6.1.9-Support-GOUT-handling-P2P-Pr.patch
deleted file mode 100644
index 27d0724e1726ee44603d39b26666c6c615507302..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0010-brcmfmac-P2P-CERT-6.1.9-Support-GOUT-handling-P2P-Pr.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From e8f083f0fd6279222652a0d9d4545abd565659fb Mon Sep 17 00:00:00 2001
-From: Madhan Mohan R <MadhanMohan.R@cypress.com>
-Date: Wed, 23 May 2018 17:22:44 +0530
-Subject: [PATCH 010/138] brcmfmac: P2P CERT 6.1.9-Support GOUT handling P2P
- Presence Request
-
-Send P2P Presence Response from the p2p interface address instead
-of the p2p device address.
-
-Signed-off-by: Madhan Mohan R <madhanmohan.r@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 9 ++++++++-
- 1 file changed, 8 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 7ba9f6a..7233b37 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -1491,6 +1491,7 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
- {
- 	struct brcmf_pub *drvr = p2p->cfg->pub;
- 	struct brcmf_cfg80211_vif *vif;
-+	struct brcmf_p2p_action_frame *p2p_act_frame;
- 	s32 err = 0;
- 	s32 timeout = 0;
- 
-@@ -1500,7 +1501,13 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
- 
--	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
-+	/* check if it is a p2p_presence response */
-+	p2p_act_frame = (struct brcmf_p2p_action_frame *)af_params->action_frame.data;
-+	if (p2p_act_frame->subtype == P2P_AF_PRESENCE_RSP)
-+		vif = p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif;
-+	else
-+		vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
-+
- 	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe", af_params,
- 					sizeof(*af_params));
- 	if (err) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0011-brcmfmac-only-generate-random-p2p-address-when-neede.patch b/patches/cypress/brcmfmac/0011-brcmfmac-only-generate-random-p2p-address-when-neede.patch
deleted file mode 100644
index 3be544aacc5a0392cdd972b7c513595aecbfa05c..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0011-brcmfmac-only-generate-random-p2p-address-when-neede.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 2f714f0e7b7132d36b5e4360a14014ddb65d9cbe Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Fri, 1 Jun 2018 05:22:05 -0500
-Subject: [PATCH 011/138] brcmfmac: only generate random p2p address when
- needed
-
-P2p spec mentioned that the p2p device address should be the globally
-administered address with locally administered bit set. Therefore,
-follow this guideline by default.
-
-When the primary interface is set to a locally administered address, the
-locally administered bit cannot be set again. Generate a random locally
-administered address for this case.
-
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 18 ++++++++++++++++--
- 1 file changed, 16 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 7233b37..4f15f4a 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -457,10 +457,21 @@ static int brcmf_p2p_set_firmware(struct brcmf_if *ifp, u8 *p2p_mac)
-  */
- static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- {
-+	struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
- 	bool random_addr = false;
-+	bool local_admin = false;
- 
--	if (!dev_addr || is_zero_ether_addr(dev_addr))
--		random_addr = true;
-+	if (!dev_addr || is_zero_ether_addr(dev_addr)) {
-+		/* If the primary interface address is already locally
-+		 * administered, create a new random address.
-+		 */
-+		if (pri_ifp->mac_addr[0] & 0x02) {
-+			random_addr = true;
-+		} else {
-+			dev_addr = pri_ifp->mac_addr;
-+			local_admin = true;
-+		}
-+	}
- 
- 	/* Generate the P2P Device Address obtaining a random ethernet
- 	 * address with the locally administered bit set.
-@@ -470,6 +481,9 @@ static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- 	else
- 		memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
- 
-+	if (local_admin)
-+		p2p->dev_addr[0] |= 0x02;
-+
- 	/* Generate the P2P Interface Address.  If the discovery and connection
- 	 * BSSCFGs need to simultaneously co-exist, then this address must be
- 	 * different from the P2P Device Address, but also locally administered.
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0012-brcmfmac-increase-max-hanger-slots-from-1K-to-3K-in-.patch b/patches/cypress/brcmfmac/0012-brcmfmac-increase-max-hanger-slots-from-1K-to-3K-in-.patch
deleted file mode 100644
index 6f08f8a8feb08d5e082bee94ca4bc423552168f2..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0012-brcmfmac-increase-max-hanger-slots-from-1K-to-3K-in-.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 812d348383b5f86ec7ef8d6046081e9039e1ebf5 Mon Sep 17 00:00:00 2001
-From: Madhan Mohan R <MadhanMohan.R@cypress.com>
-Date: Thu, 24 May 2018 14:19:00 +0530
-Subject: [PATCH 012/138] brcmfmac: increase max hanger slots from 1K to 3K in
- fws layer
-
-commit 	2bc50d8828ad7cc52ecd99f50074aa25f957af4 upstream.
-
-Will enable FMAC to push more packets to bus tx queue and help
-improve throughput when fws queuing is enabled. This change is
-required to tune the throughput for passing WMM CERT tests.
-
-Signed-off-by: Madhan Mohan R <madhanmohan.r@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Link: https://lore.kernel.org/r/1585124429-97371-5-git-send-email-chi-hsien.lin@cypress.com
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 2bd892d..9f7a72f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -404,7 +404,7 @@ struct brcmf_fws_mac_descriptor {
- 	u8 traffic_lastreported_bmp;
- };
- 
--#define BRCMF_FWS_HANGER_MAXITEMS	1024
-+#define BRCMF_FWS_HANGER_MAXITEMS	3072
- 
- /**
-  * enum brcmf_fws_hanger_item_state - state of hanger item.
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0013-brcmfmac-map-802.1d-priority-to-precedence-level-bas.patch b/patches/cypress/brcmfmac/0013-brcmfmac-map-802.1d-priority-to-precedence-level-bas.patch
deleted file mode 100644
index e160e4d91c8f5b7dc70436beab454925e2a34114..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0013-brcmfmac-map-802.1d-priority-to-precedence-level-bas.patch
+++ /dev/null
@@ -1,326 +0,0 @@
-From adf62ba90a461f7075352d9af7ff9ae93e943437 Mon Sep 17 00:00:00 2001
-From: Saravanan Shanmugham <sasm@cypress.com>
-Date: Wed, 13 Sep 2017 14:04:14 +0900
-Subject: [PATCH 013/138] brcmfmac: map 802.1d priority to precedence level
- based on AP WMM params
-
-In WLAN, priority among various access categories of traffic is
-always set by the AP using WMM parameters and this may not always
-follow the standard 802.1d priority.
-In this change, priority is adjusted based on the AP WMM params
-received as part of the Assoc Response and the same is later used
-to map the priority of all incoming traffic.
-
-This change should fix the following 802.11n certification tests:
-* 5.2.31 ACM Bit Conformance test
-* 5.2.32 AC Parameter Modification test
-
-Signed-off-by: Saravanan Shanmugham <sasm@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 145 +++++++++++++++++++++
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         |  24 ++++
- .../wireless/broadcom/brcm80211/brcmfmac/common.h  |   4 +
- .../broadcom/brcm80211/brcmfmac/fwsignal.c         |   4 +-
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    |  17 +--
- 5 files changed, 183 insertions(+), 11 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index d34448d..0cd0ea3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5454,12 +5454,126 @@ static void brcmf_clear_assoc_ies(struct brcmf_cfg80211_info *cfg)
- 	conn_info->resp_ie_len = 0;
- }
- 
-+u8 brcmf_map_prio_to_prec(void *config, u8 prio)
-+{
-+	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
-+
-+	if (!cfg)
-+		return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
-+		       (prio ^ 2) : prio;
-+
-+	/* For those AC(s) with ACM flag set to 1, convert its 4-level priority
-+	 * to an 8-level precedence which is the same as BE's
-+	 */
-+	if (prio > PRIO_8021D_EE &&
-+	    cfg->ac_priority[prio] == cfg->ac_priority[PRIO_8021D_BE])
-+		return cfg->ac_priority[prio] * 2;
-+
-+	/* Conversion of 4-level priority to 8-level precedence */
-+	if (prio == PRIO_8021D_BE || prio == PRIO_8021D_BK ||
-+	    prio == PRIO_8021D_CL || prio == PRIO_8021D_VO)
-+		return cfg->ac_priority[prio] * 2;
-+	else
-+		return cfg->ac_priority[prio] * 2 + 1;
-+}
-+
-+u8 brcmf_map_prio_to_aci(void *config, u8 prio)
-+{
-+	/* Prio here refers to the 802.1d priority in range of 0 to 7.
-+	 * ACI here refers to the WLAN AC Index in range of 0 to 3.
-+	 * This function will return ACI corresponding to input prio.
-+	 */
-+	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
-+
-+	if (cfg)
-+		return cfg->ac_priority[prio];
-+
-+	return prio;
-+}
-+
-+static void brcmf_wifi_prioritize_acparams(const
-+	struct brcmf_cfg80211_edcf_acparam *acp, u8 *priority)
-+{
-+	u8 aci;
-+	u8 aifsn;
-+	u8 ecwmin;
-+	u8 ecwmax;
-+	u8 acm;
-+	u8 ranking_basis[EDCF_AC_COUNT];
-+	u8 aci_prio[EDCF_AC_COUNT]; /* AC_BE, AC_BK, AC_VI, AC_VO */
-+	u8 index;
-+
-+	for (aci = 0; aci < EDCF_AC_COUNT; aci++, acp++) {
-+		aifsn  = acp->ACI & EDCF_AIFSN_MASK;
-+		acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0;
-+		ecwmin = acp->ECW & EDCF_ECWMIN_MASK;
-+		ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT;
-+		brcmf_dbg(CONN, "ACI %d aifsn %d acm %d ecwmin %d ecwmax %d\n",
-+			  aci, aifsn, acm, ecwmin, ecwmax);
-+		/* Default AC_VO will be the lowest ranking value */
-+		ranking_basis[aci] = aifsn + ecwmin + ecwmax;
-+		/* Initialise priority starting at 0 (AC_BE) */
-+		aci_prio[aci] = 0;
-+
-+		/* If ACM is set, STA can't use this AC as per 802.11.
-+		 * Change the ranking to BE
-+		 */
-+		if (aci != AC_BE && aci != AC_BK && acm == 1)
-+			ranking_basis[aci] = ranking_basis[AC_BE];
-+	}
-+
-+	/* Ranking method which works for AC priority
-+	 * swapping when values for cwmin, cwmax and aifsn are varied
-+	 * Compare each aci_prio against each other aci_prio
-+	 */
-+	for (aci = 0; aci < EDCF_AC_COUNT; aci++) {
-+		for (index = 0; index < EDCF_AC_COUNT; index++) {
-+			if (index != aci) {
-+				/* Smaller ranking value has higher priority,
-+				 * so increment priority for each ACI which has
-+				 * a higher ranking value
-+				 */
-+				if (ranking_basis[aci] < ranking_basis[index])
-+					aci_prio[aci]++;
-+			}
-+		}
-+	}
-+
-+	/* By now, aci_prio[] will be in range of 0 to 3.
-+	 * Use ACI prio to get the new priority value for
-+	 * each 802.1d traffic type, in this range.
-+	 */
-+
-+	/* 802.1d 0,3 maps to BE */
-+	priority[0] = aci_prio[AC_BE];
-+	priority[3] = aci_prio[AC_BE];
-+
-+	/* 802.1d 1,2 maps to BK */
-+	priority[1] = aci_prio[AC_BK];
-+	priority[2] = aci_prio[AC_BK];
-+
-+	/* 802.1d 4,5 maps to VO */
-+	priority[4] = aci_prio[AC_VI];
-+	priority[5] = aci_prio[AC_VI];
-+
-+	/* 802.1d 6,7 maps to VO */
-+	priority[6] = aci_prio[AC_VO];
-+	priority[7] = aci_prio[AC_VO];
-+
-+	brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n",
-+		  priority[0], priority[1], priority[2], priority[3]);
-+
-+	brcmf_dbg(CONN, "Adj prio VI 4->%d, VI 5->%d, VO 6->%d, VO 7->%d\n",
-+		  priority[4], priority[5], priority[6], priority[7]);
-+}
-+
- static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 			       struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct brcmf_cfg80211_assoc_ielen_le *assoc_info;
- 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
-+	struct brcmf_cfg80211_edcf_acparam edcf_acparam_info[EDCF_AC_COUNT];
- 	u32 req_len;
- 	u32 resp_len;
- 	s32 err = 0;
-@@ -5508,6 +5622,17 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 			    GFP_KERNEL);
- 		if (!conn_info->resp_ie)
- 			conn_info->resp_ie_len = 0;
-+
-+		err = brcmf_fil_iovar_data_get(ifp, "wme_ac_sta",
-+					       edcf_acparam_info,
-+					       sizeof(edcf_acparam_info));
-+		if (err) {
-+			brcmf_err("could not get wme_ac_sta (%d)\n", err);
-+			return err;
-+		}
-+
-+		brcmf_wifi_prioritize_acparams(edcf_acparam_info,
-+					       cfg->ac_priority);
- 	} else {
- 		conn_info->resp_ie_len = 0;
- 		conn_info->resp_ie = NULL;
-@@ -5825,6 +5950,25 @@ static void brcmf_init_conf(struct brcmf_cfg80211_conf *conf)
- 	conf->retry_long = (u32)-1;
- }
- 
-+static void brcmf_init_wmm_prio(u8 *priority)
-+{
-+	/* Initialize AC priority array to default
-+	 * 802.1d priority as per following table:
-+	 * 802.1d prio 0,3 maps to BE
-+	 * 802.1d prio 1,2 maps to BK
-+	 * 802.1d prio 4,5 maps to VI
-+	 * 802.1d prio 6,7 maps to VO
-+	 */
-+	priority[0] = AC_BE;
-+	priority[3] = AC_BE;
-+	priority[1] = AC_BK;
-+	priority[2] = AC_BK;
-+	priority[4] = AC_VI;
-+	priority[5] = AC_VI;
-+	priority[6] = AC_VO;
-+	priority[7] = AC_VO;
-+}
-+
- static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg)
- {
- 	brcmf_fweh_register(cfg->pub, BRCMF_E_LINK,
-@@ -5919,6 +6063,7 @@ static s32 wl_init_priv(struct brcmf_cfg80211_info *cfg)
- 	mutex_init(&cfg->usr_sync);
- 	brcmf_init_escan(cfg);
- 	brcmf_init_conf(cfg->conf);
-+	brcmf_init_wmm_prio(cfg->ac_priority);
- 	init_completion(&cfg->vif_disabled);
- 	return err;
- }
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 2e95ad4..e229df7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -23,6 +23,23 @@
- #define WL_ROAM_TRIGGER_LEVEL		-75
- #define WL_ROAM_DELTA			20
- 
-+/* WME Access Category Indices (ACIs) */
-+#define AC_BE			0	/* Best Effort */
-+#define AC_BK			1	/* Background */
-+#define AC_VI			2	/* Video */
-+#define AC_VO			3	/* Voice */
-+#define EDCF_AC_COUNT		4
-+#define MAX_8021D_PRIO		8
-+
-+#define EDCF_ACI_MASK			0x60
-+#define EDCF_ACI_SHIFT			5
-+#define EDCF_ACM_MASK                  0x10
-+#define EDCF_ECWMIN_MASK		0x0f
-+#define EDCF_ECWMAX_SHIFT		4
-+#define EDCF_AIFSN_MASK			0x0f
-+#define EDCF_AIFSN_MAX			15
-+#define EDCF_ECWMAX_MASK		0xf0
-+
- /* Keep BRCMF_ESCAN_BUF_SIZE below 64K (65536). Allocing over 64K can be
-  * problematic on some systems and should be avoided.
-  */
-@@ -210,6 +227,12 @@ struct brcmf_cfg80211_assoc_ielen_le {
- 	__le32 resp_len;
- };
- 
-+struct brcmf_cfg80211_edcf_acparam {
-+	u8 ACI;
-+	u8 ECW;
-+	u16 TXOP;        /* stored in network order (ls octet first) */
-+};
-+
- /* dongle escan state */
- enum wl_escan_state {
- 	WL_ESCAN_STATE_IDLE,
-@@ -328,6 +351,7 @@ struct brcmf_cfg80211_info {
- 	struct brcmf_assoclist_le assoclist;
- 	struct brcmf_cfg80211_wowl wowl;
- 	struct brcmf_pno_info *pno;
-+	u8 ac_priority[MAX_8021D_PRIO];
- };
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-index 0cb39b6..34991a8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-@@ -76,4 +76,8 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
- brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev) {}
- #endif
- 
-+u8 brcmf_map_prio_to_prec(void *cfg, u8 prio);
-+
-+u8 brcmf_map_prio_to_aci(void *cfg, u8 prio);
-+
- #endif /* BRCMFMAC_COMMON_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 9f7a72f..a3fe8a9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -2130,8 +2130,10 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
- 	skcb->if_flags = 0;
- 	skcb->state = BRCMF_FWS_SKBSTATE_NEW;
- 	brcmf_skb_if_flags_set_field(skb, INDEX, ifp->ifidx);
-+
-+	/* mapping from 802.1d priority to firmware fifo index */
- 	if (!multicast)
--		fifo = brcmf_fws_prio2fifo[skb->priority];
-+		fifo = brcmf_map_prio_to_aci(drvr->config, skb->priority);
- 
- 	brcmf_fws_lock(fws);
- 	if (fifo != BRCMF_FWS_FIFO_AC_BE && fifo < BRCMF_FWS_FIFO_BCMC)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index fbababf..59dd78f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -313,15 +313,6 @@ struct rte_console {
- #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
- #define BRCMF_SDIO_MAX_ACCESS_ERRORS	5
- 
--/*
-- * Conversion of 802.1D priority to precedence level
-- */
--static uint prio2prec(u32 prio)
--{
--	return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
--	       (prio^2) : prio;
--}
--
- #ifdef DEBUG
- /* Device console log buffer state */
- struct brcmf_console {
-@@ -2767,7 +2758,13 @@ static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
- 	skb_push(pkt, bus->tx_hdrlen);
- 	/* precondition: IS_ALIGNED((unsigned long)(pkt->data), 2) */
- 
--	prec = prio2prec((pkt->priority & PRIOMASK));
-+	/* In WLAN, priority is always set by the AP using WMM parameters
-+	 * and this need not always follow the standard 802.1d priority.
-+	 * Based on AP WMM config, map from 802.1d priority to corresponding
-+	 * precedence level.
-+	 */
-+	prec = brcmf_map_prio_to_prec(bus_if->drvr->config,
-+				      (pkt->priority & PRIOMASK));
- 
- 	/* Check for existing queue, current flow-control,
- 			 pending event, or pending clock */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0014-brcmfmac-set-state-of-hanger-slot-to-FREE-when-flush.patch b/patches/cypress/brcmfmac/0014-brcmfmac-set-state-of-hanger-slot-to-FREE-when-flush.patch
deleted file mode 100644
index 43de978a2507677fe4f89f68b2870dea00093fe4..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0014-brcmfmac-set-state-of-hanger-slot-to-FREE-when-flush.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From 0382192350062777e264fdc3399a7c2abae89e28 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 24 Jul 2018 01:21:30 -0500
-Subject: [PATCH 014/138] brcmfmac: set state of hanger slot to FREE when
- flushing PSQ
-
-When USB or SDIO device got abnormal bus disconnection, host driver
-tried to clean up the SKBs in PSQ and TXQ. The SKBs pointer in hanger
-linked to PSQ and TSQ, so we should set the state of skb hanger slot
-to BRCMF_FWS_HANGER_ITEM_STATE_FREE before freeing skb. In
-brcmf_fws_bus_txq_cleanup it already set BRCMF_FWS_HANGER_ITEM_STATE_FREE
-before freeing SKB, therefore we add this in brcmf_fws_psq_flush to
-avoid following warning message.
-
-   [ 1580.012880] ------------   [ cut here ]------------
-   [ 1580.017550] WARNING: CPU: 3 PID: 3065 at
-drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c:49
-brcmu_pkt_buf_free_skb+0x21/0x30 [brcmutil]
-   [ 1580.184017] Call Trace:
-   [ 1580.186514]  brcmf_fws_cleanup+0x14e/0x190 [brcmfmac]
-   [ 1580.191594]  brcmf_fws_del_interface+0x70/0x90 [brcmfmac]
-   [ 1580.197029]  brcmf_proto_bcdc_del_if+0xe/0x10 [brcmfmac]
-   [ 1580.202418]  brcmf_remove_interface+0x69/0x190 [brcmfmac]
-   [ 1580.207888]  brcmf_detach+0x90/0xe0 [brcmfmac]
-   [ 1580.212385]  brcmf_usb_disconnect+0x76/0xb0 [brcmfmac]
-   [ 1580.217557]  usb_unbind_interface+0x72/0x260
-   [ 1580.221857]  device_release_driver_internal+0x141/0x200
-   [ 1580.227152]  device_release_driver+0x12/0x20
-   [ 1580.231460]  bus_remove_device+0xfd/0x170
-   [ 1580.235504]  device_del+0x1d9/0x300
-   [ 1580.239041]  usb_disable_device+0x9e/0x270
-   [ 1580.243160]  usb_disconnect+0x94/0x270
-   [ 1580.246980]  hub_event+0x76d/0x13b0
-   [ 1580.250499]  process_one_work+0x144/0x360
-   [ 1580.254564]  worker_thread+0x4d/0x3c0
-   [ 1580.258247]  kthread+0x109/0x140
-   [ 1580.261515]  ? rescuer_thread+0x340/0x340
-   [ 1580.265543]  ? kthread_park+0x60/0x60
-   [ 1580.269237]  ? SyS_exit_group+0x14/0x20
-   [ 1580.273118]  ret_from_fork+0x25/0x30
-   [ 1580.300446] ------------   [ cut here ]------------
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index a3fe8a9..477db9b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -643,6 +643,7 @@ static inline int brcmf_fws_hanger_poppkt(struct brcmf_fws_hanger *h,
- static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
- 				int ifidx)
- {
-+	struct brcmf_fws_hanger_item *hi;
- 	bool (*matchfn)(struct sk_buff *, void *) = NULL;
- 	struct sk_buff *skb;
- 	int prec;
-@@ -654,6 +655,9 @@ static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
- 		skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx);
- 		while (skb) {
- 			hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
-+			hi = &fws->hanger.items[hslot];
-+			WARN_ON(skb != hi->pkt);
-+			hi->state = BRCMF_FWS_HANGER_ITEM_STATE_FREE;
- 			brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
- 						true);
- 			brcmu_pkt_buf_free_skb(skb);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0015-brcmfmac-add-RSDB-condition-when-setting-interface-c.patch b/patches/cypress/brcmfmac/0015-brcmfmac-add-RSDB-condition-when-setting-interface-c.patch
deleted file mode 100644
index be441c81b34a9d647e5abbc67067289838a2a56f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0015-brcmfmac-add-RSDB-condition-when-setting-interface-c.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From 31c3f05da222a31ea2b8866a74357c654238d5a5 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Thu, 12 Dec 2019 00:52:50 +0100
-Subject: [PATCH 015/138] brcmfmac: add RSDB condition when setting interface
- combinations
-
-commit 	837482e69a3f0d7cbc73922020012f83635f5ddb upstream.
-
-With firmware RSDB feature
-1. The maximum support interface is four.
-2. The maximum difference channel is two.
-3. The maximum interfaces of {station/p2p client/AP} are two.
-4. The maximum interface of p2p device is one.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Soeren Moch <smoch@web.de>
-Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 54 ++++++++++++++++++----
- 1 file changed, 46 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 0cd0ea3..35064d3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6626,6 +6626,9 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
-  *	#STA <= 1, #AP <= 1, channels = 1, 2 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-  *
-+ * no p2p and rsdb:
-+ *	#STA <= 2, #AP <= 2, channels = 2, 4 total
-+ *
-  * p2p, no mchan, and mbss:
-  *
-  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
-@@ -6637,6 +6640,10 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
-  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-+ *
-+ * p2p, rsdb, and no mbss:
-+ *	#STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-+ *	 channels = 2, 4 total
-  */
- static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
-@@ -6644,13 +6651,14 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	struct ieee80211_iface_limit *c0_limits = NULL;
- 	struct ieee80211_iface_limit *p2p_limits = NULL;
- 	struct ieee80211_iface_limit *mbss_limits = NULL;
--	bool mbss, p2p;
-+	bool mbss, p2p, rsdb;
- 	int i, c, n_combos;
- 
- 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
- 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
-+	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
- 
--	n_combos = 1 + !!p2p + !!mbss;
-+	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
- 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
- 	if (!combo)
- 		goto err;
-@@ -6661,16 +6669,36 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 
- 	c = 0;
- 	i = 0;
--	c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
-+	if (p2p && rsdb)
-+		c0_limits = kcalloc(4, sizeof(*c0_limits), GFP_KERNEL);
-+	else if (p2p)
-+		c0_limits = kcalloc(3, sizeof(*c0_limits), GFP_KERNEL);
-+	else
-+		c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
- 	if (!c0_limits)
- 		goto err;
--	c0_limits[i].max = 1;
--	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
--	if (p2p) {
-+	if (p2p && rsdb) {
-+		combo[c].num_different_channels = 2;
-+		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+					  BIT(NL80211_IFTYPE_P2P_GO) |
-+					  BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
-+				       BIT(NL80211_IFTYPE_P2P_GO);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = 5;
-+	} else if (p2p) {
- 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
- 			combo[c].num_different_channels = 2;
- 		else
- 			combo[c].num_different_channels = 1;
-+		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
- 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 					  BIT(NL80211_IFTYPE_P2P_GO) |
- 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
-@@ -6679,16 +6707,26 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 				       BIT(NL80211_IFTYPE_P2P_GO);
-+		combo[c].max_interfaces = i;
-+	} else if (rsdb) {
-+		combo[c].num_different_channels = 2;
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		c0_limits[i].max = 2;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = 3;
- 	} else {
- 		combo[c].num_different_channels = 1;
- 		c0_limits[i].max = 1;
-+		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
-+		combo[c].max_interfaces = i;
- 	}
--	combo[c].max_interfaces = i;
- 	combo[c].n_limits = i;
- 	combo[c].limits = c0_limits;
- 
--	if (p2p) {
-+	if (p2p && !rsdb) {
- 		c++;
- 		i = 0;
- 		p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0016-brcmfmac-not-set-mbss-in-vif-if-firmware-does-not-su.patch b/patches/cypress/brcmfmac/0016-brcmfmac-not-set-mbss-in-vif-if-firmware-does-not-su.patch
deleted file mode 100644
index 1e5ceef3785ed6b7e7074635534f5ce68c3d4abf..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0016-brcmfmac-not-set-mbss-in-vif-if-firmware-does-not-su.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From b6bc815ae2cee55e8623f8c8f0903583e1c37871 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Thu, 12 Dec 2019 00:52:51 +0100
-Subject: [PATCH 016/138] brcmfmac: not set mbss in vif if firmware does not
- support MBSS
-
-commit 2635853ce4ab7654a77ab7080fb56de83408606b upstream.
-
-With RSDB mode, FMAC and firmware are able to create 2 or more AP,
-so we should not set mbss in vif structure if firmware does not
-support MBSS feature.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Soeren Moch <smoch@web.de>
-Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 35064d3..1b7f999 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5328,6 +5328,7 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
- 	struct brcmf_cfg80211_vif *vif_walk;
- 	struct brcmf_cfg80211_vif *vif;
- 	bool mbss;
-+	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
- 
- 	brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
- 		  sizeof(*vif));
-@@ -5340,7 +5341,8 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
- 
- 	brcmf_init_prof(&vif->profile);
- 
--	if (type == NL80211_IFTYPE_AP) {
-+	if (type == NL80211_IFTYPE_AP &&
-+	    brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
- 		mbss = false;
- 		list_for_each_entry(vif_walk, &cfg->vif_list, list) {
- 			if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0017-brcmfmac-support-the-second-p2p-connection.patch b/patches/cypress/brcmfmac/0017-brcmfmac-support-the-second-p2p-connection.patch
deleted file mode 100644
index 0524967ed722ed037c6052f954c268938bf3f1da..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0017-brcmfmac-support-the-second-p2p-connection.patch
+++ /dev/null
@@ -1,161 +0,0 @@
-From 492685165586349bdf898a610c02c94e5df44473 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 29 Jun 2018 02:07:02 -0500
-Subject: [PATCH 017/138] brcmfmac: support the second p2p connection
-
-With RSDB feature, firmware is able to support two P2P-AGO or two
-P2P-GC at the same time. So we add the second p2p connection type
-to maps to driver's second P2P connection bsscfg.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 56 ++++++++++++++++++----
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.h |  9 ++--
- 2 files changed, 54 insertions(+), 11 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 4f15f4a..5128e35 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -17,6 +17,7 @@
- #include "fwil_types.h"
- #include "p2p.h"
- #include "cfg80211.h"
-+#include "feature.h"
- 
- /* parameters used for p2p escan */
- #define P2PAPI_SCAN_NPROBES 1
-@@ -488,9 +489,13 @@ static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr)
- 	 * BSSCFGs need to simultaneously co-exist, then this address must be
- 	 * different from the P2P Device Address, but also locally administered.
- 	 */
--	memcpy(p2p->int_addr, p2p->dev_addr, ETH_ALEN);
--	p2p->int_addr[0] |= 0x02;
--	p2p->int_addr[4] ^= 0x80;
-+	memcpy(p2p->conn_int_addr, p2p->dev_addr, ETH_ALEN);
-+	p2p->conn_int_addr[0] |= 0x02;
-+	p2p->conn_int_addr[4] ^= 0x80;
-+
-+	memcpy(p2p->conn2_int_addr, p2p->dev_addr, ETH_ALEN);
-+	p2p->conn2_int_addr[0] |= 0x02;
-+	p2p->conn2_int_addr[4] ^= 0x90;
- }
- 
- /**
-@@ -2015,7 +2020,7 @@ int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg,
- 
- 	if_request.type = cpu_to_le16((u16)if_type);
- 	if_request.chspec = cpu_to_le16(chanspec);
--	memcpy(if_request.addr, p2p->int_addr, sizeof(if_request.addr));
-+	memcpy(if_request.addr, p2p->conn_int_addr, sizeof(if_request.addr));
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 	err = brcmf_fil_iovar_data_set(vif->ifp, "p2p_ifupd", &if_request,
-@@ -2169,6 +2174,27 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
- 	return ERR_PTR(err);
- }
- 
-+int brcmf_p2p_get_conn_idx(struct brcmf_cfg80211_info *cfg)
-+{
-+	int i;
-+	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-+
-+	if (!ifp)
-+		return -ENODEV;
-+
-+	for (i = P2PAPI_BSSCFG_CONNECTION; i < P2PAPI_BSSCFG_MAX; i++) {
-+		if (!cfg->p2p.bss_idx[i].vif) {
-+			if (i == P2PAPI_BSSCFG_CONNECTION2 &&
-+			    !(brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB))) {
-+				brcmf_err("Multi p2p not supported");
-+				return -EIO;
-+			}
-+			return i;
-+		}
-+	}
-+	return -EIO;
-+}
-+
- /**
-  * brcmf_p2p_add_vif() - create a new P2P virtual interface.
-  *
-@@ -2188,7 +2214,9 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 	struct brcmf_pub *drvr = cfg->pub;
- 	struct brcmf_cfg80211_vif *vif;
- 	enum brcmf_fil_p2p_if_types iftype;
--	int err;
-+	int err = 0;
-+	int connidx;
-+	u8 *p2p_intf_addr;
- 
- 	if (brcmf_cfg80211_vif_event_armed(cfg))
- 		return ERR_PTR(-EBUSY);
-@@ -2214,9 +2242,21 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 		return (struct wireless_dev *)vif;
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 
--	err = brcmf_p2p_request_p2p_if(&cfg->p2p, ifp, cfg->p2p.int_addr,
--				       iftype);
-+	connidx = brcmf_p2p_get_conn_idx(cfg);
-+
-+	if (connidx == P2PAPI_BSSCFG_CONNECTION)
-+		p2p_intf_addr = cfg->p2p.conn_int_addr;
-+	else if (connidx == P2PAPI_BSSCFG_CONNECTION2)
-+		p2p_intf_addr = cfg->p2p.conn2_int_addr;
-+	else
-+		err = -EINVAL;
-+
-+	if (!err)
-+		err =  brcmf_p2p_request_p2p_if(&cfg->p2p, ifp,
-+						p2p_intf_addr, iftype);
-+
- 	if (err) {
-+		brcmf_err("request p2p interface failed\n");
- 		brcmf_cfg80211_arm_vif_event(cfg, NULL);
- 		goto fail;
- 	}
-@@ -2248,7 +2288,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
- 		goto fail;
- 	}
- 
--	cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
-+	cfg->p2p.bss_idx[connidx].vif = vif;
- 	/* Disable firmware roaming for P2P interface  */
- 	brcmf_fil_iovar_int_set(ifp, "roam_off", 1);
- 	if (iftype == BRCMF_FIL_P2P_IF_GO) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-index 64ab9b6..d2ecee5 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-@@ -14,13 +14,15 @@
-  *
-  * @P2PAPI_BSSCFG_PRIMARY: maps to driver's primary bsscfg.
-  * @P2PAPI_BSSCFG_DEVICE: maps to driver's P2P device discovery bsscfg.
-- * @P2PAPI_BSSCFG_CONNECTION: maps to driver's P2P connection bsscfg.
-+ * @P2PAPI_BSSCFG_CONNECTION: maps to driver's 1st P2P connection bsscfg.
-+ * @P2PAPI_BSSCFG_CONNECTION2: maps to driver's 2nd P2P connection bsscfg.
-  * @P2PAPI_BSSCFG_MAX: used for range checking.
-  */
- enum p2p_bss_type {
- 	P2PAPI_BSSCFG_PRIMARY, /* maps to driver's primary bsscfg */
- 	P2PAPI_BSSCFG_DEVICE, /* maps to driver's P2P device discovery bsscfg */
--	P2PAPI_BSSCFG_CONNECTION, /* maps to driver's P2P connection bsscfg */
-+	P2PAPI_BSSCFG_CONNECTION, /* driver's 1st P2P connection bsscfg */
-+	P2PAPI_BSSCFG_CONNECTION2, /* driver's 2nd P2P connection bsscfg */
- 	P2PAPI_BSSCFG_MAX
- };
- 
-@@ -119,7 +121,8 @@ struct brcmf_p2p_info {
- 	struct brcmf_cfg80211_info *cfg;
- 	unsigned long status;
- 	u8 dev_addr[ETH_ALEN];
--	u8 int_addr[ETH_ALEN];
-+	u8 conn_int_addr[ETH_ALEN];
-+	u8 conn2_int_addr[ETH_ALEN];
- 	struct p2p_bss bss_idx[P2PAPI_BSSCFG_MAX];
- 	struct timer_list listen_timer;
- 	u8 listen_channel;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0018-brcmfmac-add-support-for-BCM4359-SDIO-chipset.patch b/patches/cypress/brcmfmac/0018-brcmfmac-add-support-for-BCM4359-SDIO-chipset.patch
deleted file mode 100644
index 0306e54eb9f1cf4aeacce44cb681cb77df4d81b2..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0018-brcmfmac-add-support-for-BCM4359-SDIO-chipset.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From ba9a54116d4cfdb26f462b11310b9408b61315c2 Mon Sep 17 00:00:00 2001
-From: Soeren Moch <smoch@web.de>
-Date: Thu, 12 Dec 2019 00:52:49 +0100
-Subject: [PATCH 018/138] brcmfmac: add support for BCM4359 SDIO chipset
-
-commit 6581154be4a2b0f77ff789b09fade7c14ec3078c upstream.
-
-BCM4359 is a 2x2 802.11 abgn+ac Dual-Band HT80 combo chip and it
-supports Real Simultaneous Dual Band feature.
-
-Based on a similar patch by: Wright Feng <wright.feng@cypress.com>
-
-Signed-off-by: Soeren Moch <smoch@web.de>
-Acked-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 ++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c   | 1 +
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 2 ++
- include/linux/mmc/sdio_ids.h                              | 2 ++
- 4 files changed, 7 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index b646002..3ab5ab6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -977,8 +977,10 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_4373),
- 	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43012),
-+	BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_89359),
- 	{ /* end: all zeroes */ }
- };
- MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index dd586a9..e2dc1cfe 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -1361,6 +1361,7 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
- 		addr = CORE_CC_REG(base, sr_control0);
- 		reg = chip->ops->read32(chip->ctx, addr);
- 		return (reg & CC_SR_CTL0_ENABLE_MASK) != 0;
-+	case BRCM_CC_4359_CHIP_ID:
- 	case CY_CC_43012_CHIP_ID:
- 		addr = CORE_CC_REG(pmu->base, retention_ctl);
- 		reg = chip->ops->read32(chip->ctx, addr);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 59dd78f..b7a0fa3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -605,6 +605,7 @@ struct sdiod_drive_str {
- BRCMF_FW_DEF(43456, "brcmfmac43456-sdio");
- BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
- BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
-+BRCMF_FW_DEF(4359, "brcmfmac4359-sdio");
- BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
- BRCMF_FW_DEF(43012, "brcmfmac43012-sdio");
- 
-@@ -627,6 +628,7 @@ struct sdiod_drive_str {
- 	BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFDC0, 43455),
- 	BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
- 	BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
-+	BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
- 	BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
- 	BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012)
- };
-diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
-index 08b25c0..2e9a6e4 100644
---- a/include/linux/mmc/sdio_ids.h
-+++ b/include/linux/mmc/sdio_ids.h
-@@ -41,8 +41,10 @@
- #define SDIO_DEVICE_ID_BROADCOM_43455		0xa9bf
- #define SDIO_DEVICE_ID_BROADCOM_4354		0x4354
- #define SDIO_DEVICE_ID_BROADCOM_4356		0x4356
-+#define SDIO_DEVICE_ID_BROADCOM_4359		0x4359
- #define SDIO_DEVICE_ID_CYPRESS_4373		0x4373
- #define SDIO_DEVICE_ID_CYPRESS_43012		43012
-+#define SDIO_DEVICE_ID_CYPRESS_89359		0x4355
- 
- #define SDIO_VENDOR_ID_INTEL			0x0089
- #define SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX	0x1402
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0019-brcmfmac-send-port-authorized-event-for-FT-802.1X.patch b/patches/cypress/brcmfmac/0019-brcmfmac-send-port-authorized-event-for-FT-802.1X.patch
deleted file mode 100644
index 36e0ace746a5a1abadfa998bbf1a690adfda0444..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0019-brcmfmac-send-port-authorized-event-for-FT-802.1X.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From 510de966ba2dfac6113dff08abbb34b9a6c43c3d Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Thu, 9 May 2019 09:48:26 +0000
-Subject: [PATCH 019/138] brcmfmac: send port authorized event for FT-802.1X
-
-commit be898fed355e70b9115b439b4b9587b5fea2aca1 upstream.
-
-With FT-802.1X, driver should send a port authorized event right after
-sending a roamed event. It is used to indicate that a new AP is already
-authorized so 802.1X is not required.
-
-Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 ++++++++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 1 +
- 2 files changed, 9 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 1b7f999..188426f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1647,6 +1647,7 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 	u16 count;
- 
- 	profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
-+	profile->is_ft = false;
- 
- 	if (!sme->crypto.n_akm_suites)
- 		return 0;
-@@ -1691,11 +1692,13 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 			break;
- 		case WLAN_AKM_SUITE_FT_8021X:
- 			val = WPA2_AUTH_UNSPECIFIED | WPA2_AUTH_FT;
-+			profile->is_ft = true;
- 			if (sme->want_1x)
- 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
- 			break;
- 		case WLAN_AKM_SUITE_FT_PSK:
- 			val = WPA2_AUTH_PSK | WPA2_AUTH_FT;
-+			profile->is_ft = true;
- 			break;
- 		default:
- 			bphy_err(drvr, "invalid cipher group (%d)\n",
-@@ -5708,6 +5711,11 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
- 	brcmf_dbg(CONN, "Report roaming result\n");
- 
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) {
-+		cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
-+		brcmf_dbg(CONN, "Report port authorized\n");
-+	}
-+
- 	set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
- 	brcmf_dbg(TRACE, "Exit\n");
- 	return err;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index e229df7..3df57e1 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -146,6 +146,7 @@ struct brcmf_cfg80211_profile {
- 	struct brcmf_cfg80211_security sec;
- 	struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
- 	enum brcmf_profile_fwsup use_fwsup;
-+	bool is_ft;
- };
- 
- /**
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0020-brcmfmac-add-vendor-ie-for-association-responses.patch b/patches/cypress/brcmfmac/0020-brcmfmac-add-vendor-ie-for-association-responses.patch
deleted file mode 100644
index e94fc9927426fecf6bb85d0ad4d493ae7686c64a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0020-brcmfmac-add-vendor-ie-for-association-responses.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From bb8ba684418f6d515c342ca3faa79f5985bed9f8 Mon Sep 17 00:00:00 2001
-From: Ryohei Kondo <ryohei.kondo@cypress.com>
-Date: Mon, 20 Aug 2018 16:27:41 +0900
-Subject: [PATCH 020/138] brcmfmac: add vendor ie for association responses
-
-Miracast Certification clause 6.1.2 may fail if there is no WFD IE
-in P2P assoc response. This change allows WFD IE to be added to P2P assoc
-response.
-
-Related WFA certification.
-6.1.2 P-SnUT operating as a Group Owner accepts a WFD Session
-with a Reference Source
-
-Signed-off-by: Ryohei Kondo <ryohei.kondo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c    | 14 ++++++++++++++
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h    |  4 ++++
- 2 files changed, 18 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 188426f..0f217c7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4319,6 +4319,11 @@ s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
- 		mgmt_ie_len = &saved_ie->assoc_req_ie_len;
- 		mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie);
- 		break;
-+	case BRCMF_VNDR_IE_ASSOCRSP_FLAG:
-+		mgmt_ie_buf = saved_ie->assoc_res_ie;
-+		mgmt_ie_len = &saved_ie->assoc_res_ie_len;
-+		mgmt_ie_buf_len = sizeof(saved_ie->assoc_res_ie);
-+		break;
- 	default:
- 		err = -EPERM;
- 		bphy_err(drvr, "not suitable type\n");
-@@ -4465,6 +4470,15 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 	else
- 		brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
- 
-+	/* Set Assoc Response IEs to FW */
-+	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_ASSOCRSP_FLAG,
-+				    beacon->assocresp_ies,
-+				    beacon->assocresp_ies_len);
-+	if (err)
-+		brcmf_err("Set Assoc Resp IE Failed\n");
-+	else
-+		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc Resp\n");
-+
- 	return err;
- }
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 3df57e1..c9b3345 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -176,19 +176,23 @@ enum brcmf_vif_status {
-  * @probe_req_ie: IE info for probe request.
-  * @probe_res_ie: IE info for probe response.
-  * @beacon_ie: IE info for beacon frame.
-+ * @assoc_res_ie: IE info for association response frame.
-  * @probe_req_ie_len: IE info length for probe request.
-  * @probe_res_ie_len: IE info length for probe response.
-  * @beacon_ie_len: IE info length for beacon frame.
-+ * @assoc_res_ie_len: IE info length for association response frame.
-  */
- struct vif_saved_ie {
- 	u8  probe_req_ie[IE_MAX_LEN];
- 	u8  probe_res_ie[IE_MAX_LEN];
- 	u8  beacon_ie[IE_MAX_LEN];
- 	u8  assoc_req_ie[IE_MAX_LEN];
-+	u8  assoc_res_ie[IE_MAX_LEN];
- 	u32 probe_req_ie_len;
- 	u32 probe_res_ie_len;
- 	u32 beacon_ie_len;
- 	u32 assoc_req_ie_len;
-+	u32 assoc_res_ie_len;
- };
- 
- /**
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0021-brcmfmac-fix-4339-CRC-error-under-SDIO-3.0-SDR104-mo.patch b/patches/cypress/brcmfmac/0021-brcmfmac-fix-4339-CRC-error-under-SDIO-3.0-SDR104-mo.patch
deleted file mode 100644
index 651607d3363599a492c77436581122b76f2c6c3e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0021-brcmfmac-fix-4339-CRC-error-under-SDIO-3.0-SDR104-mo.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 7598a5cfb9c88b3223cdceae5d325cfde04706ad Mon Sep 17 00:00:00 2001
-From: Double Lo <dblo@cypress.com>
-Date: Wed, 5 Sep 2018 01:18:25 -0500
-Subject: [PATCH 021/138] brcmfmac: fix 4339 CRC error under SDIO 3.0 SDR104
- mode
-
-This patch fixes 4339 CRC error while running Tput test with
-suspend/resume test script.
-
-The continuous failure messages before system crash:
-brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
-brcmfmac: brcmf_sdio_rxglom: glom read of 25600 bytes failed: -5
-brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
-brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
-brcmfmac: brcmf_sdio_rxglom: glom read of 24576 bytes failed: -5
-brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
-
-Signed-off-by: Double Lo <dblo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 17 +++++++++++++++++
- 1 file changed, 17 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index b7a0fa3..fb1071f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -42,6 +42,10 @@
- #define DEFAULT_F2_WATERMARK    0x8
- #define CY_4373_F2_WATERMARK    0x40
- #define CY_43012_F2_WATERMARK    0x60
-+#define CY_4339_F2_WATERMARK    48
-+#define CY_4339_MES_WATERMARK	80
-+#define CY_4339_MESBUSYCTRL	(CY_4339_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- 
- #ifdef DEBUG
- 
-@@ -4204,6 +4208,19 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
- 			break;
-+		case SDIO_DEVICE_ID_BROADCOM_4339:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 4339\n",
-+				  CY_4339_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_4339_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_4339_MESBUSYCTRL, &err);
-+			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
- 					   DEFAULT_F2_WATERMARK, &err);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0022-brcmfmac-fix-the-incorrect-return-value-in-brcmf_inf.patch b/patches/cypress/brcmfmac/0022-brcmfmac-fix-the-incorrect-return-value-in-brcmf_inf.patch
deleted file mode 100644
index a3687216057fcd92941374bf4eb5e71ebd8cd088..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0022-brcmfmac-fix-the-incorrect-return-value-in-brcmf_inf.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 7816e4fe730011ac4c68f75279efb181c036e4a3 Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Tue, 4 Sep 2018 00:10:49 -0500
-Subject: [PATCH 022/138] brcmfmac: fix the incorrect return value in
- brcmf_inform_single_bss().
-
-commit bd9944918ceb28ede97f715d209e220db5e92c09 upstream.
-
-The function brcmf_inform_single_bss returns the value as success,
-even when the length exceeds the maximum value.
-The fix is to send appropriate code on this error.
-This issue is observed when SVT reported random fmac crashes
-when running their tests and the path was identified from the
-crash logs. With this fix the random failure issue in SVT was
-resolved.
-
-Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Link: https://lore.kernel.org/r/1585124429-97371-4-git-send-email-chi-hsien.lin@cypress.com
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 0f217c7..9e42b50 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2815,7 +2815,7 @@ static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
- 
- 	if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
- 		bphy_err(drvr, "Bss info is larger than buffer. Discarding\n");
--		return 0;
-+		return -EINVAL;
- 	}
- 
- 	if (!bi->ctl_ch) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0023-brcmfmac-Fix-double-freeing-in-the-fmac-usb-data-pat.patch b/patches/cypress/brcmfmac/0023-brcmfmac-Fix-double-freeing-in-the-fmac-usb-data-pat.patch
deleted file mode 100644
index 6593f790f2e3a04633f8ed77a2b3270387ebacb3..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0023-brcmfmac-Fix-double-freeing-in-the-fmac-usb-data-pat.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From fbd85bdf76af60b517c61e21e7ad99bcb7546c63 Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Fri, 7 Sep 2018 13:49:55 -0500
-Subject: [PATCH 023/138] brcmfmac: Fix double freeing in the fmac usb data
- path
-
-commit78179869dc3f5c0059bbf5d931a2717f1ad97ecd upstream.
-
-When the brcmf_fws_process_skb() fails to get hanger slot for
-queuing the skb, it tries to free the skb.
-But the caller brcmf_netdev_start_xmit() of that funciton frees
-the packet on error return value.
-This causes the double freeing and which caused the kernel crash.
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Link: https://lore.kernel.org/r/1585124429-97371-3-git-send-email-chi-hsien.lin@cypress.com
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 477db9b..a5db264 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -2151,8 +2151,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
- 		brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb);
- 		brcmf_fws_schedule_deq(fws);
- 	} else {
--		bphy_err(drvr, "drop skb: no hanger slot\n");
--		brcmf_txfinalize(ifp, skb, false);
-+		bphy_err(drvr, "no hanger slot available\n");
- 		rc = -ENOMEM;
- 	}
- 	brcmf_fws_unlock(fws);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0024-brcmfmac-Fix-driver-crash-on-USB-control-transfer-ti.patch b/patches/cypress/brcmfmac/0024-brcmfmac-Fix-driver-crash-on-USB-control-transfer-ti.patch
deleted file mode 100644
index 35ca0b7cf92bda0466e65c3cb325daa0faee34f0..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0024-brcmfmac-Fix-driver-crash-on-USB-control-transfer-ti.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 367f94fc13e313b5a3e0b13736f68aa84086519d Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Fri, 7 Sep 2018 14:07:07 -0500
-Subject: [PATCH 024/138] brcmfmac: Fix driver crash on USB control transfer
- timeout
-
-commit	93a5bfbc7cad8bf3dea81c9bc07761c1226a0860 upstream.
-
-When the control transfer gets timed out, the error status
-was returned without killing that urb, this leads to using
-the same urb. This issue causes the kernel crash as the same
-urb is sumbitted multiple times. The fix is to kill the
-urb for timeout transfer before returning error
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Link: https://lore.kernel.org/r/1585124429-97371-2-git-send-email-chi-hsien.lin@cypress.com
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index 7cdfde9..6e0b636 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -328,11 +328,12 @@ static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 		return err;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
--	clear_bit(0, &devinfo->ctl_op);
- 	if (!timeout) {
- 		brcmf_err("Txctl wait timed out\n");
-+		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
- 	}
-+	clear_bit(0, &devinfo->ctl_op);
- 	return err;
- }
- 
-@@ -358,11 +359,12 @@ static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
- 	err = devinfo->ctl_urb_status;
--	clear_bit(0, &devinfo->ctl_op);
- 	if (!timeout) {
- 		brcmf_err("rxctl wait timed out\n");
-+		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
- 	}
-+	clear_bit(0, &devinfo->ctl_op);
- 	if (!err)
- 		return devinfo->ctl_urb_actual_length;
- 	else
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0025-brcmfmac-avoid-network-disconnection-during-suspend-.patch b/patches/cypress/brcmfmac/0025-brcmfmac-avoid-network-disconnection-during-suspend-.patch
deleted file mode 100644
index fdedb454a6bde17d2eb9f578d7f3204ad383a5d7..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0025-brcmfmac-avoid-network-disconnection-during-suspend-.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 304078daa8134ce544e630658f659ec554858be3 Mon Sep 17 00:00:00 2001
-From: Double Lo <dblo@cypress.com>
-Date: Thu, 13 Sep 2018 03:07:29 -0500
-Subject: [PATCH 025/138] brcmfmac: avoid network disconnection during suspend
- with linux-3.8 and above kernel
-
-From linux-3.8 kernel, wowlan packet filter is mandated to avoid
-the disconnection of connected network before suspend in commit
-812569699119 ("cfg80211/mac80211: disconnect on suspend").
-So as a dummy wowlan filter is configured for kernels linux-3.8
-and above. Later all private command implementation of packet
-filters can be moved to wowlan based filters.
-
-Signed-off-by: Double Lo <dblo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 9e42b50..ae3f2d2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6931,8 +6931,7 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	wiphy->vendor_commands = brcmf_vendor_cmds;
- 	wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1;
- 
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
--		brcmf_wiphy_wowl_params(wiphy, ifp);
-+	brcmf_wiphy_wowl_params(wiphy, ifp);
- 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist,
- 				     sizeof(bandlist));
- 	if (err) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0026-brcmfmac-allow-credit-borrowing-for-all-access-categ.patch b/patches/cypress/brcmfmac/0026-brcmfmac-allow-credit-borrowing-for-all-access-categ.patch
deleted file mode 100644
index 84e6276bd1dd884f8a0454be60809911a59d7b4b..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0026-brcmfmac-allow-credit-borrowing-for-all-access-categ.patch
+++ /dev/null
@@ -1,148 +0,0 @@
-From 16772e747c128d825eb606af756dfed4af39e78d Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Tue, 11 Sep 2018 21:28:25 -0500
-Subject: [PATCH 026/138] brcmfmac: allow credit borrowing for all access
- categories
-
-Current credit borrowing allows only the access category BE to
-borrow the credits. This change is to fix the credit borrowing
-logic, to make borrowing available for all access categories
-and also to borrow only from the lower categories.
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/fwsignal.c         | 61 +++++++++++++---------
- 1 file changed, 37 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index a5db264..9f836c0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -405,6 +405,7 @@ struct brcmf_fws_mac_descriptor {
- };
- 
- #define BRCMF_FWS_HANGER_MAXITEMS	3072
-+#define BRCMF_BORROW_RATIO			3
- 
- /**
-  * enum brcmf_fws_hanger_item_state - state of hanger item.
-@@ -501,7 +502,8 @@ struct brcmf_fws_info {
- 	u32 fifo_enqpkt[BRCMF_FWS_FIFO_COUNT];
- 	int fifo_credit[BRCMF_FWS_FIFO_COUNT];
- 	int init_fifo_credit[BRCMF_FWS_FIFO_COUNT];
--	int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1];
-+	int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1]
-+		[BRCMF_FWS_FIFO_AC_VO + 1];
- 	int deq_node_pos[BRCMF_FWS_FIFO_COUNT];
- 	u32 fifo_credit_map;
- 	u32 fifo_delay_map;
-@@ -1211,13 +1213,11 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
- 	if (!credits)
- 		return;
- 
--	fws->fifo_credit_map |= 1 << fifo;
--
--	if ((fifo == BRCMF_FWS_FIFO_AC_BE) &&
--	    (fws->credits_borrowed[0])) {
-+	if (fifo > BRCMF_FWS_FIFO_AC_BK &&
-+	    fifo <= BRCMF_FWS_FIFO_AC_VO) {
- 		for (lender_ac = BRCMF_FWS_FIFO_AC_VO; lender_ac >= 0;
- 		     lender_ac--) {
--			borrowed = &fws->credits_borrowed[lender_ac];
-+			borrowed = &fws->credits_borrowed[fifo][lender_ac];
- 			if (*borrowed) {
- 				fws->fifo_credit_map |= (1 << lender_ac);
- 				fifo_credit = &fws->fifo_credit[lender_ac];
-@@ -1234,7 +1234,11 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
- 		}
- 	}
- 
--	fws->fifo_credit[fifo] += credits;
-+	if (credits) {
-+		fws->fifo_credit[fifo] += credits;
-+		fws->fifo_credit_map |= 1 << fifo;
-+	}
-+
- 	if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo])
- 		fws->fifo_credit[fifo] = fws->init_fifo_credit[fifo];
- 
-@@ -2031,27 +2035,31 @@ static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws,
- 	}
- }
- 
--static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws)
-+static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws,
-+				   int highest_lender_ac, int borrower_ac,
-+				   bool borrow_all)
- {
--	int lender_ac;
-+	int lender_ac, borrow_limit = 0;
- 
--	if (time_after(fws->borrow_defer_timestamp, jiffies)) {
--		fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE);
--		return -ENAVAIL;
--	}
-+	for (lender_ac = 0; lender_ac <= highest_lender_ac; lender_ac++) {
- 
--	for (lender_ac = 0; lender_ac <= BRCMF_FWS_FIFO_AC_VO; lender_ac++) {
--		if (fws->fifo_credit[lender_ac] > 0) {
--			fws->credits_borrowed[lender_ac]++;
-+		if (!borrow_all)
-+			borrow_limit =
-+			  fws->fifo_credit[lender_ac] / BRCMF_BORROW_RATIO;
-+		else
-+			borrow_limit = 0;
-+
-+		if (fws->fifo_credit[lender_ac] > borrow_limit) {
-+			fws->credits_borrowed[borrower_ac][lender_ac]++;
- 			fws->fifo_credit[lender_ac]--;
- 			if (fws->fifo_credit[lender_ac] == 0)
- 				fws->fifo_credit_map &= ~(1 << lender_ac);
--			fws->fifo_credit_map |= (1 << BRCMF_FWS_FIFO_AC_BE);
-+			fws->fifo_credit_map |= (1 << borrower_ac);
- 			brcmf_dbg(DATA, "borrow credit from: %d\n", lender_ac);
- 			return 0;
- 		}
- 	}
--	fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE);
-+	fws->fifo_credit_map &= ~(1 << borrower_ac);
- 	return -ENAVAIL;
- }
- 
-@@ -2242,9 +2250,10 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 			}
- 			continue;
- 		}
--		while ((fws->fifo_credit[fifo] > 0) ||
-+
-+		while ((fws->fifo_credit[fifo]) ||
- 		       ((!fws->bcmc_credit_check) &&
--			(fifo == BRCMF_FWS_FIFO_BCMC))) {
-+				(fifo == BRCMF_FWS_FIFO_BCMC))) {
- 			skb = brcmf_fws_deq(fws, fifo);
- 			if (!skb)
- 				break;
-@@ -2254,10 +2263,14 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 			if (fws->bus_flow_blocked)
- 				break;
- 		}
--		if ((fifo == BRCMF_FWS_FIFO_AC_BE) &&
--		    (fws->fifo_credit[fifo] <= 0) &&
--		    (!fws->bus_flow_blocked)) {
--			while (brcmf_fws_borrow_credit(fws) == 0) {
-+
-+		if (fifo >= BRCMF_FWS_FIFO_AC_BE &&
-+		    fifo <= BRCMF_FWS_FIFO_AC_VO &&
-+		    fws->fifo_credit[fifo] == 0 &&
-+		    !fws->bus_flow_blocked) {
-+			while (brcmf_fws_borrow_credit(fws,
-+						       fifo - 1, fifo,
-+						       true) == 0) {
- 				skb = brcmf_fws_deq(fws, fifo);
- 				if (!skb) {
- 					brcmf_fws_return_credits(fws, fifo, 1);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0027-non-upstream-Changes-to-improve-USB-Tx-throughput.patch b/patches/cypress/brcmfmac/0027-non-upstream-Changes-to-improve-USB-Tx-throughput.patch
deleted file mode 100644
index fb3b868b6b49eec7781eeb44e646b695d8631e04..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0027-non-upstream-Changes-to-improve-USB-Tx-throughput.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 23031efaa381badd9492043d13272b7e5cae99dd Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Tue, 11 Sep 2018 19:06:06 -0500
-Subject: [PATCH 027/138] non-upstream: Changes to improve USB Tx throughput.
-
-The inbound buffer been duplicated and returned to
-the upper layer to increase the througput.
-
-Below the improvement observed in different traffic
-UDP Rx	UDP Tx	TCP Rx	TCP Tx
-237	138	161	71	Without Tx improvement
-238	155	162	137	With Tx improvement
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index 6e0b636..f834561 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -603,6 +603,7 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		goto fail;
- 	}
- 
-+	skb_orphan(skb);
- 	req->skb = skb;
- 	req->devinfo = devinfo;
- 	usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0028-brcmfmac-reset-two-D11-cores-if-chip-has-two-D11-cor.patch b/patches/cypress/brcmfmac/0028-brcmfmac-reset-two-D11-cores-if-chip-has-two-D11-cor.patch
deleted file mode 100644
index 8cd7486fd2fba4000912589595669f87ab6561f9..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0028-brcmfmac-reset-two-D11-cores-if-chip-has-two-D11-cor.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From 4b98141e170ce0cb9c68b608a871c6277e73e50e Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Thu, 12 Dec 2019 00:52:45 +0100
-Subject: [PATCH 028/138] brcmfmac: reset two D11 cores if chip has two D11
- cores
-
-commit 1b8d2e0a9e4221b99eea375c079507ce8ef655f5 upstream.
-
-There are two D11 cores in RSDB chips like 4359. We have to reset two
-D11 cores simutaneously before firmware download, or the firmware may
-not be initialized correctly and cause "fw initialized failed" error.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Soeren Moch <smoch@web.de>
-Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/chip.c    | 50 ++++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/chip.h    |  1 +
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    |  2 +-
- 3 files changed, 52 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index e2dc1cfe..85cf408 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -433,11 +433,25 @@ static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset,
- {
- 	struct brcmf_chip_priv *ci;
- 	int count;
-+	struct brcmf_core *d11core2 = NULL;
-+	struct brcmf_core_priv *d11priv2 = NULL;
- 
- 	ci = core->chip;
- 
-+	/* special handle two D11 cores reset */
-+	if (core->pub.id == BCMA_CORE_80211) {
-+		d11core2 = brcmf_chip_get_d11core(&ci->pub, 1);
-+		if (d11core2) {
-+			brcmf_dbg(INFO, "found two d11 cores, reset both\n");
-+			d11priv2 = container_of(d11core2,
-+						struct brcmf_core_priv, pub);
-+		}
-+	}
-+
- 	/* must disable first to work for arbitrary current core state */
- 	brcmf_chip_ai_coredisable(core, prereset, reset);
-+	if (d11priv2)
-+		brcmf_chip_ai_coredisable(d11priv2, prereset, reset);
- 
- 	count = 0;
- 	while (ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL) &
-@@ -449,9 +463,30 @@ static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset,
- 		usleep_range(40, 60);
- 	}
- 
-+	if (d11priv2) {
-+		count = 0;
-+		while (ci->ops->read32(ci->ctx,
-+				       d11priv2->wrapbase + BCMA_RESET_CTL) &
-+				       BCMA_RESET_CTL_RESET) {
-+			ci->ops->write32(ci->ctx,
-+					 d11priv2->wrapbase + BCMA_RESET_CTL,
-+					 0);
-+			count++;
-+			if (count > 50)
-+				break;
-+			usleep_range(40, 60);
-+		}
-+	}
-+
- 	ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
- 			 postreset | BCMA_IOCTL_CLK);
- 	ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL);
-+
-+	if (d11priv2) {
-+		ci->ops->write32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL,
-+				 postreset | BCMA_IOCTL_CLK);
-+		ci->ops->read32(ci->ctx, d11priv2->wrapbase + BCMA_IOCTL);
-+	}
- }
- 
- char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
-@@ -1113,6 +1148,21 @@ void brcmf_chip_detach(struct brcmf_chip *pub)
- 	kfree(chip);
- }
- 
-+struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit)
-+{
-+	struct brcmf_chip_priv *chip;
-+	struct brcmf_core_priv *core;
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	list_for_each_entry(core, &chip->cores, list) {
-+		if (core->pub.id == BCMA_CORE_80211) {
-+			if (unit-- == 0)
-+				return &core->pub;
-+		}
-+	}
-+	return NULL;
-+}
-+
- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *pub, u16 coreid)
- {
- 	struct brcmf_chip_priv *chip;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-index 7b00f6a..8fa3865 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-@@ -74,6 +74,7 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx,
- 				     const struct brcmf_buscore_ops *ops);
- void brcmf_chip_detach(struct brcmf_chip *chip);
- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid);
-+struct brcmf_core *brcmf_chip_get_d11core(struct brcmf_chip *pub, u8 unit);
- struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip);
- struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub);
- bool brcmf_chip_iscoreup(struct brcmf_core *core);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 3be60ae..3e32347 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -78,7 +78,7 @@ enum brcmf_pcie_state {
- 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
- };
- 
--#define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */
-+#define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
- 
- #define BRCMF_PCIE_REG_MAP_SIZE			(32 * 1024)
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0029-brcmfmac-introduce-module-parameter-to-configure-def.patch b/patches/cypress/brcmfmac/0029-brcmfmac-introduce-module-parameter-to-configure-def.patch
deleted file mode 100644
index c72b990c37c19d7470765ffa0cf8788a78ebf5b5..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0029-brcmfmac-introduce-module-parameter-to-configure-def.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From babf0e6c709aed108e5902cea3c3f8e62830289a Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Mon, 17 Sep 2018 04:51:08 -0500
-Subject: [PATCH 029/138] brcmfmac: introduce module parameter to configure
- default PM mode
-
-Add module parameter max_pm to allow using PM_MAX as default power
-management mode. Default PM mode is set to PM_MAX when max_pm=1, and is
-set to PM_FAST when max_pm=0 or max_pm is not set.
-
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++--
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c   | 6 ++++++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h   | 2 ++
- 3 files changed, 10 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index ae3f2d2..26a88d4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2777,7 +2777,7 @@ static void brcmf_fill_bss_param(struct brcmf_if *ifp, struct station_info *si)
- 		goto done;
- 	}
- 
--	pm = enabled ? PM_FAST : PM_OFF;
-+	pm = enabled ? ifp->drvr->settings->default_pm : PM_OFF;
- 	/* Do not enable the power save after assoc if it is a p2p interface */
- 	if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) {
- 		brcmf_dbg(INFO, "Do not enable power save for P2P clients\n");
-@@ -7009,7 +7009,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
- 
- 	brcmf_dongle_scantime(ifp);
- 
--	power_mode = cfg->pwr_save ? PM_FAST : PM_OFF;
-+	power_mode = cfg->pwr_save ? ifp->drvr->settings->default_pm : PM_OFF;
- 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, power_mode);
- 	if (err)
- 		goto default_conf_out;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index 41169bf..7805bba 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -20,6 +20,7 @@
- #include "of.h"
- #include "firmware.h"
- #include "chip.h"
-+#include "defs.h"
- 
- MODULE_AUTHOR("Broadcom Corporation");
- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
-@@ -75,6 +76,10 @@
- module_param_named(sdio_wq_highpri, brcmf_sdio_wq_highpri, int, 0);
- MODULE_PARM_DESC(sdio_wq_highpri, "SDIO workqueue is set to high priority");
- 
-+static int brcmf_max_pm;
-+module_param_named(max_pm, brcmf_max_pm, int, 0);
-+MODULE_PARM_DESC(max_pm, "Use max power management mode by default");
-+
- #ifdef DEBUG
- /* always succeed brcmf_bus_started() */
- static int brcmf_ignore_probe_fail;
-@@ -435,6 +440,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
- 	settings->iapp = !!brcmf_iapp_enable;
- 	settings->eap_restrict = !!brcmf_eap_restrict;
- 	settings->sdio_wq_highpri = !!brcmf_sdio_wq_highpri;
-+	settings->default_pm = !!brcmf_max_pm ? PM_MAX : PM_FAST;
- #ifdef DEBUG
- 	settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;
- #endif
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-index 34991a8..c0bf586 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-@@ -39,6 +39,7 @@ struct brcmf_mp_global_t {
-  * @roamoff: Firmware roaming off?
-  * @eap_restrict: Not allow data tx/rx until 802.1X auth succeeds
-  * @sdio_wq_highpri: Tasks submitted to SDIO workqueue will run immediately.
-+ * @default_pm: default power management (PM) mode.
-  * @ignore_probe_fail: Ignore probe failure.
-  * @country_codes: If available, pointer to struct for translating country codes
-  * @bus: Bus specific platform data. Only SDIO at the mmoment.
-@@ -51,6 +52,7 @@ struct brcmf_mp_device {
- 	bool		iapp;
- 	bool		eap_restrict;
- 	bool		sdio_wq_highpri;
-+	int		default_pm;
- 	bool		ignore_probe_fail;
- 	struct brcmfmac_pd_cc *country_codes;
- 	const char	*board_type;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0030-brcmfmac-configure-wowl-parameters-in-suspend-functi.patch b/patches/cypress/brcmfmac/0030-brcmfmac-configure-wowl-parameters-in-suspend-functi.patch
deleted file mode 100644
index 7ccab659eef07b2682c06e68fe602de1fa9228c2..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0030-brcmfmac-configure-wowl-parameters-in-suspend-functi.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From d1381628ede9a015153ba40c3e120ee1063f0e3b Mon Sep 17 00:00:00 2001
-From: Double Lo <dblo@cypress.com>
-Date: Thu, 20 Sep 2018 01:44:01 -0500
-Subject: [PATCH 030/138] brcmfmac: configure wowl parameters in suspend
- function only if firmware support wowl
-
-This patch removes the redundant wowl configuration for none wowl
-FW.
-
-Signed-off-by: Double Lo <dblo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 26a88d4..eeb034d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -3777,8 +3777,9 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 		brcmf_set_mpc(ifp, 1);
- 
- 	} else {
--		/* Configure WOWL parameters */
--		brcmf_configure_wowl(cfg, ifp, wowl);
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
-+			/* Configure WOWL parameters */
-+			brcmf_configure_wowl(cfg, ifp, wowl);
- 	}
- 
- exit:
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0031-brcmfmac-keep-SDIO-watchdog-running-when-console_int.patch b/patches/cypress/brcmfmac/0031-brcmfmac-keep-SDIO-watchdog-running-when-console_int.patch
deleted file mode 100644
index e970a2ec16197f8795c5dc19aa0a2da05f3d8da1..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0031-brcmfmac-keep-SDIO-watchdog-running-when-console_int.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From b8f229e335d8a20962594f663141752fe0399614 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 14 Nov 2018 23:13:02 -0600
-Subject: [PATCH 031/138] brcmfmac: keep SDIO watchdog running when
- console_interval is non-zero
-
-brcmfmac host driver makes SDIO bus sleep and stops SDIO watchdog if no
-pending event or data. As a result, host driver does not poll firmware
-console buffer before buffer overflow, which leads to missing firmware
-logs. We should not stop SDIO watchdog if console_interval is non-zero
-in debug build.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index fb1071f..0c2db76 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -3685,7 +3685,11 @@ static void brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
- 			if (bus->idlecount > bus->idletime) {
- 				brcmf_dbg(SDIO, "idle\n");
- 				sdio_claim_host(bus->sdiodev->func1);
--				brcmf_sdio_wd_timer(bus, false);
-+#ifdef DEBUG
-+				if (!BRCMF_FWCON_ON() ||
-+				    bus->console_interval == 0)
-+#endif
-+					brcmf_sdio_wd_timer(bus, false);
- 				bus->idlecount = 0;
- 				brcmf_sdio_bus_sleep(bus, true, false);
- 				sdio_release_host(bus->sdiodev->func1);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0032-brcmfmac-To-fix-kernel-crash-on-out-of-boundary-acce.patch b/patches/cypress/brcmfmac/0032-brcmfmac-To-fix-kernel-crash-on-out-of-boundary-acce.patch
deleted file mode 100644
index ad59e92729b3229fa9c203e393838ed5a89f5b31..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0032-brcmfmac-To-fix-kernel-crash-on-out-of-boundary-acce.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From d46b2aadba500b1001bd2c6b63ce9d08514311a1 Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Mon, 12 Nov 2018 20:32:11 -0600
-Subject: [PATCH 032/138] brcmfmac: To fix kernel crash on out of boundary
- access
-
-To trunkcate the addtional bytes, if extra bytes been received.
-Current code only have a warning and proceed without handling it.
-But in one of the crash reported by DVT, these causes the
-crash intermittently. So the processing is limit to the skb->len.
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 9f836c0..e81204d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -1873,6 +1873,9 @@ void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb)
- 
- 	WARN_ON(siglen > skb->len);
- 
-+	if (siglen > skb->len)
-+		siglen = skb->len;
-+
- 	if (!siglen)
- 		return;
- 	/* if flow control disabled, skip to packet data and leave */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0033-brcmfmac-reduce-maximum-station-interface-from-2-to-.patch b/patches/cypress/brcmfmac/0033-brcmfmac-reduce-maximum-station-interface-from-2-to-.patch
deleted file mode 100644
index c964ec05c5af9fde9b555ef5ca53231ef9ee1e96..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0033-brcmfmac-reduce-maximum-station-interface-from-2-to-.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From d6f83b619b103e0274443a59ec818781788ab9a0 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 20 Nov 2018 21:20:41 -0600
-Subject: [PATCH 033/138] brcmfmac: reduce maximum station interface from 2 to
- 1 in RSDB mode
-
-The firmware state machines are not fully suitable for concurrent
-station interface support, it may hit unexpected error if we have 2
-different SSIDs and the roaming scenarios concurrently.
-To avoid the bad user-experience if this is not fully validated, we
-dis-allow user to create two concurrent station interfaces.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c  | 16 +++++++++++-----
- 1 file changed, 11 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index eeb034d..7e51a70 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6652,7 +6652,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-  *
-  * no p2p and rsdb:
-- *	#STA <= 2, #AP <= 2, channels = 2, 4 total
-+ *	#STA <= 1, #AP <= 2, channels = 2, 3 total
-  *
-  * p2p, no mchan, and mbss:
-  *
-@@ -6667,8 +6667,14 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-  *
-  * p2p, rsdb, and no mbss:
-- *	#STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-+ *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-  *	 channels = 2, 4 total
-+ *
-+ * p2p, rsdb, mbss
-+ *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
-+ *	 channels = 2, 4 total
-+ *	#AP <= 4, matching BI, channels = 1, 4 total
-+ *
-  */
- static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
-@@ -6707,7 +6713,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 					  BIT(NL80211_IFTYPE_P2P_GO) |
- 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
--		c0_limits[i].max = 2;
-+		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
- 		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
-@@ -6716,7 +6722,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 				       BIT(NL80211_IFTYPE_P2P_GO);
- 		c0_limits[i].max = 2;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
--		combo[c].max_interfaces = 5;
-+		combo[c].max_interfaces = 4;
- 	} else if (p2p) {
- 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
- 			combo[c].num_different_channels = 2;
-@@ -6735,7 +6741,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 		combo[c].max_interfaces = i;
- 	} else if (rsdb) {
- 		combo[c].num_different_channels = 2;
--		c0_limits[i].max = 2;
-+		c0_limits[i].max = 1;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
- 		c0_limits[i].max = 2;
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0034-brcmfmac-validate-ifp-pointer-in-brcmf_txfinalize.patch b/patches/cypress/brcmfmac/0034-brcmfmac-validate-ifp-pointer-in-brcmf_txfinalize.patch
deleted file mode 100644
index cb1a93a2eb3f536c7a60db59f3118dc56eb04c58..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0034-brcmfmac-validate-ifp-pointer-in-brcmf_txfinalize.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From f3b185be5badc92b8e0e85c61c23694b02ec8c05 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 21 Nov 2018 03:16:55 -0600
-Subject: [PATCH 034/138] brcmfmac: validate ifp pointer in brcmf_txfinalize
-
-We got ifp null pointer kernel panic in brcmf_txfinalize after removing
-Wi-Fi USB dongle when data was transmitting, The root cause is that
-interface was removed before calling brcmf_txfinalize in
-brcmf_fws_dequeue_worker and finally caused kernel panic.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index c4857a0..175f544 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -536,6 +536,11 @@ void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
- 	struct ethhdr *eh;
- 	u16 type;
- 
-+	if (!ifp) {
-+		brcmu_pkt_buf_free_skb(txp);
-+		return;
-+	}
-+
- 	eh = (struct ethhdr *)(txp->data);
- 	type = ntohs(eh->h_proto);
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0035-brcmfmac-clean-up-iface-mac-descriptor-before-de-ini.patch b/patches/cypress/brcmfmac/0035-brcmfmac-clean-up-iface-mac-descriptor-before-de-ini.patch
deleted file mode 100644
index d44f9f8484e7526e237e7f8d10c1f6ab0752b4a1..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0035-brcmfmac-clean-up-iface-mac-descriptor-before-de-ini.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From d0321119e5ab585d509e3b74aa3138fb089d756c Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 21 Nov 2018 20:42:39 -0600
-Subject: [PATCH 035/138] brcmfmac: clean up iface mac descriptor before
- de-initializing it
-
-We saw following warning message after removing USB Wi-Fi dongle with
-data connection. The root cause is that some skb were queued in iface
-mac descriptor psq and occupied the hanger slots, and we didn't de-queue
-the skb before de-initializing iface mac descriptor. So it triggered
-WARN_ON when cleaning up hanger slot eventually.
-
-backports/drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c:49
-brcmu_pkt_buf_free_skb+0x21/0x30 [brcmutil]
-[  977.523200] Modules linked in: brcmfmac(OE) brcmutil(OE) cfg80211(OE)
-compat(OE) sdhci_pci(OE) sdhci(OE) mmc_core(OE) rfkill ip6table_filter
-ip6_tables ebtable_nat ebtables dns_resolver fscache e1000e mei_me mei
-tpm_tis tpm_tis_core tpm iTCO_wdt ppdev iTCO_vendor_support pcspkr
-lpc_ich i2c_i801 mfd_core ptp pps_core parport_pc parport wmi uinput
-tcp_bic i915 iosf_mbi i2c_algo_bit drm_kms_helper drm i2c_core video
-[last unloaded: brcmfmac]
-[  977.523219] CPU: 1 PID: 1306 Comm: kworker/1:1 Tainted: G
-OE   4.12.0 #1
-[  977.523220] Hardware name:                  /DH77EB, BIOS
-EBH7710H.86A.0100.2013.0312.1351 03/12/2013
-[  977.523223] Workqueue: usb_hub_wq hub_event
-[  977.523224] task: ffff880118703600 task.stack: ffffc90000be4000
-[  977.523226] RIP: 0010:brcmu_pkt_buf_free_skb+0x21/0x30 [brcmutil]
-[  977.523227] RSP: 0018:ffffc90000be7a98 EFLAGS: 00010086
-[  977.523228] RAX: 0000000000000045 RBX: ffffffffa03fa850 RCX:
-0000000000000006
-[  977.523228] RDX: 0000000000000000 RSI: 0000000000000092 RDI:
-ffff8801106a3ce8
-[  977.523229] RBP: ffffc90000be7a98 R08: 0000000000000000 R09:
-000000000000045b
-[  977.523229] R10: 0000000000000001 R11: 0000000000aaaaaa R12:
-0000000000000988
-[  977.523230] R13: ffff880110569938 R14: 0000000000000002 R15:
-ffff8801106a3ce8
-[  977.523231] FS:  0000000000000000(0000) GS:ffff88011f280000(0000)
-knlGS:0000000000000000
-[  977.523232] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-[  977.523232] CR2: 00007f7873490000 CR3: 0000000001c09000 CR4:
-00000000001406e0
-[  977.523233] Call Trace:
-[  977.523244]  brcmf_fws_cleanup+0x1f2/0x230 [brcmfmac]
-[  977.523251]  brcmf_fws_del_interface+0x70/0x90 [brcmfmac]
-[  977.523257]  brcmf_proto_bcdc_del_if+0xe/0x10 [brcmfmac]
-[  977.523262]  brcmf_remove_interface+0x69/0x190 [brcmfmac]
-[  977.523267]  brcmf_detach+0x90/0xe0 [brcmfmac]
-[  977.523273]  brcmf_usb_disconnect+0x76/0xb0 [brcmfmac]
-[  977.523275]  usb_unbind_interface+0x72/0x260
-[  977.523279]  device_release_driver_internal+0x141/0x200
-[  977.523280]  device_release_driver+0x12/0x20
-[  977.523282]  bus_remove_device+0xfd/0x170
-[  977.523283]  device_del+0x1d9/0x300
-[  977.523284]  usb_disable_device+0x9e/0x270
-[  977.523286]  usb_disconnect+0x94/0x270
-[  977.523287]  usb_disconnect+0x1f1/0x270
-[  977.523288]  hub_event+0x76d/0x13b0
-[  977.523291]  process_one_work+0x144/0x360
-[  977.523293]  worker_thread+0x4d/0x3c0
-[  977.523294]  kthread+0x112/0x150
-[  977.523295]  ? rescuer_thread+0x340/0x340
-[  977.523296]  ? kthread_park+0x60/0x60
-[  977.523298]  ? SyS_exit_group+0x14/0x20
-[  977.523300]  ret_from_fork+0x25/0x30
-[  977.523301] Code: 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 85
-ff 74 15 48 83 3f 00 55 48 89 e5 75 0d be 01 00 00 00 e8 82 5a 3e e1 5d
-f3 c3 <0f> ff eb ef 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index e81204d..03153be 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -2208,6 +2208,7 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp)
- 
- 	brcmf_fws_lock(fws);
- 	ifp->fws_desc = NULL;
-+	brcmf_fws_macdesc_cleanup(fws, entry, ifp->ifidx);
- 	brcmf_dbg(TRACE, "deleting %s\n", entry->name);
- 	brcmf_fws_macdesc_cleanup(fws, &fws->desc.iface[ifp->ifidx],
- 				  ifp->ifidx);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0036-brcmfmac-To-fix-Bss-Info-flag-definition-Bug.patch b/patches/cypress/brcmfmac/0036-brcmfmac-To-fix-Bss-Info-flag-definition-Bug.patch
deleted file mode 100644
index 0d7a7e8a90618b1fbe73b8f1bad57744ee49695a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0036-brcmfmac-To-fix-Bss-Info-flag-definition-Bug.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 69e71efb50978d26192ebb24162f59c3057de66d Mon Sep 17 00:00:00 2001
-From: Prasanna Kerekoppa <prasanna.kerekoppa@cypress.com>
-Date: Tue, 4 Dec 2018 00:30:31 -0600
-Subject: [PATCH 036/138] brcmfmac: To fix Bss Info flag definition Bug
-
-Bss info flag definition need to be fixed from 0x2 to 0x4
-This flag is for rssi info received on channel.
-All Firmware branches defined as 0x4 and this is bug in brcmfmac.
-
-Signed-off-by: Prasanna Kerekoppa <prasanna.kerekoppa@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-index f3f7b15..ee728d6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -19,7 +19,7 @@
- #define BRCMF_ARP_OL_PEER_AUTO_REPLY	0x00000008
- 
- #define	BRCMF_BSS_INFO_VERSION	109 /* curr ver of brcmf_bss_info_le struct */
--#define BRCMF_BSS_RSSI_ON_CHANNEL	0x0002
-+#define BRCMF_BSS_RSSI_ON_CHANNEL	0x0004
- 
- #define BRCMF_STA_BRCM			0x00000001	/* Running a Broadcom driver */
- #define BRCMF_STA_WME			0x00000002	/* WMM association */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0037-brcmfmac-disable-command-decode-in-sdio_aos-for-4356.patch b/patches/cypress/brcmfmac/0037-brcmfmac-disable-command-decode-in-sdio_aos-for-4356.patch
deleted file mode 100644
index 7611f308aeb83c6b1f19822c55ba0f1dcad0fc81..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0037-brcmfmac-disable-command-decode-in-sdio_aos-for-4356.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 250a982731960580065a6af2233f90b4fc5653a0 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Mon, 17 Dec 2018 00:54:07 -0600
-Subject: [PATCH 037/138] brcmfmac: disable command decode in sdio_aos for 4356
-
-AOS is a part of the SDIOD core that becomes active when the rest of
-SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
-commands.
-
-Transaction between AOS and SDIOD is not protected, and if cmd 52 is
-received in AOS and in the middle of response state changed from AOS to
-SDIOD, response is corrupted and it causes to SDIO Host controller to
-hang.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 0c2db76..0ebbece 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -3378,7 +3378,9 @@ static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
- 
- static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
- {
--	if (bus->ci->chip == CY_CC_43012_CHIP_ID)
-+	if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4354_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4356_CHIP_ID)
- 		return true;
- 	else
- 		return false;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0038-brcmfmac-increase-default-max-WOWL-patterns-to-16.patch b/patches/cypress/brcmfmac/0038-brcmfmac-increase-default-max-WOWL-patterns-to-16.patch
deleted file mode 100644
index 6d007e21837e6366f2f1e551c9ad2627ae6306e3..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0038-brcmfmac-increase-default-max-WOWL-patterns-to-16.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From b5168f2f095daa1cb28c07f2030e6a0de74d7aee Mon Sep 17 00:00:00 2001
-From: Ryohei Kondo <ryohei.kondo@cypress.com>
-Date: Thu, 8 Nov 2018 10:37:29 +0900
-Subject: [PATCH 038/138] brcmfmac: increase default max WOWL patterns to 16
-
-4373 has support of 16 WOWL patterns thus increasing the default value
-
-Signed-off-by: Ryohei Kondo <ryohei.kondo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-index ee728d6..f504fd2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -133,7 +133,7 @@
- /* Link Down indication in WoWL mode: */
- #define BRCMF_WOWL_LINKDOWN		(1 << 31)
- 
--#define BRCMF_WOWL_MAXPATTERNS		8
-+#define BRCMF_WOWL_MAXPATTERNS		16
- #define BRCMF_WOWL_MAXPATTERNSIZE	128
- 
- enum {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0039-non-upstream-Enable-Process-and-forward-PHY_TEMP-eve.patch b/patches/cypress/brcmfmac/0039-non-upstream-Enable-Process-and-forward-PHY_TEMP-eve.patch
deleted file mode 100644
index 739467503f427c6298fa2d7ce24f1520681ea665..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0039-non-upstream-Enable-Process-and-forward-PHY_TEMP-eve.patch
+++ /dev/null
@@ -1,180 +0,0 @@
-From 4bb82070692d4c57d3a998185ea1b8f07848f376 Mon Sep 17 00:00:00 2001
-From: Robert Trask <robert.trask@cypress.com>
-Date: Thu, 20 Dec 2018 11:55:30 -0600
-Subject: [PATCH 039/138] non-upstream: Enable, Process, and forward PHY_TEMP
- event.
-
-New code enables PHY_TEMP event in firmware, receives it, processes
-into cfg80211 vendor specific event, and forwards to waiting host.
-
--1- Enable rx PHY_TEMP event from underlying hardware
--2- Process PHY_TEMP event into vendor specific event
--3- Forward vendor specific event to host layer
-
-Signed-off-by: Robert Trask <robert.trask@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  5 ++
- .../wireless/broadcom/brcm80211/brcmfmac/fweh.h    |  1 +
- .../wireless/broadcom/brcm80211/brcmfmac/vendor.c  | 57 ++++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/vendor.h  | 19 ++++++++
- 4 files changed, 82 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 7e51a70..2460054 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6870,6 +6870,7 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
- static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	const struct ieee80211_iface_combination *combo;
- 	struct ieee80211_supported_band *band;
- 	u16 max_interfaces = 0;
-@@ -6937,6 +6938,10 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	/* vendor commands/events support */
- 	wiphy->vendor_commands = brcmf_vendor_cmds;
- 	wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1;
-+	wiphy->vendor_events = brcmf_vendor_events;
-+	wiphy->n_vendor_events = BRCMF_VNDR_EVTS_LAST;
-+	brcmf_fweh_register(cfg->pub, BRCMF_E_PHY_TEMP,
-+			    brcmf_wiphy_phy_temp_evt_handler);
- 
- 	brcmf_wiphy_wowl_params(wiphy, ifp);
- 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-index a82f51b..8210509f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-@@ -90,6 +90,7 @@
- 	BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \
- 	BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \
- 	BRCMF_ENUM_DEF(TDLS_PEER_EVENT, 92) \
-+	BRCMF_ENUM_DEF(PHY_TEMP, 111) \
- 	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127)
- 
- #define BRCMF_ENUM_DEF(id, val) \
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-index d07e7c7..4ed3287 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-@@ -104,6 +104,56 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
- 	return ret;
- }
- 
-+s32
-+brcmf_wiphy_phy_temp_evt_handler(struct brcmf_if *ifp,
-+				 const struct brcmf_event_msg *e, void *data)
-+
-+{
-+	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
-+	struct wiphy *wiphy = cfg_to_wiphy(cfg);
-+	struct sk_buff *skb;
-+	struct nlattr *phy_temp_data;
-+	u32 version, temp, tempdelta;
-+	struct brcmf_phy_temp_evt *phy_temp_evt;
-+
-+	phy_temp_evt = (struct brcmf_phy_temp_evt *)data;
-+
-+	version = le32_to_cpu(phy_temp_evt->version);
-+	temp = le32_to_cpu(phy_temp_evt->temp);
-+	tempdelta = le32_to_cpu(phy_temp_evt->tempdelta);
-+
-+	skb = cfg80211_vendor_event_alloc(wiphy, NULL,
-+					  sizeof(*phy_temp_evt),
-+					  BRCMF_VNDR_EVTS_PHY_TEMP,
-+					  GFP_KERNEL);
-+
-+	if (!skb) {
-+		brcmf_dbg(EVENT, "NO MEM: can't allocate skb for vendor PHY_TEMP_EVENT\n");
-+		return -ENOMEM;
-+	}
-+
-+	phy_temp_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_EVENTS);
-+	if (!phy_temp_data) {
-+		nla_nest_cancel(skb, phy_temp_data);
-+		kfree_skb(skb);
-+		brcmf_dbg(EVENT, "skb could not nest vendor attributes\n");
-+		return -EMSGSIZE;
-+	}
-+
-+	if (nla_put_u32(skb, BRCMF_NLATTR_VERS, version) ||
-+	    nla_put_u32(skb, BRCMF_NLATTR_PHY_TEMP, temp) ||
-+	    nla_put_u32(skb, BRCMF_NLATTR_PHY_TEMPDELTA, tempdelta)) {
-+		kfree_skb(skb);
-+		brcmf_dbg(EVENT, "NO ROOM in skb for vendor PHY_TEMP_EVENT\n");
-+		return -EMSGSIZE;
-+	}
-+
-+	nla_nest_end(skb, phy_temp_data);
-+
-+	cfg80211_vendor_event(skb, GFP_KERNEL);
-+	return 0;
-+}
-+
- const struct wiphy_vendor_command brcmf_vendor_cmds[] = {
- 	{
- 		{
-@@ -116,3 +166,10 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
- 		.doit = brcmf_cfg80211_vndr_cmds_dcmd_handler
- 	},
- };
-+
-+const struct nl80211_vendor_cmd_info brcmf_vendor_events[] = {
-+	{
-+		.vendor_id = BROADCOM_OUI,
-+		.subcmd = BRCMF_VNDR_EVTS_PHY_TEMP,
-+	},
-+};
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h
-index 418f33ea..3bdf473 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.h
-@@ -14,6 +14,11 @@ enum brcmf_vndr_cmds {
- 	BRCMF_VNDR_CMDS_LAST
- };
- 
-+enum brcmf_vndr_evts {
-+	BRCMF_VNDR_EVTS_PHY_TEMP,
-+	BRCMF_VNDR_EVTS_LAST
-+};
-+
- /**
-  * enum brcmf_nlattrs - nl80211 message attributes
-  *
-@@ -25,11 +30,21 @@ enum brcmf_nlattrs {
- 
- 	BRCMF_NLATTR_LEN,
- 	BRCMF_NLATTR_DATA,
-+	BRCMF_NLATTR_VERS,
-+	BRCMF_NLATTR_PHY_TEMP,
-+	BRCMF_NLATTR_PHY_TEMPDELTA,
- 
- 	__BRCMF_NLATTR_AFTER_LAST,
- 	BRCMF_NLATTR_MAX = __BRCMF_NLATTR_AFTER_LAST - 1
- };
- 
-+/* structure of event sent up by firmware: is this the right place for it? */
-+struct brcmf_phy_temp_evt {
-+	__le32 version;
-+	__le32 temp;
-+	__le32 tempdelta;
-+} __packed;
-+
- /**
-  * struct brcmf_vndr_dcmd_hdr - message header for cfg80211 vendor command dcmd
-  *				support
-@@ -49,5 +64,9 @@ struct brcmf_vndr_dcmd_hdr {
- };
- 
- extern const struct wiphy_vendor_command brcmf_vendor_cmds[];
-+extern const struct nl80211_vendor_cmd_info brcmf_vendor_events[];
-+s32 brcmf_wiphy_phy_temp_evt_handler(struct brcmf_if *ifp,
-+				     const struct brcmf_event_msg *e,
-+				     void *data);
- 
- #endif /* _vendor_h_ */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0040-brcmfmac-Use-FW-priority-definition-to-initialize-WM.patch b/patches/cypress/brcmfmac/0040-brcmfmac-Use-FW-priority-definition-to-initialize-WM.patch
deleted file mode 100644
index a1c63b455cc3422a6b9e4de8780625a0b020e7f0..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0040-brcmfmac-Use-FW-priority-definition-to-initialize-WM.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From 3a47ab7ffe06d263ba44326a342e5f892954bbda Mon Sep 17 00:00:00 2001
-From: Justin Li <nenl@cypress.com>
-Date: Wed, 23 Jan 2019 03:32:16 -0600
-Subject: [PATCH 040/138] brcmfmac: Use FW priority definition to initialize
- WMM AC priority array
-
-It was observed that TCP Tx/Rx and UDP Tx showed very low throughput
-when fcmode=2. This is caused by incorrect default FIFO priority.
-BK FIFO queue was used for default 802.1D BE priority traffic.
-Hostapd relies on the correct priority setting to deliver good
-throughput.
-
-Signed-off-by: Justin Li <nenl@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 17 ++++++++--------
- .../broadcom/brcm80211/brcmfmac/fwsignal.c         | 22 ---------------------
- .../broadcom/brcm80211/brcmfmac/fwsignal.h         | 23 ++++++++++++++++++++++
- 3 files changed, 32 insertions(+), 30 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 2460054..8e17bb7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -22,6 +22,7 @@
- #include "p2p.h"
- #include "btcoex.h"
- #include "pno.h"
-+#include "fwsignal.h"
- #include "cfg80211.h"
- #include "feature.h"
- #include "fwil.h"
-@@ -5984,14 +5985,14 @@ static void brcmf_init_wmm_prio(u8 *priority)
- 	 * 802.1d prio 4,5 maps to VI
- 	 * 802.1d prio 6,7 maps to VO
- 	 */
--	priority[0] = AC_BE;
--	priority[3] = AC_BE;
--	priority[1] = AC_BK;
--	priority[2] = AC_BK;
--	priority[4] = AC_VI;
--	priority[5] = AC_VI;
--	priority[6] = AC_VO;
--	priority[7] = AC_VO;
-+	priority[0] = BRCMF_FWS_FIFO_AC_BE;
-+	priority[3] = BRCMF_FWS_FIFO_AC_BE;
-+	priority[1] = BRCMF_FWS_FIFO_AC_BK;
-+	priority[2] = BRCMF_FWS_FIFO_AC_BK;
-+	priority[4] = BRCMF_FWS_FIFO_AC_VI;
-+	priority[5] = BRCMF_FWS_FIFO_AC_VI;
-+	priority[6] = BRCMF_FWS_FIFO_AC_VO;
-+	priority[7] = BRCMF_FWS_FIFO_AC_VO;
- }
- 
- static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 03153be..86c6fc2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -311,28 +311,6 @@ struct brcmf_skbuff_cb {
- /* How long to defer borrowing in jiffies */
- #define BRCMF_FWS_BORROW_DEFER_PERIOD		(HZ / 10)
- 
--/**
-- * enum brcmf_fws_fifo - fifo indices used by dongle firmware.
-- *
-- * @BRCMF_FWS_FIFO_FIRST: first fifo, ie. background.
-- * @BRCMF_FWS_FIFO_AC_BK: fifo for background traffic.
-- * @BRCMF_FWS_FIFO_AC_BE: fifo for best-effort traffic.
-- * @BRCMF_FWS_FIFO_AC_VI: fifo for video traffic.
-- * @BRCMF_FWS_FIFO_AC_VO: fifo for voice traffic.
-- * @BRCMF_FWS_FIFO_BCMC: fifo for broadcast/multicast (AP only).
-- * @BRCMF_FWS_FIFO_ATIM: fifo for ATIM (AP only).
-- * @BRCMF_FWS_FIFO_COUNT: number of fifos.
-- */
--enum brcmf_fws_fifo {
--	BRCMF_FWS_FIFO_FIRST,
--	BRCMF_FWS_FIFO_AC_BK = BRCMF_FWS_FIFO_FIRST,
--	BRCMF_FWS_FIFO_AC_BE,
--	BRCMF_FWS_FIFO_AC_VI,
--	BRCMF_FWS_FIFO_AC_VO,
--	BRCMF_FWS_FIFO_BCMC,
--	BRCMF_FWS_FIFO_ATIM,
--	BRCMF_FWS_FIFO_COUNT
--};
- 
- /**
-  * enum brcmf_fws_txstatus - txstatus flag values.
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-index b486d57..b16a9d1 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-@@ -6,6 +6,29 @@
- #ifndef FWSIGNAL_H_
- #define FWSIGNAL_H_
- 
-+/**
-+ * enum brcmf_fws_fifo - fifo indices used by dongle firmware.
-+ *
-+ * @BRCMF_FWS_FIFO_FIRST: first fifo, ie. background.
-+ * @BRCMF_FWS_FIFO_AC_BK: fifo for background traffic.
-+ * @BRCMF_FWS_FIFO_AC_BE: fifo for best-effort traffic.
-+ * @BRCMF_FWS_FIFO_AC_VI: fifo for video traffic.
-+ * @BRCMF_FWS_FIFO_AC_VO: fifo for voice traffic.
-+ * @BRCMF_FWS_FIFO_BCMC: fifo for broadcast/multicast (AP only).
-+ * @BRCMF_FWS_FIFO_ATIM: fifo for ATIM (AP only).
-+ * @BRCMF_FWS_FIFO_COUNT: number of fifos.
-+ */
-+enum brcmf_fws_fifo {
-+	BRCMF_FWS_FIFO_FIRST,
-+	BRCMF_FWS_FIFO_AC_BK = BRCMF_FWS_FIFO_FIRST,
-+	BRCMF_FWS_FIFO_AC_BE,
-+	BRCMF_FWS_FIFO_AC_VI,
-+	BRCMF_FWS_FIFO_AC_VO,
-+	BRCMF_FWS_FIFO_BCMC,
-+	BRCMF_FWS_FIFO_ATIM,
-+	BRCMF_FWS_FIFO_COUNT
-+};
-+
- struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
- void brcmf_fws_detach(struct brcmf_fws_info *fws);
- void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0041-brcmfmac-Fix-P2P-Group-Formation-failure-via-Go-neg-.patch b/patches/cypress/brcmfmac/0041-brcmfmac-Fix-P2P-Group-Formation-failure-via-Go-neg-.patch
deleted file mode 100644
index 833f7d9d9acf69ade58828583d5b2b7a7297c0b5..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0041-brcmfmac-Fix-P2P-Group-Formation-failure-via-Go-neg-.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From 4905432b28b7a2eb6fea8494b20ad85599ff183d Mon Sep 17 00:00:00 2001
-From: Jia-Shyr Chuang <saint.chuang@cypress.com>
-Date: Wed, 30 Jan 2019 21:22:04 -0600
-Subject: [PATCH 041/138] brcmfmac: Fix P2P Group Formation failure via Go-neg
- method
-
-P2P group formation fails since either peer is not able to send go-neg
-confirm or dut is not able to send go-neg response. To fix this, retry
-limit should be increased and dwell time check should be added.
-
-Signed-off-by: Jia-Shyr Chuang <saint.chuang@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 28 ++++++++++++++++++++--
- 1 file changed, 26 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 5128e35..31862ca 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -60,7 +60,7 @@
- #define P2P_AF_MIN_DWELL_TIME		100
- #define P2P_AF_MED_DWELL_TIME		400
- #define P2P_AF_LONG_DWELL_TIME		1000
--#define P2P_AF_TX_MAX_RETRY		1
-+#define P2P_AF_TX_MAX_RETRY		5
- #define P2P_AF_MAX_WAIT_TIME		msecs_to_jiffies(2000)
- #define P2P_INVALID_CHANNEL		-1
- #define P2P_CHANNEL_SYNC_RETRY		5
-@@ -93,6 +93,9 @@
- #define P2PSD_ACTION_ID_GAS_CRESP	0x0d	/* GAS Comback Response AF */
- 
- #define BRCMF_P2P_DISABLE_TIMEOUT	msecs_to_jiffies(500)
-+
-+/* Mask for retry counter of custom dwell time */
-+#define CUSTOM_RETRY_MASK 0xff000000
- /**
-  * struct brcmf_p2p_disc_st_le - set discovery state in firmware.
-  *
-@@ -1666,6 +1669,17 @@ static s32 brcmf_p2p_pub_af_tx(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
-+static bool brcmf_p2p_check_dwell_overflow(s32 requested_dwell,
-+					   unsigned long dwell_jiffies)
-+{
-+	if ((requested_dwell & CUSTOM_RETRY_MASK) &&
-+	    (jiffies_to_msecs(jiffies - dwell_jiffies) >
-+	    (requested_dwell & ~CUSTOM_RETRY_MASK))) {
-+		brcmf_err("Action frame TX retry time over dwell time!\n");
-+		return true;
-+	}
-+	return false;
-+}
- /**
-  * brcmf_p2p_send_action_frame() - send action frame .
-  *
-@@ -1690,6 +1704,10 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	s32 tx_retry;
- 	s32 extra_listen_time;
- 	uint delta_ms;
-+	unsigned long dwell_jiffies = 0;
-+	bool dwell_overflow = false;
-+
-+	s32 requested_dwell = af_params->dwell_time;
- 
- 	action_frame = &af_params->action_frame;
- 	action_frame_len = le16_to_cpu(action_frame->len);
-@@ -1801,12 +1819,18 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 		/* update channel */
- 		af_params->channel = cpu_to_le32(afx_hdl->peer_chan);
- 	}
-+	dwell_jiffies = jiffies;
-+	dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
-+							dwell_jiffies);
- 
- 	tx_retry = 0;
- 	while (!p2p->block_gon_req_tx &&
--	       (ack == false) && (tx_retry < P2P_AF_TX_MAX_RETRY)) {
-+	       (!ack) && (tx_retry < P2P_AF_TX_MAX_RETRY) &&
-+		!dwell_overflow) {
- 		ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
- 		tx_retry++;
-+		dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
-+								dwell_jiffies);
- 	}
- 	if (ack == false) {
- 		bphy_err(drvr, "Failed to send Action Frame(retry %d)\n",
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0042-brcmfmac-Add-P2P-Action-Frame-retry-delay-to-fix-GAS.patch b/patches/cypress/brcmfmac/0042-brcmfmac-Add-P2P-Action-Frame-retry-delay-to-fix-GAS.patch
deleted file mode 100644
index fe1f028ae5ce2e11edcbc538b577f30274929865..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0042-brcmfmac-Add-P2P-Action-Frame-retry-delay-to-fix-GAS.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 02d935dc678db3fb6a8c578ac17eb5c216972c52 Mon Sep 17 00:00:00 2001
-From: Justin Li <nenl@cypress.com>
-Date: Wed, 27 Feb 2019 02:47:49 -0600
-Subject: [PATCH 042/138] brcmfmac: Add P2P Action Frame retry delay to fix GAS
- Comeback Response failure issue
-
-It was observed that P2P Cert. 5.1.19: DEVUT responds to Service
-Discovery request failed due to DUT did not send GAS Comeback Response
-after receiving request from test bed P2P peer. To fix this issue,
-we need to add P2P Action Frame retry delay to enhance P2P connection
-under VSDB and noisy environment, since the peer can be in other
-channels under VSDB.
-
-Signed-off-by: Justin Li <nenl@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 31862ca..793b5a0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -66,6 +66,7 @@
- #define P2P_CHANNEL_SYNC_RETRY		5
- #define P2P_AF_FRM_SCAN_MAX_WAIT	msecs_to_jiffies(450)
- #define P2P_DEFAULT_SLEEP_TIME_VSDB	200
-+#define P2P_AF_RETRY_DELAY_TIME		40
- 
- /* WiFi P2P Public Action Frame OUI Subtypes */
- #define P2P_PAF_GON_REQ		0	/* Group Owner Negotiation Req */
-@@ -1827,6 +1828,9 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	while (!p2p->block_gon_req_tx &&
- 	       (!ack) && (tx_retry < P2P_AF_TX_MAX_RETRY) &&
- 		!dwell_overflow) {
-+		if (af_params->channel)
-+			msleep(P2P_AF_RETRY_DELAY_TIME);
-+
- 		ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
- 		tx_retry++;
- 		dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0043-brcmfmac-Use-default-FW-priority-when-EDCA-params-sa.patch b/patches/cypress/brcmfmac/0043-brcmfmac-Use-default-FW-priority-when-EDCA-params-sa.patch
deleted file mode 100644
index 4f01f21d31e2fd8ba196f6bffe34501cbb3f4083..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0043-brcmfmac-Use-default-FW-priority-when-EDCA-params-sa.patch
+++ /dev/null
@@ -1,124 +0,0 @@
-From 702111931ee792f84160ea807b9ac9b650c5a543 Mon Sep 17 00:00:00 2001
-From: Madhan Mohan R <madhanmohan.r@cypress.com>
-Date: Wed, 27 Feb 2019 03:36:42 -0600
-Subject: [PATCH 043/138] brcmfmac: Use default FW priority when EDCA params
- same for all ACs
-
-In brcmfmac driver, all ACs were assgined a FW priority based on the
-EDCA parameters from AP. In a specific scenario where EDCA parameters
-are configured to be same for all ACs, we propose to use the default
-FW priority definition to avoid queuing packets of all ACs to the
-same priority queue.
-Also in case of fcmode=2, throughput of any AC would have depended on
-available credits of a single AC, without this fix.
-
-Fixes 11AC CERT 5.2.33 TXOP Limit test
-
-Signed-off-by: Madhan Mohan R <madhanmohan.r@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 70 ++++++++++++----------
- 1 file changed, 39 insertions(+), 31 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 8e17bb7..ce2a79b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5512,6 +5512,25 @@ u8 brcmf_map_prio_to_aci(void *config, u8 prio)
- 	return prio;
- }
- 
-+static void brcmf_init_wmm_prio(u8 *priority)
-+{
-+	/* Initialize AC priority array to default
-+	 * 802.1d priority as per following table:
-+	 * 802.1d prio 0,3 maps to BE
-+	 * 802.1d prio 1,2 maps to BK
-+	 * 802.1d prio 4,5 maps to VI
-+	 * 802.1d prio 6,7 maps to VO
-+	 */
-+	priority[0] = BRCMF_FWS_FIFO_AC_BE;
-+	priority[3] = BRCMF_FWS_FIFO_AC_BE;
-+	priority[1] = BRCMF_FWS_FIFO_AC_BK;
-+	priority[2] = BRCMF_FWS_FIFO_AC_BK;
-+	priority[4] = BRCMF_FWS_FIFO_AC_VI;
-+	priority[5] = BRCMF_FWS_FIFO_AC_VI;
-+	priority[6] = BRCMF_FWS_FIFO_AC_VO;
-+	priority[7] = BRCMF_FWS_FIFO_AC_VO;
-+}
-+
- static void brcmf_wifi_prioritize_acparams(const
- 	struct brcmf_cfg80211_edcf_acparam *acp, u8 *priority)
- {
-@@ -5564,22 +5583,30 @@ static void brcmf_wifi_prioritize_acparams(const
- 	 * Use ACI prio to get the new priority value for
- 	 * each 802.1d traffic type, in this range.
- 	 */
-+	if (!(aci_prio[AC_BE] == aci_prio[AC_BK] &&
-+	      aci_prio[AC_BK] == aci_prio[AC_VI] &&
-+	      aci_prio[AC_VI] == aci_prio[AC_VO])) {
- 
--	/* 802.1d 0,3 maps to BE */
--	priority[0] = aci_prio[AC_BE];
--	priority[3] = aci_prio[AC_BE];
-+		/* 802.1d 0,3 maps to BE */
-+		priority[0] = aci_prio[AC_BE];
-+		priority[3] = aci_prio[AC_BE];
- 
--	/* 802.1d 1,2 maps to BK */
--	priority[1] = aci_prio[AC_BK];
--	priority[2] = aci_prio[AC_BK];
-+		/* 802.1d 1,2 maps to BK */
-+		priority[1] = aci_prio[AC_BK];
-+		priority[2] = aci_prio[AC_BK];
- 
--	/* 802.1d 4,5 maps to VO */
--	priority[4] = aci_prio[AC_VI];
--	priority[5] = aci_prio[AC_VI];
-+		/* 802.1d 4,5 maps to VO */
-+		priority[4] = aci_prio[AC_VI];
-+		priority[5] = aci_prio[AC_VI];
- 
--	/* 802.1d 6,7 maps to VO */
--	priority[6] = aci_prio[AC_VO];
--	priority[7] = aci_prio[AC_VO];
-+		/* 802.1d 6,7 maps to VO */
-+		priority[6] = aci_prio[AC_VO];
-+		priority[7] = aci_prio[AC_VO];
-+
-+	} else {
-+		/* Initialize to default priority */
-+		brcmf_init_wmm_prio(priority);
-+	}
- 
- 	brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n",
- 		  priority[0], priority[1], priority[2], priority[3]);
-@@ -5976,25 +6003,6 @@ static void brcmf_init_conf(struct brcmf_cfg80211_conf *conf)
- 	conf->retry_long = (u32)-1;
- }
- 
--static void brcmf_init_wmm_prio(u8 *priority)
--{
--	/* Initialize AC priority array to default
--	 * 802.1d priority as per following table:
--	 * 802.1d prio 0,3 maps to BE
--	 * 802.1d prio 1,2 maps to BK
--	 * 802.1d prio 4,5 maps to VI
--	 * 802.1d prio 6,7 maps to VO
--	 */
--	priority[0] = BRCMF_FWS_FIFO_AC_BE;
--	priority[3] = BRCMF_FWS_FIFO_AC_BE;
--	priority[1] = BRCMF_FWS_FIFO_AC_BK;
--	priority[2] = BRCMF_FWS_FIFO_AC_BK;
--	priority[4] = BRCMF_FWS_FIFO_AC_VI;
--	priority[5] = BRCMF_FWS_FIFO_AC_VI;
--	priority[6] = BRCMF_FWS_FIFO_AC_VO;
--	priority[7] = BRCMF_FWS_FIFO_AC_VO;
--}
--
- static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg)
- {
- 	brcmf_fweh_register(cfg->pub, BRCMF_E_LINK,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0044-brcmfmac-fix-continuous-802.1x-tx-pending-timeout-er.patch b/patches/cypress/brcmfmac/0044-brcmfmac-fix-continuous-802.1x-tx-pending-timeout-er.patch
deleted file mode 100644
index 1f6256e895b5fce35100f5c5e26488dcd6727c9e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0044-brcmfmac-fix-continuous-802.1x-tx-pending-timeout-er.patch
+++ /dev/null
@@ -1,90 +0,0 @@
-From 7cefc1da405a0a55a9ebe603c937fd18445a0431 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 27 Feb 2019 02:06:18 -0600
-Subject: [PATCH 044/138] brcmfmac: fix continuous 802.1x tx pending timeout
- error
-
-The race condition in brcmf_msgbuf_txflow and brcmf_msgbuf_delete_flowring
-makes tx_msghdr writing after brcmf_msgbuf_remove_flowring. Host
-driver should delete flowring after txflow complete and all txstatus back,
-or pend_8021x_cnt will never be zero and cause every connection 950
-milliseconds(MAX_WAIT_FOR_8021X_TX) delay.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/core.c    |  4 +++-
- .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  | 23 +++++++++++++++++++++-
- 2 files changed, 25 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 175f544..5bded9b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1407,8 +1407,10 @@ int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp)
- 				 !brcmf_get_pend_8021x_cnt(ifp),
- 				 MAX_WAIT_FOR_8021X_TX);
- 
--	if (!err)
-+	if (!err) {
- 		bphy_err(drvr, "Timed out waiting for no pending 802.1x packets\n");
-+		atomic_set(&ifp->pend_8021x_cnt, 0);
-+	}
- 
- 	return !err;
- }
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index e3dd862..1af9552 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -70,6 +70,7 @@
- #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS	32
- #define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS		48
- 
-+#define BRCMF_MAX_TXSTATUS_WAIT_RETRIES		10
- 
- struct msgbuf_common_hdr {
- 	u8				msgtype;
-@@ -805,8 +806,12 @@ static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
- 	flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
- 	if (flowid == BRCMF_FLOWRING_INVALID_ID) {
- 		flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb);
--		if (flowid == BRCMF_FLOWRING_INVALID_ID)
-+		if (flowid == BRCMF_FLOWRING_INVALID_ID) {
- 			return -ENOMEM;
-+		} else {
-+			brcmf_flowring_enqueue(flow, flowid, skb);
-+			return 0;
-+		}
- 	}
- 	queue_count = brcmf_flowring_enqueue(flow, flowid, skb);
- 	force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0);
-@@ -1394,9 +1399,25 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
- 	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
- 	struct msgbuf_tx_flowring_delete_req *delete;
- 	struct brcmf_commonring *commonring;
-+	struct brcmf_commonring *commonring_del;
-+
- 	void *ret_ptr;
- 	u8 ifidx;
- 	int err;
-+	int retry = BRCMF_MAX_TXSTATUS_WAIT_RETRIES;
-+
-+	/* wait for commonring txflow finished */
-+	commonring_del = msgbuf->flowrings[flowid];
-+	brcmf_commonring_lock(commonring_del);
-+	while (retry && atomic_read(&commonring_del->outstanding_tx)) {
-+		usleep_range(5000, 10000);
-+		retry--;
-+	}
-+	brcmf_commonring_unlock(commonring_del);
-+	if (!retry && atomic_read(&commonring_del->outstanding_tx)) {
-+		brcmf_err("timed out waiting for txstatus\n");
-+		atomic_set(&commonring_del->outstanding_tx, 0);
-+	}
- 
- 	/* no need to submit if firmware can not be reached */
- 	if (drvr->bus_if->state != BRCMF_BUS_UP) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0045-brcmfmac-add-sleep-in-bus-suspend-and-cfg80211-resum.patch b/patches/cypress/brcmfmac/0045-brcmfmac-add-sleep-in-bus-suspend-and-cfg80211-resum.patch
deleted file mode 100644
index 7615706828c53027a1bc5b83e2025618d23f666d..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0045-brcmfmac-add-sleep-in-bus-suspend-and-cfg80211-resum.patch
+++ /dev/null
@@ -1,261 +0,0 @@
-From 24f2bc5f0cc8affe9fc11c42cf6bbab4e8ad2acf Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Thu, 7 Mar 2019 01:37:27 -0600
-Subject: [PATCH 045/138] brcmfmac: add sleep in bus suspend and cfg80211
- resume functions
-
-With asynchronous suspend/resume feature, suspend and resume callbacks to
-be executed in parallel with each other. It makes bus changes the state to
-BRCMF_BUS_DOWN before all brcmf_cfg80211_suspend IOVAR executions.
-The same situation also happens in resume procedure and causes PM mode
-keeps in PM_MAX after resume. In order to fix the race condition, We add
-one second sleep in bus suspend and cfg80211 resume function.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 19 ++++++++++++++--
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 25 +++++++++++++++++++++-
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         | 10 +++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 12 +++++++++++
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 15 +++++++++++++
- 5 files changed, 78 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 3ab5ab6..a957107 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -36,6 +36,7 @@
- #include "sdio.h"
- #include "core.h"
- #include "common.h"
-+#include "cfg80211.h"
- 
- #define SDIOH_API_ACCESS_RETRY_LIMIT	2
- 
-@@ -1049,6 +1050,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
- 	dev_set_drvdata(&func->dev, bus_if);
- 	dev_set_drvdata(&sdiodev->func1->dev, bus_if);
- 	sdiodev->dev = &sdiodev->func1->dev;
-+	dev_set_drvdata(&sdiodev->func2->dev, bus_if);
- 
- 	brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
- 
-@@ -1065,6 +1067,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
- fail:
- 	dev_set_drvdata(&func->dev, NULL);
- 	dev_set_drvdata(&sdiodev->func1->dev, NULL);
-+	dev_set_drvdata(&sdiodev->func2->dev, NULL);
- 	kfree(sdiodev);
- 	kfree(bus_if);
- 	return err;
-@@ -1119,14 +1122,26 @@ static int brcmf_ops_sdio_suspend(struct device *dev)
- 	struct brcmf_bus *bus_if;
- 	struct brcmf_sdio_dev *sdiodev;
- 	mmc_pm_flag_t sdio_flags;
-+	struct brcmf_cfg80211_info *config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	func = container_of(dev, struct sdio_func, dev);
-+	bus_if = dev_get_drvdata(dev);
-+	config = bus_if->drvr->config;
-+
- 	brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
-+
-+	while (retry &&
-+	       config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
-+		usleep_range(10000, 20000);
-+		retry--;
-+	}
-+	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
-+		brcmf_err("timed out wait for cfg80211 suspended\n");
-+
- 	if (func->num != 1)
- 		return 0;
- 
--
--	bus_if = dev_get_drvdata(dev);
- 	sdiodev = bus_if->bus_priv.sdio;
- 
- 	brcmf_sdiod_freezer_on(sdiodev);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index ce2a79b..9779ac4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -3647,10 +3647,24 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct net_device *ndev = cfg_to_ndev(cfg);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_bus *bus_if = drvr->bus_if;
-+	struct brcmf_cfg80211_info *config = drvr->config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_RESUMING;
-+
- 	if (cfg->wowl.active) {
-+		/* wait for bus resumed */
-+		while (retry && bus_if->state != BRCMF_BUS_UP) {
-+			usleep_range(10000, 20000);
-+			retry--;
-+		}
-+		if (!retry && bus_if->state != BRCMF_BUS_UP)
-+			brcmf_err("timed out wait for bus resume\n");
-+
- 		brcmf_report_wowl_wakeind(wiphy, ifp);
- 		brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
- 		brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
-@@ -3671,6 +3685,7 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
- 		brcmf_pktfilter_enable(ifp->ndev, false);
- 
- 	}
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_RESUMED;
- 	return 0;
- }
- 
-@@ -3740,9 +3755,12 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 	struct net_device *ndev = cfg_to_ndev(cfg);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	struct brcmf_cfg80211_vif *vif;
-+	struct brcmf_cfg80211_info *config = ifp->drvr->config;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_SUSPENDING;
-+
- 	/* if the primary net_device is not READY there is nothing
- 	 * we can do but pray resume goes smoothly.
- 	 */
-@@ -3784,9 +3802,13 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 	}
- 
- exit:
--	brcmf_dbg(TRACE, "Exit\n");
-+	/* set cfg80211 pm state to cfg80211 suspended state */
-+	config->pm_state = BRCMF_CFG80211_PM_STATE_SUSPENDED;
-+
- 	/* clear any scanning activity */
- 	cfg->scan_status = 0;
-+
-+	brcmf_dbg(TRACE, "Exit\n");
- 	return 0;
- }
- 
-@@ -7328,6 +7350,7 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
- 
- 	cfg->wiphy = wiphy;
- 	cfg->pub = drvr;
-+	cfg->pm_state = BRCMF_CFG80211_PM_STATE_RESUMED;
- 	init_vif_event(&cfg->vif_event);
- 	INIT_LIST_HEAD(&cfg->vif_list);
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index c9b3345..0af3c1a 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -92,6 +92,8 @@
- 
- #define BRCMF_VIF_EVENT_TIMEOUT		msecs_to_jiffies(1500)
- 
-+#define BRCMF_PM_WAIT_MAXRETRY			100
-+
- /* cfg80211 wowlan definitions */
- #define WL_WOWLAN_MAX_PATTERNS			8
- #define WL_WOWLAN_MIN_PATTERN_LEN		1
-@@ -170,6 +172,13 @@ enum brcmf_vif_status {
- 	BRCMF_VIF_STATUS_ASSOC_SUCCESS,
- };
- 
-+enum brcmf_cfg80211_pm_state {
-+	BRCMF_CFG80211_PM_STATE_RESUMED,
-+	BRCMF_CFG80211_PM_STATE_RESUMING,
-+	BRCMF_CFG80211_PM_STATE_SUSPENDED,
-+	BRCMF_CFG80211_PM_STATE_SUSPENDING,
-+};
-+
- /**
-  * struct vif_saved_ie - holds saved IEs for a virtual interface.
-  *
-@@ -357,6 +366,7 @@ struct brcmf_cfg80211_info {
- 	struct brcmf_cfg80211_wowl wowl;
- 	struct brcmf_pno_info *pno;
- 	u8 ac_priority[MAX_8021D_PRIO];
-+	u8 pm_state;
- };
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 3e32347..5118d8e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -38,6 +38,7 @@
- #include "chip.h"
- #include "core.h"
- #include "common.h"
-+#include "cfg80211.h"
- 
- 
- enum brcmf_pcie_state {
-@@ -2011,11 +2012,22 @@ static int brcmf_pcie_pm_enter_D3(struct device *dev)
- {
- 	struct brcmf_pciedev_info *devinfo;
- 	struct brcmf_bus *bus;
-+	struct brcmf_cfg80211_info *config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	brcmf_dbg(PCIE, "Enter\n");
- 
- 	bus = dev_get_drvdata(dev);
- 	devinfo = bus->bus_priv.pcie->devinfo;
-+	config = bus->drvr->config;
-+
-+	while (retry &&
-+	       config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
-+		usleep_range(10000, 20000);
-+		retry--;
-+	}
-+	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
-+		brcmf_err(bus, "timed out wait for cfg80211 suspended\n");
- 
- 	brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index f834561..e910cc0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -19,6 +19,7 @@
- #include "core.h"
- #include "common.h"
- #include "bcdc.h"
-+#include "cfg80211.h"
- 
- 
- #define IOCTL_RESP_TIMEOUT		msecs_to_jiffies(2000)
-@@ -1444,8 +1445,22 @@ static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
- {
- 	struct usb_device *usb = interface_to_usbdev(intf);
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
-+	struct brcmf_bus *bus;
-+	struct brcmf_cfg80211_info *config;
-+	int retry = BRCMF_PM_WAIT_MAXRETRY;
- 
- 	brcmf_dbg(USB, "Enter\n");
-+
-+	bus = devinfo->bus_pub.bus;
-+	config = bus->drvr->config;
-+	while (retry &&
-+	       config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING) {
-+		usleep_range(10000, 20000);
-+		retry--;
-+	}
-+	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
-+		brcmf_err("timed out wait for cfg80211 suspended\n");
-+
- 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
- 	if (devinfo->wowl_enabled) {
- 		brcmf_cancel_all_urbs(devinfo);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0046-brcmfmac-fix-43455-CRC-error-under-SDIO-3.0-SDR104-m.patch b/patches/cypress/brcmfmac/0046-brcmfmac-fix-43455-CRC-error-under-SDIO-3.0-SDR104-m.patch
deleted file mode 100644
index be60e8cfe055d499f5c0257154f48eb6324b20fd..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0046-brcmfmac-fix-43455-CRC-error-under-SDIO-3.0-SDR104-m.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 7995dc7f2d99b4ab53349b65e9a261591b3074b5 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Thu, 7 Mar 2019 21:13:02 -0600
-Subject: [PATCH 046/138] brcmfmac: fix 43455 CRC error under SDIO 3.0 SDR104
- mode
-
-This patch fixes 43455 CRC error while running throughput test with
-suspend/resume stress test.
-
-The continuous failure messages before system crash:
-brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
-brcmfmac: brcmf_sdio_rxglom: glom read of 25600 bytes failed: -5
-brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
-brcmfmac: brcmf_sdiod_sglist_rw: CMD53 sg block read failed -84
-brcmfmac: brcmf_sdio_rxglom: glom read of 24576 bytes failed: -5
-brcmfmac: brcmf_sdio_rxfail: abort command, terminate frame
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 17 +++++++++++++++++
- 1 file changed, 17 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 0ebbece..b73f4ef 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -46,6 +46,10 @@
- #define CY_4339_MES_WATERMARK	80
- #define CY_4339_MESBUSYCTRL	(CY_4339_MES_WATERMARK | \
- 				 SBSDIO_MESBUSYCTRL_ENAB)
-+#define CY_43455_F2_WATERMARK	0x60
-+#define CY_43455_MES_WATERMARK	0x50
-+#define CY_43455_MESBUSYCTRL	(CY_43455_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- 
- #ifdef DEBUG
- 
-@@ -4227,6 +4231,19 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
- 					   CY_4339_MESBUSYCTRL, &err);
- 			break;
-+		case SDIO_DEVICE_ID_BROADCOM_43455:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 43455\n",
-+				  CY_43455_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_43455_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_43455_MESBUSYCTRL, &err);
-+			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
- 					   DEFAULT_F2_WATERMARK, &err);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0047-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch b/patches/cypress/brcmfmac/0047-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch
deleted file mode 100644
index d8a4f1820c2693dc34db8bbb46cdcc433c178a6d..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0047-brcmfmac-set-F2-blocksize-and-watermark-for-4359.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From 07550fe8116a91f06a09e46a0f9de8d0ade6b369 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Thu, 12 Dec 2019 00:52:46 +0100
-Subject: [PATCH 047/138] brcmfmac: set F2 blocksize and watermark for 4359
-
-commit e0029595fa0f7afe284b51dcf6d43704c2f9f88b upstream.
-
-Set F2 blocksize to 256 bytes and watermark to 0x40 for 4359. Also
-enable and configure F1 MesBusyCtrl. It fixes DMA error while having
-UDP bi-directional traffic.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-[slightly adapted for rebase on mainline linux]
-Signed-off-by: Soeren Moch <smoch@web.de>
-[use switch-case to replace if-else for F2 blksz setting]
-Reviewed-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 11 ++++++++++-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 15 +++++++++++++++
- 2 files changed, 25 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index a957107..29197f3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -45,6 +45,7 @@
- #define SDIO_FUNC1_BLOCKSIZE		64
- #define SDIO_FUNC2_BLOCKSIZE		512
- #define SDIO_4373_FUNC2_BLOCKSIZE	256
-+#define SDIO_4359_FUNC2_BLOCKSIZE	256
- /* Maximum milliseconds to wait for F2 to come up */
- #define SDIO_WAIT_F2RDY	3000
- 
-@@ -916,8 +917,16 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		goto out;
- 	}
- 
--	if (sdiodev->func2->device == SDIO_DEVICE_ID_CYPRESS_4373)
-+	switch (sdiodev->func2->device) {
-+	case SDIO_DEVICE_ID_CYPRESS_4373:
- 		f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
-+		break;
-+	case SDIO_DEVICE_ID_BROADCOM_4359:
-+		f2_blksz = SDIO_4359_FUNC2_BLOCKSIZE;
-+		break;
-+	default:
-+		break;
-+	}
- 
- 	ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
- 	if (ret) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index b73f4ef..86d332b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -50,6 +50,8 @@
- #define CY_43455_MES_WATERMARK	0x50
- #define CY_43455_MESBUSYCTRL	(CY_43455_MES_WATERMARK | \
- 				 SBSDIO_MESBUSYCTRL_ENAB)
-+#define CY_4359_F2_WATERMARK	0x40
-+#define CY_4359_F1_MESBUSYCTRL	(CY_4359_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
- 
- #ifdef DEBUG
- 
-@@ -4244,6 +4246,19 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
- 					   CY_43455_MESBUSYCTRL, &err);
- 			break;
-+		case SDIO_DEVICE_ID_BROADCOM_4359:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
-+				  CY_4359_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_4359_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_4359_F1_MESBUSYCTRL, &err);
-+			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
- 					   DEFAULT_F2_WATERMARK, &err);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0048-brcmfmac-reserve-2-credits-for-host-tx-control-path.patch b/patches/cypress/brcmfmac/0048-brcmfmac-reserve-2-credits-for-host-tx-control-path.patch
deleted file mode 100644
index 8729508bb56638ca51b7568d779e444c377edc52..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0048-brcmfmac-reserve-2-credits-for-host-tx-control-path.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 900514cd525617e59760ba44f2bfdec7e9ecf070 Mon Sep 17 00:00:00 2001
-From: Amar Shankar <amsr@cypress.com>
-Date: Mon, 15 Oct 2018 05:32:26 -0500
-Subject: [PATCH 048/138] brcmfmac: reserve 2 credits for host tx control path
-
-It is observed that sometimes when sdiod is low in tx credits in low
-rssi scenarios, the data path consumes all sdiod rx all credits and
-there is no sdiod rx credit available for control path causing host
-and card to go out of sync resulting in link loss between host and
-card. So in order to prevent it some credits are reserved for control
-path.
-
-Note that TXCTL_CREDITS can't be larger than the firmware default
-credit update threshold 2; otherwise there will be a deadlock for both
-side waiting for each other.
-
-Signed-off-by: Amar Shankar <amsr@cypress.com>
-Signed-off-by: Jia-Shyr Chuang <saint.chuang@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 18 ++++++++++++++++--
- 1 file changed, 16 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 86d332b..13676cc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -643,6 +643,8 @@ struct sdiod_drive_str {
- 	BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012)
- };
- 
-+#define TXCTL_CREDITS	2
-+
- static void pkt_align(struct sk_buff *p, int len, int align)
- {
- 	uint datalign;
-@@ -653,9 +655,18 @@ static void pkt_align(struct sk_buff *p, int len, int align)
- 	__skb_trim(p, len);
- }
- 
--/* To check if there's window offered */
-+/* To check if there's window offered
-+ * Reserve 3 credits for txctl
-+ */
- static bool data_ok(struct brcmf_sdio *bus)
- {
-+	return (u8)(bus->tx_max - bus->tx_seq) > TXCTL_CREDITS &&
-+	       ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0;
-+}
-+
-+/* To check if there's window offered */
-+static bool txctl_ok(struct brcmf_sdio *bus)
-+{
- 	return (u8)(bus->tx_max - bus->tx_seq) != 0 &&
- 	       ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0;
- }
-@@ -2660,7 +2671,7 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 	brcmf_sdio_clrintr(bus);
- 
- 	if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
--	    data_ok(bus)) {
-+	    txctl_ok(bus)) {
- 		sdio_claim_host(bus->sdiodev->func1);
- 		if (bus->ctrl_frame_stat) {
- 			err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
-@@ -2668,6 +2679,9 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 			bus->ctrl_frame_err = err;
- 			wmb();
- 			bus->ctrl_frame_stat = false;
-+			if (err)
-+				brcmf_err("sdio ctrlframe tx failed err=%d\n",
-+					  err);
- 		}
- 		sdio_release_host(bus->sdiodev->func1);
- 		brcmf_sdio_wait_event_wakeup(bus);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0049-brcmfmac-update-tx-status-flags-to-sync-with-firmwar.patch b/patches/cypress/brcmfmac/0049-brcmfmac-update-tx-status-flags-to-sync-with-firmwar.patch
deleted file mode 100644
index 4c7d99b2415e5ac08dfea2757d4d815571449d1f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0049-brcmfmac-update-tx-status-flags-to-sync-with-firmwar.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From f5d0b4a7bd6e79b03585c5bf27632c23c26975f0 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Thu, 20 Jun 2019 01:31:16 -0500
-Subject: [PATCH 049/138] brcmfmac: update tx status flags to sync with
- firmware
-
-There is a mismatch of tx status flag values between host and firmware.
-It makes the host mistake the flags and have incorrect behavior of credit
-returns. So update the flags to sync with the firmware ones.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 86c6fc2..74a6272 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -323,6 +323,10 @@ struct brcmf_skbuff_cb {
-  *	firmware suppress the packet as device is already in PS mode.
-  * @BRCMF_FWS_TXSTATUS_FW_TOSSED:
-  *	firmware tossed the packet.
-+ * @BRCMF_FWS_TXSTATUS_FW_DISCARD_NOACK:
-+ *	firmware tossed the packet after retries.
-+ * @BRCMF_FWS_TXSTATUS_FW_SUPPRESS_ACKED:
-+ *	firmware wrongly reported suppressed previously, now fixing to acked.
-  * @BRCMF_FWS_TXSTATUS_HOST_TOSSED:
-  *	host tossed the packet.
-  */
-@@ -331,6 +335,8 @@ enum brcmf_fws_txstatus {
- 	BRCMF_FWS_TXSTATUS_CORE_SUPPRESS,
- 	BRCMF_FWS_TXSTATUS_FW_PS_SUPPRESS,
- 	BRCMF_FWS_TXSTATUS_FW_TOSSED,
-+	BRCMF_FWS_TXSTATUS_FW_DISCARD_NOACK,
-+	BRCMF_FWS_TXSTATUS_FW_SUPPRESS_ACKED,
- 	BRCMF_FWS_TXSTATUS_HOST_TOSSED
- };
- 
-@@ -1459,6 +1465,10 @@ static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo,
- 		remove_from_hanger = false;
- 	} else if (flags == BRCMF_FWS_TXSTATUS_FW_TOSSED)
- 		fws->stats.txs_tossed += compcnt;
-+	else if (flags == BRCMF_FWS_TXSTATUS_FW_DISCARD_NOACK)
-+		fws->stats.txs_discard += compcnt;
-+	else if (flags == BRCMF_FWS_TXSTATUS_FW_SUPPRESS_ACKED)
-+		fws->stats.txs_discard += compcnt;
- 	else if (flags == BRCMF_FWS_TXSTATUS_HOST_TOSSED)
- 		fws->stats.txs_host_tossed += compcnt;
- 	else
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0050-brcmfmac-fix-credit-reserve-for-each-access-category.patch b/patches/cypress/brcmfmac/0050-brcmfmac-fix-credit-reserve-for-each-access-category.patch
deleted file mode 100644
index ea0ae9a9bf9ddc96501c779593d7770660896c92..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0050-brcmfmac-fix-credit-reserve-for-each-access-category.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From a1884e05979783bf66354078edf6e4eb1ad9b9d4 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Thu, 20 Jun 2019 02:59:26 -0500
-Subject: [PATCH 050/138] brcmfmac: fix credit reserve for each access category
-
-Commit 7f52880c5ecd ("brcmfmac: Allow credit borrowing for all access
-categories") added a ratio to reserve the credits for each access
-category. However, calculating the number of reserved credits with the
-runtime one let an access category lend all its credits. Fix this by
-using the number of initial credits to determine the reserved one.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 74a6272..030452c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -2036,7 +2036,7 @@ static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws,
- 
- 		if (!borrow_all)
- 			borrow_limit =
--			  fws->fifo_credit[lender_ac] / BRCMF_BORROW_RATIO;
-+			  fws->init_fifo_credit[lender_ac] / BRCMF_BORROW_RATIO;
- 		else
- 			borrow_limit = 0;
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0051-brcmfmac-fix-throughput-zero-stalls-on-PM-1-mode-due.patch b/patches/cypress/brcmfmac/0051-brcmfmac-fix-throughput-zero-stalls-on-PM-1-mode-due.patch
deleted file mode 100644
index f38f3d6620e1f8ad4a2fef43d6b3332e6e531a8a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0051-brcmfmac-fix-throughput-zero-stalls-on-PM-1-mode-due.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From b6477900b26bc2b2512a7bd28b43393a1b7fd7d0 Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Thu, 27 Jun 2019 04:00:02 -0500
-Subject: [PATCH 051/138] brcmfmac: fix throughput zero stalls on PM 1 mode due
- to credit map
-
-This patch move the credit map setting to right place to avoid
-brcmf_fws_return_credits() return without setting the credit map.
-It fix the thoughput zero stalls issue in softAP mode when STA
-using PM 1 mode.
-
-Signed-off-by: Double Lo <double.lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 030452c..bed7cac 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -1197,6 +1197,8 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
- 	if (!credits)
- 		return;
- 
-+	fws->fifo_credit_map |= 1 << fifo;
-+
- 	if (fifo > BRCMF_FWS_FIFO_AC_BK &&
- 	    fifo <= BRCMF_FWS_FIFO_AC_VO) {
- 		for (lender_ac = BRCMF_FWS_FIFO_AC_VO; lender_ac >= 0;
-@@ -1220,7 +1222,6 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws,
- 
- 	if (credits) {
- 		fws->fifo_credit[fifo] += credits;
--		fws->fifo_credit_map |= 1 << fifo;
- 	}
- 
- 	if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo])
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0052-brcmfmac-43012-Update-MES-Watermark.patch b/patches/cypress/brcmfmac/0052-brcmfmac-43012-Update-MES-Watermark.patch
deleted file mode 100644
index 7dc5b3e9e8e0daba0fe50ed6bf70563619f33530..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0052-brcmfmac-43012-Update-MES-Watermark.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From d08879420f04fe0944dc7a2b0de21d735678960f Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Sun, 18 Aug 2019 22:31:19 -0500
-Subject: [PATCH 052/138] brcmfmac: 43012 Update MES Watermark
-
-Set MES watermark size to 0x50 for 43012. It fixes SDIO bus hang issue
-when running at high throughput.
-
-Signed-off-by: Double Lo <double.lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 13676cc..5c9b9b8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -42,6 +42,9 @@
- #define DEFAULT_F2_WATERMARK    0x8
- #define CY_4373_F2_WATERMARK    0x40
- #define CY_43012_F2_WATERMARK    0x60
-+#define CY_43012_MES_WATERMARK  0x50
-+#define CY_43012_MESBUSYCTRL    (CY_43012_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- #define CY_4339_F2_WATERMARK    48
- #define CY_4339_MES_WATERMARK	80
- #define CY_4339_MESBUSYCTRL	(CY_4339_MES_WATERMARK | \
-@@ -4233,6 +4236,8 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_43012_MESBUSYCTRL, &err);
- 			break;
- 		case SDIO_DEVICE_ID_BROADCOM_4339:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 4339\n",
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0053-brcmfmac-add-support-for-CYW89359-SDIO-chipset.patch b/patches/cypress/brcmfmac/0053-brcmfmac-add-support-for-CYW89359-SDIO-chipset.patch
deleted file mode 100644
index 24ed60e61125ac3f6e9cb6dad1b66b545a3b9199..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0053-brcmfmac-add-support-for-CYW89359-SDIO-chipset.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From d33e1dfb9eb85acbedf1aad5cd178ffcfb26f6fd Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Tue, 8 Oct 2019 01:28:40 -0500
-Subject: [PATCH 053/138] brcmfmac: add support for CYW89359 SDIO chipset
-
-Add support for CYW89359 SDIO chipset. CYW89359 is a 2x2 dual-band 11ac chipset
-with 20/40/80Mhz channel support.
-
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 +
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 1 +
- 2 files changed, 2 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 29197f3..896546d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -922,6 +922,7 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
- 		break;
- 	case SDIO_DEVICE_ID_BROADCOM_4359:
-+	case SDIO_DEVICE_ID_CYPRESS_89359:
- 		f2_blksz = SDIO_4359_FUNC2_BLOCKSIZE;
- 		break;
- 	default:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 5c9b9b8..31b4fb2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4266,6 +4266,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 					   CY_43455_MESBUSYCTRL, &err);
- 			break;
- 		case SDIO_DEVICE_ID_BROADCOM_4359:
-+		case SDIO_DEVICE_ID_CYPRESS_89359:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
- 				  CY_4359_F2_WATERMARK);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0054-brcmfmac-add-CYW43570-PCIE-device.patch b/patches/cypress/brcmfmac/0054-brcmfmac-add-CYW43570-PCIE-device.patch
deleted file mode 100644
index d7d4ed72ecd2c55b69a02a9a099f380cdfe8d71a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0054-brcmfmac-add-CYW43570-PCIE-device.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From ead5f7beb5c60e3a03e1a7ad79a585dac390ec47 Mon Sep 17 00:00:00 2001
-From: Soontak Lee <soontak.lee@cypress.com>
-Date: Mon, 4 Nov 2019 12:13:09 -0600
-Subject: [PATCH 054/138] brcmfmac: add CYW43570 PCIE device
-
-CYW43570 is a 3-antenna, 2x2 MIMO,802.11a/b/g/n/ac, PCIe 3.0 for WLAN.
-It is BT/WIFI combo.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c       | 1 +
- drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 +
- 2 files changed, 2 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 5118d8e..02e9b01 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -2113,6 +2113,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_RAW_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4358_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4359_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-index d1037b6..8919cdc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-@@ -68,6 +68,7 @@
- #define BRCM_PCIE_4356_DEVICE_ID	0x43ec
- #define BRCM_PCIE_43567_DEVICE_ID	0x43d3
- #define BRCM_PCIE_43570_DEVICE_ID	0x43d9
-+#define BRCM_PCIE_43570_RAW_DEVICE_ID	0xaa31
- #define BRCM_PCIE_4358_DEVICE_ID	0x43e9
- #define BRCM_PCIE_4359_DEVICE_ID	0x43ef
- #define BRCM_PCIE_43602_DEVICE_ID	0x43ba
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0055-brcmfmac-Use-seq-seq_len-and-set-iv_initialize-when-.patch b/patches/cypress/brcmfmac/0055-brcmfmac-Use-seq-seq_len-and-set-iv_initialize-when-.patch
deleted file mode 100644
index 94f06192b47e7d8101cc3e422bef891693365499..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0055-brcmfmac-Use-seq-seq_len-and-set-iv_initialize-when-.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From fbace684717968e71482aa906f80f6347772805b Mon Sep 17 00:00:00 2001
-From: Soontak Lee <soontak.lee@cypress.com>
-Date: Mon, 4 Nov 2019 13:05:35 -0600
-Subject: [PATCH 055/138] brcmfmac: Use seq/seq_len and set iv_initialize when
- plumbing of rxiv in (GTK) keys
-
-When plumbing rxiv for (GTK) keys, current code does not use seq/seq_len
-when present nor set iv_initialized for iovar wsec_key. This could
-result in missing broadcast traffic after GTK rekey. The fix is setting
-iv_initialized and using seq/seq_len for iovar wsec_key.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 9779ac4..d2c9299 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2331,6 +2331,17 @@ static void brcmf_set_join_pref(struct brcmf_if *ifp,
- 	if (!ext_key)
- 		key->flags = BRCMF_PRIMARY_KEY;
- 
-+	if (params->seq && params->seq_len == 6) {
-+		/* rx iv */
-+		u8 *ivptr;
-+
-+		ivptr = (u8 *)params->seq;
-+		key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) |
-+			(ivptr[3] << 8) | ivptr[2];
-+		key->rxiv.lo = (ivptr[1] << 8) | ivptr[0];
-+		key->iv_initialized = true;
-+	}
-+
- 	switch (params->cipher) {
- 	case WLAN_CIPHER_SUITE_WEP40:
- 		key->algo = CRYPTO_ALGO_WEP1;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0056-brcmfmac-use-actframe_abort-to-cancel-ongoing-action.patch b/patches/cypress/brcmfmac/0056-brcmfmac-use-actframe_abort-to-cancel-ongoing-action.patch
deleted file mode 100644
index f1791957cb399ebd3b27b153963a4c024ea5b32e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0056-brcmfmac-use-actframe_abort-to-cancel-ongoing-action.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 56dbb7f258b737828ad3b65308a7520031b5bbc6 Mon Sep 17 00:00:00 2001
-From: Ryohei Kondo <ryohei.kondo@cypress.com>
-Date: Tue, 5 Nov 2019 12:39:56 +0900
-Subject: [PATCH 056/138] brcmfmac: use actframe_abort to cancel ongoing action
- frame
-
-The driver sends an action frame down and waits for dwell time to be
-completed or aborted before sending out the next action frame.
-Driver issues "scan abort" to cancel the current time slot, but this
-doesn't have any effect because, we are not using scan engine for
-sending action frame.
-Fix is to use "actframe_abort" to cancels the current action frame.
-
-Signed-off-by: Ryohei Kondo <ryohei.kondo@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 34 ++++++++++++++++++++--
- 1 file changed, 32 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 793b5a0..a399714 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -1268,6 +1268,30 @@ bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- }
- 
- /**
-+ * brcmf_p2p_abort_action_frame() - abort action frame.
-+ *
-+ * @cfg: common configuration struct.
-+ *
-+ */
-+static s32 brcmf_p2p_abort_action_frame(struct brcmf_cfg80211_info *cfg)
-+{
-+	struct brcmf_p2p_info *p2p = &cfg->p2p;
-+	struct brcmf_cfg80211_vif *vif;
-+	s32 err;
-+	s32 int_val = 1;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
-+	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe_abort", &int_val,
-+					sizeof(s32));
-+	if (err)
-+		brcmf_err(" aborting action frame has failed (%d)\n", err);
-+
-+	return err;
-+}
-+
-+/**
-  * brcmf_p2p_stop_wait_next_action_frame() - finish scan if af tx complete.
-  *
-  * @cfg: common configuration struct.
-@@ -1278,6 +1302,7 @@ bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- {
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
- 	struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
-+	s32 err;
- 
- 	if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) &&
- 	    (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) ||
-@@ -1286,8 +1311,13 @@ bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- 		/* if channel is not zero, "actfame" uses off channel scan.
- 		 * So abort scan for off channel completion.
- 		 */
--		if (p2p->af_sent_channel)
--			brcmf_notify_escan_complete(cfg, ifp, true, true);
-+		if (p2p->af_sent_channel) {
-+			/* abort actframe using actframe_abort or abort scan */
-+			err = brcmf_p2p_abort_action_frame(cfg);
-+			if (err)
-+				brcmf_notify_escan_complete(cfg, ifp, true,
-+							    true);
-+		}
- 	} else if (test_bit(BRCMF_P2P_STATUS_WAITING_NEXT_AF_LISTEN,
- 			    &p2p->status)) {
- 		brcmf_dbg(TRACE, "*** Wake UP ** abort listen for next af frame\n");
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0057-brcmfmac-fix-scheduling-while-atomic-issue-when-dele.patch b/patches/cypress/brcmfmac/0057-brcmfmac-fix-scheduling-while-atomic-issue-when-dele.patch
deleted file mode 100644
index 65db748bf78d9d8f530bf66c5a62db75a4327d8d..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0057-brcmfmac-fix-scheduling-while-atomic-issue-when-dele.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 379ea537486c17827a0b780294cf43563b9780f1 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 5 Nov 2019 19:54:22 -0600
-Subject: [PATCH 057/138] brcmfmac: fix scheduling while atomic issue when
- deleting flowring
-
-We should not sleep while holding the spin lock. It makes
-'scheduling while atomic' in brcmf_msgbuf_delete_flowring.
-And to avoid race condition between deleting flowring and txflow,
-we only hold spin lock when seting flowring status to RING_CLOSING.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/flowring.c    |  5 +----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  | 14 ++++++++------
- 2 files changed, 9 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-index 8e9d067..b1727c4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-@@ -419,7 +419,6 @@ void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx,
- 				flowid = flow->hash[i].flowid;
- 				if (flow->rings[flowid]->status != RING_OPEN)
- 					continue;
--				flow->rings[flowid]->status = RING_CLOSING;
- 				brcmf_msgbuf_delete_flowring(drvr, flowid);
- 			}
- 		}
-@@ -458,10 +457,8 @@ void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx,
- 		if ((sta || (memcmp(hash[i].mac, peer, ETH_ALEN) == 0)) &&
- 		    (hash[i].ifidx == ifidx)) {
- 			flowid = flow->hash[i].flowid;
--			if (flow->rings[flowid]->status == RING_OPEN) {
--				flow->rings[flowid]->status = RING_CLOSING;
-+			if (flow->rings[flowid]->status == RING_OPEN)
- 				brcmf_msgbuf_delete_flowring(drvr, flowid);
--			}
- 		}
- 	}
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index 1af9552..5cecbe1 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -1399,22 +1399,24 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
- 	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
- 	struct msgbuf_tx_flowring_delete_req *delete;
- 	struct brcmf_commonring *commonring;
--	struct brcmf_commonring *commonring_del;
--
-+	struct brcmf_commonring *commonring_del = msgbuf->flowrings[flowid];
-+	struct brcmf_flowring *flow = msgbuf->flow;
- 	void *ret_ptr;
- 	u8 ifidx;
- 	int err;
- 	int retry = BRCMF_MAX_TXSTATUS_WAIT_RETRIES;
- 
--	/* wait for commonring txflow finished */
--	commonring_del = msgbuf->flowrings[flowid];
-+	/* make sure it is not in txflow */
- 	brcmf_commonring_lock(commonring_del);
-+	flow->rings[flowid]->status = RING_CLOSING;
-+	brcmf_commonring_unlock(commonring_del);
-+
-+	/* wait for commonring txflow finished */
- 	while (retry && atomic_read(&commonring_del->outstanding_tx)) {
- 		usleep_range(5000, 10000);
- 		retry--;
- 	}
--	brcmf_commonring_unlock(commonring_del);
--	if (!retry && atomic_read(&commonring_del->outstanding_tx)) {
-+	if (!retry) {
- 		brcmf_err("timed out waiting for txstatus\n");
- 		atomic_set(&commonring_del->outstanding_tx, 0);
- 	}
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0058-brcmfmac-increase-message-buffer-size-for-control-pa.patch b/patches/cypress/brcmfmac/0058-brcmfmac-increase-message-buffer-size-for-control-pa.patch
deleted file mode 100644
index 96b6b6602b124b3cae21ae83abac3c89c47c794f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0058-brcmfmac-increase-message-buffer-size-for-control-pa.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 1d54a4199e5d865cbcc8424b4c0c084a33cca810 Mon Sep 17 00:00:00 2001
-From: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Date: Wed, 6 Nov 2019 16:31:12 -0600
-Subject: [PATCH 058/138] brcmfmac: increase message buffer size for control
- packets
-
-In wifi firmware, max length of IOCTL/IOVAR buffer size is 8192.
-Increase the message buffer max size same as wifi firmware for control
-packets so return buffers can come back.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index 5cecbe1..9f1e8ad 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -54,6 +54,7 @@
- #define BRCMF_IOCTL_REQ_PKTID			0xFFFE
- 
- #define BRCMF_MSGBUF_MAX_PKT_SIZE		2048
-+#define BRCMF_MSGBUF_MAX_CTL_PKT_SIZE           8192
- #define BRCMF_MSGBUF_RXBUFPOST_THRESHOLD	32
- #define BRCMF_MSGBUF_MAX_IOCTLRESPBUF_POST	8
- #define BRCMF_MSGBUF_MAX_EVENTBUF_POST		8
-@@ -1033,7 +1034,7 @@ static u32 brcmf_msgbuf_rxbuf_data_post(struct brcmf_msgbuf *msgbuf, u32 count)
- 		rx_bufpost = (struct msgbuf_rx_ioctl_resp_or_event *)ret_ptr;
- 		memset(rx_bufpost, 0, sizeof(*rx_bufpost));
- 
--		skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_PKT_SIZE);
-+		skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_CTL_PKT_SIZE);
- 
- 		if (skb == NULL) {
- 			bphy_err(drvr, "Failed to alloc SKB\n");
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0059-brcmfmac-Support-89459-pcie.patch b/patches/cypress/brcmfmac/0059-brcmfmac-Support-89459-pcie.patch
deleted file mode 100644
index 10e3fa010d0d75488425579200a8caa1275d706a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0059-brcmfmac-Support-89459-pcie.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From 656b908083e1bba961728aea8f9dff66d0cbd6c8 Mon Sep 17 00:00:00 2001
-From: "alep@cypress.com" <alexander.prutskov@cypress.com>
-Date: Fri, 26 Jul 2019 04:03:06 -0500
-Subject: [PATCH 059/138] brcmfmac: Support 89459 pcie
-
-Adds support of 89459 chip pcie device and save restore support.
-
-Signed-off-by: alep@cypress.com <alexander.prutskov@cypress.com>
-Signed-off-by: Joseph chuang <jiac@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c       | 3 +++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c       | 4 ++++
- drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 4 +++-
- 3 files changed, 10 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index 85cf408..2e9b324 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -724,6 +724,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
- 		return 0x200000;
- 	case CY_CC_4373_CHIP_ID:
- 		return 0x160000;
-+	case CY_CC_89459_CHIP_ID:
-+		return ((ci->pub.chiprev < 9) ? 0x180000 : 0x160000);
- 	default:
- 		brcmf_err("unknown chip: %s\n", ci->pub.name);
- 		break;
-@@ -1407,6 +1409,7 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
- 		reg = chip->ops->read32(chip->ctx, addr);
- 		return reg != 0;
- 	case CY_CC_4373_CHIP_ID:
-+	case CY_CC_89459_CHIP_ID:
- 		/* explicitly check SR engine enable bit */
- 		addr = CORE_CC_REG(base, sr_control0);
- 		reg = chip->ops->read32(chip->ctx, addr);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 02e9b01..6812704 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -58,6 +58,7 @@ enum brcmf_pcie_state {
- BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
- BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
- BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
-+BRCMF_FW_DEF(4355, "brcmfmac89459-pcie");
- 
- static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
-@@ -77,6 +78,7 @@ enum brcmf_pcie_state {
- 	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
- 	BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
- 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
-+	BRCMF_FW_ENTRY(CY_CC_89459_CHIP_ID, 0xFFFFFFFF, 4355),
- };
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
-@@ -2128,6 +2130,8 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(CY_PCIE_89459_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(CY_PCIE_89459_RAW_DEVICE_ID),
- 	{ /* end: all zeroes */ }
- };
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-index 8919cdc..8ee9a04 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-@@ -50,6 +50,7 @@
- #define BRCM_CC_4371_CHIP_ID		0x4371
- #define CY_CC_4373_CHIP_ID		0x4373
- #define CY_CC_43012_CHIP_ID		43012
-+#define CY_CC_89459_CHIP_ID             0x4355
- 
- /* USB Device IDs */
- #define BRCM_USB_43143_DEVICE_ID	0xbd1e
-@@ -82,7 +83,8 @@
- #define BRCM_PCIE_4366_2G_DEVICE_ID	0x43c4
- #define BRCM_PCIE_4366_5G_DEVICE_ID	0x43c5
- #define BRCM_PCIE_4371_DEVICE_ID	0x440d
--
-+#define CY_PCIE_89459_DEVICE_ID         0x4415
-+#define CY_PCIE_89459_RAW_DEVICE_ID     0x4355
- 
- /* brcmsmac IDs */
- #define BCM4313_D11N2G_ID	0x4727	/* 4313 802.11n 2.4G device */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0060-brcmfmac-Fix-for-unable-to-return-to-visible-SSID.patch b/patches/cypress/brcmfmac/0060-brcmfmac-Fix-for-unable-to-return-to-visible-SSID.patch
deleted file mode 100644
index f24a13444cc046a9d2aeed28a16c958d5be3f74e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0060-brcmfmac-Fix-for-unable-to-return-to-visible-SSID.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 8219bf950f6ee24f5b60e05c41840cb3706d690e Mon Sep 17 00:00:00 2001
-From: Soontak Lee <soontak.lee@cypress.com>
-Date: Thu, 7 Nov 2019 12:49:40 -0600
-Subject: [PATCH 060/138] brcmfmac: Fix for unable to return to visible SSID
-
-Unable to change back to visiable SSID because there is
-no disable hidden ssid routine.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c    | 14 ++++++++------
- 1 file changed, 8 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index d2c9299..89ed0c7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4708,12 +4708,14 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 			goto exit;
- 		}
- 
--		if (settings->hidden_ssid) {
--			err = brcmf_fil_iovar_int_set(ifp, "closednet", 1);
--			if (err) {
--				bphy_err(drvr, "closednet error (%d)\n", err);
--				goto exit;
--			}
-+		err = brcmf_fil_iovar_int_set(ifp, "closednet",
-+					      settings->hidden_ssid);
-+		if (err) {
-+			bphy_err(drvr, "%s closednet error (%d)\n",
-+				 settings->hidden_ssid ?
-+				 "enabled" : "disabled",
-+				 err);
-+			goto exit;
- 		}
- 
- 		brcmf_dbg(TRACE, "AP mode configuration complete\n");
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0061-brcmfmac-Fix-for-wrong-disconnection-event-source-in.patch b/patches/cypress/brcmfmac/0061-brcmfmac-Fix-for-wrong-disconnection-event-source-in.patch
deleted file mode 100644
index 43e7f59828e62794731e9fee2a6054d815b4b144..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0061-brcmfmac-Fix-for-wrong-disconnection-event-source-in.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 080da92a858d5d9cd5fdec521b7e386b1f2a2be9 Mon Sep 17 00:00:00 2001
-From: Soontak Lee <soontak.lee@cypress.com>
-Date: Wed, 6 Nov 2019 18:57:12 -0600
-Subject: [PATCH 061/138] brcmfmac: Fix for wrong disconnection event source
- information.
-
-Add event source argument on link down handler.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 17 +++++++++++------
- 1 file changed, 11 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 89ed0c7..8f9d865 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1283,7 +1283,8 @@ static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
- 	return err;
- }
- 
--static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
-+static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason,
-+			    bool locally_generated)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
- 	struct brcmf_pub *drvr = cfg->pub;
-@@ -1305,7 +1306,7 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
- 		if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
- 		    (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
- 			cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
--					      true, GFP_KERNEL);
-+					      locally_generated, GFP_KERNEL);
- 	}
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
- 	clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
-@@ -1484,7 +1485,7 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
- 		return 0;
- 	}
- 
--	brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING);
-+	brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING, true);
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	brcmf_dbg(TRACE, "Exit\n");
-@@ -3796,7 +3797,7 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
- 			 * disassociate from AP to save power while system is
- 			 * in suspended state
- 			 */
--			brcmf_link_down(vif, WLAN_REASON_UNSPECIFIED);
-+			brcmf_link_down(vif, WLAN_REASON_UNSPECIFIED, true);
- 			/* Make sure WPA_Supplicant receives all the event
- 			 * generated due to DISASSOC call to the fw to keep
- 			 * the state fw and WPA_Supplicant state consistent
-@@ -5920,7 +5921,11 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 		if (!brcmf_is_ibssmode(ifp->vif)) {
- 			brcmf_bss_connect_done(cfg, ndev, e, false);
- 			brcmf_link_down(ifp->vif,
--					brcmf_map_fw_linkdown_reason(e));
-+					brcmf_map_fw_linkdown_reason(e),
-+					e->event_code &
-+					(BRCMF_E_DEAUTH_IND |
-+					BRCMF_E_DISASSOC_IND)
-+					? false : true);
- 			brcmf_init_prof(ndev_to_prof(ndev));
- 			if (ndev != cfg_to_ndev(cfg))
- 				complete(&cfg->vif_disabled);
-@@ -7119,7 +7124,7 @@ static s32 __brcmf_cfg80211_down(struct brcmf_if *ifp)
- 	 * from AP to save power
- 	 */
- 	if (check_vif_up(ifp->vif)) {
--		brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED);
-+		brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED, true);
- 
- 		/* Make sure WPA_Supplicant receives all the event
- 		   generated due to DISASSOC call to the fw to keep
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0062-brcmfmac-add-support-for-SAE-authentication-offload.patch b/patches/cypress/brcmfmac/0062-brcmfmac-add-support-for-SAE-authentication-offload.patch
deleted file mode 100644
index 953411ec0bf9c42de12a867988311f5731f4c556..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0062-brcmfmac-add-support-for-SAE-authentication-offload.patch
+++ /dev/null
@@ -1,266 +0,0 @@
-From e0825f186d3eb961ca98e1d9bd6f23016929ed6d Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Wed, 2 Oct 2019 09:31:12 +0000
-Subject: [PATCH 062/138] brcmfmac: add support for SAE authentication offload
-
-commit 3b1e0a7bdfeedbde49b8d424aeb88ac3c0cf8182 upstream.
-
-The firmware may have SAE authentication code built-in. This is
-detected by the driver and indicated in the wiphy features flags.
-User-space can use this flag to determine whether or not to provide
-the password material for SAE authentication in the nl80211 CONNECT
-command.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 73 ++++++++++++++++++++--
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         |  3 +-
- .../wireless/broadcom/brcm80211/brcmfmac/feature.c |  3 +-
- .../wireless/broadcom/brcm80211/brcmfmac/feature.h |  4 +-
- .../broadcom/brcm80211/brcmfmac/fwil_types.h       | 13 ++++
- .../broadcom/brcm80211/include/brcmu_wifi.h        |  2 +
- 6 files changed, 90 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 8f9d865..cf5e12e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1283,6 +1283,31 @@ static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
- 	return err;
- }
- 
-+static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data,
-+				  u16 pwd_len)
-+{
-+	struct brcmf_pub *drvr = ifp->drvr;
-+	struct brcmf_wsec_sae_pwd_le sae_pwd;
-+	int err;
-+
-+	if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
-+		bphy_err(drvr, "sae_password must be less than %d\n",
-+			 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
-+		return -EINVAL;
-+	}
-+
-+	sae_pwd.key_len = cpu_to_le16(pwd_len);
-+	memcpy(sae_pwd.key, pwd_data, pwd_len);
-+
-+	err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
-+				       sizeof(sae_pwd));
-+	if (err < 0)
-+		bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
-+			 pwd_len);
-+
-+	return err;
-+}
-+
- static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason,
- 			    bool locally_generated)
- {
-@@ -1507,6 +1532,8 @@ static s32 brcmf_set_wpa_version(struct net_device *ndev,
- 		val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;
- 	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)
- 		val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;
-+	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3)
-+		val = WPA3_AUTH_SAE_PSK;
- 	else
- 		val = WPA_AUTH_DISABLED;
- 	brcmf_dbg(CONN, "setting wpa_auth to 0x%0x\n", val);
-@@ -1539,6 +1566,10 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 		val = 1;
- 		brcmf_dbg(CONN, "shared key\n");
- 		break;
-+	case NL80211_AUTHTYPE_SAE:
-+		val = 3;
-+		brcmf_dbg(CONN, "SAE authentication\n");
-+		break;
- 	default:
- 		val = 2;
- 		brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type);
-@@ -1707,6 +1738,16 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 				 sme->crypto.cipher_group);
- 			return -EINVAL;
- 		}
-+	} else if (val & WPA3_AUTH_SAE_PSK) {
-+		switch (sme->crypto.akm_suites[0]) {
-+		case WLAN_AKM_SUITE_SAE:
-+			val = WPA3_AUTH_SAE_PSK;
-+			break;
-+		default:
-+			bphy_err(drvr, "invalid cipher group (%d)\n",
-+				 sme->crypto.cipher_group);
-+			return -EINVAL;
-+		}
- 	}
- 
- 	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X)
-@@ -1778,7 +1819,8 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 	brcmf_dbg(CONN, "wpa_versions 0x%x cipher_pairwise 0x%x\n",
- 		  sec->wpa_versions, sec->cipher_pairwise);
- 
--	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))
-+	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2 |
-+				 NL80211_WPA_VERSION_3))
- 		return 0;
- 
- 	if (!(sec->cipher_pairwise &
-@@ -1985,7 +2027,13 @@ static void brcmf_set_join_pref(struct brcmf_if *ifp,
- 		goto done;
- 	}
- 
--	if (sme->crypto.psk) {
-+	if (sme->crypto.sae_pwd) {
-+		brcmf_dbg(INFO, "using SAE offload\n");
-+		profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
-+	}
-+
-+	if (sme->crypto.psk &&
-+	    profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
- 		if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
- 			err = -EINVAL;
- 			goto done;
-@@ -2003,12 +2051,23 @@ static void brcmf_set_join_pref(struct brcmf_if *ifp,
- 		}
- 	}
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK) {
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
- 		err = brcmf_set_pmk(ifp, sme->crypto.psk,
- 				    BRCMF_WSEC_MAX_PSK_LEN);
--		if (err)
-+	else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
-+		/* clean up user-space RSNE */
-+		if (brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0)) {
-+			bphy_err(drvr, "failed to clean up user-space RSNE\n");
- 			goto done;
-+		}
-+		err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
-+					     sme->crypto.sae_pwd_len);
-+		if (!err && sme->crypto.psk)
-+			err = brcmf_set_pmk(ifp, sme->crypto.psk,
-+					    BRCMF_WSEC_MAX_PSK_LEN);
- 	}
-+	if (err)
-+		goto done;
- 
- 	/* Join with specific BSSID and cached SSID
- 	 * If SSID is zero join based on BSSID only
-@@ -5443,7 +5502,8 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
- 	if (event == BRCMF_E_SET_SSID && status == BRCMF_E_STATUS_SUCCESS) {
- 		brcmf_dbg(CONN, "Processing set ssid\n");
- 		memcpy(vif->profile.bssid, e->addr, ETH_ALEN);
--		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK)
-+		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK &&
-+		    vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_SAE)
- 			return true;
- 
- 		set_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
-@@ -6977,6 +7037,9 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK);
- 		wiphy_ext_feature_set(wiphy,
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X);
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
-+			wiphy_ext_feature_set(wiphy,
-+					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
- 	}
- 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
- 	wiphy->max_remain_on_channel_duration = 5000;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 0af3c1a..31e3a55 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -133,7 +133,8 @@ struct brcmf_cfg80211_security {
- enum brcmf_profile_fwsup {
- 	BRCMF_PROFILE_FWSUP_NONE,
- 	BRCMF_PROFILE_FWSUP_PSK,
--	BRCMF_PROFILE_FWSUP_1X
-+	BRCMF_PROFILE_FWSUP_1X,
-+	BRCMF_PROFILE_FWSUP_SAE
- };
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-index 565db6c..d712734 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-@@ -38,7 +38,8 @@ struct brcmf_feat_fwcap {
- 	{ BRCMF_FEAT_P2P, "p2p" },
- 	{ BRCMF_FEAT_MONITOR, "monitor" },
- 	{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
--	{ BRCMF_FEAT_DOT11H, "802.11h" }
-+	{ BRCMF_FEAT_DOT11H, "802.11h" },
-+	{ BRCMF_FEAT_SAE, "sae" },
- };
- 
- #ifdef DEBUG
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-index 736a817..280a1f6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-@@ -26,6 +26,7 @@
-  * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
-  * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
-  * DOT11H: firmware supports 802.11h
-+ * SAE: simultaneous authentication of equals
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
-@@ -45,7 +46,8 @@
- 	BRCMF_FEAT_DEF(MONITOR) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
--	BRCMF_FEAT_DEF(DOT11H)
-+	BRCMF_FEAT_DEF(DOT11H) \
-+	BRCMF_FEAT_DEF(SAE)
- 
- /*
-  * Quirks:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-index f504fd2..b7c16dc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
-@@ -61,6 +61,8 @@
- #define BRCMF_WSEC_MAX_PSK_LEN		32
- #define	BRCMF_WSEC_PASSPHRASE		BIT(0)
- 
-+#define BRCMF_WSEC_MAX_SAE_PASSWORD_LEN 128
-+
- /* primary (ie tx) key */
- #define BRCMF_PRIMARY_KEY		(1 << 1)
- #define DOT11_BSSTYPE_ANY		2
-@@ -531,6 +533,17 @@ struct brcmf_wsec_pmk_le {
- 	u8 key[2 * BRCMF_WSEC_MAX_PSK_LEN + 1];
- };
- 
-+/**
-+ * struct brcmf_wsec_sae_pwd_le - firmware SAE password material.
-+ *
-+ * @key_len: number of octets in key materials.
-+ * @key: SAE password material.
-+ */
-+struct brcmf_wsec_sae_pwd_le {
-+	__le16 key_len;
-+	u8 key[BRCMF_WSEC_MAX_SAE_PASSWORD_LEN];
-+};
-+
- /* Used to get specific STA parameters */
- struct brcmf_scb_val_le {
- 	__le32 val;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-index 7b31c21..7552bdb9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-@@ -231,6 +231,8 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec)
- #define WPA2_AUTH_FT		0x4000	/* Fast BSS Transition */
- #define WPA2_AUTH_PSK_SHA256	0x8000	/* PSK with SHA256 key derivation */
- 
-+#define WPA3_AUTH_SAE_PSK	0x40000	/* SAE with 4-way handshake */
-+
- #define DOT11_DEFAULT_RTS_LEN		2347
- #define DOT11_DEFAULT_FRAG_LEN		2346
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0063-brcmfmac-Support-multiple-AP-interfaces-and-fix-STA-.patch b/patches/cypress/brcmfmac/0063-brcmfmac-Support-multiple-AP-interfaces-and-fix-STA-.patch
deleted file mode 100644
index 6f594d0d8d645db59e85895a4da92ead150ffe69..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0063-brcmfmac-Support-multiple-AP-interfaces-and-fix-STA-.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-From fc0b22667ec5661a85f12d439012f5af860b4fba Mon Sep 17 00:00:00 2001
-From: Soontak Lee <soontak.lee@cypress.com>
-Date: Wed, 6 Nov 2019 17:36:25 -0600
-Subject: [PATCH 063/138] brcmfmac: Support multiple AP interfaces and fix STA
- disconnection issue
-
-Support multiple AP interfaces for STA + AP + AP usecase.
-And fix STA disconnection when deactivating AP interface.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 48 +++++++++++++++++-----
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         |  1 +
- .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  5 +++
- 3 files changed, 44 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index cf5e12e..c6258d0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4608,6 +4608,7 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 		  settings->inactivity_timeout);
- 	dev_role = ifp->vif->wdev.iftype;
- 	mbss = ifp->vif->mbss;
-+	brcmf_dbg(TRACE, "mbss %s\n", mbss ? "enabled" : "disabled");
- 
- 	/* store current 11d setting */
- 	if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY,
-@@ -4814,6 +4815,9 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 	if ((err) && (!mbss)) {
- 		brcmf_set_mpc(ifp, 1);
- 		brcmf_configure_arp_nd_offload(ifp, true);
-+	} else {
-+		cfg->num_softap++;
-+		brcmf_dbg(TRACE, "Num of SoftAP %u\n", cfg->num_softap);
- 	}
- 	return err;
- }
-@@ -4826,6 +4830,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 	s32 err;
- 	struct brcmf_fil_bss_enable_le bss_enable;
- 	struct brcmf_join_params join_params;
-+	s32 apsta = 0;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-@@ -4834,6 +4839,27 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 		/* first to make sure they get processed by fw. */
- 		msleep(400);
- 
-+		cfg->num_softap--;
-+
-+		/* Clear bss configuration and SSID */
-+		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
-+		bss_enable.enable = cpu_to_le32(0);
-+		err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
-+					       sizeof(bss_enable));
-+		if (err < 0)
-+			brcmf_err("bss_enable config failed %d\n", err);
-+
-+		memset(&join_params, 0, sizeof(join_params));
-+		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
-+					     &join_params, sizeof(join_params));
-+		if (err < 0)
-+			bphy_err(drvr, "SET SSID error (%d)\n", err);
-+
-+		if (cfg->num_softap) {
-+			brcmf_dbg(TRACE, "Num of SoftAP %u\n", cfg->num_softap);
-+			return 0;
-+		}
-+
- 		if (ifp->vif->mbss) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			return err;
-@@ -4843,17 +4869,18 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 		if (ifp->bsscfgidx == 0)
- 			brcmf_fil_iovar_int_set(ifp, "closednet", 0);
- 
--		memset(&join_params, 0, sizeof(join_params));
--		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
--					     &join_params, sizeof(join_params));
--		if (err < 0)
--			bphy_err(drvr, "SET SSID error (%d)\n", err);
--		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
--		if (err < 0)
--			bphy_err(drvr, "BRCMF_C_DOWN error %d\n", err);
--		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
-+		err = brcmf_fil_iovar_int_get(ifp, "apsta", &apsta);
- 		if (err < 0)
--			bphy_err(drvr, "setting AP mode failed %d\n", err);
-+			brcmf_err("wl apsta failed (%d)\n", err);
-+
-+		if (!apsta) {
-+			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
-+			if (err < 0)
-+				bphy_err(drvr, "BRCMF_C_DOWN error %d\n", err);
-+			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
-+			if (err < 0)
-+				bphy_err(drvr, "Set AP mode error %d\n", err);
-+		}
- 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
- 			brcmf_fil_iovar_int_set(ifp, "mbss", 0);
- 		brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
-@@ -7432,6 +7459,7 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
- 	cfg->wiphy = wiphy;
- 	cfg->pub = drvr;
- 	cfg->pm_state = BRCMF_CFG80211_PM_STATE_RESUMED;
-+	cfg->num_softap = 0;
- 	init_vif_event(&cfg->vif_event);
- 	INIT_LIST_HEAD(&cfg->vif_list);
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 31e3a55..74287a3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -368,6 +368,7 @@ struct brcmf_cfg80211_info {
- 	struct brcmf_pno_info *pno;
- 	u8 ac_priority[MAX_8021D_PRIO];
- 	u8 pm_state;
-+	u8 num_softap;
- };
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index 7805bba..75beeb4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -305,6 +305,11 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 		brcmf_dbg(INFO, "CLM version = %s\n", clmver);
- 	}
- 
-+	/* set apsta */
-+	err = brcmf_fil_iovar_int_set(ifp, "apsta", 1);
-+	if (err)
-+		brcmf_info("failed setting apsta, %d\n", err);
-+
- 	/* set mpc */
- 	err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
- 	if (err) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0064-brcmfmac-Support-custom-PCIE-BAR-window-size.patch b/patches/cypress/brcmfmac/0064-brcmfmac-Support-custom-PCIE-BAR-window-size.patch
deleted file mode 100644
index ee6e02c4b67608d3e89d8bc6528df45239a6ad7c..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0064-brcmfmac-Support-custom-PCIE-BAR-window-size.patch
+++ /dev/null
@@ -1,458 +0,0 @@
-From 5ecd9d1b4c19246021527f02fd54d6a633442c1f Mon Sep 17 00:00:00 2001
-From: Soontak Lee <soontak.lee@cypress.com>
-Date: Mon, 4 Nov 2019 18:33:29 -0600
-Subject: [PATCH 064/138] brcmfmac: Support custom PCIE BAR window size.
-
-Certain host processors cannot support 4MB PCIE BAR window size.
-For example, AMLogic A113D can support 2MB size only.
-This patch is for host processor which support lower than 4MB
-PCIE BAR window size.
-
-Signed-off-by: Soontak Lee <soontak.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/Kconfig    |  11 +
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 242 ++++++++++++++++++++-
- 2 files changed, 247 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/Kconfig b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-index a5bf16c..b239e06 100644
---- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
-+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-@@ -37,3 +37,14 @@ config BRCMDBG
- 	select WANT_DEV_COREDUMP if BRCMFMAC
- 	---help---
- 	  Selecting this enables additional code for debug purposes.
-+
-+config BRCMFMAC_PCIE_BARWIN_SZ
-+	bool "Custom PCIE BAR window size support for FullMAC driver"
-+	depends on BRCMFMAC
-+	depends on PCI
-+	default n
-+	---help---
-+	  If you say Y here, the FMAC driver will use custom PCIE BAR
-+	  window size. Say Y to allow developers to use custom PCIE
-+	  BAR window size when HOST PCIE IP can support less then 4MB
-+	  BAR window.
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 6812704..e3f1cd5 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -272,6 +272,9 @@ struct brcmf_pciedev_info {
- 	void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 			  u16 value);
- 	struct brcmf_mp_device *settings;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	ulong bar1_size;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- };
- 
- struct brcmf_pcie_ringbuf {
-@@ -343,6 +346,10 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- static struct brcmf_fw_request *
- brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
- 
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+DEFINE_RAW_SPINLOCK(pcie_lock);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-+
- static u32
- brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
- {
-@@ -366,8 +373,24 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- brcmf_pcie_read_tcm8(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+	u8 value;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread8(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
-+	return value;
-+#else
- 	return (ioread8(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -375,8 +398,24 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- brcmf_pcie_read_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	u16 value;
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread16(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
-+	return value;
-+#else
- 	return (ioread16(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -385,8 +424,22 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 		       u16 value)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
- 
- 	iowrite16(value, address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#else
-+	iowrite16(value, address);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -413,8 +466,24 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- brcmf_pcie_read_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	u32 value;
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread32(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
-+	return value;
-+#else
- 	return (ioread32(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -423,17 +492,47 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 		       u32 value)
- {
- 	void __iomem *address = devinfo->tcm + mem_offset;
--
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	iowrite32(value, address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#else
- 	iowrite32(value, address);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
- static u32
- brcmf_pcie_read_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
- {
--	void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset;
-+	void __iomem *address = devinfo->tcm + devinfo->ci->rambase
-+		+ mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	u32 value;
-+	unsigned long flags;
-+
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	value = ioread32(address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
- 
--	return (ioread32(addr));
-+	return value;
-+#else
-+	return (ioread32(address));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -441,9 +540,23 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- brcmf_pcie_write_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
- 		       u32 value)
- {
--	void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset;
-+	void __iomem *address = devinfo->tcm + devinfo->ci->rambase
-+		+ mem_offset;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
- 
--	iowrite32(value, addr);
-+	raw_spin_lock_irqsave(&pcie_lock, flags);
-+	if ((address - devinfo->tcm) >= devinfo->bar1_size) {
-+		pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN,
-+				       devinfo->bar1_size);
-+		address = address - devinfo->bar1_size;
-+	}
-+	iowrite32(value, address);
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+	raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#else
-+	iowrite32(value, address);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -455,12 +568,30 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	__le32 *src32;
- 	__le16 *src16;
- 	u8 *src8;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 
- 	if (((ulong)address & 4) || ((ulong)srcaddr & 4) || (len & 4)) {
- 		if (((ulong)address & 2) || ((ulong)srcaddr & 2) || (len & 2)) {
- 			src8 = (u8 *)srcaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+				    devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						 BCMA_PCI_BAR1_WIN,
-+						 devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				iowrite8(*src8, address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address++;
- 				src8++;
- 				len--;
-@@ -469,7 +600,22 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 			len = len / 2;
- 			src16 = (__le16 *)srcaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+					devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						BCMA_PCI_BAR1_WIN,
-+						devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				iowrite16(le16_to_cpu(*src16), address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address += 2;
- 				src16++;
- 				len--;
-@@ -479,12 +625,29 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 		len = len / 4;
- 		src32 = (__le32 *)srcaddr;
- 		while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_lock_irqsave(&pcie_lock, flags);
-+			if ((address - devinfo->tcm) >=
-+			    devinfo->bar1_size) {
-+				pci_write_config_dword
-+					(devinfo->pdev,
-+					 BCMA_PCI_BAR1_WIN,
-+					 devinfo->bar1_size);
-+				address = address - devinfo->bar1_size;
-+			}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			iowrite32(le32_to_cpu(*src32), address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			address += 4;
- 			src32++;
- 			len--;
- 		}
- 	}
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -496,12 +659,30 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	__le32 *dst32;
- 	__le16 *dst16;
- 	u8 *dst8;
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	unsigned long flags;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 
- 	if (((ulong)address & 4) || ((ulong)dstaddr & 4) || (len & 4)) {
- 		if (((ulong)address & 2) || ((ulong)dstaddr & 2) || (len & 2)) {
- 			dst8 = (u8 *)dstaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+				    devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						BCMA_PCI_BAR1_WIN,
-+						devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				*dst8 = ioread8(address);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address++;
- 				dst8++;
- 				len--;
-@@ -510,7 +691,22 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 			len = len / 2;
- 			dst16 = (__le16 *)dstaddr;
- 			while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_lock_irqsave(&pcie_lock, flags);
-+				if ((address - devinfo->tcm) >=
-+				    devinfo->bar1_size) {
-+					pci_write_config_dword
-+						(devinfo->pdev,
-+						BCMA_PCI_BAR1_WIN,
-+						devinfo->bar1_size);
-+					address = address -
-+						devinfo->bar1_size;
-+				}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				*dst16 = cpu_to_le16(ioread16(address));
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+				raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 				address += 2;
- 				dst16++;
- 				len--;
-@@ -520,12 +716,29 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 		len = len / 4;
- 		dst32 = (__le32 *)dstaddr;
- 		while (len) {
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_lock_irqsave(&pcie_lock, flags);
-+			if ((address - devinfo->tcm) >=
-+			    devinfo->bar1_size) {
-+				pci_write_config_dword
-+					(devinfo->pdev,
-+					BCMA_PCI_BAR1_WIN,
-+					devinfo->bar1_size);
-+				address = address - devinfo->bar1_size;
-+			}
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			*dst32 = cpu_to_le32(ioread32(address));
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			raw_spin_unlock_irqrestore(&pcie_lock, flags);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			address += 4;
- 			dst32++;
- 			len--;
- 		}
- 	}
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	pci_write_config_dword(devinfo->pdev, BCMA_PCI_BAR1_WIN, 0x0);
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- }
- 
- 
-@@ -569,6 +782,9 @@ static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
- 			     BRCMF_PCIE_CFGREG_MSI_ADDR_L,
- 			     BRCMF_PCIE_CFGREG_MSI_ADDR_H,
- 			     BRCMF_PCIE_CFGREG_MSI_DATA,
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+			     BCMA_PCI_BAR1_WIN,
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 			     BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL2,
- 			     BRCMF_PCIE_CFGREG_RBAR_CTRL,
- 			     BRCMF_PCIE_CFGREG_PML1_SUB_CTRL1,
-@@ -1139,9 +1355,14 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
- 	u16 max_flowrings;
- 	u16 max_submissionrings;
- 	u16 max_completionrings;
--
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	brcmf_pcie_copy_dev_tomem(devinfo, devinfo->shared.ring_info_addr,
-+				  &ringinfo, sizeof(ringinfo));
-+#else
- 	memcpy_fromio(&ringinfo, devinfo->tcm + devinfo->shared.ring_info_addr,
- 		      sizeof(ringinfo));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-+
- 	if (devinfo->shared.version >= 6) {
- 		max_submissionrings = le16_to_cpu(ringinfo.max_submissionrings);
- 		max_flowrings = le16_to_cpu(ringinfo.max_flowrings);
-@@ -1210,8 +1431,14 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
- 		ringinfo.d2h_r_idx_hostaddr.high_addr =
- 			cpu_to_le32(address >> 32);
- 
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+		brcmf_pcie_copy_mem_todev(devinfo,
-+					  devinfo->shared.ring_info_addr,
-+					  &ringinfo, sizeof(ringinfo));
-+#else
- 		memcpy_toio(devinfo->tcm + devinfo->shared.ring_info_addr,
- 			    &ringinfo, sizeof(ringinfo));
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 		brcmf_dbg(PCIE, "Using host memory indices\n");
- 	}
- 
-@@ -1650,6 +1877,9 @@ static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
- 
- 	devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
- 	devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
-+#ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
-+	devinfo->bar1_size = bar1_size;
-+#endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
- 
- 	if (!devinfo->regs || !devinfo->tcm) {
- 		brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0065-brcmfmac-set-F2-blocksize-and-watermark-for-4354.patch b/patches/cypress/brcmfmac/0065-brcmfmac-set-F2-blocksize-and-watermark-for-4354.patch
deleted file mode 100644
index 2eb02ca0128d4adf02e26b7e9f40da66adc9f1d8..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0065-brcmfmac-set-F2-blocksize-and-watermark-for-4354.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From e4d4ae6f491d4b0a43baf7a827e2954775574cbe Mon Sep 17 00:00:00 2001
-From: Frank Kao <frank.kao@cypress.com>
-Date: Mon, 25 Nov 2019 15:41:13 +0800
-Subject: [PATCH 065/138] brcmfmac: set F2 blocksize and watermark for 4354
-
-Set F2 blocksize to 256 bytes and watermark to 0x40 for 4354.
-Also enable and configure F1 MesBusyCtrl. It would resolve random
-driver crash issue.
-
-Signed-off-by: Frank Kao <frank.kao@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |  4 ++++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 15 +++++++++++++++
- 2 files changed, 19 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 896546d..570210b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -46,6 +46,7 @@
- #define SDIO_FUNC2_BLOCKSIZE		512
- #define SDIO_4373_FUNC2_BLOCKSIZE	256
- #define SDIO_4359_FUNC2_BLOCKSIZE	256
-+#define SDIO_4354_FUNC2_BLOCKSIZE	256
- /* Maximum milliseconds to wait for F2 to come up */
- #define SDIO_WAIT_F2RDY	3000
- 
-@@ -925,6 +926,9 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 	case SDIO_DEVICE_ID_CYPRESS_89359:
- 		f2_blksz = SDIO_4359_FUNC2_BLOCKSIZE;
- 		break;
-+	case SDIO_DEVICE_ID_BROADCOM_4354:
-+		f2_blksz = SDIO_4354_FUNC2_BLOCKSIZE;
-+		break;
- 	default:
- 		break;
- 	}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 31b4fb2..c68b5a4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -55,6 +55,8 @@
- 				 SBSDIO_MESBUSYCTRL_ENAB)
- #define CY_4359_F2_WATERMARK	0x40
- #define CY_4359_F1_MESBUSYCTRL	(CY_4359_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
-+#define CY_4354_F2_WATERMARK	0x40
-+#define CY_4354_F1_MESBUSYCTRL	(CY_4354_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
- 
- #ifdef DEBUG
- 
-@@ -4279,6 +4281,19 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
- 					   CY_4359_F1_MESBUSYCTRL, &err);
- 			break;
-+		case SDIO_DEVICE_ID_BROADCOM_4354:
-+			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
-+				  CY_4354_F2_WATERMARK);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
-+					   CY_4354_F2_WATERMARK, &err);
-+			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
-+						   &err);
-+			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
-+					   &err);
-+			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
-+					   CY_4354_F1_MESBUSYCTRL, &err);
-+			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
- 					   DEFAULT_F2_WATERMARK, &err);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0066-brcmfmac-support-for-virtual-interface-creation-from.patch b/patches/cypress/brcmfmac/0066-brcmfmac-support-for-virtual-interface-creation-from.patch
deleted file mode 100644
index 9b90fe9a2731f35a06965864492053fcdbf4b563..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0066-brcmfmac-support-for-virtual-interface-creation-from.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 83c2d664f46e195da9c412ec1d2ab24ba90ac6f2 Mon Sep 17 00:00:00 2001
-From: "Lo(Double)Hsiang Lo" <double.lo@cypress.com>
-Date: Mon, 9 Dec 2019 20:49:17 -0600
-Subject: [PATCH 066/138] brcmfmac: support for virtual interface creation from
- firmware
-
-Allow interface creation via IF_ADD event from firmware.
-
-Signed-off-by: Lo(Double)Hsiang Lo <double.lo@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-SWLINUX-1291
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 45 ++++++++++++++++++++--
- 1 file changed, 42 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index c6258d0..edf7d52 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -229,6 +229,9 @@ struct parsed_vndr_ies {
- 	struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
- };
- 
-+#define WLC_E_IF_ROLE_STA		0	/* Infra STA */
-+#define WLC_E_IF_ROLE_AP		1	/* Access Point */
-+
- static u8 nl80211_band_to_fwil(enum nl80211_band band)
- {
- 	switch (band) {
-@@ -5512,8 +5515,10 @@ void brcmf_cfg80211_free_netdev(struct net_device *ndev)
- 	ifp = netdev_priv(ndev);
- 	vif = ifp->vif;
- 
--	if (vif)
-+	if (vif) {
- 		brcmf_free_vif(vif);
-+		ifp->vif = NULL;
-+	}
- }
- 
- static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
-@@ -6075,6 +6080,9 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
- 	struct brcmf_if_event *ifevent = (struct brcmf_if_event *)data;
- 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
- 	struct brcmf_cfg80211_vif *vif;
-+	enum nl80211_iftype iftype = NL80211_IFTYPE_UNSPECIFIED;
-+	bool vif_pend = false;
-+	int err;
- 
- 	brcmf_dbg(TRACE, "Enter: action %u flags %u ifidx %u bsscfgidx %u\n",
- 		  ifevent->action, ifevent->flags, ifevent->ifidx,
-@@ -6087,9 +6095,28 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
- 	switch (ifevent->action) {
- 	case BRCMF_E_IF_ADD:
- 		/* waiting process may have timed out */
--		if (!cfg->vif_event.vif) {
-+		if (!vif) {
-+			/* handle IF_ADD event from firmware */
- 			spin_unlock(&event->vif_event_lock);
--			return -EBADF;
-+			vif_pend = true;
-+			if (ifevent->role == WLC_E_IF_ROLE_STA)
-+				iftype = NL80211_IFTYPE_STATION;
-+			else if (ifevent->role == WLC_E_IF_ROLE_AP)
-+				iftype = NL80211_IFTYPE_AP;
-+			else
-+				vif_pend = false;
-+
-+			if (vif_pend) {
-+				vif = brcmf_alloc_vif(cfg, iftype);
-+				if (IS_ERR(vif)) {
-+					brcmf_err("Role:%d failed to alloc vif\n",
-+						  ifevent->role);
-+					return PTR_ERR(vif);
-+				}
-+			} else {
-+				brcmf_err("Invalid Role:%d\n", ifevent->role);
-+				return -EBADF;
-+			}
- 		}
- 
- 		ifp->vif = vif;
-@@ -6099,6 +6126,18 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
- 			ifp->ndev->ieee80211_ptr = &vif->wdev;
- 			SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy));
- 		}
-+
-+		if (vif_pend) {
-+			err = brcmf_net_attach(ifp, false);
-+			if (err) {
-+				brcmf_err("netdevice register failed with err:%d\n",
-+					  err);
-+				brcmf_free_vif(vif);
-+				free_netdev(ifp->ndev);
-+			}
-+			return err;
-+		}
-+
- 		spin_unlock(&event->vif_event_lock);
- 		wake_up(&event->vif_wq);
- 		return 0;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0067-brcmfmac-set-security-after-reiniting-interface.patch b/patches/cypress/brcmfmac/0067-brcmfmac-set-security-after-reiniting-interface.patch
deleted file mode 100644
index 3c7351bedd7f2e143ea919400bbe350bd1f7a21d..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0067-brcmfmac-set-security-after-reiniting-interface.patch
+++ /dev/null
@@ -1,147 +0,0 @@
-From 733b2f7932ae64a05ce8940ee47b7d897b76ac83 Mon Sep 17 00:00:00 2001
-From: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Date: Thu, 12 Dec 2019 00:02:45 -0600
-Subject: [PATCH 067/138] brcmfmac: set security after reiniting interface
-
-Host driver parses and sets security params into FW passed by
-supplicant. This has to be done after reiniting interface in the
-firmware.
-
-Signed-off-by: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 90 ++++++++++++++--------
- 1 file changed, 58 insertions(+), 32 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index edf7d52..90ee396 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4581,6 +4581,48 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- }
- 
- static s32
-+brcmf_parse_configure_security(struct brcmf_if *ifp,
-+			       struct cfg80211_ap_settings *settings,
-+			       enum nl80211_iftype dev_role)
-+{
-+	const struct brcmf_tlv *rsn_ie;
-+	const struct brcmf_vs_tlv *wpa_ie;
-+	s32 err = 0;
-+
-+	/* find the RSN_IE */
-+	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
-+				  settings->beacon.tail_len, WLAN_EID_RSN);
-+
-+	/* find the WPA_IE */
-+	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
-+				  settings->beacon.tail_len);
-+
-+	if (wpa_ie || rsn_ie) {
-+		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
-+		if (wpa_ie) {
-+			/* WPA IE */
-+			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
-+			if (err < 0)
-+				return err;
-+		} else {
-+			struct brcmf_vs_tlv *tmp_ie;
-+
-+			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
-+
-+			/* RSN IE */
-+			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
-+			if (err < 0)
-+				return err;
-+		}
-+	} else {
-+		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
-+		brcmf_configure_opensecurity(ifp);
-+	}
-+
-+	return err;
-+}
-+
-+static s32
- brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
- 			struct cfg80211_ap_settings *settings)
- {
-@@ -4592,8 +4634,6 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 	const struct brcmf_tlv *country_ie;
- 	struct brcmf_ssid_le ssid_le;
- 	s32 err = -EPERM;
--	const struct brcmf_tlv *rsn_ie;
--	const struct brcmf_vs_tlv *wpa_ie;
- 	struct brcmf_join_params join_params;
- 	enum nl80211_iftype dev_role;
- 	struct brcmf_fil_bss_enable_le bss_enable;
-@@ -4648,36 +4688,6 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 		brcmf_configure_arp_nd_offload(ifp, false);
- 	}
- 
--	/* find the RSN_IE */
--	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
--				  settings->beacon.tail_len, WLAN_EID_RSN);
--
--	/* find the WPA_IE */
--	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
--				  settings->beacon.tail_len);
--
--	if ((wpa_ie != NULL || rsn_ie != NULL)) {
--		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
--		if (wpa_ie != NULL) {
--			/* WPA IE */
--			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
--			if (err < 0)
--				goto exit;
--		} else {
--			struct brcmf_vs_tlv *tmp_ie;
--
--			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
--
--			/* RSN IE */
--			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
--			if (err < 0)
--				goto exit;
--		}
--	} else {
--		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
--		brcmf_configure_opensecurity(ifp);
--	}
--
- 	/* Parameters shared by all radio interfaces */
- 	if (!mbss) {
- 		if ((supports_11d) && (is_11d != ifp->vif->is_11d)) {
-@@ -4756,6 +4766,14 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 			bphy_err(drvr, "BRCMF_C_UP error (%d)\n", err);
- 			goto exit;
- 		}
-+
-+		err = brcmf_parse_configure_security(ifp, settings,
-+						     NL80211_IFTYPE_AP);
-+		if (err < 0) {
-+			bphy_err(drvr, "brcmf_parse_configure_security error\n");
-+			goto exit;
-+		}
-+
- 		/* On DOWN the firmware removes the WEP keys, reconfigure
- 		 * them if they were set.
- 		 */
-@@ -4790,6 +4808,14 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 				 chanspec, err);
- 			goto exit;
- 		}
-+
-+		err = brcmf_parse_configure_security(ifp, settings,
-+						     NL80211_IFTYPE_P2P_GO);
-+		if (err < 0) {
-+			brcmf_err("brcmf_parse_configure_security error\n");
-+			goto exit;
-+		}
-+
- 		err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
- 						sizeof(ssid_le));
- 		if (err < 0) {
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0068-brcmfmac-increase-dcmd-maximum-buffer-size.patch b/patches/cypress/brcmfmac/0068-brcmfmac-increase-dcmd-maximum-buffer-size.patch
deleted file mode 100644
index 527fa0f26ff18a8b360a0a996f0616cbc3c35ff8..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0068-brcmfmac-increase-dcmd-maximum-buffer-size.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From de35e70b94a4904df03c0eb127ec4a7e36b9c07e Mon Sep 17 00:00:00 2001
-From: "Lo(Double)Hsiang Lo" <double.lo@cypress.com>
-Date: Mon, 16 Dec 2019 03:41:09 -0600
-Subject: [PATCH 068/138] brcmfmac: increase dcmd maximum buffer size
-
-Increase dcmd maximum buffer size to match firmware
-configuration for new chips.
-
-Signed-off-by: Lo(Double)Hsiang Lo <double.lo@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-SWLINUX-1273
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-index 2c95a08..705130c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-@@ -87,6 +87,8 @@ struct brcmf_proto_bcdc_header {
- 					 * plus any space that might be needed
- 					 * for bus alignment padding.
- 					 */
-+#define ROUND_UP_MARGIN 2048
-+
- struct brcmf_bcdc {
- 	u16 reqid;
- 	u8 bus_header[BUS_HEADER_LEN];
-@@ -471,7 +473,7 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
- 
- 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
- 	drvr->bus_if->maxctl = BRCMF_DCMD_MAXLEN +
--			sizeof(struct brcmf_proto_bcdc_dcmd);
-+			sizeof(struct brcmf_proto_bcdc_dcmd) + ROUND_UP_MARGIN;
- 	return 0;
- 
- fail:
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0069-brcmfmac-set-F2-blocksize-and-watermark-for-4356-SDI.patch b/patches/cypress/brcmfmac/0069-brcmfmac-set-F2-blocksize-and-watermark-for-4356-SDI.patch
deleted file mode 100644
index e6f04a1bb59b71dffa6c306a9597f4a15ac76ebd..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0069-brcmfmac-set-F2-blocksize-and-watermark-for-4356-SDI.patch
+++ /dev/null
@@ -1,101 +0,0 @@
-From 9c48baad793241f922efdc17a667977d49fd6bfa Mon Sep 17 00:00:00 2001
-From: Frank Kao <frank.kao@cypress.com>
-Date: Wed, 18 Dec 2019 16:11:14 +0800
-Subject: [PATCH 069/138] brcmfmac: set F2 blocksize and watermark for 4356
- SDIO
-
-Set F2 blocksize to 256 bytes and watermark to 0x40 for 4356 SDIO.
-Also enable and configure F1 MesBusyCtrl. It would resolve random
-driver crash issue.
-
-Signed-off-by: Frank Kao <frank.kao@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  |  8 +++----
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 27 ++++++----------------
- 2 files changed, 10 insertions(+), 25 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 570210b..3ad9224 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -45,8 +45,7 @@
- #define SDIO_FUNC1_BLOCKSIZE		64
- #define SDIO_FUNC2_BLOCKSIZE		512
- #define SDIO_4373_FUNC2_BLOCKSIZE	256
--#define SDIO_4359_FUNC2_BLOCKSIZE	256
--#define SDIO_4354_FUNC2_BLOCKSIZE	256
-+#define SDIO_435X_FUNC2_BLOCKSIZE	256
- /* Maximum milliseconds to wait for F2 to come up */
- #define SDIO_WAIT_F2RDY	3000
- 
-@@ -924,10 +923,9 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		break;
- 	case SDIO_DEVICE_ID_BROADCOM_4359:
- 	case SDIO_DEVICE_ID_CYPRESS_89359:
--		f2_blksz = SDIO_4359_FUNC2_BLOCKSIZE;
--		break;
- 	case SDIO_DEVICE_ID_BROADCOM_4354:
--		f2_blksz = SDIO_4354_FUNC2_BLOCKSIZE;
-+	case SDIO_DEVICE_ID_BROADCOM_4356:
-+		f2_blksz = SDIO_435X_FUNC2_BLOCKSIZE;
- 		break;
- 	default:
- 		break;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index c68b5a4..de090ee 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -53,11 +53,9 @@
- #define CY_43455_MES_WATERMARK	0x50
- #define CY_43455_MESBUSYCTRL	(CY_43455_MES_WATERMARK | \
- 				 SBSDIO_MESBUSYCTRL_ENAB)
--#define CY_4359_F2_WATERMARK	0x40
--#define CY_4359_F1_MESBUSYCTRL	(CY_4359_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
--#define CY_4354_F2_WATERMARK	0x40
--#define CY_4354_F1_MESBUSYCTRL	(CY_4354_F2_WATERMARK | SBSDIO_MESBUSYCTRL_ENAB)
--
-+#define CY_435X_F2_WATERMARK	0x40
-+#define CY_435X_F1_MESBUSYCTRL	(CY_435X_F2_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- #ifdef DEBUG
- 
- #define BRCMF_TRAP_INFO_SIZE	80
-@@ -4269,30 +4267,19 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			break;
- 		case SDIO_DEVICE_ID_BROADCOM_4359:
- 		case SDIO_DEVICE_ID_CYPRESS_89359:
--			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
--				  CY_4359_F2_WATERMARK);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--					   CY_4359_F2_WATERMARK, &err);
--			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
--						   &err);
--			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
--			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
--					   &err);
--			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_4359_F1_MESBUSYCTRL, &err);
--			break;
- 		case SDIO_DEVICE_ID_BROADCOM_4354:
-+		case SDIO_DEVICE_ID_BROADCOM_4356:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
--				  CY_4354_F2_WATERMARK);
-+				  CY_435X_F2_WATERMARK);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--					   CY_4354_F2_WATERMARK, &err);
-+					   CY_435X_F2_WATERMARK, &err);
- 			devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
- 						   &err);
- 			devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_4354_F1_MESBUSYCTRL, &err);
-+					   CY_435X_F1_MESBUSYCTRL, &err);
- 			break;
- 		default:
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0070-brcmfmac-set-net-carrier-on-via-test-tool-for-AP-mod.patch b/patches/cypress/brcmfmac/0070-brcmfmac-set-net-carrier-on-via-test-tool-for-AP-mod.patch
deleted file mode 100644
index 1a26fb42fcd2a1a1f1d4c0d1225406fa4fe467ef..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0070-brcmfmac-set-net-carrier-on-via-test-tool-for-AP-mod.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 65b06108e57a2c25811411d28bdcc92f4aba8736 Mon Sep 17 00:00:00 2001
-From: Kurt Lee/TAIPEI <kurl@cypress.com>
-Date: Tue, 31 Dec 2019 03:47:08 -0600
-Subject: [PATCH 070/138] brcmfmac: set net carrier on via test tool for AP
- mode
-
-Host parses ioctl cmd via test tool, then set itself iftype to ap
-mode and report netif_carrier_on to upper layer
-
-Signed-off-by: Kurt Lee <kurt.lee@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-SWLINUX-1322
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-index 4ed3287..0bad78d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-@@ -64,6 +64,15 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
- 		*(char *)(dcmd_buf + len)  = '\0';
- 	}
- 
-+	if (cmdhdr->cmd == BRCMF_C_SET_AP) {
-+		if (*(int *)(dcmd_buf) == 1) {
-+			ifp->vif->wdev.iftype = NL80211_IFTYPE_AP;
-+			brcmf_net_setcarrier(ifp, true);
-+		} else {
-+			ifp->vif->wdev.iftype = NL80211_IFTYPE_STATION;
-+		}
-+	}
-+
- 	if (cmdhdr->set)
- 		ret = brcmf_fil_cmd_data_set(ifp, cmdhdr->cmd, dcmd_buf,
- 					     ret_len);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0071-nl80211-add-authorized-flag-back-to-ROAM-event.patch b/patches/cypress/brcmfmac/0071-nl80211-add-authorized-flag-back-to-ROAM-event.patch
deleted file mode 100644
index 29764f08e56d3772fe7ea0c5c60a8e45f4dc67f3..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0071-nl80211-add-authorized-flag-back-to-ROAM-event.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 3b8d2b01828da85042213ce7e984fdda1a38c5b5 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Thu, 14 Feb 2019 16:33:53 +0800
-Subject: [PATCH 071/138] nl80211: add authorized flag back to ROAM event
-
-Commit 503c1fb98ba3 ("cfg80211/nl80211: add a port authorized event")
-added the NL80211_CMD_PORT_AUTHORIZED event to indicate that a
-connection is authorized. It replaced the PORT_AUTHORIZED attribute and
-the authorized flag added in commit f45cbe6e691f
-("nl80211: add authorized flag to ROAM event").
-
-However, for offload FT, using PORT_AUTHORIZED event mechanism induces
-wpa_supplicant to start a full EAP exchange after a successful roaming.
-This patch adds the flag mechanism back to the ROAM event for drivers
-to fix the offload FT roaming issue.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- include/net/cfg80211.h       | 4 ++++
- include/uapi/linux/nl80211.h | 5 ++++-
- net/wireless/nl80211.c       | 4 +++-
- net/wireless/sme.c           | 1 +
- 4 files changed, 12 insertions(+), 2 deletions(-)
-
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 68782ba..598cf54 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6570,6 +6570,9 @@ void cfg80211_connect_done(struct net_device *dev,
-  * @resp_ie: association response IEs (may be %NULL)
-  * @resp_ie_len: assoc response IEs length
-  * @fils: FILS related roaming information.
-+ * @authorized: true if the 802.1X authentication was done by the driver or is
-+ *	not needed (e.g., when Fast Transition protocol was used), false
-+ *	otherwise. Ignored for networks that don't use 802.1X authentication.
-  */
- struct cfg80211_roam_info {
- 	struct ieee80211_channel *channel;
-@@ -6580,6 +6583,7 @@ struct cfg80211_roam_info {
- 	const u8 *resp_ie;
- 	size_t resp_ie_len;
- 	struct cfg80211_fils_resp_params fils;
-+	bool authorized;
- };
- 
- /**
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index beee59c..4e6178f 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -2299,7 +2299,10 @@ enum nl80211_commands {
-  *	in %NL80211_CMD_CONNECT to indicate that for 802.1X authentication it
-  *	wants to use the supported offload of the 4-way handshake.
-  * @NL80211_ATTR_PMKR0_NAME: PMK-R0 Name for offloaded FT.
-- * @NL80211_ATTR_PORT_AUTHORIZED: (reserved)
-+ * @NL80211_ATTR_PORT_AUTHORIZED: flag attribute used in %NL80211_CMD_ROAMED
-+ *	notification indicating that that 802.1X authentication was done by
-+ *	the driver or is not needed (because roaming used the Fast Transition
-+ *	protocol).
-  *
-  * @NL80211_ATTR_EXTERNAL_AUTH_ACTION: Identify the requested external
-  *     authentication operation (u32 attribute with an
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index c74646b..e67b77f 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -15312,7 +15312,9 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
- 	    (info->fils.pmk &&
- 	     nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
- 	    (info->fils.pmkid &&
--	     nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
-+	     nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)) ||
-+	    (info->authorized &&
-+	     nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)))
- 		goto nla_put_failure;
- 
- 	genlmsg_end(msg, hdr);
-diff --git a/net/wireless/sme.c b/net/wireless/sme.c
-index d32a2ec..d341763 100644
---- a/net/wireless/sme.c
-+++ b/net/wireless/sme.c
-@@ -1020,6 +1020,7 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
- 	if (info->fils.update_erp_next_seq_num)
- 		ev->rm.fils.erp_next_seq_num = info->fils.erp_next_seq_num;
- 	ev->rm.bss = info->bss;
-+	ev->rm.authorized = info->authorized;
- 
- 	spin_lock_irqsave(&wdev->event_lock, flags);
- 	list_add_tail(&ev->list, &wdev->event_list);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0072-brcmfmac-set-authorized-flag-in-ROAM-event-for-offlo.patch b/patches/cypress/brcmfmac/0072-brcmfmac-set-authorized-flag-in-ROAM-event-for-offlo.patch
deleted file mode 100644
index 68348c833547bb0ce73eb6127d40b8a72cdc3792..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0072-brcmfmac-set-authorized-flag-in-ROAM-event-for-offlo.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 751cdfc65b2692062e42f5d0f93bf756921cb217 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Thu, 14 Feb 2019 17:28:22 +0800
-Subject: [PATCH 072/138] brcmfmac: set authorized flag in ROAM event for
- offload FT roaming
-
-When using PORT_AUTHORIZED event mechanism for offload FT,
-wpa_supplicant started a full EAP exchange after a successful roaming.
-It was caused by setting portEnabled to FALSE to get EAP state machine
-out of the SUCCESS state and eapSuccess cleared when handling ROAM
-event in wap_supplicant.
-
-With this patch, the authorized flag in the ROAM event is used to
-indicate the connection is authorized. Wpa_supplicant sets portEnabled
-according to the flag and no full EAP exchange is performed after the
-roaming.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 90ee396..a71f002 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5905,14 +5905,12 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	roam_info.resp_ie = conn_info->resp_ie;
- 	roam_info.resp_ie_len = conn_info->resp_ie_len;
- 
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft)
-+		roam_info.authorized = true;
-+
- 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
- 	brcmf_dbg(CONN, "Report roaming result\n");
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) {
--		cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
--		brcmf_dbg(CONN, "Report port authorized\n");
--	}
--
- 	set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
- 	brcmf_dbg(TRACE, "Exit\n");
- 	return err;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0073-brcmfmac-set-authorized-flag-in-ROAM-event-for-PMK-c.patch b/patches/cypress/brcmfmac/0073-brcmfmac-set-authorized-flag-in-ROAM-event-for-PMK-c.patch
deleted file mode 100644
index cec15b818b80ea1f8a0eda26c296be8620ff2b9a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0073-brcmfmac-set-authorized-flag-in-ROAM-event-for-PMK-c.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From d7dabfffb70bf0abb940cf9b86600f894821c41e Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Sun, 3 Mar 2019 20:30:32 -0600
-Subject: [PATCH 073/138] brcmfmac: set authorized flag in ROAM event for PMK
- caching
-
-With 4-way handshake offload for 802.1X authentication, the authorized
-flag in ROAM event should be set for a successful roaming with PMK
-caching. The roaming is identified by checking the existence of PMKID
-within the (Re)Association Request frame with this patch.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 45 +++++++++++++++++++++-
- 1 file changed, 44 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index a71f002..2c0245c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5845,6 +5845,47 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
-+static bool
-+brcmf_has_pmkid(const u8 *parse, u32 len)
-+{
-+	const struct brcmf_tlv *rsn_ie;
-+	const u8 *ie;
-+	u32 ie_len;
-+	u32 offset;
-+	u16 count;
-+
-+	rsn_ie = brcmf_parse_tlvs(parse, len, WLAN_EID_RSN);
-+	if (!rsn_ie)
-+		goto done;
-+	ie = (const u8 *)rsn_ie;
-+	ie_len = rsn_ie->len + TLV_HDR_LEN;
-+	/* Skip group data cipher suite */
-+	offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN;
-+	if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
-+		goto done;
-+	/* Skip pairwise cipher suite(s) */
-+	count = ie[offset] + (ie[offset + 1] << 8);
-+	offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
-+	if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
-+		goto done;
-+	/* Skip auth key management suite(s) */
-+	count = ie[offset] + (ie[offset + 1] << 8);
-+	offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
-+	if (offset + RSN_CAP_LEN >= ie_len)
-+		goto done;
-+	/* Skip rsn capabilities */
-+	offset += RSN_CAP_LEN;
-+	if (offset + RSN_PMKID_COUNT_LEN > ie_len)
-+		goto done;
-+	/* Extract PMKID count */
-+	count = ie[offset] + (ie[offset + 1] << 8);
-+	if (count)
-+		return true;
-+
-+done:
-+	return false;
-+}
-+
- static s32
- brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
- 		       struct net_device *ndev,
-@@ -5905,7 +5946,9 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	roam_info.resp_ie = conn_info->resp_ie;
- 	roam_info.resp_ie_len = conn_info->resp_ie_len;
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft)
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X &&
-+	    (brcmf_has_pmkid(roam_info.req_ie, roam_info.req_ie_len) ||
-+	     profile->is_ft))
- 		roam_info.authorized = true;
- 
- 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0074-nl80211-add-authorized-flag-to-CONNECT-event.patch b/patches/cypress/brcmfmac/0074-nl80211-add-authorized-flag-to-CONNECT-event.patch
deleted file mode 100644
index 1a6f239471d8e8036ad3fb3ae3f72ee527466655..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0074-nl80211-add-authorized-flag-to-CONNECT-event.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 547b24914939f9551990bd777bc7d35159293b11 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 30 Apr 2019 17:52:41 -0500
-Subject: [PATCH 074/138] nl80211: add authorized flag to CONNECT event
-
-Add authorized flag to CONNECT event. It is used for 802.1X 4-way
-handshake offload with PMK caching.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- include/net/cfg80211.h | 3 +++
- net/wireless/nl80211.c | 2 ++
- net/wireless/sme.c     | 1 +
- 3 files changed, 6 insertions(+)
-
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 598cf54..91939f3 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6410,6 +6410,8 @@ struct cfg80211_fils_resp_params {
-  *	not known. This value is used only if @status < 0 to indicate that the
-  *	failure is due to a timeout and not due to explicit rejection by the AP.
-  *	This value is ignored in other cases (@status >= 0).
-+ * @authorized: Indicates whether the connection is ready to transport
-+ *	data packets.
-  */
- struct cfg80211_connect_resp_params {
- 	int status;
-@@ -6421,6 +6423,7 @@ struct cfg80211_connect_resp_params {
- 	size_t resp_ie_len;
- 	struct cfg80211_fils_resp_params fils;
- 	enum nl80211_timeout_reason timeout_reason;
-+	bool authorized;
- };
- 
- /**
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index e67b77f..3191532 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -15246,6 +15246,8 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
- 	     (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) ||
- 	      nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON,
- 			  cr->timeout_reason))) ||
-+	    (cr->authorized &&
-+	     nla_put_flag(msg, NL80211_ATTR_PORT_AUTHORIZED)) ||
- 	    (cr->req_ie &&
- 	     nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) ||
- 	    (cr->resp_ie &&
-diff --git a/net/wireless/sme.c b/net/wireless/sme.c
-index d341763..407ce1d 100644
---- a/net/wireless/sme.c
-+++ b/net/wireless/sme.c
-@@ -887,6 +887,7 @@ void cfg80211_connect_done(struct net_device *dev,
- 	ev->cr.bss = params->bss;
- 	ev->cr.status = params->status;
- 	ev->cr.timeout_reason = params->timeout_reason;
-+	ev->cr.authorized = params->authorized;
- 
- 	spin_lock_irqsave(&wdev->event_lock, flags);
- 	list_add_tail(&ev->list, &wdev->event_list);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0075-brcmfmac-set-authorized-flag-in-CONNECT-event-for-PM.patch b/patches/cypress/brcmfmac/0075-brcmfmac-set-authorized-flag-in-CONNECT-event-for-PM.patch
deleted file mode 100644
index 7e46e6b17ff960e650d7d6b6fb865221eeb43296..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0075-brcmfmac-set-authorized-flag-in-CONNECT-event-for-PM.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From f4d1a8d5613c696d60627b06a2a7f361404c6425 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 30 Apr 2019 17:55:02 -0500
-Subject: [PATCH 075/138] brcmfmac: set authorized flag in CONNECT event for
- PMK caching
-
-With 4-way handshake offload for 802.1X authentication, the authorized
-flag in CONNECT event should be set for a successful connection with
-PMK caching. The connection is identified by checking the existence of
-PMKID within the Association Request frame with this patch.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 2c0245c..77f7ef4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5988,6 +5988,11 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 		conn_params.req_ie_len = conn_info->req_ie_len;
- 		conn_params.resp_ie = conn_info->resp_ie;
- 		conn_params.resp_ie_len = conn_info->resp_ie_len;
-+
-+		if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X &&
-+		    brcmf_has_pmkid(conn_params.req_ie, conn_params.req_ie_len))
-+			conn_params.authorized = true;
-+
- 		cfg80211_connect_done(ndev, &conn_params, GFP_KERNEL);
- 		brcmf_dbg(CONN, "Report connect result - connection %s\n",
- 			  completed ? "succeeded" : "failed");
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0076-brcmfmac-add-support-for-Opportunistic-Key-Caching.patch b/patches/cypress/brcmfmac/0076-brcmfmac-add-support-for-Opportunistic-Key-Caching.patch
deleted file mode 100644
index cb0209cc74e7aa8e5141d70323648b384742431e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0076-brcmfmac-add-support-for-Opportunistic-Key-Caching.patch
+++ /dev/null
@@ -1,108 +0,0 @@
-From ebb6cb8e4820320f0f193855ad374b4e3de1c6c6 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 28 May 2019 04:20:20 -0500
-Subject: [PATCH 076/138] brcmfmac: add support for Opportunistic Key Caching
-
-The firmware may have OKC management. This is detected by the driver and
-supported via providing the PMK. The authorized flag in ROAM event
-should be set for a successful roaming with OKC.
-
-Signed-off-by: Darren Li <hsin-hung.li@cypress.com>
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 25 ++++++++++++++++++++--
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         |  1 +
- 2 files changed, 24 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 77f7ef4..dce792e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1674,6 +1674,7 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 	struct brcmf_pub *drvr = ifp->drvr;
- 	s32 val;
- 	s32 err;
-+	s32 okc_enable;
- 	const struct brcmf_tlv *rsn_ie;
- 	const u8 *ie;
- 	u32 ie_len;
-@@ -1684,6 +1685,7 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 
- 	profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
- 	profile->is_ft = false;
-+	profile->is_okc = false;
- 
- 	if (!sme->crypto.n_akm_suites)
- 		return 0;
-@@ -1753,8 +1755,17 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 		}
- 	}
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X)
-+	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X) {
- 		brcmf_dbg(INFO, "using 1X offload\n");
-+		err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), "okc_enable",
-+					       &okc_enable);
-+		if (err) {
-+			bphy_err(drvr, "get okc_enable failed (%d)\n", err);
-+		} else {
-+			brcmf_dbg(INFO, "get okc_enable (%d)\n", okc_enable);
-+			profile->is_okc = okc_enable;
-+		}
-+	}
- 
- 	if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
- 		goto skip_mfp_config;
-@@ -5384,17 +5395,27 @@ static int brcmf_cfg80211_set_pmk(struct wiphy *wiphy, struct net_device *dev,
- 				  const struct cfg80211_pmk_conf *conf)
- {
- 	struct brcmf_if *ifp;
-+	struct brcmf_pub *drvr;
-+	int ret;
- 
- 	brcmf_dbg(TRACE, "enter\n");
- 
- 	/* expect using firmware supplicant for 1X */
- 	ifp = netdev_priv(dev);
-+	drvr = ifp->drvr;
- 	if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X))
- 		return -EINVAL;
- 
- 	if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN)
- 		return -ERANGE;
- 
-+	if (ifp->vif->profile.is_okc) {
-+		ret = brcmf_fil_iovar_data_set(ifp, "okc_info_pmk", conf->pmk,
-+					       conf->pmk_len);
-+		if (ret < 0)
-+			bphy_err(drvr, "okc_info_pmk iovar failed: ret=%d\n", ret);
-+	}
-+
- 	return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len);
- }
- 
-@@ -5948,7 +5969,7 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 
- 	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X &&
- 	    (brcmf_has_pmkid(roam_info.req_ie, roam_info.req_ie_len) ||
--	     profile->is_ft))
-+	     profile->is_ft || profile->is_okc))
- 		roam_info.authorized = true;
- 
- 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 74287a3..fcffe0c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -150,6 +150,7 @@ struct brcmf_cfg80211_profile {
- 	struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
- 	enum brcmf_profile_fwsup use_fwsup;
- 	bool is_ft;
-+	bool is_okc;
- };
- 
- /**
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0077-nl80211-support-4-way-handshake-offloading-for-WPA-W.patch b/patches/cypress/brcmfmac/0077-nl80211-support-4-way-handshake-offloading-for-WPA-W.patch
deleted file mode 100644
index 2e259c43bdba739a65ae9a208fcce2866c4dc315..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0077-nl80211-support-4-way-handshake-offloading-for-WPA-W.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From 4e43a62d4c45a5af34bd61f5d4d8ba1fbbb8b6c5 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 10 Dec 2019 14:21:26 -0600
-Subject: [PATCH 077/138] nl80211: support 4-way handshake offloading for
- WPA/WPA2-PSK in AP mode
-
-Let drivers advertise support for AP-mode WPA/WPA2-PSK 4-way handshake
-offloading with a new NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK flag.
-
-Extend use of NL80211_ATTR_PMK attribute indicating it might be passed
-as part of NL80211_CMD_START_AP command, and contain the PSK (which is
-the PMK, hence the name).
-
-The driver is assumed to handle the 4-way handshake by itself in this
-case, instead of relying on user space.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- include/uapi/linux/nl80211.h | 41 ++++++++++++++++++++++++++++-------------
- net/wireless/nl80211.c       |  4 +++-
- 2 files changed, 31 insertions(+), 14 deletions(-)
-
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index 4e6178f..cfba370 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -183,18 +183,27 @@
-  *
-  * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK flag drivers
-  * can indicate they support offloading EAPOL handshakes for WPA/WPA2
-- * preshared key authentication. In %NL80211_CMD_CONNECT the preshared
-- * key should be specified using %NL80211_ATTR_PMK. Drivers supporting
-- * this offload may reject the %NL80211_CMD_CONNECT when no preshared
-- * key material is provided, for example when that driver does not
-- * support setting the temporal keys through %CMD_NEW_KEY.
-+ * preshared key authentication in station mode. In %NL80211_CMD_CONNECT
-+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
-+ * supporting this offload may reject the %NL80211_CMD_CONNECT when no
-+ * preshared key material is provided, for example when that driver does
-+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
-  *
-  * Similarly @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X flag can be
-  * set by drivers indicating offload support of the PTK/GTK EAPOL
-- * handshakes during 802.1X authentication. In order to use the offload
-- * the %NL80211_CMD_CONNECT should have %NL80211_ATTR_WANT_1X_4WAY_HS
-- * attribute flag. Drivers supporting this offload may reject the
-- * %NL80211_CMD_CONNECT when the attribute flag is not present.
-+ * handshakes during 802.1X authentication in station mode. In order to
-+ * use the offload the %NL80211_CMD_CONNECT should have
-+ * %NL80211_ATTR_WANT_1X_4WAY_HS attribute flag. Drivers supporting this
-+ * offload may reject the %NL80211_CMD_CONNECT when the attribute flag is
-+ * not present.
-+ *
-+ * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK flag drivers
-+ * can indicate they support offloading EAPOL handshakes for WPA/WPA2
-+ * preshared key authentication in AP mode. In %NL80211_CMD_START_AP
-+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
-+ * supporting this offload may reject the %NL80211_CMD_START_AP when no
-+ * preshared key material is provided, for example when that driver does
-+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
-  *
-  * For 802.1X the PMK or PMK-R0 are set by providing %NL80211_ATTR_PMK
-  * using %NL80211_CMD_SET_PMK. For offloaded FT support also
-@@ -2285,10 +2294,11 @@ enum nl80211_commands {
-  *
-  * @NL80211_ATTR_PMK: attribute for passing PMK key material. Used with
-  *	%NL80211_CMD_SET_PMKSA for the PMKSA identified by %NL80211_ATTR_PMKID.
-- *	For %NL80211_CMD_CONNECT it is used to provide PSK for offloading 4-way
-- *	handshake for WPA/WPA2-PSK networks. For 802.1X authentication it is
-- *	used with %NL80211_CMD_SET_PMK. For offloaded FT support this attribute
-- *	specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME is included as well.
-+ *	For %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP it is used to provide
-+ *	PSK for offloading 4-way handshake for WPA/WPA2-PSK networks. For 802.1X
-+ *	authentication it is used with %NL80211_CMD_SET_PMK. For offloaded FT
-+ *	support this attribute specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME
-+ *	is included as well.
-  *
-  * @NL80211_ATTR_SCHED_SCAN_MULTI: flag attribute which user-space shall use to
-  *	indicate that it supports multiple active scheduled scan requests.
-@@ -5487,6 +5497,10 @@ enum nl80211_feature_flags {
-  * @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in
-  *	station mode (SAE password is passed as part of the connect command).
-  *
-+ * @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK: Device wants to do 4-way
-+ *	handshake with PSK in AP mode (PSK is passed as part of the start AP
-+ *	command).
-+ *
-  * @NUM_NL80211_EXT_FEATURES: number of extended features.
-  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-  */
-@@ -5532,6 +5546,7 @@ enum nl80211_ext_feature_index {
- 	NL80211_EXT_FEATURE_EXT_KEY_ID,
- 	NL80211_EXT_FEATURE_STA_TX_PWR,
- 	NL80211_EXT_FEATURE_SAE_OFFLOAD,
-+	NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK,
- 
- 	/* add new features before the definition below */
- 	NUM_NL80211_EXT_FEATURES,
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 3191532..4d5ef27 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -9157,7 +9157,9 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
- 		if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
- 			return -EINVAL;
- 		if (!wiphy_ext_feature_isset(&rdev->wiphy,
--					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK))
-+					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) &&
-+		    !wiphy_ext_feature_isset(&rdev->wiphy,
-+					     NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK))
- 			return -EINVAL;
- 		settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
- 	}
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0078-brcmfmac-support-4-way-handshake-offloading-for-WPA-.patch b/patches/cypress/brcmfmac/0078-brcmfmac-support-4-way-handshake-offloading-for-WPA-.patch
deleted file mode 100644
index f99f6ba93a1d852f238815b9f64a307ac1b3d0f5..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0078-brcmfmac-support-4-way-handshake-offloading-for-WPA-.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-From ceb73105fe24f4e88c026cc9748603edb0c5a739 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 10 Dec 2019 14:22:56 -0600
-Subject: [PATCH 078/138] brcmfmac: support 4-way handshake offloading for
- WPA/WPA2-PSK in AP mode
-
-Firmware may have authenticator code built-in. This is detected by the
-driver and indicated in the wiphy features flags. User space can use
-this flag to determine whether or not to provide the pre-shared key
-material in the nl80211 start AP command to offload the 4-way handshake
-in AP mode.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 23 ++++++++++++++++++++++
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         | 12 +++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/feature.c |  1 +
- .../wireless/broadcom/brcm80211/brcmfmac/feature.h |  4 +++-
- 4 files changed, 39 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index dce792e..ea21b69 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4641,6 +4641,8 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	struct brcmf_pub *drvr = cfg->pub;
-+	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
-+	struct cfg80211_crypto_settings *crypto = &settings->crypto;
- 	const struct brcmf_tlv *ssid_ie;
- 	const struct brcmf_tlv *country_ie;
- 	struct brcmf_ssid_le ssid_le;
-@@ -4778,6 +4780,17 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 			goto exit;
- 		}
- 
-+		if (crypto->psk) {
-+			brcmf_dbg(INFO, "using PSK offload\n");
-+			profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_PSK);
-+			err = brcmf_set_pmk(ifp, crypto->psk,
-+					    BRCMF_WSEC_MAX_PSK_LEN);
-+			if (err < 0)
-+				goto exit;
-+		}
-+		if (profile->use_fwauth == 0)
-+			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
-+
- 		err = brcmf_parse_configure_security(ifp, settings,
- 						     NL80211_IFTYPE_AP);
- 		if (err < 0) {
-@@ -4867,6 +4880,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(ndev);
- 	struct brcmf_pub *drvr = cfg->pub;
-+	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
- 	s32 err;
- 	struct brcmf_fil_bss_enable_le bss_enable;
- 	struct brcmf_join_params join_params;
-@@ -4900,6 +4914,12 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 			return 0;
- 		}
- 
-+		if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) {
-+			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK))
-+				brcmf_set_pmk(ifp, NULL, 0);
-+			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
-+		}
-+
- 		if (ifp->vif->mbss) {
- 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
- 			return err;
-@@ -7200,6 +7220,9 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 			wiphy_ext_feature_set(wiphy,
- 					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
- 	}
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH))
-+		wiphy_ext_feature_set(wiphy,
-+				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK);
- 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
- 	wiphy->max_remain_on_channel_duration = 5000;
- 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index fcffe0c..d4e32a8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -138,6 +138,17 @@ enum brcmf_profile_fwsup {
- };
- 
- /**
-+ * enum brcmf_profile_fwauth - firmware authenticator profile
-+ *
-+ * @BRCMF_PROFILE_FWAUTH_NONE: no firmware authenticator
-+ * @BRCMF_PROFILE_FWAUTH_PSK: authenticator for WPA/WPA2-PSK
-+ */
-+enum brcmf_profile_fwauth {
-+	BRCMF_PROFILE_FWAUTH_NONE,
-+	BRCMF_PROFILE_FWAUTH_PSK
-+};
-+
-+/**
-  * struct brcmf_cfg80211_profile - profile information.
-  *
-  * @bssid: bssid of joined/joining ibss.
-@@ -149,6 +160,7 @@ struct brcmf_cfg80211_profile {
- 	struct brcmf_cfg80211_security sec;
- 	struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS];
- 	enum brcmf_profile_fwsup use_fwsup;
-+	u16 use_fwauth;
- 	bool is_ft;
- 	bool is_okc;
- };
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-index d712734..b9ae778 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-@@ -40,6 +40,7 @@ struct brcmf_feat_fwcap {
- 	{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
- 	{ BRCMF_FEAT_DOT11H, "802.11h" },
- 	{ BRCMF_FEAT_SAE, "sae" },
-+	{ BRCMF_FEAT_FWAUTH, "idauth" },
- };
- 
- #ifdef DEBUG
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-index 280a1f6..56d991c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-@@ -27,6 +27,7 @@
-  * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
-  * DOT11H: firmware supports 802.11h
-  * SAE: simultaneous authentication of equals
-+ * FWAUTH: Firmware authenticator
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
-@@ -47,7 +48,8 @@
- 	BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
- 	BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
- 	BRCMF_FEAT_DEF(DOT11H) \
--	BRCMF_FEAT_DEF(SAE)
-+	BRCMF_FEAT_DEF(SAE) \
-+	BRCMF_FEAT_DEF(FWAUTH)
- 
- /*
-  * Quirks:
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0079-nl80211-support-SAE-authentication-offload-in-AP-mod.patch b/patches/cypress/brcmfmac/0079-nl80211-support-SAE-authentication-offload-in-AP-mod.patch
deleted file mode 100644
index bd68d9bca28b2e0a56c8766220677c1056d5380f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0079-nl80211-support-SAE-authentication-offload-in-AP-mod.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 6456ef4e270c98ef01aaeacc9fdb4b2add449579 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 10 Dec 2019 14:24:10 -0600
-Subject: [PATCH 079/138] nl80211: support SAE authentication offload in AP
- mode
-
-Add support for SAE authentication offload in AP mode.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- include/uapi/linux/nl80211.h | 10 ++++++----
- net/wireless/nl80211.c       |  5 +++--
- 2 files changed, 9 insertions(+), 6 deletions(-)
-
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index cfba370..b660fb0 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -252,9 +252,10 @@
-  * DOC: SAE authentication offload
-  *
-  * By setting @NL80211_EXT_FEATURE_SAE_OFFLOAD flag drivers can indicate they
-- * support offloading SAE authentication for WPA3-Personal networks. In
-- * %NL80211_CMD_CONNECT the password for SAE should be specified using
-- * %NL80211_ATTR_SAE_PASSWORD.
-+ * support offloading SAE authentication for WPA3-Personal networks. The
-+ * password for SAE should be specified using %NL80211_ATTR_SAE_PASSWORD in
-+ * %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP for station and AP mode
-+ * respectively.
-  */
- 
- /**
-@@ -5495,7 +5496,8 @@ enum nl80211_feature_flags {
-  *	to a station.
-  *
-  * @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in
-- *	station mode (SAE password is passed as part of the connect command).
-+ *	station mode (SAE password is passed as part of the connect command)
-+ *	or AP mode (SAE password is passed as part of the start AP command).
-  *
-  * @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK: Device wants to do 4-way
-  *	handshake with PSK in AP mode (PSK is passed as part of the start AP
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 4d5ef27..4538a79 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -4611,8 +4611,9 @@ static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
- 			return false;
- 		return true;
- 	case NL80211_CMD_START_AP:
--		/* SAE not supported yet */
--		if (auth_type == NL80211_AUTHTYPE_SAE)
-+		if (!wiphy_ext_feature_isset(&rdev->wiphy,
-+					     NL80211_EXT_FEATURE_SAE_OFFLOAD) &&
-+		    auth_type == NL80211_AUTHTYPE_SAE)
- 			return false;
- 		/* FILS not supported yet */
- 		if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0080-brcmfmac-support-SAE-authentication-offload-in-AP-mo.patch b/patches/cypress/brcmfmac/0080-brcmfmac-support-SAE-authentication-offload-in-AP-mo.patch
deleted file mode 100644
index 2991d0ac0876befdfc60bc228edf342fae096ac0..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0080-brcmfmac-support-SAE-authentication-offload-in-AP-mo.patch
+++ /dev/null
@@ -1,118 +0,0 @@
-From be8eef6fc674652aef2ed4e6c2cd1667d1a20fbb Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Tue, 10 Dec 2019 14:25:14 -0600
-Subject: [PATCH 080/138] brcmfmac: support SAE authentication offload in AP
- mode
-
-Firmware may have SAE authenticator code built-in. This is detected by
-the driver and indicated in the wiphy features flags. User space can use
-this flag to determine whether or not to provide the password material
-in the nl80211 start AP command to offload the SAE authentication in AP
-mode.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 28 ++++++++++++++++++----
- .../broadcom/brcm80211/brcmfmac/cfg80211.h         |  4 +++-
- 2 files changed, 27 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index ea21b69..4b007ea 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -55,6 +55,7 @@
- #define RSN_AKM_PSK			2	/* Pre-shared Key */
- #define RSN_AKM_SHA256_1X		5	/* SHA256, 802.1X */
- #define RSN_AKM_SHA256_PSK		6	/* SHA256, Pre-shared Key */
-+#define RSN_AKM_SAE			8	/* SAE */
- #define RSN_CAP_LEN			2	/* Length of RSN capabilities */
- #define RSN_CAP_PTK_REPLAY_CNTR_MASK	(BIT(2) | BIT(3))
- #define RSN_CAP_MFPR_MASK		BIT(6)
-@@ -4204,6 +4205,10 @@ static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
- 			brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
- 			wpa_auth |= WPA2_AUTH_1X_SHA256;
- 			break;
-+		case RSN_AKM_SAE:
-+			brcmf_dbg(TRACE, "RSN_AKM_SAE\n");
-+			wpa_auth |= WPA3_AUTH_SAE_PSK;
-+			break;
- 		default:
- 			bphy_err(drvr, "Invalid key mgmt info\n");
- 		}
-@@ -4221,11 +4226,12 @@ static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
- 				brcmf_dbg(TRACE, "MFP Required\n");
- 				mfp = BRCMF_MFP_REQUIRED;
- 				/* Firmware only supports mfp required in
--				 * combination with WPA2_AUTH_PSK_SHA256 or
--				 * WPA2_AUTH_1X_SHA256.
-+				 * combination with WPA2_AUTH_PSK_SHA256,
-+				 * WPA2_AUTH_1X_SHA256, or WPA3_AUTH_SAE_PSK.
- 				 */
- 				if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 |
--						  WPA2_AUTH_1X_SHA256))) {
-+						  WPA2_AUTH_1X_SHA256 |
-+						  WPA3_AUTH_SAE_PSK))) {
- 					err = -EINVAL;
- 					goto exit;
- 				}
-@@ -4788,6 +4794,14 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 			if (err < 0)
- 				goto exit;
- 		}
-+		if (crypto->sae_pwd) {
-+			brcmf_dbg(INFO, "using SAE offload\n");
-+			profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_SAE);
-+			err = brcmf_set_sae_password(ifp, crypto->sae_pwd,
-+						     crypto->sae_pwd_len);
-+			if (err < 0)
-+				goto exit;
-+		}
- 		if (profile->use_fwauth == 0)
- 			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
- 
-@@ -4917,6 +4931,8 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 		if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) {
- 			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK))
- 				brcmf_set_pmk(ifp, NULL, 0);
-+			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_SAE))
-+				brcmf_set_sae_password(ifp, NULL, 0);
- 			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
- 		}
- 
-@@ -7220,9 +7236,13 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
- 			wiphy_ext_feature_set(wiphy,
- 					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
- 	}
--	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH))
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH)) {
- 		wiphy_ext_feature_set(wiphy,
- 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK);
-+		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
-+			wiphy_ext_feature_set(wiphy,
-+					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
-+	}
- 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
- 	wiphy->max_remain_on_channel_duration = 5000;
- 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index d4e32a8..bd4ea5e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -142,10 +142,12 @@ enum brcmf_profile_fwsup {
-  *
-  * @BRCMF_PROFILE_FWAUTH_NONE: no firmware authenticator
-  * @BRCMF_PROFILE_FWAUTH_PSK: authenticator for WPA/WPA2-PSK
-+ * @BRCMF_PROFILE_FWAUTH_PSK: authenticator for SAE
-  */
- enum brcmf_profile_fwauth {
- 	BRCMF_PROFILE_FWAUTH_NONE,
--	BRCMF_PROFILE_FWAUTH_PSK
-+	BRCMF_PROFILE_FWAUTH_PSK,
-+	BRCMF_PROFILE_FWAUTH_SAE
- };
- 
- /**
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0081-brcmfmac-add-USB-autosuspend-feature-support.patch b/patches/cypress/brcmfmac/0081-brcmfmac-add-USB-autosuspend-feature-support.patch
deleted file mode 100644
index 418cecc2bf5d6c10638517b8bc0a008b28c1f4d2..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0081-brcmfmac-add-USB-autosuspend-feature-support.patch
+++ /dev/null
@@ -1,297 +0,0 @@
-From 24df0f91ae69c7d17decdeae1d3bc260457bda34 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 7 Feb 2020 01:55:59 -0600
-Subject: [PATCH 081/138] brcmfmac: add USB autosuspend feature support
-
-commit 7f1d42304d933c310592c91df70b661965a36121 upstream.
-
-We add enable dynamic suspend (autosuspend) support in host driver, and
-it can let platform cut down idle power consumption.
-To support autosuspend feature in host driver, kernel need to be built
-with CONFIG_USB_SUSPEND and autosuspend need to be turn on.
-And we also replace wowl feature with adding "needs_remote_wakeup", so
-that host still can be waken by wireless device.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-Link: https://lore.kernel.org/r/1585124429-97371-6-git-send-email-chi-hsien.lin@cypress.com
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 121 ++++++++++++---------
- 1 file changed, 71 insertions(+), 50 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index e910cc0..be04fcb 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -165,7 +165,6 @@ struct brcmf_usbdev_info {
- 
- 	struct urb *bulk_urb; /* used for FW download */
- 
--	bool wowl_enabled;
- 	struct brcmf_mp_device *settings;
- };
- 
-@@ -313,28 +312,43 @@ static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	int err = 0;
- 	int timeout = 0;
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
-+	struct usb_interface *intf = to_usb_interface(dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
--		return -EIO;
- 
--	if (test_and_set_bit(0, &devinfo->ctl_op))
--		return -EIO;
-+	err = usb_autopm_get_interface(intf);
-+	if (err)
-+		goto out;
-+
-+	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-+		err = -EIO;
-+		goto fail;
-+	}
-+
-+	if (test_and_set_bit(0, &devinfo->ctl_op)) {
-+		err = -EIO;
-+		goto fail;
-+	}
- 
- 	devinfo->ctl_completed = false;
- 	err = brcmf_usb_send_ctl(devinfo, buf, len);
- 	if (err) {
- 		brcmf_err("fail %d bytes: %d\n", err, len);
- 		clear_bit(0, &devinfo->ctl_op);
--		return err;
-+		goto fail;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
- 	if (!timeout) {
- 		brcmf_err("Txctl wait timed out\n");
- 		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
-+		goto fail;
- 	}
- 	clear_bit(0, &devinfo->ctl_op);
-+
-+fail:
-+	usb_autopm_put_interface(intf);
-+out:
- 	return err;
- }
- 
-@@ -343,20 +357,30 @@ static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 	int err = 0;
- 	int timeout = 0;
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
-+	struct usb_interface *intf = to_usb_interface(dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP)
--		return -EIO;
- 
--	if (test_and_set_bit(0, &devinfo->ctl_op))
--		return -EIO;
-+	err = usb_autopm_get_interface(intf);
-+	if (err)
-+		goto out;
-+
-+	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-+		err = -EIO;
-+		goto fail;
-+	}
-+
-+	if (test_and_set_bit(0, &devinfo->ctl_op)) {
-+		err = -EIO;
-+		goto fail;
-+	}
- 
- 	devinfo->ctl_completed = false;
- 	err = brcmf_usb_recv_ctl(devinfo, buf, len);
- 	if (err) {
- 		brcmf_err("fail %d bytes: %d\n", err, len);
- 		clear_bit(0, &devinfo->ctl_op);
--		return err;
-+		goto fail;
- 	}
- 	timeout = brcmf_usb_ioctl_resp_wait(devinfo);
- 	err = devinfo->ctl_urb_status;
-@@ -364,12 +388,15 @@ static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
- 		brcmf_err("rxctl wait timed out\n");
- 		usb_kill_urb(devinfo->ctl_urb);
- 		err = -EIO;
-+		goto fail;
- 	}
- 	clear_bit(0, &devinfo->ctl_op);
-+fail:
-+	usb_autopm_put_interface(intf);
- 	if (!err)
- 		return devinfo->ctl_urb_actual_length;
--	else
--		return err;
-+out:
-+	return err;
- }
- 
- static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
-@@ -502,10 +529,12 @@ static void brcmf_usb_rx_complete(struct urb *urb)
- 		return;
- 	}
- 
--	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
-+	if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP ||
-+	    devinfo->bus_pub.state == BRCMFMAC_USB_STATE_SLEEP) {
- 		skb_put(skb, urb->actual_length);
- 		brcmf_rx_frame(devinfo->dev, skb, true);
- 		brcmf_usb_rx_refill(devinfo, req);
-+		usb_mark_last_busy(urb->dev);
- 	} else {
- 		brcmu_pkt_buf_free_skb(skb);
- 		brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
-@@ -589,6 +618,11 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 	struct brcmf_usbreq  *req;
- 	int ret;
- 	unsigned long flags;
-+	struct usb_interface *intf = to_usb_interface(dev);
-+
-+	ret = usb_autopm_get_interface(intf);
-+	if (ret)
-+		goto out;
- 
- 	brcmf_dbg(USB, "Enter, skb=%p\n", skb);
- 	if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
-@@ -628,9 +662,10 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		devinfo->tx_flowblock = true;
- 	}
- 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
--	return 0;
- 
- fail:
-+	usb_autopm_put_interface(intf);
-+out:
- 	return ret;
- }
- 
-@@ -994,20 +1029,32 @@ static int brcmf_usb_dlrun(struct brcmf_usbdev_info *devinfo)
- brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
- {
- 	int err;
-+	struct usb_interface *intf;
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (devinfo == NULL)
--		return -ENODEV;
-+	if (!devinfo) {
-+		err = -ENODEV;
-+		goto out;
-+	}
- 
- 	if (!devinfo->image) {
- 		brcmf_err("No firmware!\n");
--		return -ENOENT;
-+		err = -ENOENT;
-+		goto out;
- 	}
- 
-+	intf = to_usb_interface(devinfo->dev);
-+	err = usb_autopm_get_interface(intf);
-+	if (err)
-+		goto out;
-+
- 	err = brcmf_usb_dlstart(devinfo,
- 		(u8 *)devinfo->image, devinfo->image_len);
- 	if (err == 0)
- 		err = brcmf_usb_dlrun(devinfo);
-+
-+	usb_autopm_put_interface(intf);
-+out:
- 	return err;
- }
- 
-@@ -1108,18 +1155,6 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
- 	return NULL;
- }
- 
--static void brcmf_usb_wowl_config(struct device *dev, bool enabled)
--{
--	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
--
--	brcmf_dbg(USB, "Configuring WOWL, enabled=%d\n", enabled);
--	devinfo->wowl_enabled = enabled;
--	if (enabled)
--		device_set_wakeup_enable(devinfo->dev, true);
--	else
--		device_set_wakeup_enable(devinfo->dev, false);
--}
--
- static
- int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- {
-@@ -1146,7 +1181,6 @@ int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- 	.txdata = brcmf_usb_tx,
- 	.txctl = brcmf_usb_tx_ctlpkt,
- 	.rxctl = brcmf_usb_rx_ctlpkt,
--	.wowl_config = brcmf_usb_wowl_config,
- 	.get_fwname = brcmf_usb_get_fwname,
- };
- 
-@@ -1335,6 +1369,8 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 
- 	usb_set_intfdata(intf, devinfo);
- 
-+	intf->needs_remote_wakeup = 1;
-+
- 	/* Check that the device supports only one configuration */
- 	if (usb->descriptor.bNumConfigurations != 1) {
- 		brcmf_err("Number of configurations: %d not supported\n",
-@@ -1462,12 +1498,8 @@ static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
- 		brcmf_err("timed out wait for cfg80211 suspended\n");
- 
- 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
--	if (devinfo->wowl_enabled) {
--		brcmf_cancel_all_urbs(devinfo);
--	} else {
--		brcmf_detach(&usb->dev);
--		brcmf_free(&usb->dev);
--	}
-+	brcmf_cancel_all_urbs(devinfo);
-+	device_set_wakeup_enable(devinfo->dev, true);
- 	return 0;
- }
- 
-@@ -1480,22 +1512,10 @@ static int brcmf_usb_resume(struct usb_interface *intf)
- 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
- 
- 	brcmf_dbg(USB, "Enter\n");
--	if (!devinfo->wowl_enabled) {
--		int err;
--
--		err = brcmf_alloc(&usb->dev, devinfo->settings);
--		if (err)
--			return err;
--
--		err = brcmf_attach(devinfo->dev);
--		if (err) {
--			brcmf_free(devinfo->dev);
--			return err;
--		}
--	}
- 
- 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
- 	brcmf_usb_rx_fill_all(devinfo);
-+	device_set_wakeup_enable(devinfo->dev, false);
- 	return 0;
- }
- 
-@@ -1552,6 +1572,7 @@ static int brcmf_usb_reset_resume(struct usb_interface *intf)
- 	.suspend = brcmf_usb_suspend,
- 	.resume = brcmf_usb_resume,
- 	.reset_resume = brcmf_usb_reset_resume,
-+	.supports_autosuspend = true,
- 	.disable_hub_initiated_lpm = 1,
- };
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0082-brcmfmac-To-support-printing-USB-console-messages.patch b/patches/cypress/brcmfmac/0082-brcmfmac-To-support-printing-USB-console-messages.patch
deleted file mode 100644
index 13e9df5473e832f73af737d1c5a850e6e77a2b02..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0082-brcmfmac-To-support-printing-USB-console-messages.patch
+++ /dev/null
@@ -1,241 +0,0 @@
-From 9e7783c41c755cd94f507e30a3356ccef2b27dc3 Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Wed, 7 Nov 2018 16:59:03 -0600
-Subject: [PATCH 082/138] brcmfmac: To support printing USB console messages
-
-This change is to add support for printing the firmware
-console messges of a USB interface chip to the host.
-To enable this feature, build option '-msgtrace' should be
-enabled in the firmware. And in the host, debug=0x100000
-should be provided as a module parameter.
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  1 +
- .../wireless/broadcom/brcm80211/brcmfmac/core.c    |  9 +++
- .../wireless/broadcom/brcm80211/brcmfmac/debug.c   | 83 ++++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/debug.h   | 24 +++++++
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 14 ++++
- 5 files changed, 131 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-index 623c016..c8063ca 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -271,6 +271,7 @@ int brcmf_bus_reset(struct brcmf_bus *bus)
- 
- s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len);
- void brcmf_bus_add_txhdrlen(struct device *dev, uint len);
-+int brcmf_fwlog_attach(struct device *dev);
- 
- #ifdef CONFIG_BRCMFMAC_SDIO
- void brcmf_sdio_exit(void);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 5bded9b..ec7c5a9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1051,6 +1051,15 @@ static int brcmf_inet6addr_changed(struct notifier_block *nb,
- }
- #endif
- 
-+
-+int brcmf_fwlog_attach(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pub *drvr = bus_if->drvr;
-+
-+	return brcmf_debug_fwlog_init(drvr);
-+}
-+
- static int brcmf_revinfo_read(struct seq_file *s, void *data)
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(s->private);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-index 120515f..26efe50 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
-@@ -14,6 +14,82 @@
- #include "fweh.h"
- #include "debug.h"
- 
-+static int
-+brcmf_debug_msgtrace_seqchk(u32 *prev, u32 cur)
-+{
-+	if ((cur == 0 && *prev == 0xFFFFFFFF) || ((cur - *prev) == 1)) {
-+		goto done;
-+	} else if (cur == *prev) {
-+		brcmf_dbg(FWCON, "duplicate trace\n");
-+		return -1;
-+	} else if (cur > *prev) {
-+		brcmf_dbg(FWCON, "lost %d packets\n", cur - *prev);
-+	} else {
-+		brcmf_dbg(FWCON, "seq out of order, host %d, dongle %d\n",
-+			  *prev, cur);
-+	}
-+done:
-+	*prev = cur;
-+	return 0;
-+}
-+
-+static int
-+brcmf_debug_msg_parser(void *event_data)
-+{
-+	int err = 0;
-+	struct msgtrace_hdr *hdr;
-+	char *data, *s;
-+	static u32 seqnum_prev;
-+
-+	hdr = (struct msgtrace_hdr *)event_data;
-+	data = (char *)event_data + MSGTRACE_HDRLEN;
-+
-+	/* There are 2 bytes available at the end of data */
-+	data[ntohs(hdr->len)] = '\0';
-+
-+	if (ntohl(hdr->discarded_bytes) || ntohl(hdr->discarded_printf)) {
-+		brcmf_dbg(FWCON, "Discarded_bytes %d discarded_printf %d\n",
-+			  ntohl(hdr->discarded_bytes),
-+				ntohl(hdr->discarded_printf));
-+	}
-+
-+	err = brcmf_debug_msgtrace_seqchk(&seqnum_prev, ntohl(hdr->seqnum));
-+	if (err)
-+		return err;
-+
-+	while (*data != '\0' && (s = strstr(data, "\n")) != NULL) {
-+		*s = '\0';
-+		brcmf_dbg(FWCON, "CONSOLE: %s\n", data);
-+		data = s + 1;
-+	}
-+	if (*data)
-+		brcmf_dbg(FWCON, "CONSOLE: %s", data);
-+
-+	return err;
-+}
-+
-+static int
-+brcmf_debug_trace_parser(struct brcmf_if *ifp,
-+			 const struct brcmf_event_msg *evtmsg,
-+			 void *event_data)
-+{
-+	int err = 0;
-+	struct msgtrace_hdr *hdr;
-+
-+	hdr = (struct msgtrace_hdr *)event_data;
-+	if (hdr->version != MSGTRACE_VERSION) {
-+		brcmf_dbg(FWCON, "trace version mismatch host %d dngl %d\n",
-+			  MSGTRACE_VERSION, hdr->version);
-+		err = -EPROTO;
-+		return err;
-+	}
-+
-+	if (hdr->trace_type == MSGTRACE_HDR_TYPE_MSG)
-+		err = brcmf_debug_msg_parser(event_data);
-+
-+	return err;
-+}
-+
- int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 			       size_t len)
- {
-@@ -42,6 +118,13 @@ int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 	return 0;
- }
- 
-+
-+int brcmf_debug_fwlog_init(struct brcmf_pub *drvr)
-+{
-+	return brcmf_fweh_register(drvr, BRCMF_E_TRACE,
-+				brcmf_debug_trace_parser);
-+}
-+
- struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
- {
- 	return drvr->wiphy->debugfsdir;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-index 9b221b5..d61508b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-@@ -103,6 +103,10 @@
- 
- #endif /* defined(DEBUG) || defined(CONFIG_BRCM_TRACING) */
- 
-+#define MSGTRACE_VERSION 1
-+#define MSGTRACE_HDR_TYPE_MSG 0
-+#define MSGTRACE_HDR_TYPE_LOG 1
-+
- #define brcmf_dbg_hex_dump(test, data, len, fmt, ...)			\
- do {									\
- 	trace_brcmf_hexdump((void *)data, len);				\
-@@ -120,6 +124,7 @@ int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
- 			    int (*read_fn)(struct seq_file *seq, void *data));
- int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- 			       size_t len);
-+int brcmf_debug_fwlog_init(struct brcmf_pub *drvr);
- #else
- static inline struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
- {
-@@ -137,6 +142,25 @@ int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
- {
- 	return 0;
- }
-+
-+static inline
-+int brcmf_debug_fwlog_init(struct brcmf_pub *drvr)
-+{
-+	return 0;
-+}
- #endif
- 
-+/* Message trace header */
-+struct msgtrace_hdr {
-+	u8	version;
-+	u8	trace_type;
-+	u16	len;    /* Len of the trace */
-+	u32	seqnum; /* Sequence number of message */
-+	/* Number of discarded bytes because of trace overflow  */
-+	u32	discarded_bytes;
-+	/* Number of discarded printf because of trace overflow */
-+	u32	discarded_printf;
-+};
-+
-+#define MSGTRACE_HDRLEN		sizeof(struct msgtrace_hdr)
- #endif /* BRCMFMAC_DEBUG_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index be04fcb..ba7d659 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -1220,6 +1220,12 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
- 	if (ret)
- 		goto error;
- 
-+	if (BRCMF_FWCON_ON()) {
-+		ret = brcmf_fwlog_attach(devinfo->dev);
-+		if (ret)
-+			goto error;
-+	}
-+
- 	/* Attach to the common driver interface */
- 	ret = brcmf_attach(devinfo->dev);
- 	if (ret)
-@@ -1296,9 +1302,17 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 		ret = brcmf_alloc(devinfo->dev, devinfo->settings);
- 		if (ret)
- 			goto fail;
-+
-+		if (BRCMF_FWCON_ON()) {
-+			ret = brcmf_fwlog_attach(devinfo->dev);
-+			if (ret)
-+				goto fail;
-+		}
-+
- 		ret = brcmf_attach(devinfo->dev);
- 		if (ret)
- 			goto fail;
-+
- 		/* we are done */
- 		complete(&devinfo->dev_init_done);
- 		return 0;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0083-brcmfmac-reset-SDIO-bus-on-a-firmware-crash.patch b/patches/cypress/brcmfmac/0083-brcmfmac-reset-SDIO-bus-on-a-firmware-crash.patch
deleted file mode 100644
index 1b3fb4c5c0c37e48ef500bf739e871c9fc0588f3..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0083-brcmfmac-reset-SDIO-bus-on-a-firmware-crash.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-From 722b3f93272d865da79e17c643f28b6f5cf8f0f9 Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Mon, 4 Nov 2019 02:03:38 -0600
-Subject: [PATCH 083/138] brcmfmac: reset SDIO bus on a firmware crash
-
-commit 4684997d9eea ("brcmfmac: reset PCIe bus on a firmware crash")
-adds a reset function to recover firmware trap for PCIe bus. This commit
-adds an implementation for SDIO bus.
-
-Upon SDIO firmware trap, do below:
- - Remove the device
- - Reset hardware
- - Probe the device again
-
-Signed-off-by: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  |  4 +--
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 34 +++++++++++++++++++++-
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    |  3 ++
- 3 files changed, 38 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 3ad9224..87f1155 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -868,7 +868,7 @@ static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
- }
- #endif /* CONFIG_PM_SLEEP */
- 
--static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
-+int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
- {
- 	sdiodev->state = BRCMF_SDIOD_DOWN;
- 	if (sdiodev->bus) {
-@@ -903,7 +903,7 @@ static void brcmf_sdiod_host_fixup(struct mmc_host *host)
- 	host->caps |= MMC_CAP_NONREMOVABLE;
- }
- 
--static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
-+int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- {
- 	int ret = 0;
- 	unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index de090ee..ec19258 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -16,6 +16,7 @@
- #include <linux/mmc/sdio_ids.h>
- #include <linux/mmc/sdio_func.h>
- #include <linux/mmc/card.h>
-+#include <linux/mmc/core.h>
- #include <linux/semaphore.h>
- #include <linux/firmware.h>
- #include <linux/module.h>
-@@ -4124,6 +4125,36 @@ int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- 	return 0;
- }
- 
-+static int brcmf_sdio_bus_reset(struct device *dev)
-+{
-+	int ret = 0;
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
-+
-+	brcmf_dbg(SDIO, "Enter\n");
-+
-+	/* start by unregistering irqs */
-+	brcmf_sdiod_intr_unregister(sdiodev);
-+
-+	brcmf_sdiod_remove(sdiodev);
-+
-+	/* reset the adapter */
-+	sdio_claim_host(sdiodev->func1);
-+	mmc_hw_reset(sdiodev->func1->card->host);
-+	sdio_release_host(sdiodev->func1);
-+
-+	brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
-+
-+	ret = brcmf_sdiod_probe(sdiodev);
-+	if (ret) {
-+		brcmf_err("Failed to probe after sdio device reset: ret %d\n",
-+			  ret);
-+		brcmf_sdiod_remove(sdiodev);
-+	}
-+
-+	return ret;
-+}
-+
- static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
- 	.stop = brcmf_sdio_bus_stop,
- 	.preinit = brcmf_sdio_bus_preinit,
-@@ -4135,7 +4166,8 @@ int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- 	.get_ramsize = brcmf_sdio_bus_get_ramsize,
- 	.get_memdump = brcmf_sdio_bus_get_memdump,
- 	.get_fwname = brcmf_sdio_get_fwname,
--	.debugfs_create = brcmf_sdio_debugfs_create
-+	.debugfs_create = brcmf_sdio_debugfs_create,
-+	.reset = brcmf_sdio_bus_reset
- };
- 
- #define BRCMF_SDIO_FW_CODE	0
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-index 0bd47c1..cb0d71d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-@@ -368,6 +368,9 @@ static inline void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
- }
- #endif /* CONFIG_PM_SLEEP */
- 
-+int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev);
-+int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev);
-+
- struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
- void brcmf_sdio_remove(struct brcmf_sdio *bus);
- void brcmf_sdio_isr(struct brcmf_sdio *bus);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0084-brcmfmac-fix-for-WPA-WPA2-PSK-4-way-handshake-and-SA.patch b/patches/cypress/brcmfmac/0084-brcmfmac-fix-for-WPA-WPA2-PSK-4-way-handshake-and-SA.patch
deleted file mode 100644
index e47fcb3487f7fb6a682ce7091158b3eafab01b1e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0084-brcmfmac-fix-for-WPA-WPA2-PSK-4-way-handshake-and-SA.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From e874a31e5358b1f961c2ee420d4cad768db44fc2 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Mon, 17 Feb 2020 04:18:15 -0600
-Subject: [PATCH 084/138] brcmfmac: fix for WPA/WPA2-PSK 4-way handshake and
- SAE offload failures
-
-An incorrect value of use_fwsup is set for 4-way handshake offload for
-WPA//WPA2-PSK, caused by commit 3b1e0a7bdfee ("brcmfmac: add support for
-SAE authentication offload"). It results in missing bit
-BRCMF_VIF_STATUS_EAP_SUCCESS set in brcmf_is_linkup() and causes the
-failure. This patch correct the value for the case.
-
-Also setting bit BRCMF_VIF_STATUS_EAP_SUCCESS for SAE offload case in
-brcmf_is_linkup() to fix SAE offload failure.
-
-Fixes: 3b1e0a7bdfee ("brcmfmac: add support for SAE authentication
-offload")
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 4b007ea..557a3e6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1748,6 +1748,10 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 		switch (sme->crypto.akm_suites[0]) {
- 		case WLAN_AKM_SUITE_SAE:
- 			val = WPA3_AUTH_SAE_PSK;
-+			if (sme->crypto.sae_pwd) {
-+				brcmf_dbg(INFO, "using SAE offload\n");
-+				profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
-+			}
- 			break;
- 		default:
- 			bphy_err(drvr, "invalid cipher group (%d)\n",
-@@ -2042,11 +2046,6 @@ static void brcmf_set_join_pref(struct brcmf_if *ifp,
- 		goto done;
- 	}
- 
--	if (sme->crypto.sae_pwd) {
--		brcmf_dbg(INFO, "using SAE offload\n");
--		profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
--	}
--
- 	if (sme->crypto.psk &&
- 	    profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
- 		if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
-@@ -5610,7 +5609,8 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
- 	u32 event = e->event_code;
- 	u32 status = e->status;
- 
--	if (vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK &&
-+	if ((vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK ||
-+	     vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_SAE) &&
- 	    event == BRCMF_E_PSK_SUP &&
- 	    status == BRCMF_E_STATUS_FWSUP_COMPLETED)
- 		set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0085-non-upstream-Fix-no-P2P-IE-in-probe-requests-issue.patch b/patches/cypress/brcmfmac/0085-non-upstream-Fix-no-P2P-IE-in-probe-requests-issue.patch
deleted file mode 100644
index df515208160b0409827d82d3ac69a13f24efdd42..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0085-non-upstream-Fix-no-P2P-IE-in-probe-requests-issue.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From e69b78f94c70bc85b20d8b62ee764edcdea31391 Mon Sep 17 00:00:00 2001
-From: Ting-Ying Li <tingying.li@cypress.com>
-Date: Fri, 21 Feb 2020 04:02:25 -0600
-Subject: [PATCH 085/138] non-upstream: Fix no P2P IE in probe requests issue
-
-This reverts commit bd99a3013bdc00f8fc7534c657b39616792b4467.
-
-The original parameter "vif" is updated in brcmf_p2p_scan_prep()
-but the new code does not get the same vif.
-
-Fixes: bd99a30 ("brcmfmac: move configuration of probe request IEs")
-Signed-off-by: Ting-Ying Li <tingying.li@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 -----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c      | 6 ++++--
- 2 files changed, 4 insertions(+), 7 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 557a3e6..d5a21b6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1133,11 +1133,6 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
- 	if (err)
- 		goto scan_out;
- 
--	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
--				    request->ie, request->ie_len);
--	if (err)
--		goto scan_out;
--
- 	err = brcmf_do_escan(vif->ifp, request);
- 	if (err)
- 		goto scan_out;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index a399714..8eb6d4f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -895,7 +895,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wiphy,
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
--	int err;
-+	int err = 0;
- 
- 	if (brcmf_p2p_scan_is_p2p_request(request)) {
- 		/* find my listen channel */
-@@ -918,7 +918,9 @@ int brcmf_p2p_scan_prep(struct wiphy *wiphy,
- 		/* override .run_escan() callback. */
- 		cfg->escan_info.run = brcmf_p2p_run_escan;
- 	}
--	return 0;
-+	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
-+				    request->ie, request->ie_len);
-+	return err;
- }
- 
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0086-brcmfmac-add-54591-PCIE-device.patch b/patches/cypress/brcmfmac/0086-brcmfmac-add-54591-PCIE-device.patch
deleted file mode 100644
index a726a29934ecfdac507c1b5d65e10da1dac3906a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0086-brcmfmac-add-54591-PCIE-device.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 100c19cdca8ce709e7a2c1fa0ee68f36aa6665d0 Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Wed, 26 Feb 2020 04:21:22 -0600
-Subject: [PATCH 086/138] brcmfmac: add 54591 PCIE device
-
-Support 54591 PCIE device.
-
-Signed-off-by: Double Lo <double.lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 22 ++++++++++++++++++++--
- .../broadcom/brcm80211/include/brcm_hw_ids.h       |  2 ++
- 2 files changed, 22 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index e3f1cd5..fbe4392 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -59,6 +59,7 @@ enum brcmf_pcie_state {
- BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
- BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
- BRCMF_FW_DEF(4355, "brcmfmac89459-pcie");
-+BRCMF_FW_DEF(54591, "brcmfmac54591-pcie");
- 
- static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
-@@ -79,6 +80,7 @@ enum brcmf_pcie_state {
- 	BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
- 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
- 	BRCMF_FW_ENTRY(CY_CC_89459_CHIP_ID, 0xFFFFFFFF, 4355),
-+	BRCMF_FW_ENTRY(CY_CC_54591_CHIP_ID, 0xFFFFFFFF, 54591),
- };
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
-@@ -1633,12 +1635,21 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len)
- int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
- 	struct brcmf_fw_request *fwreq;
- 	struct brcmf_fw_name fwnames[] = {
- 		{ ext, fw_name },
- 	};
-+	u32 chip;
- 
--	fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
-+	if (devinfo->ci->chip == CY_CC_89459_CHIP_ID &&
-+	    devinfo->pdev->device == CY_PCIE_54591_DEVICE_ID)
-+		chip = CY_CC_54591_CHIP_ID;
-+	else
-+		chip = bus_if->chip;
-+
-+	fwreq = brcmf_fw_alloc_request(chip, bus_if->chiprev,
- 				       brcmf_pcie_fwnames,
- 				       ARRAY_SIZE(brcmf_pcie_fwnames),
- 				       fwnames, ARRAY_SIZE(fwnames));
-@@ -2080,8 +2091,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 		{ ".bin", devinfo->fw_name },
- 		{ ".txt", devinfo->nvram_name },
- 	};
-+	u32 chip;
- 
--	fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev,
-+	if (devinfo->ci->chip == CY_CC_89459_CHIP_ID &&
-+	    devinfo->pdev->device == CY_PCIE_54591_DEVICE_ID)
-+		chip = CY_CC_54591_CHIP_ID;
-+	else
-+		chip = devinfo->ci->chip;
-+	fwreq = brcmf_fw_alloc_request(chip, devinfo->ci->chiprev,
- 				       brcmf_pcie_fwnames,
- 				       ARRAY_SIZE(brcmf_pcie_fwnames),
- 				       fwnames, ARRAY_SIZE(fwnames));
-@@ -2362,6 +2379,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
- 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(CY_PCIE_89459_DEVICE_ID),
- 	BRCMF_PCIE_DEVICE(CY_PCIE_89459_RAW_DEVICE_ID),
-+	BRCMF_PCIE_DEVICE(CY_PCIE_54591_DEVICE_ID),
- 	{ /* end: all zeroes */ }
- };
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-index 8ee9a04..1a04157 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-@@ -51,6 +51,7 @@
- #define CY_CC_4373_CHIP_ID		0x4373
- #define CY_CC_43012_CHIP_ID		43012
- #define CY_CC_89459_CHIP_ID             0x4355
-+#define CY_CC_54591_CHIP_ID             0x54591
- 
- /* USB Device IDs */
- #define BRCM_USB_43143_DEVICE_ID	0xbd1e
-@@ -85,6 +86,7 @@
- #define BRCM_PCIE_4371_DEVICE_ID	0x440d
- #define CY_PCIE_89459_DEVICE_ID         0x4415
- #define CY_PCIE_89459_RAW_DEVICE_ID     0x4355
-+#define CY_PCIE_54591_DEVICE_ID         0x4417
- 
- /* brcmsmac IDs */
- #define BCM4313_D11N2G_ID	0x4727	/* 4313 802.11n 2.4G device */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0087-brcmfmac-support-DS1-exit-firmware-re-download.patch b/patches/cypress/brcmfmac/0087-brcmfmac-support-DS1-exit-firmware-re-download.patch
deleted file mode 100644
index 3463ab1f434b592fdddfad2882196ba21efbf967..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0087-brcmfmac-support-DS1-exit-firmware-re-download.patch
+++ /dev/null
@@ -1,736 +0,0 @@
-From dd581f95d0fdb0c73f6b83ce6747560826c0869a Mon Sep 17 00:00:00 2001
-From: Praveen Babu C <pucn@cypress.com>
-Date: Tue, 9 Jan 2018 11:33:10 +0530
-Subject: [PATCH 087/138] brcmfmac: support DS1 exit firmware re-download
-
-In deep sleep mode (DS1) ARM is off and once exit trigger comes than
-mailbox Interrupt comes to host and whole reinitiation should be done
-in the ARM to start TX/RX.
-
-Also fix below issus for DS1 exit:
-1. Sent Tx Control frame only after firmware redownload complete (check
-F2 Ready before sending Tx Control frame to Firmware)
-2. intermittent High DS1 TX Exit latency time (almost 3sec) ==> This is
-fixed by skipping host Mailbox interrupt Multiple times (ulp state
-mechanism)
-3. RX GlOM save/restore in Firmware
-4. Add ULP event enable & event_msgs_ext iovar configuration in FMAC
-5. Add ULP_EVENT_RECV state machine for sbwad support
-6. Support 2 Byte Shared memory read for DS1 Exit HUDI implementation
-
-Signed-off-by: Praveen Babu C <pucn@cypress.com>
-Signed-off-by: Naveen Gupta <nagu@cypress.com>
-[Merge from 4.14.77 to 5.4.18; set BRCMF_SDIO_MAX_ACCESS_ERRORS to 20]
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |   2 +-
- .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  39 ++++
- .../wireless/broadcom/brcm80211/brcmfmac/core.c    |  13 +-
- .../wireless/broadcom/brcm80211/brcmfmac/debug.h   |   1 +
- .../wireless/broadcom/brcm80211/brcmfmac/fweh.h    |  27 ++-
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    |   2 +-
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 258 ++++++++++++++++++++-
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    | 110 +++++++++
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c |   4 +-
- .../broadcom/brcm80211/include/chipcommon.h        |   2 +
- 10 files changed, 441 insertions(+), 17 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-index c8063ca..e62c348 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -255,7 +255,7 @@ int brcmf_bus_reset(struct brcmf_bus *bus)
- 
- int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings);
- /* Indication from bus module regarding presence/insertion of dongle. */
--int brcmf_attach(struct device *dev);
-+int brcmf_attach(struct device *dev, bool start_bus);
- /* Indication from bus module regarding removal/absence of dongle */
- void brcmf_detach(struct device *dev);
- void brcmf_free(struct device *dev);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index 75beeb4..e9bf5f9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -21,6 +21,8 @@
- #include "firmware.h"
- #include "chip.h"
- #include "defs.h"
-+#include "fweh.h"
-+#include <brcm_hw_ids.h>
- 
- MODULE_AUTHOR("Broadcom Corporation");
- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
-@@ -214,6 +216,8 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 	char *clmver;
- 	char *ptr;
- 	s32 err;
-+	struct eventmsgs_ext *eventmask_msg = NULL;
-+	u8 msglen;
- 
- 	/* retrieve mac addresses */
- 	err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
-@@ -334,6 +338,41 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 		goto done;
- 	}
- 
-+	/* Enable event_msg_ext specific to 43012 chip */
-+	if (bus->chip == CY_CC_43012_CHIP_ID) {
-+		/* Program event_msg_ext to support event larger than 128 */
-+		msglen = (roundup(BRCMF_E_LAST, NBBY) / NBBY) +
-+				  EVENTMSGS_EXT_STRUCT_SIZE;
-+		/* Allocate buffer for eventmask_msg */
-+		eventmask_msg = kzalloc(msglen, GFP_KERNEL);
-+		if (!eventmask_msg) {
-+			err = -ENOMEM;
-+			goto done;
-+		}
-+
-+		/* Read the current programmed event_msgs_ext */
-+		eventmask_msg->ver = EVENTMSGS_VER;
-+		eventmask_msg->len = roundup(BRCMF_E_LAST, NBBY) / NBBY;
-+		err = brcmf_fil_iovar_data_get(ifp, "event_msgs_ext",
-+					       eventmask_msg,
-+					       msglen);
-+
-+		/* Enable ULP event */
-+		brcmf_dbg(EVENT, "enable event ULP\n");
-+		setbit(eventmask_msg->mask, BRCMF_E_ULP);
-+
-+		/* Write updated Event mask */
-+		eventmask_msg->ver = EVENTMSGS_VER;
-+		eventmask_msg->command = EVENTMSGS_SET_MASK;
-+		eventmask_msg->len = (roundup(BRCMF_E_LAST, NBBY) / NBBY);
-+
-+		err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
-+					       eventmask_msg, msglen);
-+		if (err) {
-+			brcmf_err("Set event_msgs_ext error (%d)\n", err);
-+			goto done;
-+		}
-+	}
- 	/* Setup default scan channel time */
- 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
- 				    BRCMF_DEFAULT_SCAN_CHANNEL_TIME);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index ec7c5a9..f290a5f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1249,7 +1249,7 @@ int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings)
- 	return 0;
- }
- 
--int brcmf_attach(struct device *dev)
-+int brcmf_attach(struct device *dev, bool start_bus)
- {
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
- 	struct brcmf_pub *drvr = bus_if->drvr;
-@@ -1280,10 +1280,13 @@ int brcmf_attach(struct device *dev)
- 	/* attach firmware event handler */
- 	brcmf_fweh_attach(drvr);
- 
--	ret = brcmf_bus_started(drvr, drvr->ops);
--	if (ret != 0) {
--		bphy_err(drvr, "dongle is not responding: err=%d\n", ret);
--		goto fail;
-+	if (start_bus) {
-+		ret = brcmf_bus_started(drvr, drvr->ops);
-+		if (ret != 0) {
-+			bphy_err(drvr, "dongle is not responding: err=%d\n",
-+				 ret);
-+			goto fail;
-+		}
- 	}
- 
- 	return 0;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-index d61508b..f67f54c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
-@@ -29,6 +29,7 @@
- #define BRCMF_MSGBUF_VAL	0x00040000
- #define BRCMF_PCIE_VAL		0x00080000
- #define BRCMF_FWCON_VAL		0x00100000
-+#define BRCMF_ULP_VAL		0x00200000
- 
- /* set default print format */
- #undef pr_fmt
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-index 8210509f..e740c2f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h
-@@ -91,7 +91,8 @@
- 	BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \
- 	BRCMF_ENUM_DEF(TDLS_PEER_EVENT, 92) \
- 	BRCMF_ENUM_DEF(PHY_TEMP, 111) \
--	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127)
-+	BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \
-+	BRCMF_ENUM_DEF(ULP, 146)
- 
- #define BRCMF_ENUM_DEF(id, val) \
- 	BRCMF_E_##id = (val),
-@@ -103,7 +104,7 @@ enum brcmf_fweh_event_code {
- 	 * minimum length check in device firmware so it is
- 	 * hard-coded here.
- 	 */
--	BRCMF_E_LAST = 139
-+	BRCMF_E_LAST = 147
- };
- #undef BRCMF_ENUM_DEF
- 
-@@ -284,6 +285,28 @@ struct brcmf_if_event {
- 	u8 role;
- };
- 
-+enum event_msgs_ext_command {
-+	EVENTMSGS_NONE		=	0,
-+	EVENTMSGS_SET_BIT	=	1,
-+	EVENTMSGS_RESET_BIT	=	2,
-+	EVENTMSGS_SET_MASK	=	3
-+};
-+
-+#define EVENTMSGS_VER 1
-+#define EVENTMSGS_EXT_STRUCT_SIZE	offsetof(struct eventmsgs_ext, mask[0])
-+
-+/* len-	for SET it would be mask size from the application to the firmware */
-+/*		for GET it would be actual firmware mask size */
-+/* maxgetsize -	is only used for GET. indicate max mask size that the */
-+/*				application can read from the firmware */
-+struct eventmsgs_ext {
-+	u8	ver;
-+	u8	command;
-+	u8	len;
-+	u8	maxgetsize;
-+	u8	mask[1];
-+};
-+
- typedef int (*brcmf_fweh_handler_t)(struct brcmf_if *ifp,
- 				    const struct brcmf_event_msg *evtmsg,
- 				    void *data);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index fbe4392..d8ab8fb0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -2071,7 +2071,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	brcmf_pcie_intr_enable(devinfo);
- 	brcmf_pcie_hostready(devinfo);
- 
--	ret = brcmf_attach(&devinfo->pdev->dev);
-+	ret = brcmf_attach(&devinfo->pdev->dev, true);
- 	if (ret)
- 		goto fail;
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index ec19258..b9e21d3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -35,9 +35,11 @@
- #include "core.h"
- #include "common.h"
- #include "bcdc.h"
-+#include "fwil.h"
- 
- #define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2500)
- #define CTL_DONE_TIMEOUT	msecs_to_jiffies(2500)
-+#define ULP_HUDI_PROC_DONE_TIME	msecs_to_jiffies(2500)
- 
- /* watermark expressed in number of words */
- #define DEFAULT_F2_WATERMARK    0x8
-@@ -325,7 +327,16 @@ struct rte_console {
- 
- #define KSO_WAIT_US 50
- #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
--#define BRCMF_SDIO_MAX_ACCESS_ERRORS	5
-+#define BRCMF_SDIO_MAX_ACCESS_ERRORS	20
-+
-+static void brcmf_sdio_firmware_callback(struct device *dev, int err,
-+					 struct brcmf_fw_request *fwreq);
-+static struct brcmf_fw_request *
-+	brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus);
-+static int brcmf_sdio_f2_ready(struct brcmf_sdio *bus);
-+static int brcmf_ulp_event_notify(struct brcmf_if *ifp,
-+				  const struct brcmf_event_msg *evtmsg,
-+				  void *data);
- 
- #ifdef DEBUG
- /* Device console log buffer state */
-@@ -1086,7 +1097,7 @@ static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)
- }
- #endif /* DEBUG */
- 
--static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
-+static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus, u32 *hmbd)
- {
- 	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
- 	struct brcmf_core *core = bus->sdio_core;
-@@ -1175,6 +1186,9 @@ static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
- 			 HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
- 		brcmf_err("Unknown mailbox data content: 0x%02x\n",
- 			  hmb_data);
-+	/* Populate hmb_data if argument is passed for DS1 check later */
-+	if (hmbd)
-+		*hmbd = hmb_data;
- 
- 	return intstatus;
- }
-@@ -2558,6 +2572,182 @@ static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
- 	return ret;
- }
- 
-+/* This Function is used to retrieve important
-+ * details from dongle related to ULP mode Mostly
-+ * values/SHM details that will be vary depending
-+ * on the firmware branches
-+ */
-+static void
-+brcmf_sdio_ulp_preinit(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
-+	struct brcmf_if *ifp = bus_if->drvr->iflist[0];
-+
-+	brcmf_dbg(ULP, "Enter\n");
-+
-+	/* Query ulp_sdioctrl iovar to get the ULP related SHM offsets */
-+	brcmf_fil_iovar_data_get(ifp, "ulp_sdioctrl",
-+				 &sdiodev->fmac_ulp.ulp_shm_offset,
-+				 sizeof(sdiodev->fmac_ulp.ulp_shm_offset));
-+
-+	sdiodev->ulp = false;
-+
-+	brcmf_dbg(ULP, "m_ulp_ctrl_sdio[%x] m_ulp_wakeevt_ind [%x]\n",
-+		  M_DS1_CTRL_SDIO(sdiodev->fmac_ulp),
-+		  M_WAKEEVENT_IND(sdiodev->fmac_ulp));
-+	brcmf_dbg(ULP, "m_ulp_wakeind [%x]\n",
-+		  M_ULP_WAKE_IND(sdiodev->fmac_ulp));
-+}
-+
-+/* Reinitialize ARM because In DS1 mode ARM got off */
-+static int
-+brcmf_sdio_ulp_reinit_fw(struct brcmf_sdio *bus)
-+{
-+	struct brcmf_sdio_dev *sdiodev = bus->sdiodev;
-+	struct brcmf_fw_request *fwreq;
-+	int err = 0;
-+
-+	/* After firmware redownload tx/rx seq are reset accordingly
-+	 * these values are reset on FMAC side tx_max is initially set to 4,
-+	 * which later is updated by FW.
-+	 */
-+	bus->tx_seq = 0;
-+	bus->rx_seq = 0;
-+	bus->tx_max = 4;
-+
-+	fwreq = brcmf_sdio_prepare_fw_request(bus);
-+	if (!fwreq)
-+		return -ENOMEM;
-+
-+	err = brcmf_fw_get_firmwares(sdiodev->dev, fwreq,
-+				     brcmf_sdio_firmware_callback);
-+	if (err != 0) {
-+		brcmf_err("async firmware request failed: %d\n", err);
-+		kfree(fwreq);
-+	}
-+
-+	return err;
-+}
-+
-+/* Check if device is in DS1 mode and handshake with ULP UCODE */
-+static bool
-+brcmf_sdio_ulp_pre_redownload_check(struct brcmf_sdio *bus, u32 hmb_data)
-+{
-+	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
-+	int err = 0;
-+	u32 value = 0;
-+	u32 val32, ulp_wake_ind, wowl_wake_ind;
-+	int reg_addr;
-+	unsigned long timeout;
-+	struct brcmf_ulp *fmac_ulp = &bus->sdiodev->fmac_ulp;
-+	int i = 0;
-+
-+	/* If any host mail box data is present, ignore DS1 exit sequence */
-+	if (hmb_data)
-+		return false;
-+	/* Skip if DS1 Exit is already in progress
-+	 * This can happen if firmware download is taking more time
-+	 */
-+	if (fmac_ulp->ulp_state == FMAC_ULP_TRIGGERED)
-+		return false;
-+
-+	value = brcmf_sdiod_func0_rb(sdiod, SDIO_CCCR_IOEx, &err);
-+
-+	if (value == SDIO_FUNC_ENABLE_1) {
-+		brcmf_dbg(ULP, "GOT THE INTERRUPT FROM UCODE\n");
-+		sdiod->ulp = true;
-+		fmac_ulp->ulp_state = FMAC_ULP_TRIGGERED;
-+		ulp_wake_ind = D11SHM_RDW(sdiod,
-+					  M_ULP_WAKE_IND(sdiod->fmac_ulp),
-+					  &err);
-+		wowl_wake_ind = D11SHM_RDW(sdiod,
-+					   M_WAKEEVENT_IND(sdiod->fmac_ulp),
-+					   &err);
-+
-+		brcmf_dbg(ULP, "wowl_wake_ind: 0x%08x, ulp_wake_ind: 0x%08x state %s\n",
-+			  wowl_wake_ind, ulp_wake_ind, (fmac_ulp->ulp_state) ?
-+			  "DS1 Exit Triggered" : "IDLE State");
-+
-+		if (wowl_wake_ind || ulp_wake_ind) {
-+			/* RX wake Don't do anything.
-+			 * Just bail out and re-download firmware.
-+			 */
-+			 /* Print out PHY TX error block when bit 9 set */
-+			if ((ulp_wake_ind & C_DS1_PHY_TXERR) &&
-+			    M_DS1_PHYTX_ERR_BLK(sdiod->fmac_ulp)) {
-+				brcmf_err("Dump PHY TX Error SHM Locations\n");
-+				for (i = 0; i < PHYTX_ERR_BLK_SIZE; i++) {
-+					pr_err("0x%x",
-+					       D11SHM_RDW(sdiod,
-+					       (M_DS1_PHYTX_ERR_BLK(sdiod->fmac_ulp) +
-+						(i * 2)), &err));
-+				}
-+				brcmf_err("\n");
-+			}
-+		} else {
-+			/* TX wake negotiate with MAC */
-+			brcmf_dbg(ULP, "M_DS1_CTRL_SDIO: 0x%08x\n",
-+				  (u32)D11SHM_RDW(sdiod,
-+				  M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+				  &err));
-+			val32 = D11SHM_RD(sdiod,
-+					  M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+					  &err);
-+			D11SHM_WR(sdiod, M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+				  val32, (C_DS1_CTRL_SDIO_DS1_EXIT |
-+				  C_DS1_CTRL_REQ_VALID), &err);
-+			val32 = D11REG_RD(sdiod, D11_MACCONTROL_REG, &err);
-+			val32 = val32 | D11_MACCONTROL_REG_WAKE;
-+			D11REG_WR(sdiod, D11_MACCONTROL_REG, val32, &err);
-+
-+			/* Poll for PROC_DONE to be set by ucode */
-+			value = D11SHM_RDW(sdiod,
-+					   M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+					   &err);
-+			/* Wait here (polling) for C_DS1_CTRL_PROC_DONE */
-+			timeout = jiffies + ULP_HUDI_PROC_DONE_TIME;
-+			while (!(value & C_DS1_CTRL_PROC_DONE)) {
-+				value = D11SHM_RDW(sdiod,
-+						   M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+						   &err);
-+				if (time_after(jiffies, timeout))
-+					break;
-+				usleep_range(1000, 2000);
-+			}
-+			brcmf_dbg(ULP, "M_DS1_CTRL_SDIO: 0x%08x\n",
-+				  (u32)D11SHM_RDW(sdiod,
-+				  M_DS1_CTRL_SDIO(sdiod->fmac_ulp), &err));
-+			value = D11SHM_RDW(sdiod,
-+					   M_DS1_CTRL_SDIO(sdiod->fmac_ulp),
-+					   &err);
-+			if (!(value & C_DS1_CTRL_PROC_DONE)) {
-+				brcmf_err("Timeout Failed to enter DS1 Exit state!\n");
-+				return false;
-+			}
-+		}
-+
-+		ulp_wake_ind = D11SHM_RDW(sdiod,
-+					  M_ULP_WAKE_IND(sdiod->fmac_ulp),
-+					  &err);
-+		wowl_wake_ind = D11SHM_RDW(sdiod,
-+					   M_WAKEEVENT_IND(sdiod->fmac_ulp),
-+					   &err);
-+		brcmf_dbg(ULP, "wowl_wake_ind: 0x%08x, ulp_wake_ind: 0x%08x\n",
-+			  wowl_wake_ind, ulp_wake_ind);
-+		reg_addr = CORE_CC_REG(
-+			  brcmf_chip_get_pmu(bus->ci)->base, min_res_mask);
-+		brcmf_sdiod_writel(sdiod, reg_addr,
-+				   DEFAULT_43012_MIN_RES_MASK, &err);
-+		if (err)
-+			brcmf_err("min_res_mask failed\n");
-+
-+		return true;
-+	}
-+
-+	return false;
-+}
-+
- static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- {
- 	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
-@@ -2629,8 +2819,11 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 
- 	/* Handle host mailbox indication */
- 	if (intstatus & I_HMB_HOST_INT) {
-+		u32 hmb_data = 0;
- 		intstatus &= ~I_HMB_HOST_INT;
--		intstatus |= brcmf_sdio_hostmail(bus);
-+		intstatus |= brcmf_sdio_hostmail(bus, &hmb_data);
-+		if (brcmf_sdio_ulp_pre_redownload_check(bus, hmb_data))
-+			brcmf_sdio_ulp_reinit_fw(bus);
- 	}
- 
- 	sdio_release_host(bus->sdiodev->func1);
-@@ -2675,7 +2868,7 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
- 	brcmf_sdio_clrintr(bus);
- 
- 	if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
--	    txctl_ok(bus)) {
-+	    txctl_ok(bus) && brcmf_sdio_f2_ready(bus)) {
- 		sdio_claim_host(bus->sdiodev->func1);
- 		if (bus->ctrl_frame_stat) {
- 			err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
-@@ -3544,6 +3737,10 @@ static int brcmf_sdio_bus_preinit(struct device *dev)
- 	if (err < 0)
- 		goto done;
- 
-+	/* initialize SHM address from firmware for DS1 */
-+	if (!bus->sdiodev->ulp)
-+		brcmf_sdio_ulp_preinit(dev);
-+
- 	bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
- 	if (sdiodev->sg_support) {
- 		bus->txglom = false;
-@@ -4186,7 +4383,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 	u8 saveclk, bpreq;
- 	u8 devctl;
- 
--	brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
-+	brcmf_dbg(ULP, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
- 
- 	if (err)
- 		goto fail;
-@@ -4362,12 +4559,25 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 	}
- 
- 	/* Attach to the common layer, reserve hdr space */
--	err = brcmf_attach(sdiod->dev);
-+	err = brcmf_attach(sdiod->dev, !bus->sdiodev->ulp);
- 	if (err != 0) {
- 		brcmf_err("brcmf_attach failed\n");
- 		goto free;
- 	}
- 
-+	/* Register for ULP events */
-+	if (sdiod->func1->device == SDIO_DEVICE_ID_CYPRESS_43012)
-+		brcmf_fweh_register(bus_if->drvr, BRCMF_E_ULP,
-+				    brcmf_ulp_event_notify);
-+
-+	if (bus->sdiodev->ulp) {
-+		/* For ULP, after firmware redownload complete
-+		 * set ULP state to IDLE
-+		 */
-+		if (bus->sdiodev->fmac_ulp.ulp_state == FMAC_ULP_TRIGGERED)
-+			bus->sdiodev->fmac_ulp.ulp_state = FMAC_ULP_IDLE;
-+	}
-+
- 	/* ready */
- 	return;
- 
-@@ -4611,3 +4821,39 @@ int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep)
- 	return ret;
- }
- 
-+/* Check F2 Ready bit before sending data to Firmware */
-+static int
-+brcmf_sdio_f2_ready(struct brcmf_sdio *bus)
-+{
-+	int ret = -1;
-+	int iordy_status = 0;
-+
-+	sdio_claim_host(bus->sdiodev->func1);
-+	/* Read the status of IOR2 */
-+	iordy_status = brcmf_sdiod_func0_rb(bus->sdiodev, SDIO_CCCR_IORx, NULL);
-+
-+	sdio_release_host(bus->sdiodev->func1);
-+	ret = iordy_status & SDIO_FUNC_ENABLE_2;
-+	return ret;
-+}
-+
-+static int brcmf_ulp_event_notify(struct brcmf_if *ifp,
-+				  const struct brcmf_event_msg *evtmsg,
-+				  void *data)
-+{
-+	int err = 0;
-+	struct brcmf_bus *bus_if = ifp->drvr->bus_if;
-+	struct brcmf_sdio_dev *sdiodev;
-+	struct brcmf_sdio *bus;
-+	struct brcmf_ulp_event *ulp_event = (struct brcmf_ulp_event *)data;
-+
-+	sdiodev = bus_if->bus_priv.sdio;
-+	bus = sdiodev->bus;
-+
-+	brcmf_dbg(ULP, "Chip went to DS1 state : action %d\n",
-+		  ulp_event->ulp_dongle_action);
-+	if (ulp_event->ulp_dongle_action == FMAC_ULP_ENTRY)
-+		bus->sdiodev->fmac_ulp.ulp_state = FMAC_ULP_ENTRY_RECV;
-+
-+	return err;
-+}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-index cb0d71d..d008689 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
-@@ -165,6 +165,35 @@ struct brcmf_sdreg {
- struct brcmf_sdio;
- struct brcmf_sdiod_freezer;
- 
-+/* ULP SHM Offsets info */
-+struct ulp_shm_info {
-+	u32 m_ulp_ctrl_sdio;
-+	u32 m_ulp_wakeevt_ind;
-+	u32 m_ulp_wakeind;
-+	u32 m_ulp_phytxblk;
-+};
-+
-+/* FMAC ULP state machine */
-+#define FMAC_ULP_IDLE		(0)
-+#define FMAC_ULP_ENTRY_RECV		(1)
-+#define FMAC_ULP_TRIGGERED		(2)
-+
-+/* BRCMF_E_ULP event data */
-+#define FMAC_ULP_EVENT_VERSION		1
-+#define FMAC_ULP_DISABLE_CONSOLE		1 /* Disable console */
-+#define FMAC_ULP_UCODE_DOWNLOAD		2 /* Download ULP ucode file */
-+#define FMAC_ULP_ENTRY		3 /* Inform ulp entry to Host */
-+
-+struct brcmf_ulp {
-+	uint ulp_state;
-+	struct ulp_shm_info ulp_shm_offset;
-+};
-+
-+struct brcmf_ulp_event {
-+	u16 version;
-+	u16 ulp_dongle_action;
-+};
-+
- struct brcmf_sdio_dev {
- 	struct sdio_func *func1;
- 	struct sdio_func *func2;
-@@ -190,6 +219,8 @@ struct brcmf_sdio_dev {
- 	bool wowl_enabled;
- 	enum brcmf_sdiod_state state;
- 	struct brcmf_sdiod_freezer *freezer;
-+	struct brcmf_ulp fmac_ulp;
-+	bool ulp;
- };
- 
- /* sdio core registers */
-@@ -380,4 +411,83 @@ static inline void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
- int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
- void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
- 
-+/* SHM offsets */
-+#define M_DS1_CTRL_SDIO(ptr)	((ptr).ulp_shm_offset.m_ulp_ctrl_sdio)
-+#define M_WAKEEVENT_IND(ptr)	((ptr).ulp_shm_offset.m_ulp_wakeevt_ind)
-+#define M_ULP_WAKE_IND(ptr)		((ptr).ulp_shm_offset.m_ulp_wakeind)
-+#define M_DS1_PHYTX_ERR_BLK(ptr)	((ptr).ulp_shm_offset.m_ulp_phytxblk)
-+
-+#define D11_BASE_ADDR			0x18001000
-+#define D11_AXI_BASE_ADDR		0xE8000000
-+#define D11_SHM_BASE_ADDR		(D11_AXI_BASE_ADDR + 0x4000)
-+
-+#define D11REG_ADDR(offset)	(D11_BASE_ADDR + (offset))
-+#define D11IHR_ADDR(offset)	(D11_AXI_BASE_ADDR + 0x400 + (2 * (offset)))
-+#define D11SHM_ADDR(offset)	(D11_SHM_BASE_ADDR + (offset))
-+
-+/* MacControl register */
-+#define D11_MACCONTROL_REG			D11REG_ADDR(0x120)
-+#define D11_MACCONTROL_REG_WAKE		0x4000000
-+
-+/* HUDI Sequence SHM bits */
-+#define	C_DS1_CTRL_SDIO_DS1_SLEEP		0x1
-+#define	C_DS1_CTRL_SDIO_MAC_ON			0x2
-+#define	C_DS1_CTRL_SDIO_RADIO_PHY_ON	0x4
-+#define	C_DS1_CTRL_SDIO_DS1_EXIT		0x8
-+#define	C_DS1_CTRL_PROC_DONE			0x100
-+#define	C_DS1_CTRL_REQ_VALID			0x200
-+
-+/* M_ULP_WAKEIND bits */
-+#define	C_WATCHDOG_EXPIRY	BIT(0)
-+#define	C_FCBS_ERROR		BIT(1)
-+#define	C_RETX_FAILURE		BIT(2)
-+#define	C_HOST_WAKEUP		BIT(3)
-+#define	C_INVALID_FCBS_BLOCK	BIT(4)
-+#define	C_HUDI_DS1_EXIT		BIT(5)
-+#define	C_LOB_SLEEP		BIT(6)
-+#define	C_DS1_PHY_TXERR		BIT(9)
-+#define	C_DS1_WAKE_TIMER	BIT(10)
-+
-+#define PHYTX_ERR_BLK_SIZE		18
-+#define D11SHM_FIRST2BYTE_MASK		0xFFFF0000
-+#define D11SHM_SECOND2BYTE_MASK		0x0000FFFF
-+#define D11SHM_2BYTE_SHIFT		16
-+
-+#define D11SHM_RD(sdh, offset, ret) \
-+	brcmf_sdiod_readl(sdh, D11SHM_ADDR(offset), ret)
-+
-+/* SHM Read is motified based on SHM 4 byte alignment as SHM size is 2 bytes and
-+ * 2 byte is currently not working on FMAC
-+ * If SHM address is not 4 byte aligned, then right shift by 16
-+ * otherwise, mask the first two MSB bytes
-+ * Suppose data in address 7260 is 0x440002 and it is 4 byte aligned
-+ * Correct SHM value is 0x2 for this SHM offset and next SHM value is 0x44
-+ */
-+#define D11SHM_RDW(sdh, offset, ret) \
-+	((offset % 4) ? \
-+		(brcmf_sdiod_readl(sdh, D11SHM_ADDR(offset), ret) \
-+		>> D11SHM_2BYTE_SHIFT) : \
-+		(brcmf_sdiod_readl(sdh, D11SHM_ADDR(offset), ret) \
-+		& D11SHM_SECOND2BYTE_MASK))
-+
-+/* SHM is of size 2 bytes, 4 bytes write will overwrite other SHM's
-+ * First read 4 bytes and then clear the required two bytes based on
-+ * 4 byte alignment, then update the required value and write the
-+ * 4 byte value now
-+ */
-+#define D11SHM_WR(sdh, offset, val, mask, ret) \
-+	do { \
-+		if ((offset) % 4) \
-+			val = (val & D11SHM_SECOND2BYTE_MASK) | \
-+				((mask) << D11SHM_2BYTE_SHIFT); \
-+		else \
-+			val = (mask) | (val & D11SHM_FIRST2BYTE_MASK); \
-+		brcmf_sdiod_writel(sdh, D11SHM_ADDR(offset), val, ret); \
-+	} while (0)
-+#define D11REG_WR(sdh, addr, val, ret) \
-+	brcmf_sdiod_writel(sdh, addr, val, ret)
-+
-+#define D11REG_RD(sdh, addr, ret) \
-+	brcmf_sdiod_readl(sdh, addr, ret)
-+
- #endif /* BRCMFMAC_SDIO_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index ba7d659..95dfcee 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -1227,7 +1227,7 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
- 	}
- 
- 	/* Attach to the common driver interface */
--	ret = brcmf_attach(devinfo->dev);
-+	ret = brcmf_attach(devinfo->dev, true);
- 	if (ret)
- 		goto error;
- 
-@@ -1309,7 +1309,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 				goto fail;
- 		}
- 
--		ret = brcmf_attach(devinfo->dev);
-+		ret = brcmf_attach(devinfo->dev, true);
- 		if (ret)
- 			goto fail;
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-index 0340bba..090a75b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-@@ -308,4 +308,6 @@ struct chipcregs {
- */
- #define PMU_MAX_TRANSITION_DLY	15000
- 
-+#define DEFAULT_43012_MIN_RES_MASK 0x0f8bfe77
-+
- #endif				/* _SBCHIPC_H */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0088-brcmfmac-fix-43012-insmod-after-rmmod-in-DS1-failure.patch b/patches/cypress/brcmfmac/0088-brcmfmac-fix-43012-insmod-after-rmmod-in-DS1-failure.patch
deleted file mode 100644
index 9cdec09d093cd86dc8dc347e4cacc156af205b2f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0088-brcmfmac-fix-43012-insmod-after-rmmod-in-DS1-failure.patch
+++ /dev/null
@@ -1,455 +0,0 @@
-From 85d68298422e7fdec27b59b6c2b355a1bc2b21e1 Mon Sep 17 00:00:00 2001
-From: Nitin Bhaskar <niti@cypress.com>
-Date: Tue, 21 Aug 2018 16:03:10 +0530
-Subject: [PATCH 088/138] brcmfmac: fix 43012 insmod-after-rmmod in DS1
- failure.
-
-After entering ULP, issuing rmmod does not put chip in
-sane state because of which next insmod fails.
-Fix includes writing into few LHL, PMU registers.
-
-Signed-off-by: Nitin Bhaskar <niti@cypress.com>
-[Merge from 4.14.77 to 5.4.18]
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/chip.c    | 155 +++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/chip.h    |   9 +-
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    |  14 +-
- .../broadcom/brcm80211/include/chipcommon.h        | 193 ++++++++++++++++++++-
- 4 files changed, 367 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index 2e9b324..f40970d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -213,6 +213,18 @@ struct sbsocramregs {
- #define	ARMCR4_BSZ_MASK		0x3f
- #define	ARMCR4_BSZ_MULT		8192
- 
-+/* Minimum PMU resource mask for 43012C0 */
-+#define CY_43012_PMU_MIN_RES_MASK       0xF8BFE77
-+
-+/* PMU STATUS mask for 43012C0 */
-+#define CY_43012_PMU_STATUS_MASK        0x1AC
-+
-+/* PMU CONTROL EXT mask for 43012C0 */
-+#define CY_43012_PMU_CONTROL_EXT_MASK   0x11
-+
-+/* PMU CONTROL EXT mask for 43012C0 */
-+#define CY_43012_PMU_WATCHDOG_TICK_VAL  0x04
-+
- struct brcmf_core_priv {
- 	struct brcmf_core pub;
- 	u32 wrapbase;
-@@ -1207,6 +1219,14 @@ struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub)
- 	return cc;
- }
- 
-+struct brcmf_core *brcmf_chip_get_gci(struct brcmf_chip *pub)
-+{
-+	struct brcmf_core *gci;
-+
-+	gci = brcmf_chip_get_core(pub, BCMA_CORE_GCI);
-+	return gci;
-+}
-+
- bool brcmf_chip_iscoreup(struct brcmf_core *pub)
- {
- 	struct brcmf_core_priv *core;
-@@ -1432,3 +1452,138 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
- 			       PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
- 	}
- }
-+
-+void brcmf_chip_reset_pmu_regs(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 addr;
-+	u32 base;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_pmu(pub)->base;
-+
-+	switch (pub->chip) {
-+	case CY_CC_43012_CHIP_ID:
-+		/* SW scratch */
-+		addr = CORE_CC_REG(base, swscratch);
-+		chip->ops->write32(chip->ctx, addr, 0);
-+
-+		/* PMU status */
-+		addr = CORE_CC_REG(base, pmustatus);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_STATUS_MASK);
-+
-+		/* PMU control ext */
-+		addr = CORE_CC_REG(base, pmucontrol_ext);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_CONTROL_EXT_MASK);
-+
-+		/* PMU watchdog */
-+		addr = CORE_CC_REG(base, pmuwatchdog);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_WATCHDOG_TICK_VAL);
-+		break;
-+
-+	default:
-+		brcmf_err("Unsupported chip id\n");
-+		break;
-+	}
-+}
-+
-+void brcmf_chip_set_default_min_res_mask(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 addr;
-+	u32 base;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_pmu(pub)->base;
-+	switch (pub->chip) {
-+	case CY_CC_43012_CHIP_ID:
-+		addr = CORE_CC_REG(base, min_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_MIN_RES_MASK);
-+		break;
-+
-+	default:
-+		brcmf_err("Unsupported chip id\n");
-+		break;
-+	}
-+}
-+
-+void brcmf_chip_ulp_reset_lhl_regs(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 base;
-+	u32 addr;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_gci(pub)->base;
-+
-+	/* LHL Top Level Power Sequence Control */
-+	addr = CORE_GCI_REG(base, lhl_top_pwrseq_ctl_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* GPIO Interrupt Enable0 */
-+	addr = CORE_GCI_REG(base, gpio_int_en_port_adr[0]);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* GPIO Interrupt Status0 */
-+	addr = CORE_GCI_REG(base, gpio_int_st_port_adr[0]);
-+	chip->ops->write32(chip->ctx, addr, ~0);
-+
-+	/* WL ARM Timer0 Interrupt Mask */
-+	addr = CORE_GCI_REG(base, lhl_wl_armtim0_intrp_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* WL ARM Timer0 Interrupt Status */
-+	addr = CORE_GCI_REG(base, lhl_wl_armtim0_st_adr);
-+	chip->ops->write32(chip->ctx, addr, ~0);
-+
-+	/* WL ARM Timer */
-+	addr = CORE_GCI_REG(base, lhl_wl_armtim0_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* WL MAC Timer0 Interrupt Mask */
-+	addr = CORE_GCI_REG(base, lhl_wl_mactim0_intrp_adr);
-+	chip->ops->write32(chip->ctx, addr, 0);
-+
-+	/* WL MAC Timer0 Interrupt Status */
-+	addr = CORE_GCI_REG(base, lhl_wl_mactim0_st_adr);
-+	chip->ops->write32(chip->ctx, addr, ~0);
-+
-+	/* WL MAC TimerInt0 */
-+	addr = CORE_GCI_REG(base, lhl_wl_mactim_int0_adr);
-+	chip->ops->write32(chip->ctx, addr, 0x0);
-+}
-+
-+void brcmf_chip_reset_watchdog(struct brcmf_chip *pub)
-+{
-+	struct brcmf_chip_priv *chip;
-+	u32 base;
-+	u32 addr;
-+
-+	brcmf_dbg(TRACE, "Enter\n");
-+
-+	chip = container_of(pub, struct brcmf_chip_priv, pub);
-+	base = brcmf_chip_get_pmu(pub)->base;
-+
-+	switch (pub->chip) {
-+	case CY_CC_43012_CHIP_ID:
-+		/* Watchdog res mask */
-+		addr = CORE_CC_REG(base, watchdog_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_MIN_RES_MASK);
-+		break;
-+
-+	default:
-+		break;
-+	}
-+}
-+
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-index 8fa3865..216e554 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
-@@ -8,7 +8,10 @@
- #include <linux/types.h>
- 
- #define CORE_CC_REG(base, field) \
--		(base + offsetof(struct chipcregs, field))
-+		((base) + offsetof(struct chipcregs, field))
-+
-+#define CORE_GCI_REG(base, field) \
-+		((base) + offsetof(struct chipgciregs, field))
- 
- /**
-  * struct brcmf_chip - chip level information.
-@@ -85,5 +88,9 @@ void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset,
- bool brcmf_chip_set_active(struct brcmf_chip *ci, u32 rstvec);
- bool brcmf_chip_sr_capable(struct brcmf_chip *pub);
- char *brcmf_chip_name(u32 chipid, u32 chiprev, char *buf, uint len);
-+void brcmf_chip_reset_watchdog(struct brcmf_chip *pub);
-+void brcmf_chip_ulp_reset_lhl_regs(struct brcmf_chip *pub);
-+void brcmf_chip_reset_pmu_regs(struct brcmf_chip *pub);
-+void brcmf_chip_set_default_min_res_mask(struct brcmf_chip *pub);
- 
- #endif /* BRCMF_AXIDMP_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index b9e21d3..cd4f5c8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4765,7 +4765,19 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
- 				 * necessary cores.
- 				 */
- 				msleep(20);
--				brcmf_chip_set_passive(bus->ci);
-+				if (bus->sdiodev->fmac_ulp.ulp_state ==
-+					FMAC_ULP_ENTRY_RECV) {
-+					brcmf_chip_ulp_reset_lhl_regs(bus->ci);
-+					brcmf_chip_reset_pmu_regs(bus->ci);
-+					brcmf_chip_set_default_min_res_mask(
-+						bus->ci);
-+				} else {
-+					brcmf_chip_set_passive(bus->ci);
-+				}
-+				/* Reset the PMU, backplane and all the
-+				 * cores by using the PMUWatchdogCounter.
-+				 */
-+				brcmf_chip_reset_watchdog(bus->ci);
- 				brcmf_sdio_clkctl(bus, CLK_NONE, false);
- 				sdio_release_host(bus->sdiodev->func1);
- 			}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-index 090a75b..39cd34c2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/chipcommon.h
-@@ -214,8 +214,197 @@ struct chipcregs {
- 	u32 PAD[3];
- 	u32 retention_grpidx;       /* 0x680 */
- 	u32 retention_grpctl;       /* 0x684 */
--	u32 PAD[94];
--	u16 sromotp[768];
-+	u32 mac_res_req_timer;      /* 0x688 */
-+	u32 mac_res_req_mask;       /* 0x68c */
-+	u32 PAD[18];
-+	u32 pmucontrol_ext;         /* 0x6d8 */
-+	u32 slowclkperiod;          /* 0x6dc */
-+	u32 PAD[8];
-+	u32 pmuintmask0;            /* 0x700 */
-+	u32 pmuintmask1;            /* 0x704 */
-+	u32 PAD[14];
-+	u32 pmuintstatus;           /* 0x740 */
-+	u32 extwakeupstatus;        /* 0x744 */
-+	u32 watchdog_res_mask;      /* 0x748 */
-+	u32 swscratch;              /* 0x750 */
-+	u32 PAD[3];
-+	u32 extwakemask[2];         /* 0x760-0x764 */
-+	u32 PAD[2];
-+	u32 extwakereqmask[2];      /* 0x770-0x774 */
-+	u32 PAD[2];
-+	u32 pmuintctrl0;            /* 0x780 */
-+	u32 pmuintctrl1;            /* 0x784 */
-+	u32 PAD[2];
-+	u32 extwakectrl[2];         /* 0x790 */
-+};
-+
-+#define CHIPGCIREGOFFS(field) offsetof(struct chipgciregs, field)
-+
-+struct chipgciregs {
-+	u32 gci_corecaps0;                             /* 0x000 */
-+	u32 gci_corecaps1;                             /* 0x004 */
-+	u32 gci_corecaps2;                             /* 0x008 */
-+	u32 gci_corectrl;                              /* 0x00c */
-+	u32 gci_corestat;                              /* 0x010 */
-+	u32 gci_intstat;                               /* 0x014 */
-+	u32 gci_intmask;                               /* 0x018 */
-+	u32 gci_wakemask;                              /* 0x01c */
-+	u32 gci_levelintstat;                          /* 0x020 */
-+	u32 gci_eventintstat;                          /* 0x024 */
-+	u32 gci_wakelevelintstat;                      /* 0x028 */
-+	u32 gci_wakeeventintstat;                      /* 0x02c */
-+	u32 semaphoreintstatus;                        /* 0x030 */
-+	u32 semaphoreintmask;                          /* 0x034 */
-+	u32 semaphorerequest;                          /* 0x038 */
-+	u32 semaphorereserve;                          /* 0x03c */
-+	u32 gci_indirect_addr;                         /* 0x040 */
-+	u32 gci_gpioctl;                               /* 0x044 */
-+	u32 gci_gpiostatus;                            /* 0x048 */
-+	u32 gci_gpiomask;                              /* 0x04c */
-+	u32 eventsummary;                              /* 0x050 */
-+	u32 gci_miscctl;                               /* 0x054 */
-+	u32 gci_gpiointmask;                           /* 0x058 */
-+	u32 gci_gpiowakemask;                          /* 0x05c */
-+	u32 gci_input[32];                             /* 0x060 */
-+	u32 gci_event[32];                             /* 0x0e0 */
-+	u32 gci_output[4];                             /* 0x160 */
-+	u32 gci_control_0;                             /* 0x170 */
-+	u32 gci_control_1;                             /* 0x174 */
-+	u32 gci_intpolreg;                             /* 0x178 */
-+	u32 gci_levelintmask;                          /* 0x17c */
-+	u32 gci_eventintmask;                          /* 0x180 */
-+	u32 wakelevelintmask;                          /* 0x184 */
-+	u32 wakeeventintmask;                          /* 0x188 */
-+	u32 hwmask;                                    /* 0x18c */
-+	u32 PAD;
-+	u32 gci_inbandeventintmask;                    /* 0x194 */
-+	u32 PAD;
-+	u32 gci_inbandeventstatus;                     /* 0x19c */
-+	u32 gci_seciauxtx;                             /* 0x1a0 */
-+	u32 gci_seciauxrx;                             /* 0x1a4 */
-+	u32 gci_secitx_datatag;                        /* 0x1a8 */
-+	u32 gci_secirx_datatag;                        /* 0x1ac */
-+	u32 gci_secitx_datamask;                       /* 0x1b0 */
-+	u32 gci_seciusef0tx_reg;                       /* 0x1b4 */
-+	u32 gci_secif0tx_offset;                       /* 0x1b8 */
-+	u32 gci_secif0rx_offset;                       /* 0x1bc */
-+	u32 gci_secif1tx_offset;                       /* 0x1c0 */
-+	u32 gci_rxfifo_common_ctrl;                    /* 0x1c4 */
-+	u32 gci_rxfifoctrl;                            /* 0x1c8 */
-+	u32 gci_hw_sema_status;                        /* 0x1cc */
-+	u32 gci_seciuartescval;                        /* 0x1d0 */
-+	u32 gic_seciuartautobaudctr;                   /* 0x1d4 */
-+	u32 gci_secififolevel;                         /* 0x1d8 */
-+	u32 gci_seciuartdata;                          /* 0x1dc */
-+	u32 gci_secibauddiv;                           /* 0x1e0 */
-+	u32 gci_secifcr;                               /* 0x1e4 */
-+	u32 gci_secilcr;                               /* 0x1e8 */
-+	u32 gci_secimcr;                               /* 0x1ec */
-+	u32 gci_secilsr;                               /* 0x1f0 */
-+	u32 gci_secimsr;                               /* 0x1f4 */
-+	u32 gci_baudadj;                               /* 0x1f8 */
-+	u32 gci_inbandintmask;                         /* 0x1fc */
-+	u32 gci_chipctrl;                              /* 0x200 */
-+	u32 gci_chipsts;                               /* 0x204 */
-+	u32 gci_gpioout;                               /* 0x208 */
-+	u32 gci_gpioout_read;                          /* 0x20C */
-+	u32 gci_mpwaketx;                              /* 0x210 */
-+	u32 gci_mpwakedetect;                          /* 0x214 */
-+	u32 gci_seciin_ctrl;                           /* 0x218 */
-+	u32 gci_seciout_ctrl;                          /* 0x21C */
-+	u32 gci_seciin_auxfifo_en;                     /* 0x220 */
-+	u32 gci_seciout_txen_txbr;                     /* 0x224 */
-+	u32 gci_seciin_rxbrstatus;                     /* 0x228 */
-+	u32 gci_seciin_rxerrstatus;                    /* 0x22C */
-+	u32 gci_seciin_fcstatus;                       /* 0x230 */
-+	u32 gci_seciout_txstatus;                      /* 0x234 */
-+	u32 gci_seciout_txbrstatus;                    /* 0x238 */
-+	u32 wlan_mem_info;                             /* 0x23C */
-+	u32 wlan_bankxinfo;                            /* 0x240 */
-+	u32 bt_smem_select;                            /* 0x244 */
-+	u32 bt_smem_stby;                              /* 0x248 */
-+	u32 bt_smem_status;                            /* 0x24C */
-+	u32 wlan_bankxactivepda;                       /* 0x250 */
-+	u32 wlan_bankxsleeppda;                        /* 0x254 */
-+	u32 wlan_bankxkill;                            /* 0x258 */
-+	u32 PAD[41];
-+	u32 gci_chipid;                                /* 0x300 */
-+	u32 PAD[3];
-+	u32 otpstatus;                                 /* 0x310 */
-+	u32 otpcontrol;                                /* 0x314 */
-+	u32 otpprog;                                   /* 0x318 */
-+	u32 otplayout;                                 /* 0x31c */
-+	u32 otplayoutextension;                        /* 0x320 */
-+	u32 otpcontrol1;                               /* 0x324 */
-+	u32 otpprogdata;                               /* 0x328 */
-+	u32 PAD[52];
-+	u32 otpECCstatus;                              /* 0x3FC */
-+	u32 PAD[512];
-+	u32 lhl_core_capab_adr;                        /* 0xC00 */
-+	u32 lhl_main_ctl_adr;                          /* 0xC04 */
-+	u32 lhl_pmu_ctl_adr;                           /* 0xC08 */
-+	u32 lhl_extlpo_ctl_adr;                        /* 0xC0C */
-+	u32 lpo_ctl_adr;                               /* 0xC10 */
-+	u32 lhl_lpo2_ctl_adr;                          /* 0xC14 */
-+	u32 lhl_osc32k_ctl_adr;                        /* 0xC18 */
-+	u32 lhl_clk_status_adr;                        /* 0xC1C */
-+	u32 lhl_clk_det_ctl_adr;                       /* 0xC20 */
-+	u32 lhl_clk_sel_adr;                           /* 0xC24 */
-+	u32 hidoff_cnt_adr[2];                         /* 0xC28-0xC2C */
-+	u32 lhl_autoclk_ctl_adr;                       /* 0xC30 */
-+	u32 PAD;
-+	u32 lhl_hibtim_adr;                            /* 0xC38 */
-+	u32 lhl_wl_ilp_val_adr;                        /* 0xC3C */
-+	u32 lhl_wl_armtim0_intrp_adr;                  /* 0xC40 */
-+	u32 lhl_wl_armtim0_st_adr;                     /* 0xC44 */
-+	u32 lhl_wl_armtim0_adr;                        /* 0xC48 */
-+	u32 PAD[9];
-+	u32 lhl_wl_mactim0_intrp_adr;                  /* 0xC70 */
-+	u32 lhl_wl_mactim0_st_adr;                     /* 0xC74 */
-+	u32 lhl_wl_mactim_int0_adr;                    /* 0xC78 */
-+	u32 lhl_wl_mactim_frac0_adr;                   /* 0xC7C */
-+	u32 lhl_wl_mactim1_intrp_adr;                  /* 0xC80 */
-+	u32 lhl_wl_mactim1_st_adr;                     /* 0xC84 */
-+	u32 lhl_wl_mactim_int1_adr;                    /* 0xC88 */
-+	u32 lhl_wl_mactim_frac1_adr;                   /* 0xC8C */
-+	u32 PAD[8];
-+	u32 gpio_int_en_port_adr[4];                   /* 0xCB0-0xCBC */
-+	u32 gpio_int_st_port_adr[4];                   /* 0xCC0-0xCCC */
-+	u32 gpio_ctrl_iocfg_p_adr[64];                 /* 0xCD0-0xDCC */
-+	u32 gpio_gctrl_iocfg_p0_p39_adr;               /* 0xDD0 */
-+	u32 gpio_gdsctrl_iocfg_p0_p25_p30_p39_adr;     /* 0xDD4 */
-+	u32 gpio_gdsctrl_iocfg_p26_p29_adr;            /* 0xDD8 */
-+	u32 PAD[8];
-+	u32 lhl_gpio_din0_adr;                         /* 0xDFC */
-+	u32 lhl_gpio_din1_adr;                         /* 0xE00 */
-+	u32 lhl_wkup_status_adr;                       /* 0xE04 */
-+	u32 lhl_ctl_adr;                               /* 0xE08 */
-+	u32 lhl_adc_ctl_adr;                           /* 0xE0C */
-+	u32 lhl_qdxyz_in_dly_adr;                      /* 0xE10 */
-+	u32 lhl_optctl_adr;                            /* 0xE14 */
-+	u32 lhl_optct2_adr;                            /* 0xE18 */
-+	u32 lhl_scanp_cntr_init_val_adr;               /* 0xE1C */
-+	u32 lhl_opt_togg_val_adr[6];                   /* 0xE20-0xE34 */
-+	u32 lhl_optx_smp_val_adr;                      /* 0xE38 */
-+	u32 lhl_opty_smp_val_adr;                      /* 0xE3C */
-+	u32 lhl_optz_smp_val_adr;                      /* 0xE40 */
-+	u32 lhl_hidoff_keepstate_adr[3];               /* 0xE44-0xE4C */
-+	u32 lhl_bt_slmboot_ctl0_adr[4];                /* 0xE50-0xE5C */
-+	u32 lhl_wl_fw_ctl;                             /* 0xE60 */
-+	u32 lhl_wl_hw_ctl_adr[2];                      /* 0xE64-0xE68 */
-+	u32 lhl_bt_hw_ctl_adr;                         /* 0xE6C */
-+	u32 lhl_top_pwrseq_en_adr;                     /* 0xE70 */
-+	u32 lhl_top_pwrdn_ctl_adr;                     /* 0xE74 */
-+	u32 lhl_top_pwrup_ctl_adr;                     /* 0xE78 */
-+	u32 lhl_top_pwrseq_ctl_adr;                    /* 0xE7C */
-+	u32 lhl_top_pwrdn2_ctl_adr;                    /* 0xE80 */
-+	u32 lhl_top_pwrup2_ctl_adr;                    /* 0xE84 */
-+	u32 wpt_regon_intrp_cfg_adr;                   /* 0xE88 */
-+	u32 bt_regon_intrp_cfg_adr;                    /* 0xE8C */
-+	u32 wl_regon_intrp_cfg_adr;                    /* 0xE90 */
-+	u32 regon_intrp_st_adr;                        /* 0xE94 */
-+	u32 regon_intrp_en_adr;                        /* 0xE98 */
-+
- };
- 
- /* chipid */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0089-brcmfmac-fix-43012-driver-reload-failure-after-DS1-e.patch b/patches/cypress/brcmfmac/0089-brcmfmac-fix-43012-driver-reload-failure-after-DS1-e.patch
deleted file mode 100644
index e0d42da85c50ebd69339e5ccb32a8ebf6ba6ba87..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0089-brcmfmac-fix-43012-driver-reload-failure-after-DS1-e.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From d8cebe8e10ba62c704c1ec969155eb906f3207b6 Mon Sep 17 00:00:00 2001
-From: David Weng <david.weng@cypress.com>
-Date: Mon, 28 Jan 2019 01:05:36 -0600
-Subject: [PATCH 089/138] brcmfmac: fix 43012 driver reload failure after DS1
- exit
-
-Device is left in non-responding state when unloading driver in non-DS1
-state if it ever enters DS1 at least once. It leaves that state only
-after a hard reset or power cycle 43012.
-
-Signed-off-by: David Weng <david.weng@cypress.com>
-[Merge from 4.14.77 to 5.4.18]
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
-SWWLAN-137253
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 12 +++++++-----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |  2 --
- 2 files changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index f40970d..b635215 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -1479,11 +1479,6 @@ void brcmf_chip_reset_pmu_regs(struct brcmf_chip *pub)
- 		addr = CORE_CC_REG(base, pmucontrol_ext);
- 		chip->ops->write32(chip->ctx, addr,
- 			CY_43012_PMU_CONTROL_EXT_MASK);
--
--		/* PMU watchdog */
--		addr = CORE_CC_REG(base, pmuwatchdog);
--		chip->ops->write32(chip->ctx, addr,
--			CY_43012_PMU_WATCHDOG_TICK_VAL);
- 		break;
- 
- 	default:
-@@ -1576,10 +1571,17 @@ void brcmf_chip_reset_watchdog(struct brcmf_chip *pub)
- 
- 	switch (pub->chip) {
- 	case CY_CC_43012_CHIP_ID:
-+		addr = CORE_CC_REG(base, min_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_MIN_RES_MASK);
- 		/* Watchdog res mask */
- 		addr = CORE_CC_REG(base, watchdog_res_mask);
- 		chip->ops->write32(chip->ctx, addr,
- 			CY_43012_PMU_MIN_RES_MASK);
-+		/* PMU watchdog */
-+		addr = CORE_CC_REG(base, pmuwatchdog);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_43012_PMU_WATCHDOG_TICK_VAL);
- 		break;
- 
- 	default:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index cd4f5c8..aa5046c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4769,8 +4769,6 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
- 					FMAC_ULP_ENTRY_RECV) {
- 					brcmf_chip_ulp_reset_lhl_regs(bus->ci);
- 					brcmf_chip_reset_pmu_regs(bus->ci);
--					brcmf_chip_set_default_min_res_mask(
--						bus->ci);
- 				} else {
- 					brcmf_chip_set_passive(bus->ci);
- 				}
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0090-brcmfmac-reset-PMU-backplane-all-cores-in-CYW4373-du.patch b/patches/cypress/brcmfmac/0090-brcmfmac-reset-PMU-backplane-all-cores-in-CYW4373-du.patch
deleted file mode 100644
index 345bc10c39ab6969f81d9a8a4291627c4af878c4..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0090-brcmfmac-reset-PMU-backplane-all-cores-in-CYW4373-du.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 1fa5202f4d6962036f50c103eb2e23bf45e95286 Mon Sep 17 00:00:00 2001
-From: Madhan Mohan R <madhanmohan.r@cypress.com>
-Date: Tue, 28 Aug 2018 17:14:20 +0530
-Subject: [PATCH 090/138] brcmfmac: reset PMU, backplane & all cores in CYW4373
- during rmmod
-
-To do a clean reset of the chip during rmmod brcmfmac, program
-the PmuWatchdogCounter register. When a watchdog reset occurs,
-the PMU, backplane and all of the cores in the chip are reset.
-
-Signed-off-by: Madhan Mohan R <madhanmohan.r@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 21 +++++++++++++++++++--
- 1 file changed, 19 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-index b635215..8285045 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
-@@ -222,9 +222,15 @@ struct sbsocramregs {
- /* PMU CONTROL EXT mask for 43012C0 */
- #define CY_43012_PMU_CONTROL_EXT_MASK   0x11
- 
--/* PMU CONTROL EXT mask for 43012C0 */
-+/* PMU Watchdog Counter Tick value for 43012C0 */
- #define CY_43012_PMU_WATCHDOG_TICK_VAL  0x04
- 
-+/* PMU Watchdog Counter Tick value for 4373 */
-+#define CY_4373_PMU_WATCHDOG_TICK_VAL  0x04
-+
-+/* Minimum PMU resource mask for 4373 */
-+#define CY_4373_PMU_MIN_RES_MASK       0xFCAFF7F
-+
- struct brcmf_core_priv {
- 	struct brcmf_core pub;
- 	u32 wrapbase;
-@@ -1583,7 +1589,18 @@ void brcmf_chip_reset_watchdog(struct brcmf_chip *pub)
- 		chip->ops->write32(chip->ctx, addr,
- 			CY_43012_PMU_WATCHDOG_TICK_VAL);
- 		break;
--
-+	case CY_CC_4373_CHIP_ID:
-+		addr = CORE_CC_REG(base, min_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_4373_PMU_MIN_RES_MASK);
-+		addr = CORE_CC_REG(base, watchdog_res_mask);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_4373_PMU_MIN_RES_MASK);
-+		addr = CORE_CC_REG(base, pmuwatchdog);
-+		chip->ops->write32(chip->ctx, addr,
-+			CY_4373_PMU_WATCHDOG_TICK_VAL);
-+		mdelay(100);
-+		break;
- 	default:
- 		break;
- 	}
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0091-brcmfmac-do-not-disconnect-for-disassoc-frame-from-u.patch b/patches/cypress/brcmfmac/0091-brcmfmac-do-not-disconnect-for-disassoc-frame-from-u.patch
deleted file mode 100644
index 8273c8532a2b40ca722163624bdf816f2955e33e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0091-brcmfmac-do-not-disconnect-for-disassoc-frame-from-u.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 172b5b826b36a749d031a2eab69ff1c5f804b5dc Mon Sep 17 00:00:00 2001
-From: Able Liao <Able.Liao@cypress.com>
-Date: Thu, 20 Feb 2020 15:49:23 +0800
-Subject: [PATCH 091/138] brcmfmac: do not disconnect for disassoc frame from
- unconnected AP
-
-Ignore FW event if the event's BSSID is different form the BSSID of the
-currently connected AP. Check interface state is connected or not, if
-state is not connected that can ignore link down event.
-
-Signed-off-by: Able Liao <Able.Liao@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index d5a21b6..e629380 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6134,7 +6134,12 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 		brcmf_net_setcarrier(ifp, true);
- 	} else if (brcmf_is_linkdown(e)) {
- 		brcmf_dbg(CONN, "Linkdown\n");
--		if (!brcmf_is_ibssmode(ifp->vif)) {
-+		if (!brcmf_is_ibssmode(ifp->vif) &&
-+		    test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+			     &ifp->vif->sme_state)) {
-+			if (memcmp(profile->bssid, e->addr, ETH_ALEN))
-+				return err;
-+
- 			brcmf_bss_connect_done(cfg, ndev, e, false);
- 			brcmf_link_down(ifp->vif,
- 					brcmf_map_fw_linkdown_reason(e),
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0092-brcmfmac-Set-pacing-shift-before-transmitting-skb-to.patch b/patches/cypress/brcmfmac/0092-brcmfmac-Set-pacing-shift-before-transmitting-skb-to.patch
deleted file mode 100644
index 6160219d9652b6c8ede882790c176fcc28d0aa57..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0092-brcmfmac-Set-pacing-shift-before-transmitting-skb-to.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From c1e52d50dda15f5157e8936c12b691460737969c Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 6 Mar 2020 04:16:34 -0600
-Subject: [PATCH 092/138] brcmfmac: Set pacing shift before transmitting skb to
- bus
-
-Linux 3.6 introduces TSQ which has a per socket threshold for TCP Tx
-packet to reduce latency. In flow control mode , host driver enqueues skb
-in hanger and TCP doesn't push new skb frees until host frees the skb when
-receiving fwstatus event. So set pacing shift 8 to send them as a single
-large aggregate frame to the bus layer.
-
-43455 TX TCP throughput in FC mode 2 on Linux 5.4.18
-sk_pacing_shift : Throughput
-10: 190 Mbps
- 9: 216 Mbps
- 8: 233 Mbps (Max throughput)
- 7: 233 Mpbs
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index f290a5f..74e6956 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -352,6 +352,9 @@ static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
- 	if ((skb->priority == 0) || (skb->priority > 7))
- 		skb->priority = cfg80211_classify8021d(skb, NULL);
- 
-+	/* set pacing shift for packet aggregation */
-+	sk_pacing_shift_update(skb->sk, 8);
-+
- 	ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
- 	if (ret < 0)
- 		brcmf_txfinalize(ifp, skb, false);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0093-brcmfmac-fix-802.1d-priority-to-ac-mapping-for-pcie-.patch b/patches/cypress/brcmfmac/0093-brcmfmac-fix-802.1d-priority-to-ac-mapping-for-pcie-.patch
deleted file mode 100644
index cf30b596fe20c4d8d7b8b80897990007b4c4e63f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0093-brcmfmac-fix-802.1d-priority-to-ac-mapping-for-pcie-.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 149e9981582708a63e44ea55b5ef622cca9b3ee7 Mon Sep 17 00:00:00 2001
-From: Pramod Prakash <pramod.prakash@cypress.com>
-Date: Fri, 2 Aug 2019 12:47:28 +0530
-Subject: [PATCH 093/138] brcmfmac: fix 802.1d priority to ac mapping for pcie
- dongles
-
-802.1d defines 0,3 for BE and 1,2 for BK. In pcie dongles, 0 & 3 are
-mapped to 0 and 1,2 are mapped to 1. This change corrects this mapping,
-so that BE & BK are given access precedence accordingly by pcie dongles.
-
-Signed-off-by: Pramod Prakash <pramod.prakash@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-index b1727c4..e1127d7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c
-@@ -26,10 +26,10 @@
- #define BRCMF_FLOWRING_HASH_STA(fifo, ifidx) (fifo + ifidx * 16)
- 
- static const u8 brcmf_flowring_prio2fifo[] = {
--	1,
--	0,
- 	0,
- 	1,
-+	1,
-+	0,
- 	2,
- 	2,
- 	3,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0094-non-upstream-calling-skb_orphan-before-sending-skb-t.patch b/patches/cypress/brcmfmac/0094-non-upstream-calling-skb_orphan-before-sending-skb-t.patch
deleted file mode 100644
index c6abdf2f880885d70cc74cc845d7d62223addfaa..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0094-non-upstream-calling-skb_orphan-before-sending-skb-t.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From f93c8ac60acc8d78cc33547d9a6a9b76f8232ff9 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Mon, 1 Jan 2018 20:12:54 -0600
-Subject: [PATCH 094/138] non-upstream: calling skb_orphan before sending skb
- to SDIO bus
-
-Linux 3.6 introduces TSQ which has a per socket threshold for TCP Tx
-packet to reduce latency. In fcmode 1/2, host driver enqueues skb in
-hanger and TCP doesn't push new skb frees until host frees the skb when
-receiving fwstatus event. So using skb_orphan before sending skb to bus
-will make the skb removing the ownership of socket. With this patch, we
-got better throughput in fcmode 1/2.
-
-We only call skb_orphan when Linux version is less than 4.16.0.
-
-Tested 43455 TCP throughput in 20 MHz bandwidth with/without this patch.
-fcmode 0: 59.5 / 59.6 (Mbps)
-fcmode 1: 59.3 / 23.4 (Mbps)
-fcmode 2: 59.6 / 21.5 (Mbps)
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index aa5046c..70f9908 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -2349,6 +2349,9 @@ static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
- 					      &prec_out);
- 			if (pkt == NULL)
- 				break;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+			skb_orphan(pkt);
-+#endif
- 			__skb_queue_tail(&pktq, pkt);
- 		}
- 		spin_unlock_bh(&bus->txq_lock);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0095-non-upstream-workaround-for-4373-USB-WMM-5.2.27-test.patch b/patches/cypress/brcmfmac/0095-non-upstream-workaround-for-4373-USB-WMM-5.2.27-test.patch
deleted file mode 100644
index d75b6fc86d0a34d0f7c34a4e8c74e5faa80c42c6..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0095-non-upstream-workaround-for-4373-USB-WMM-5.2.27-test.patch
+++ /dev/null
@@ -1,150 +0,0 @@
-From 4478585eeef611b78626893ee17700ba9c3e7bed Mon Sep 17 00:00:00 2001
-From: Madhan Mohan R <madhanmohan.r@cypress.com>
-Date: Fri, 4 Jan 2019 14:42:04 +0530
-Subject: [PATCH 095/138] non-upstream: workaround for 4373 USB WMM 5.2.27 test
- failure
-
-With the addition of skb_orphan in the datapath, though the throughput
-increases in TX path, it introduces an issue by removing the flowcontrol
-from upper layer and allowing more data to flow for different access
-category.
-
-This workaround is to disable using skb_orphan when running multi-stream
-data. This change will not be required in linux 4.15 and later versions.
-
-We only use this feature when Linux version is less than 4.16.0.
-
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  3 ++
- .../broadcom/brcm80211/brcmfmac/fwsignal.c         | 46 ++++++++++++++++++++++
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c |  8 +++-
- 3 files changed, 56 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-index e62c348..9e765c2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -152,6 +152,9 @@ struct brcmf_bus {
- 
- 	const struct brcmf_bus_ops *ops;
- 	struct brcmf_bus_msgbuf *msgbuf;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	bool allow_skborphan;
-+#endif
- };
- 
- /*
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index bed7cac..ce8d2ee 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -496,6 +496,9 @@ struct brcmf_fws_info {
- 	bool creditmap_received;
- 	u8 mode;
- 	bool avoid_queueing;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	int fifo_init_credit[BRCMF_FWS_FIFO_COUNT];
-+#endif
- };
- 
- /*
-@@ -1625,9 +1628,13 @@ static int brcmf_fws_notify_credit_map(struct brcmf_if *ifp,
- 			fws->fifo_credit_map |= 1 << i;
- 		else
- 			fws->fifo_credit_map &= ~(1 << i);
-+
- 		WARN_ONCE(fws->fifo_credit[i] < 0,
- 			  "fifo_credit[%d] is negative(%d)\n", i,
- 			  fws->fifo_credit[i]);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+		fws->fifo_init_credit[i] = fws->fifo_credit[i];
-+#endif
- 	}
- 	brcmf_fws_schedule_deq(fws);
- 	brcmf_fws_unlock(fws);
-@@ -2206,6 +2213,38 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp)
- 	brcmf_fws_unlock(fws);
- }
- 
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+static bool brcmf_fws_ismultistream(struct brcmf_fws_info *fws)
-+{
-+	bool ret = false;
-+	u8 credit_usage = 0;
-+
-+	/* Check only for BE, VI and VO traffic */
-+	u32 delay_map = fws->fifo_delay_map &
-+		((1 << BRCMF_FWS_FIFO_AC_BE) |
-+		 (1 << BRCMF_FWS_FIFO_AC_VI) |
-+		 (1 << BRCMF_FWS_FIFO_AC_VO));
-+
-+	if (hweight_long(delay_map) > 1) {
-+		ret = true;
-+	} else {
-+		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_BE] <
-+			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_BE])
-+			credit_usage++;
-+		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_VI] <
-+			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_VI])
-+			credit_usage++;
-+		if (fws->fifo_credit[BRCMF_FWS_FIFO_AC_VO] <
-+			fws->fifo_init_credit[BRCMF_FWS_FIFO_AC_VO])
-+			credit_usage++;
-+
-+		if (credit_usage > 1)
-+			ret = true;
-+	}
-+	return ret;
-+}
-+#endif
-+
- static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- {
- 	struct brcmf_fws_info *fws;
-@@ -2219,6 +2258,13 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
- 	fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work);
- 	drvr = fws->drvr;
- 
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	if (brcmf_fws_ismultistream(fws))
-+		drvr->bus_if->allow_skborphan = false;
-+	else
-+		drvr->bus_if->allow_skborphan = true;
-+#endif
-+
- 	brcmf_fws_lock(fws);
- 	for (fifo = BRCMF_FWS_FIFO_BCMC; fifo >= 0 && !fws->bus_flow_blocked;
- 	     fifo--) {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index 95dfcee..f854143 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -638,7 +638,10 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
- 		goto fail;
- 	}
- 
--	skb_orphan(skb);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	if (devinfo->bus_pub.bus->allow_skborphan)
-+		skb_orphan(skb);
-+#endif
- 	req->skb = skb;
- 	req->devinfo = devinfo;
- 	usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
-@@ -1286,6 +1289,9 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
- 	bus->ops = &brcmf_usb_bus_ops;
- 	bus->proto_type = BRCMF_PROTO_BCDC;
- 	bus->always_use_fws_queue = true;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0))
-+	bus->allow_skborphan = true;
-+#endif
- #ifdef CONFIG_PM
- 	bus->wowl_supported = true;
- #endif
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0096-brcmfmac-disable-command-decode-in-sdio_aos-for-4373.patch b/patches/cypress/brcmfmac/0096-brcmfmac-disable-command-decode-in-sdio_aos-for-4373.patch
deleted file mode 100644
index a9cb7b24982afdff6872b3920ef1f75b6f144341..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0096-brcmfmac-disable-command-decode-in-sdio_aos-for-4373.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 7626c252cef93f3fa3872376783642b47e192335 Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Fri, 13 Mar 2020 03:08:13 -0500
-Subject: [PATCH 096/138] brcmfmac: disable command decode in sdio_aos for 4373
-
-AOS is a part of the SDIOD core that becomes active when the rest of
-SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
-commands.
-
-Transaction between AOS and SDIOD is not protected, and if cmd 52 is
-received in AOS and in the middle of response state changed from AOS to
-SDIOD, response is corrupted and it causes to SDIO Host controller to
-hang.
-
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 70f9908..ff97a4c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -3599,6 +3599,7 @@ static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
- static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
- {
- 	if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
-+	    bus->ci->chip == CY_CC_4373_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4354_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4356_CHIP_ID)
- 		return true;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0097-brcmfmac-disable-command-decode-in-sdio_aos-for-4339.patch b/patches/cypress/brcmfmac/0097-brcmfmac-disable-command-decode-in-sdio_aos-for-4339.patch
deleted file mode 100644
index d507b3b5d6c09a9bc07427d74c17f08b42b372ea..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0097-brcmfmac-disable-command-decode-in-sdio_aos-for-4339.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 1906296dd6ea2c162e0010cde229521b510acf6d Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Fri, 13 Mar 2020 03:12:05 -0500
-Subject: [PATCH 097/138] brcmfmac: disable command decode in sdio_aos for 4339
-
-AOS is a part of the SDIOD core that becomes active when the rest of
-SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
-commands.
-
-Transaction between AOS and SDIOD is not protected, and if cmd 52 is
-received in AOS and in the middle of response state changed from AOS to
-SDIOD, response is corrupted and it causes to SDIO Host controller to
-hang.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index ff97a4c..257a7a3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -3600,6 +3600,7 @@ static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
- {
- 	if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
- 	    bus->ci->chip == CY_CC_4373_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4339_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4354_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4356_CHIP_ID)
- 		return true;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0098-brcmfmac-disable-command-decode-in-sdio_aos-for-4345.patch b/patches/cypress/brcmfmac/0098-brcmfmac-disable-command-decode-in-sdio_aos-for-4345.patch
deleted file mode 100644
index ebea40a162348f2c9131d4aa3eb7c58891f51607..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0098-brcmfmac-disable-command-decode-in-sdio_aos-for-4345.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From ba3368b0f6382c4e9912dcc3de17ad1bc5a718af Mon Sep 17 00:00:00 2001
-From: Chi-Hsien Lin <chi-hsien.lin@cypress.com>
-Date: Fri, 13 Mar 2020 03:15:29 -0500
-Subject: [PATCH 098/138] brcmfmac: disable command decode in sdio_aos for
- 43455
-
-AOS is a part of the SDIOD core that becomes active when the rest of
-SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
-commands.
-
-Transaction between AOS and SDIOD is not protected, and if cmd 52 is
-received in AOS and in the middle of response state changed from AOS to
-SDIOD, response is corrupted and it causes to SDIO Host controller to
-hang.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 257a7a3..ff28c39 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -3601,6 +3601,7 @@ static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
- 	if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
- 	    bus->ci->chip == CY_CC_4373_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4339_CHIP_ID ||
-+	    bus->ci->chip == BRCM_CC_4345_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4354_CHIP_ID ||
- 	    bus->ci->chip == BRCM_CC_4356_CHIP_ID)
- 		return true;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0099-brcmfmac-support-the-forwarding-packet.patch b/patches/cypress/brcmfmac/0099-brcmfmac-support-the-forwarding-packet.patch
deleted file mode 100644
index 0a09af5a643977483f6db803f454c3c9680d329a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0099-brcmfmac-support-the-forwarding-packet.patch
+++ /dev/null
@@ -1,280 +0,0 @@
-From 737abdce331b32f481941d3b22e8c5f1c316949a Mon Sep 17 00:00:00 2001
-From: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Date: Thu, 22 Aug 2019 03:39:06 -0500
-Subject: [PATCH 099/138] brcmfmac: support the forwarding packet
-
-- Support packet forwarding mechanism on fmac driver
-  for some special usages on PCIE. Please ref to JIRA.
-- Fixed BE/VI priority issue when pumping iperf
-- Fix for linux coding style
-
-Signed-off-by: Jia-Shyr Chuang <joseph.chuang@cypress.com>
-Signed-off-by: Ting-Ying Li <tingying.li@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  13 ++-
- .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 101 ++++++++++++++++++++-
- .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  17 ++++
- .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  |  31 ++++++-
- 4 files changed, 158 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index e629380..af51a82 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -4751,7 +4751,7 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 		err = -EINVAL;
- 		goto exit;
- 	}
--
-+	ifp->isap = false;
- 	/* Interface specific setup */
- 	if (dev_role == NL80211_IFTYPE_AP) {
- 		if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss))
-@@ -4831,7 +4831,7 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 				 err);
- 			goto exit;
- 		}
--
-+		ifp->isap = true;
- 		brcmf_dbg(TRACE, "AP mode configuration complete\n");
- 	} else if (dev_role == NL80211_IFTYPE_P2P_GO) {
- 		err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
-@@ -4863,6 +4863,7 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
- 			goto exit;
- 		}
- 
-+		ifp->isap = true;
- 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
- 	} else {
- 		WARN_ON(1);
-@@ -6117,6 +6118,14 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	}
- 
- 	if (brcmf_is_apmode(ifp->vif)) {
-+		if (e->event_code == BRCMF_E_ASSOC_IND ||
-+		    e->event_code == BRCMF_E_REASSOC_IND) {
-+			brcmf_findadd_sta(ifp, e->addr);
-+		} else if ((e->event_code == BRCMF_E_DISASSOC_IND) ||
-+				(e->event_code == BRCMF_E_DEAUTH_IND) ||
-+				(e->event_code == BRCMF_E_DEAUTH)) {
-+			brcmf_del_sta(ifp, e->addr);
-+		}
- 		err = brcmf_notify_connect_status_ap(cfg, ndev, e, data);
- 	} else if (brcmf_is_linkup(ifp->vif, e)) {
- 		brcmf_dbg(CONN, "Linkup\n");
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 74e6956..603bed9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -62,6 +62,14 @@ struct wlc_d11rxhdr {
- 	s8 rxpwr[4];
- } __packed;
- 
-+#define BRCMF_IF_STA_LIST_LOCK_INIT(ifp) spin_lock_init(&(ifp)->sta_list_lock)
-+#define BRCMF_IF_STA_LIST_LOCK(ifp, flags) \
-+	spin_lock_irqsave(&(ifp)->sta_list_lock, (flags))
-+#define BRCMF_IF_STA_LIST_UNLOCK(ifp, flags) \
-+	spin_unlock_irqrestore(&(ifp)->sta_list_lock, (flags))
-+
-+#define BRCMF_STA_NULL ((struct brcmf_sta *)NULL)
-+
- char *brcmf_ifname(struct brcmf_if *ifp)
- {
- 	if (!ifp)
-@@ -822,7 +830,9 @@ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
- 
- 	init_waitqueue_head(&ifp->pend_8021x_wait);
- 	spin_lock_init(&ifp->netif_stop_lock);
--
-+	BRCMF_IF_STA_LIST_LOCK_INIT(ifp);
-+	 /* Initialize STA info list */
-+	INIT_LIST_HEAD(&ifp->sta_list);
- 	if (mac_addr != NULL)
- 		memcpy(ifp->mac_addr, mac_addr, ETH_ALEN);
- 
-@@ -1670,3 +1680,92 @@ int brcmf_pktfilter_enable(struct net_device *ndev, bool enable)
- 	}
- 	return ret;
- }
-+
-+/** Find STA with MAC address ea in an interface's STA list. */
-+struct brcmf_sta *
-+brcmf_find_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta  *sta;
-+	unsigned long flags;
-+
-+	BRCMF_IF_STA_LIST_LOCK(ifp, flags);
-+	list_for_each_entry(sta, &ifp->sta_list, list) {
-+		if (!memcmp(sta->ea.octet, ea, ETH_ALEN)) {
-+			brcmf_dbg(INFO, "Found STA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x into sta list\n",
-+				  sta->ea.octet[0], sta->ea.octet[1],
-+				  sta->ea.octet[2], sta->ea.octet[3],
-+				  sta->ea.octet[4], sta->ea.octet[5]);
-+			BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+			return sta;
-+		}
-+	}
-+	BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+
-+	return BRCMF_STA_NULL;
-+}
-+
-+/** Add STA into the interface's STA list. */
-+struct brcmf_sta *
-+brcmf_add_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta *sta;
-+	unsigned long flags;
-+
-+	sta =  kzalloc(sizeof(*sta), GFP_KERNEL);
-+	if (sta == BRCMF_STA_NULL) {
-+		brcmf_err("Alloc failed\n");
-+		return BRCMF_STA_NULL;
-+	}
-+	memcpy(sta->ea.octet, ea, ETH_ALEN);
-+	brcmf_dbg(INFO, "Add STA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x into sta list\n",
-+		  sta->ea.octet[0], sta->ea.octet[1],
-+		  sta->ea.octet[2], sta->ea.octet[3],
-+		  sta->ea.octet[4], sta->ea.octet[5]);
-+
-+	/* link the sta and the dhd interface */
-+	sta->ifp = ifp;
-+	INIT_LIST_HEAD(&sta->list);
-+
-+	BRCMF_IF_STA_LIST_LOCK(ifp, flags);
-+
-+	list_add_tail(&sta->list, &ifp->sta_list);
-+
-+	BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+	return sta;
-+}
-+
-+/** Delete STA from the interface's STA list. */
-+void
-+brcmf_del_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta *sta, *next;
-+	unsigned long flags;
-+
-+	BRCMF_IF_STA_LIST_LOCK(ifp, flags);
-+	list_for_each_entry_safe(sta, next, &ifp->sta_list, list) {
-+		if (!memcmp(sta->ea.octet, ea, ETH_ALEN)) {
-+			brcmf_dbg(INFO, "del STA: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x from sta list\n",
-+				  ea[0], ea[1], ea[2], ea[3],
-+				  ea[4], ea[5]);
-+			list_del(&sta->list);
-+			kfree(sta);
-+		}
-+	}
-+
-+	BRCMF_IF_STA_LIST_UNLOCK(ifp, flags);
-+}
-+
-+/** Add STA if it doesn't exist. Not reentrant. */
-+struct brcmf_sta*
-+brcmf_findadd_sta(struct brcmf_if *ifp, const u8 *ea)
-+{
-+	struct brcmf_sta *sta = NULL;
-+
-+	sta = brcmf_find_sta(ifp, ea);
-+
-+	if (!sta) {
-+		/* Add entry */
-+		sta = brcmf_add_sta(ifp, ea);
-+	}
-+	return sta;
-+}
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-index 6def862..0852b66 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -188,6 +188,7 @@ struct brcmf_if {
- 	struct brcmf_fws_mac_descriptor *fws_desc;
- 	int ifidx;
- 	s32 bsscfgidx;
-+	bool isap;
- 	u8 mac_addr[ETH_ALEN];
- 	u8 netif_stop;
- 	spinlock_t netif_stop_lock;
-@@ -196,6 +197,19 @@ struct brcmf_if {
- 	struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES];
- 	u8 ipv6addr_idx;
- 	bool fwil_fwerr;
-+	struct list_head sta_list;              /* sll of associated stations */
-+	spinlock_t sta_list_lock;
-+};
-+
-+struct ether_addr {
-+	u8 octet[ETH_ALEN];
-+};
-+
-+/** Per STA params. A list of dhd_sta objects are managed in dhd_if */
-+struct brcmf_sta {
-+	void *ifp;             /* associated brcm_if */
-+	struct ether_addr ea;   /* stations ethernet mac address */
-+	struct list_head list;  /* link into brcmf_if::sta_list */
- };
- 
- int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp);
-@@ -219,4 +233,7 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
- int brcmf_pktfilter_add_remove(struct net_device *ndev, int filter_num,
- 			       bool add);
- int brcmf_pktfilter_enable(struct net_device *ndev, bool enable);
-+void brcmf_del_sta(struct brcmf_if *ifp, const u8 *ea);
-+struct brcmf_sta *brcmf_find_sta(struct brcmf_if *ifp, const u8 *ea);
-+struct brcmf_sta *brcmf_findadd_sta(struct brcmf_if *ifp, const u8 *ea);
- #endif /* BRCMFMAC_CORE_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index 9f1e8ad..7d8fb32 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -1145,7 +1145,8 @@ static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf)
- {
- 	struct brcmf_pub *drvr = msgbuf->drvr;
- 	struct msgbuf_rx_complete *rx_complete;
--	struct sk_buff *skb;
-+	struct sk_buff *skb, *cpskb = NULL;
-+	struct ethhdr *eh;
- 	u16 data_offset;
- 	u16 buflen;
- 	u16 flags;
-@@ -1194,6 +1195,34 @@ static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf)
- 		return;
- 	}
- 
-+	eh = (struct ethhdr *)(skb->data);
-+	if (ifp->isap) {
-+		skb_set_network_header(skb, sizeof(struct ethhdr));
-+		skb->protocol = eh->h_proto;
-+		skb->priority = cfg80211_classify8021d(skb, NULL);
-+		if (is_unicast_ether_addr(eh->h_dest)) {
-+			if (brcmf_find_sta(ifp, eh->h_dest)) {
-+				 /* determine the priority */
-+				if (skb->priority == 0 || skb->priority > 7) {
-+					skb->priority =
-+						cfg80211_classify8021d(skb,
-+								       NULL);
-+				}
-+				brcmf_proto_tx_queue_data(ifp->drvr,
-+							  ifp->ifidx, skb);
-+				return;
-+			}
-+		} else {
-+			cpskb = pskb_copy(skb, GFP_ATOMIC);
-+			if (cpskb) {
-+				brcmf_proto_tx_queue_data(ifp->drvr,
-+							  ifp->ifidx,
-+							  cpskb);
-+			} else {
-+				brcmf_err("Unable to do skb copy\n");
-+			}
-+		}
-+	}
- 	skb->protocol = eth_type_trans(skb, ifp->ndev);
- 	brcmf_netif_rx(ifp, skb);
- }
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0100-brcmfmac-add-a-variable-for-packet-forwarding-condit.patch b/patches/cypress/brcmfmac/0100-brcmfmac-add-a-variable-for-packet-forwarding-condit.patch
deleted file mode 100644
index 93f5861e8598a78e5251c364f55c1a2f40f1de6f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0100-brcmfmac-add-a-variable-for-packet-forwarding-condit.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From e897dadd3a1554e3efb82b809c9a298cec5bae1a Mon Sep 17 00:00:00 2001
-From: Ting-Ying Li <tingying.li@cypress.com>
-Date: Fri, 20 Mar 2020 05:13:47 -0500
-Subject: [PATCH 100/138] brcmfmac: add a variable for packet forwarding
- condition
-
-Some firmware does not support disabling "ap_isolate"
-via iovar. Therefore, get iovar "ap_isolate" value after
-setting to determine whether fmac driver should turn on
-host-based packet forwarding.
-
-Signed-off-by: Ting-Ying Li <tingying.li@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 13 ++++++++++++-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h     |  1 +
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c   |  4 ++--
- 3 files changed, 15 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index af51a82..256604b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5469,7 +5469,7 @@ static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
- {
- 	struct brcmf_if *ifp;
- 	int ret = 0;
--	u32 ap_isolate;
-+	u32 ap_isolate, val;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 	ifp = netdev_priv(dev);
-@@ -5480,6 +5480,17 @@ static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
- 			brcmf_err("ap_isolate iovar failed: ret=%d\n", ret);
- 	}
- 
-+	/* Get ap_isolate value from firmware to detemine whether fmac */
-+	/* driver supports packet forwarding. */
-+	if (brcmf_fil_iovar_int_get(ifp, "ap_isolate", &val) == 0) {
-+		ifp->fmac_pkt_fwd_en =
-+			((params->ap_isolate == 0) && (val == 1)) ?
-+			true : false;
-+	} else {
-+		brcmf_err("get ap_isolate iovar failed: ret=%d\n", ret);
-+		ifp->fmac_pkt_fwd_en = false;
-+	}
-+
- 	return ret;
- }
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-index 0852b66..29c931b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -199,6 +199,7 @@ struct brcmf_if {
- 	bool fwil_fwerr;
- 	struct list_head sta_list;              /* sll of associated stations */
- 	spinlock_t sta_list_lock;
-+	bool fmac_pkt_fwd_en;
- };
- 
- struct ether_addr {
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index 7d8fb32..373afdc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -1195,8 +1195,8 @@ static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf)
- 		return;
- 	}
- 
--	eh = (struct ethhdr *)(skb->data);
--	if (ifp->isap) {
-+	if (ifp->isap && ifp->fmac_pkt_fwd_en) {
-+		eh = (struct ethhdr *)(skb->data);
- 		skb_set_network_header(skb, sizeof(struct ethhdr));
- 		skb->protocol = eh->h_proto;
- 		skb->priority = cfg80211_classify8021d(skb, NULL);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0101-non-upstream-don-t-change-arp-nd-offload-in-multicas.patch b/patches/cypress/brcmfmac/0101-non-upstream-don-t-change-arp-nd-offload-in-multicas.patch
deleted file mode 100644
index 6e555aa8c25e89326a9301b2c3d1f80551eb842a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0101-non-upstream-don-t-change-arp-nd-offload-in-multicas.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 392330eb77252e7f224a3bd981b46664fe835a7d Mon Sep 17 00:00:00 2001
-From: Ting-Ying Li <tingying.li@cypress.com>
-Date: Wed, 1 Apr 2020 21:08:51 -0500
-Subject: [PATCH 101/138] non-upstream: don't change arp/nd offload in
- multicast_work
-
-Commit 6c219b008815 ("brcmfmac: disable packet filtering in promiscuous
-mode") adds brcmf_configure_arp_nd_offload() configuration according to
-promiscuous mode in _brcmf_set_multicast_list(). It will always enable
-arp/nd offload when the device is not in promiscuous mode without
-considering the interface role. Enabling ARP offload for STA/SAP
-concurent mode has caused the AP interface to send ARP responses with
-incorrect mac address.
-
-Remove the arp/nd offload setting line as a workaround for now.
-
-Signed-off-by: Ting-Ying Li <tingying.li@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 603bed9..fe083f8e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -199,7 +199,6 @@ static void _brcmf_set_multicast_list(struct work_struct *work)
- 	if (err < 0)
- 		bphy_err(drvr, "Setting BRCMF_C_SET_PROMISC failed, %d\n",
- 			 err);
--	brcmf_configure_arp_nd_offload(ifp, !cmd_value);
- }
- 
- #if IS_ENABLED(CONFIG_IPV6)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0102-non-upstream-revert-don-t-change-arp-nd-offload-in-m.patch b/patches/cypress/brcmfmac/0102-non-upstream-revert-don-t-change-arp-nd-offload-in-m.patch
deleted file mode 100644
index afeb4b6d4ba4e5f2fb5ea4da7a13b713657aa976..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0102-non-upstream-revert-don-t-change-arp-nd-offload-in-m.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 1ff25cf830007c89d40b914e4bc3bf5cca2fa51f Mon Sep 17 00:00:00 2001
-From: Ting-Ying Li <tingying.li@cypress.com>
-Date: Mon, 13 Apr 2020 22:10:50 -0500
-Subject: [PATCH 102/138] non-upstream: revert "don't change arp/nd offload in
- multicast_work"
-
-Revert commit 392330eb7725 ("non-upstream: don't change
-arp/nd offload in multicast_work").
-
-Signed-off-by: Ting-Ying Li <tingying.li@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index fe083f8e..603bed9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -199,6 +199,7 @@ static void _brcmf_set_multicast_list(struct work_struct *work)
- 	if (err < 0)
- 		bphy_err(drvr, "Setting BRCMF_C_SET_PROMISC failed, %d\n",
- 			 err);
-+	brcmf_configure_arp_nd_offload(ifp, !cmd_value);
- }
- 
- #if IS_ENABLED(CONFIG_IPV6)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0103-brcmfmac-don-t-allow-arp-nd-offload-to-be-enabled-if.patch b/patches/cypress/brcmfmac/0103-brcmfmac-don-t-allow-arp-nd-offload-to-be-enabled-if.patch
deleted file mode 100644
index ee406f7f1afcbc80655345183fe7f92932190710..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0103-brcmfmac-don-t-allow-arp-nd-offload-to-be-enabled-if.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 4b02007e831747c2441ee3242a6c8df61ea5864f Mon Sep 17 00:00:00 2001
-From: Ting-Ying Li <tingying.li@cypress.com>
-Date: Mon, 13 Apr 2020 02:39:44 -0500
-Subject: [PATCH 103/138] brcmfmac: don't allow arp/nd offload to be enabled if
- ap mode exists
-
-Add a condition to determine whether arp/nd offload enabling
-request is allowed. If there is any interface acts as ap
-mode and is operating, then reject the request of arp oflload
-enabling from cfg80211.
-
-Signed-off-by: Ting-Ying Li <tingying.li@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 17 ++++++++++++++++-
- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h |  1 +
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |  5 +++++
- 3 files changed, 22 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 256604b..a4b84ea 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -692,6 +692,21 @@ void brcmf_set_mpc(struct brcmf_if *ifp, int mpc)
- 	}
- }
- 
-+bool brcmf_is_apmode_operating(struct wiphy *wiphy)
-+{
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_cfg80211_vif *vif;
-+	bool ret = false;
-+
-+	list_for_each_entry(vif, &cfg->vif_list, list) {
-+		if (brcmf_is_apmode(vif) &&
-+		    test_bit(BRCMF_VIF_STATUS_AP_CREATED, &vif->sme_state))
-+			ret = true;
-+	}
-+
-+	return ret;
-+}
-+
- s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- 				struct brcmf_if *ifp, bool aborted,
- 				bool fw_abort)
-@@ -4971,8 +4986,8 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 			bphy_err(drvr, "bss_enable config failed %d\n", err);
- 	}
- 	brcmf_set_mpc(ifp, 1);
--	brcmf_configure_arp_nd_offload(ifp, true);
- 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
-+	brcmf_configure_arp_nd_offload(ifp, true);
- 	brcmf_net_setcarrier(ifp, false);
- 
- 	return err;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index bd4ea5e..96a5ec9 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -480,5 +480,6 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
- void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
- void brcmf_cfg80211_free_netdev(struct net_device *ndev);
-+bool brcmf_is_apmode_operating(struct wiphy *wiphy);
- 
- #endif /* BRCMFMAC_CFG80211_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 603bed9..7ace79d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -104,6 +104,11 @@ void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
- 	s32 err;
- 	u32 mode;
- 
-+	if (enable && brcmf_is_apmode_operating(ifp->drvr->wiphy)) {
-+		brcmf_dbg(TRACE, "Skip ARP/ND offload enable when soft AP is running\n");
-+		return;
-+	}
-+
- 	if (enable)
- 		mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
- 	else
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0104-brcmfmac-fix-permanent-MAC-address-in-wiphy-is-all-z.patch b/patches/cypress/brcmfmac/0104-brcmfmac-fix-permanent-MAC-address-in-wiphy-is-all-z.patch
deleted file mode 100644
index e20e542c2ca612a44a64666e055b32cffc465f76..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0104-brcmfmac-fix-permanent-MAC-address-in-wiphy-is-all-z.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From b5fbf52ce620760dc814066213a758b059044a92 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Thu, 23 Apr 2020 03:20:12 -0500
-Subject: [PATCH 104/138] brcmfmac: fix permanent MAC address in wiphy is all
- zero address
-
-When host driver retrieves mac addresses at first time, driver does memcpy
-from drvr->mac to perm_addr. But at the moment, drvr->mac is all zero
-array which causes permanent MAC address in wiphy is all zero as well.
-To fix this, we set drvr->mac before setting perm_addr.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index e9bf5f9..6f12d03 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -226,8 +226,8 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 		bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
- 		goto done;
- 	}
--	memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
- 	memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
-+	memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
- 
- 	bus = ifp->drvr->bus_if;
- 	ri = &ifp->drvr->revinfo;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0105-non-upstream-ignore-FW-BADARG-error-when-removing-no.patch b/patches/cypress/brcmfmac/0105-non-upstream-ignore-FW-BADARG-error-when-removing-no.patch
deleted file mode 100644
index fcb88d421098389b7dd04f8116579ff97575aec1..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0105-non-upstream-ignore-FW-BADARG-error-when-removing-no.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 8f89e08d20252b4ab86252a88381a5cff15b4fd3 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 29 Apr 2020 00:51:13 -0500
-Subject: [PATCH 105/138] non-upstream: ignore FW BADARG error when removing
- non-existed pkt filter
-
-The error check -ENOENT in removing packet filter never happen because
-fwil_fwerr is falase. We should set fwil_fwerr to true and ignore FW
-BADARG(-2) error if firmware does not have that packet filter pattern in
-the list.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 4 +++-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h | 1 +
- 2 files changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 7ace79d..95381b8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1644,9 +1644,11 @@ void __exit brcmf_core_exit(void)
- 
- 	} else {
- 		/* Delete filter */
-+		ifp->fwil_fwerr = true;
- 		ret = brcmf_fil_iovar_int_set(ifp, "pkt_filter_delete",
- 					      pkt_filter->id);
--		if (ret == -ENOENT)
-+		ifp->fwil_fwerr = false;
-+		if (ret == -BRCMF_FW_BADARG)
- 			ret = 0;
- 		if (ret)
- 			goto failed;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-index f2e00a3..a0c776c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h
-@@ -77,6 +77,7 @@
- #define BRCMF_C_SET_VAR				263
- #define BRCMF_C_SET_WSEC_PMK			268
- 
-+#define BRCMF_FW_BADARG				2
- #define BRCMF_FW_UNSUPPORTED			23
- 
- s32 brcmf_fil_cmd_data_set(struct brcmf_if *ifp, u32 cmd, void *data, u32 len);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0106-Revert-brcmfmac-validate-ifp-pointer-in-brcmf_txfina.patch b/patches/cypress/brcmfmac/0106-Revert-brcmfmac-validate-ifp-pointer-in-brcmf_txfina.patch
deleted file mode 100644
index 6c1426a42021407b24d0d06d3db5c06f079fd872..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0106-Revert-brcmfmac-validate-ifp-pointer-in-brcmf_txfina.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From f759a3ed382cc58e701f8d80b64c34e629a13ff2 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 5 May 2020 08:21:17 -0500
-Subject: [PATCH 106/138] Revert "brcmfmac: validate ifp pointer in
- brcmf_txfinalize"
-
-This reverts commit "brcmfmac: validate ifp pointer in brcmf_txfinalize"
-because the related change has been in upstream, commit c80d26e81ef1
-("brcmfmac: fix WARNING during USB disconnect in case of unempty psq")
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 5 -----
- 1 file changed, 5 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 95381b8..00d95f1 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -552,11 +552,6 @@ void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
- 	struct ethhdr *eh;
- 	u16 type;
- 
--	if (!ifp) {
--		brcmu_pkt_buf_free_skb(txp);
--		return;
--	}
--
- 	eh = (struct ethhdr *)(txp->data);
- 	type = ntohs(eh->h_proto);
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0107-Revert-brcmfmac-clean-up-iface-mac-descriptor-before.patch b/patches/cypress/brcmfmac/0107-Revert-brcmfmac-clean-up-iface-mac-descriptor-before.patch
deleted file mode 100644
index cf4ac07754230446ff167d2bba1152ae2f8e3f18..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0107-Revert-brcmfmac-clean-up-iface-mac-descriptor-before.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 6b118c149f6909384da9a8a39b2d7638a49af27b Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 5 May 2020 08:21:37 -0500
-Subject: [PATCH 107/138] Revert "brcmfmac: clean up iface mac descriptor
- before de-initializing it"
-
-This reverts commit "brcmfmac: clean up iface mac descriptor before
-de-initializing it" because the related change has been in upstream,
-commit 5cdb0ef6144f ("brcmfmac: fix NULL pointer derefence during
-USB disconnect").
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index ce8d2ee..8b2a929b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -2204,7 +2204,6 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp)
- 
- 	brcmf_fws_lock(fws);
- 	ifp->fws_desc = NULL;
--	brcmf_fws_macdesc_cleanup(fws, entry, ifp->ifidx);
- 	brcmf_dbg(TRACE, "deleting %s\n", entry->name);
- 	brcmf_fws_macdesc_cleanup(fws, &fws->desc.iface[ifp->ifidx],
- 				  ifp->ifidx);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0108-brcmfmac-Support-DPP-feature.patch b/patches/cypress/brcmfmac/0108-brcmfmac-Support-DPP-feature.patch
deleted file mode 100644
index 0f3a58f3f395282864b49eb6dda366a85b92f1b9..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0108-brcmfmac-Support-DPP-feature.patch
+++ /dev/null
@@ -1,360 +0,0 @@
-From 910359c16cc7a54b92576dc6e6253c58860d028d Mon Sep 17 00:00:00 2001
-From: Kurt Lee <kurt.lee@cypress.com>
-Date: Tue, 12 May 2020 05:55:29 -0500
-Subject: [PATCH 108/138] brcmfmac: Support DPP feature
-
-Let driver parse DPP frames from upper layer and do conresponding
-configuration to firmware.
-This change supports DPP handshake based on wpa_supplicant v2.9.
-
-Signed-off-by: Kurt Lee <kurt.lee@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 85 +++++++++++++---------
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 72 ++++++++++++++----
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.h |  4 +-
- .../broadcom/brcm80211/include/brcmu_wifi.h        |  5 ++
- 4 files changed, 117 insertions(+), 49 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index a4b84ea..49a84cd 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -62,6 +62,9 @@
- #define RSN_CAP_MFPC_MASK		BIT(7)
- #define RSN_PMKID_COUNT_LEN		2
- 
-+#define DPP_AKM_SUITE_TYPE		2
-+#define WLAN_AKM_SUITE_DPP		SUITE(WLAN_OUI_WFA, DPP_AKM_SUITE_TYPE)
-+
- #define VNDR_IE_CMD_LEN			4	/* length of the set command
- 						 * string :"add", "del" (+ NUL)
- 						 */
-@@ -1749,6 +1752,9 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
- 			val = WPA2_AUTH_PSK | WPA2_AUTH_FT;
- 			profile->is_ft = true;
- 			break;
-+		case WLAN_AKM_SUITE_DPP:
-+			val = WFA_AUTH_DPP;
-+			break;
- 		default:
- 			bphy_err(drvr, "invalid cipher group (%d)\n",
- 				 sme->crypto.cipher_group);
-@@ -4072,6 +4078,12 @@ static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
- 	return (memcmp(oui, WPA_OUI, TLV_OUI_LEN) == 0);
- }
- 
-+static bool brcmf_valid_dpp_suite(u8 *oui)
-+{
-+	return (memcmp(oui, WFA_OUI, TLV_OUI_LEN) == 0 &&
-+		*(oui + TLV_OUI_LEN) == DPP_AKM_SUITE_TYPE);
-+}
-+
- static s32
- brcmf_configure_wpaie(struct brcmf_if *ifp,
- 		      const struct brcmf_vs_tlv *wpa_ie,
-@@ -4185,42 +4197,47 @@ static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
- 		goto exit;
- 	}
- 	for (i = 0; i < count; i++) {
--		if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
-+		if (brcmf_valid_dpp_suite(&data[offset])) {
-+			wpa_auth |= WFA_AUTH_DPP;
-+			offset += TLV_OUI_LEN;
-+		} else if (brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
-+			offset += TLV_OUI_LEN;
-+			switch (data[offset]) {
-+			case RSN_AKM_NONE:
-+				brcmf_dbg(TRACE, "RSN_AKM_NONE\n");
-+				wpa_auth |= WPA_AUTH_NONE;
-+				break;
-+			case RSN_AKM_UNSPECIFIED:
-+				brcmf_dbg(TRACE, "RSN_AKM_UNSPECIFIED\n");
-+				is_rsn_ie ?
-+					(wpa_auth |= WPA2_AUTH_UNSPECIFIED) :
-+					(wpa_auth |= WPA_AUTH_UNSPECIFIED);
-+				break;
-+			case RSN_AKM_PSK:
-+				brcmf_dbg(TRACE, "RSN_AKM_PSK\n");
-+				is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) :
-+					    (wpa_auth |= WPA_AUTH_PSK);
-+				break;
-+			case RSN_AKM_SHA256_PSK:
-+				brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n");
-+				wpa_auth |= WPA2_AUTH_PSK_SHA256;
-+				break;
-+			case RSN_AKM_SHA256_1X:
-+				brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
-+				wpa_auth |= WPA2_AUTH_1X_SHA256;
-+				break;
-+			case RSN_AKM_SAE:
-+				brcmf_dbg(TRACE, "RSN_AKM_SAE\n");
-+				wpa_auth |= WPA3_AUTH_SAE_PSK;
-+				break;
-+			default:
-+				bphy_err(drvr, "Invalid key mgmt info\n");
-+			}
-+		} else {
- 			err = -EINVAL;
- 			bphy_err(drvr, "ivalid OUI\n");
- 			goto exit;
- 		}
--		offset += TLV_OUI_LEN;
--		switch (data[offset]) {
--		case RSN_AKM_NONE:
--			brcmf_dbg(TRACE, "RSN_AKM_NONE\n");
--			wpa_auth |= WPA_AUTH_NONE;
--			break;
--		case RSN_AKM_UNSPECIFIED:
--			brcmf_dbg(TRACE, "RSN_AKM_UNSPECIFIED\n");
--			is_rsn_ie ? (wpa_auth |= WPA2_AUTH_UNSPECIFIED) :
--				    (wpa_auth |= WPA_AUTH_UNSPECIFIED);
--			break;
--		case RSN_AKM_PSK:
--			brcmf_dbg(TRACE, "RSN_AKM_PSK\n");
--			is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) :
--				    (wpa_auth |= WPA_AUTH_PSK);
--			break;
--		case RSN_AKM_SHA256_PSK:
--			brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n");
--			wpa_auth |= WPA2_AUTH_PSK_SHA256;
--			break;
--		case RSN_AKM_SHA256_1X:
--			brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
--			wpa_auth |= WPA2_AUTH_1X_SHA256;
--			break;
--		case RSN_AKM_SAE:
--			brcmf_dbg(TRACE, "RSN_AKM_SAE\n");
--			wpa_auth |= WPA3_AUTH_SAE_PSK;
--			break;
--		default:
--			bphy_err(drvr, "Invalid key mgmt info\n");
--		}
- 		offset++;
- 	}
- 
-@@ -4240,10 +4257,12 @@ static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
- 				 */
- 				if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 |
- 						  WPA2_AUTH_1X_SHA256 |
-+						  WFA_AUTH_DPP |
- 						  WPA3_AUTH_SAE_PSK))) {
- 					err = -EINVAL;
- 					goto exit;
- 				}
-+
- 				/* Firmware has requirement that WPA2_AUTH_PSK/
- 				 * WPA2_AUTH_UNSPECIFIED be set, if SHA256 OUI
- 				 * is to be included in the rsn ie.
-@@ -5183,7 +5202,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 			  *cookie, le16_to_cpu(action_frame->len), freq);
- 
- 		ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg),
--						  af_params);
-+						  af_params, vif);
- 
- 		cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
- 					GFP_KERNEL);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 8eb6d4f..6fc2752 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -231,7 +231,35 @@ static bool brcmf_p2p_is_pub_action(void *frame, u32 frame_len)
- 	if (pact_frm->category == P2P_PUB_AF_CATEGORY &&
- 	    pact_frm->action == P2P_PUB_AF_ACTION &&
- 	    pact_frm->oui_type == P2P_VER &&
--	    memcmp(pact_frm->oui, P2P_OUI, P2P_OUI_LEN) == 0)
-+	    memcmp(pact_frm->oui, WFA_OUI, P2P_OUI_LEN) == 0)
-+		return true;
-+
-+	return false;
-+}
-+
-+/**
-+ * brcmf_p2p_is_dpp_pub_action() - true if dpp public type frame.
-+ *
-+ * @frame: action frame data.
-+ * @frame_len: length of action frame data.
-+ *
-+ * Determine if action frame is dpp public action type
-+ */
-+static bool brcmf_p2p_is_dpp_pub_action(void *frame, u32 frame_len)
-+{
-+	struct brcmf_p2p_pub_act_frame *pact_frm;
-+
-+	if (!frame)
-+		return false;
-+
-+	pact_frm = (struct brcmf_p2p_pub_act_frame *)frame;
-+	if (frame_len < sizeof(struct brcmf_p2p_pub_act_frame) - 1)
-+		return false;
-+
-+	if (pact_frm->category == WLAN_CATEGORY_PUBLIC &&
-+	    pact_frm->action == WLAN_PUB_ACTION_VENDOR_SPECIFIC &&
-+	    pact_frm->oui_type == DPP_VER &&
-+	    memcmp(pact_frm->oui, WFA_OUI, TLV_OUI_LEN) == 0)
- 		return true;
- 
- 	return false;
-@@ -995,6 +1023,8 @@ int brcmf_p2p_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	if (err)
- 		goto exit;
- 
-+	p2p->remin_on_channel_wdev = wdev;
-+
- 	memcpy(&p2p->remain_on_channel, channel, sizeof(*channel));
- 	*cookie = p2p->remain_on_channel_cookie;
- 	cfg80211_ready_on_channel(wdev, *cookie, channel, duration, GFP_KERNEL);
-@@ -1018,6 +1048,7 @@ int brcmf_p2p_notify_listen_complete(struct brcmf_if *ifp,
- {
- 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
-+	struct wireless_dev *wdev = p2p->remin_on_channel_wdev;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 	if (test_and_clear_bit(BRCMF_P2P_STATUS_DISCOVER_LISTEN,
-@@ -1030,10 +1061,16 @@ int brcmf_p2p_notify_listen_complete(struct brcmf_if *ifp,
- 			complete(&p2p->wait_next_af);
- 		}
- 
--		cfg80211_remain_on_channel_expired(&ifp->vif->wdev,
-+		wdev = p2p->remin_on_channel_wdev ?
-+			p2p->remin_on_channel_wdev :
-+			&ifp->vif->wdev;
-+
-+		cfg80211_remain_on_channel_expired(wdev,
- 						   p2p->remain_on_channel_cookie,
- 						   &p2p->remain_on_channel,
- 						   GFP_KERNEL);
-+		p2p->remin_on_channel_wdev = NULL;
-+
- 	}
- 	return 0;
- }
-@@ -1534,6 +1571,7 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
-  *
-  * @p2p: p2p info struct for vif.
-  * @af_params: action frame data/info.
-+ * @vif: vif to send
-  *
-  * Send an action frame immediately without doing channel synchronization.
-  *
-@@ -1542,13 +1580,18 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
-  * frame is transmitted.
-  */
- static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
--				     struct brcmf_fil_af_params_le *af_params)
-+				     struct brcmf_fil_af_params_le *af_params,
-+				     struct brcmf_cfg80211_vif *vif
-+				     )
- {
- 	struct brcmf_pub *drvr = p2p->cfg->pub;
--	struct brcmf_cfg80211_vif *vif;
--	struct brcmf_p2p_action_frame *p2p_act_frame;
- 	s32 err = 0;
- 	s32 timeout = 0;
-+	struct brcmf_fil_action_frame_le *action_frame;
-+	u16 action_frame_len;
-+
-+	action_frame = &af_params->action_frame;
-+	action_frame_len = le16_to_cpu(action_frame->len);
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
-@@ -1556,13 +1599,6 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
- 	clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
- 
--	/* check if it is a p2p_presence response */
--	p2p_act_frame = (struct brcmf_p2p_action_frame *)af_params->action_frame.data;
--	if (p2p_act_frame->subtype == P2P_AF_PRESENCE_RSP)
--		vif = p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif;
--	else
--		vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
--
- 	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe", af_params,
- 					sizeof(*af_params));
- 	if (err) {
-@@ -1719,10 +1755,13 @@ static bool brcmf_p2p_check_dwell_overflow(s32 requested_dwell,
-  * @cfg: driver private data for cfg80211 interface.
-  * @ndev: net device to transmit on.
-  * @af_params: configuration data for action frame.
-+ * @vif: virtual interface to send
-  */
- bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 				 struct net_device *ndev,
--				 struct brcmf_fil_af_params_le *af_params)
-+				 struct brcmf_fil_af_params_le *af_params,
-+				 struct brcmf_cfg80211_vif *vif
-+				 )
- {
- 	struct brcmf_p2p_info *p2p = &cfg->p2p;
- 	struct brcmf_if *ifp = netdev_priv(ndev);
-@@ -1795,7 +1834,9 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 			goto exit;
- 		}
- 	} else if (brcmf_p2p_is_p2p_action(action_frame->data,
--					   action_frame_len)) {
-+					   action_frame_len) ||
-+		   brcmf_p2p_is_dpp_pub_action(action_frame->data,
-+					       action_frame_len)) {
- 		/* do not configure anything. it will be */
- 		/* sent with a default configuration     */
- 	} else {
-@@ -1863,7 +1904,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 		if (af_params->channel)
- 			msleep(P2P_AF_RETRY_DELAY_TIME);
- 
--		ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
-+		ack = !brcmf_p2p_tx_action_frame(p2p, af_params, vif);
- 		tx_retry++;
- 		dwell_overflow = brcmf_p2p_check_dwell_overflow(requested_dwell,
- 								dwell_jiffies);
-@@ -2509,6 +2550,7 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
- 
- 	pri_ifp = brcmf_get_ifp(cfg->pub, 0);
- 	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
-+	init_completion(&p2p->send_af_done);
- 
- 	if (p2pdev_forced) {
- 		err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-index d2ecee5..bbc4552 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h
-@@ -138,6 +138,7 @@ struct brcmf_p2p_info {
- 	bool block_gon_req_tx;
- 	bool p2pdev_dynamically;
- 	bool wait_for_offchan_complete;
-+	struct wireless_dev *remin_on_channel_wdev;
- };
- 
- s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced);
-@@ -170,7 +171,8 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
- 					void *data);
- bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 				 struct net_device *ndev,
--				 struct brcmf_fil_af_params_le *af_params);
-+				 struct brcmf_fil_af_params_le *af_params,
-+				 struct brcmf_cfg80211_vif *vif);
- bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
- 					   struct brcmf_bss_info_le *bi);
- s32 brcmf_p2p_notify_rx_mgmt_p2p_probereq(struct brcmf_if *ifp,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-index 7552bdb9..3a9cad3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
-@@ -233,6 +233,11 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec)
- 
- #define WPA3_AUTH_SAE_PSK	0x40000	/* SAE with 4-way handshake */
- 
-+#define WFA_AUTH_DPP		0x200000 /* WFA DPP AUTH */
-+
-+#define WFA_OUI			"\x50\x6F\x9A"	/* WFA OUI */
-+#define DPP_VER			0x1A	/* WFA DPP v1.0 */
-+
- #define DOT11_DEFAULT_RTS_LEN		2347
- #define DOT11_DEFAULT_FRAG_LEN		2346
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0109-brcmfmac-move-firmware-path-to-cypress-folder.patch b/patches/cypress/brcmfmac/0109-brcmfmac-move-firmware-path-to-cypress-folder.patch
deleted file mode 100644
index 838ad11e183623a038601b468c711bdfdabc1444..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0109-brcmfmac-move-firmware-path-to-cypress-folder.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-From 746529fd2fe5313f7985c9d03aabcdc09d5cbc84 Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Tue, 12 May 2020 01:37:54 -0500
-Subject: [PATCH 109/138] brcmfmac: move firmware path to cypress folder
-
-To support upstreaming cypress firmware, move the firmware path
-to /lib/firmware/cypress. The new files in "cypress" folder will be
-called cyfmac<chip>-<bus>.bin/clm_blob/txt.
-
-
-Signed-off-by: Double Lo <double.lo@cypress.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/firmware.h  |  7 +++++++
- .../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c  | 10 +++++-----
- .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c  | 20 ++++++++++----------
- .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c   |  2 +-
- 4 files changed, 23 insertions(+), 16 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-index 3347439..51bb88a 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
-@@ -11,6 +11,8 @@
- 
- #define BRCMF_FW_DEFAULT_PATH		"brcm/"
- 
-+#define CY_FW_DEFAULT_PATH		"cypress/"
-+
- /**
-  * struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware
-  *	filename and nvram filename. Each bus type implementation should create
-@@ -32,6 +34,11 @@ struct brcmf_firmware_mapping {
- 	BRCMF_FW_DEFAULT_PATH fw_base; \
- MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".bin")
- 
-+#define CY_FW_DEF(fw_name, fw_base) \
-+static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
-+	CY_FW_DEFAULT_PATH fw_base; \
-+MODULE_FIRMWARE(CY_FW_DEFAULT_PATH fw_base ".bin")
-+
- #define BRCMF_FW_ENTRY(chipid, mask, name) \
- 	{ chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME }
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index d8ab8fb0..1dd076c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -49,17 +49,17 @@ enum brcmf_pcie_state {
- BRCMF_FW_DEF(43602, "brcmfmac43602-pcie");
- BRCMF_FW_DEF(4350, "brcmfmac4350-pcie");
- BRCMF_FW_DEF(4350C, "brcmfmac4350c2-pcie");
--BRCMF_FW_DEF(4356, "brcmfmac4356-pcie");
--BRCMF_FW_DEF(43570, "brcmfmac43570-pcie");
-+CY_FW_DEF(4356, "cyfmac4356-pcie");
-+CY_FW_DEF(43570, "cyfmac43570-pcie");
- BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
--BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
-+CY_FW_DEF(4359, "cyfmac4359-pcie");
- BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
- BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
- BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
- BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
- BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
--BRCMF_FW_DEF(4355, "brcmfmac89459-pcie");
--BRCMF_FW_DEF(54591, "brcmfmac54591-pcie");
-+CY_FW_DEF(4355, "cyfmac89459-pcie");
-+CY_FW_DEF(54591, "cyfmac54591-pcie");
- 
- static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index ff28c39..08afdbe 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -619,20 +619,20 @@ struct sdiod_drive_str {
- BRCMF_FW_DEF(4329, "brcmfmac4329-sdio");
- BRCMF_FW_DEF(4330, "brcmfmac4330-sdio");
- BRCMF_FW_DEF(4334, "brcmfmac4334-sdio");
--BRCMF_FW_DEF(43340, "brcmfmac43340-sdio");
-+CY_FW_DEF(43340, "cyfmac43340-sdio");
- BRCMF_FW_DEF(4335, "brcmfmac4335-sdio");
--BRCMF_FW_DEF(43362, "brcmfmac43362-sdio");
--BRCMF_FW_DEF(4339, "brcmfmac4339-sdio");
-+CY_FW_DEF(43362, "cyfmac43362-sdio");
-+CY_FW_DEF(4339, "cyfmac4339-sdio");
- BRCMF_FW_DEF(43430A0, "brcmfmac43430a0-sdio");
- /* Note the names are not postfixed with a1 for backward compatibility */
--BRCMF_FW_DEF(43430A1, "brcmfmac43430-sdio");
--BRCMF_FW_DEF(43455, "brcmfmac43455-sdio");
-+CY_FW_DEF(43430A1, "cyfmac43430-sdio");
-+CY_FW_DEF(43455, "cyfmac43455-sdio");
- BRCMF_FW_DEF(43456, "brcmfmac43456-sdio");
--BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
--BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
--BRCMF_FW_DEF(4359, "brcmfmac4359-sdio");
--BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
--BRCMF_FW_DEF(43012, "brcmfmac43012-sdio");
-+CY_FW_DEF(4354, "cyfmac4354-sdio");
-+CY_FW_DEF(4356, "cyfmac4356-sdio");
-+CY_FW_DEF(4359, "cyfmac4359-sdio");
-+CY_FW_DEF(4373, "cyfmac4373-sdio");
-+CY_FW_DEF(43012, "cyfmac43012-sdio");
- 
- static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-index f854143..24d3897 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -40,7 +40,7 @@
- BRCMF_FW_DEF(43236B, "brcmfmac43236b");
- BRCMF_FW_DEF(43242A, "brcmfmac43242a");
- BRCMF_FW_DEF(43569, "brcmfmac43569");
--BRCMF_FW_DEF(4373, "brcmfmac4373");
-+CY_FW_DEF(4373, "cyfmac4373");
- 
- static const struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0110-brcmfmac-add-support-for-sof-time-stammping-for-tx-p.patch b/patches/cypress/brcmfmac/0110-brcmfmac-add-support-for-sof-time-stammping-for-tx-p.patch
deleted file mode 100644
index ed9f47209c52f30f0ff30e063e6e4cb50737977f..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0110-brcmfmac-add-support-for-sof-time-stammping-for-tx-p.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 6a7c8451d06a7c724f17f775cb1841cc64130a15 Mon Sep 17 00:00:00 2001
-From: Brian Henriquez <brian.henriquez@cypress.com>
-Date: Tue, 19 May 2020 00:04:02 -0500
-Subject: [PATCH 110/138] brcmfmac: add support for sof time-stammping for tx
- packets
-
-This adds support for time-stamping outgoing tx packets to support
-PTP with better accuracy. Packets are time-stamped very close to
-when they are put on the bus.
-
-Signed-off-by: Brian Henriquez <brian.henriquez@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c   | 2 ++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 2 ++
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 3 +++
- 3 files changed, 7 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index 00d95f1..add27fb 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -5,6 +5,7 @@
- 
- #include <linux/kernel.h>
- #include <linux/etherdevice.h>
-+#include <linux/ethtool.h>
- #include <linux/module.h>
- #include <linux/inetdevice.h>
- #include <net/cfg80211.h>
-@@ -585,6 +586,7 @@ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
- 
- static const struct ethtool_ops brcmf_ethtool_ops = {
- 	.get_drvinfo = brcmf_ethtool_get_drvinfo,
-+	.get_ts_info = ethtool_op_get_ts_info,
- };
- 
- static int brcmf_netdev_stop(struct net_device *ndev)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-index 373afdc..33fd145 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
-@@ -11,6 +11,7 @@
- #include <linux/types.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
-+#include <linux/net_tstamp.h>
- 
- #include <brcmu_utils.h>
- #include <brcmu_wifi.h>
-@@ -719,6 +720,7 @@ static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u16 flowid)
- 				 brcmf_flowring_qlen(flow, flowid));
- 			break;
- 		}
-+		skb_tx_timestamp(skb);
- 		skb_orphan(skb);
- 		if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev,
- 					     msgbuf->tx_pktids, skb, ETH_HLEN,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 08afdbe..8db7dad 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -23,6 +23,7 @@
- #include <linux/bcma/bcma.h>
- #include <linux/debugfs.h>
- #include <linux/vmalloc.h>
-+#include <linux/net_tstamp.h>
- #include <asm/unaligned.h>
- #include <defs.h>
- #include <brcmu_wifi.h>
-@@ -2997,6 +2998,8 @@ static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
- 	brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq));
- 	bus->sdcnt.fcqueued++;
- 
-+	skb_tx_timestamp(pkt);
-+
- 	/* Priority based enq */
- 	spin_lock_bh(&bus->txq_lock);
- 	/* reset bus_flags in packet cb */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0111-Revert-brcmfmac-add-support-for-CYW89359-SDIO-chipse.patch b/patches/cypress/brcmfmac/0111-Revert-brcmfmac-add-support-for-CYW89359-SDIO-chipse.patch
deleted file mode 100644
index df940145155d9b24c1d50785fe02977a7a53154a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0111-Revert-brcmfmac-add-support-for-CYW89359-SDIO-chipse.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From e31936ff77391a250b9774c841502c8a921ca842 Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Wed, 27 May 2020 07:47:47 -0500
-Subject: [PATCH 111/138] Revert "brcmfmac: add support for CYW89359 SDIO
- chipset"
-
-This reverts commit "brcmfmac: add support for CYW89359 SDIO chipset".
-
-Signed-off-by: Double Lo <double.lo@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 -
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-index 87f1155..f41a36b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
-@@ -922,7 +922,6 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
- 		f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
- 		break;
- 	case SDIO_DEVICE_ID_BROADCOM_4359:
--	case SDIO_DEVICE_ID_CYPRESS_89359:
- 	case SDIO_DEVICE_ID_BROADCOM_4354:
- 	case SDIO_DEVICE_ID_BROADCOM_4356:
- 		f2_blksz = SDIO_435X_FUNC2_BLOCKSIZE;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 8db7dad..94edc41 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4504,7 +4504,6 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 					   CY_43455_MESBUSYCTRL, &err);
- 			break;
- 		case SDIO_DEVICE_ID_BROADCOM_4359:
--		case SDIO_DEVICE_ID_CYPRESS_89359:
- 		case SDIO_DEVICE_ID_BROADCOM_4354:
- 		case SDIO_DEVICE_ID_BROADCOM_4356:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0112-brcmfmac-initialize-the-requested-dwell-time.patch b/patches/cypress/brcmfmac/0112-brcmfmac-initialize-the-requested-dwell-time.patch
deleted file mode 100644
index 5f9a8fee1e0ac878ad4de973d76be661977ac362..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0112-brcmfmac-initialize-the-requested-dwell-time.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 730939918bad727aa9109d423ac062a0d08af893 Mon Sep 17 00:00:00 2001
-From: Joseph Chuang <joseph.chuang@cypress.com>
-Date: Wed, 27 May 2020 00:20:48 -0500
-Subject: [PATCH 112/138] brcmfmac: initialize the requested dwell time
-
-Commit 9c29da3f4e7e
-("brcmfmac: Fix P2P Group Formation failure via Go-neg method") did not
-initialize requested_dwell properly, resulting in an always-false dwell
-time overflow check. Fix it by setting the correct requested_dwell
-value.
-
-Fixes: 4905432b28b7 ("brcmfmac: Fix P2P Group Formation failure via Go-neg method")
-Signed-off-by: Joseph Chuang <joseph.chuang@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c      | 5 ++---
- 2 files changed, 3 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 49a84cd..1f13ad3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -5194,7 +5194,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
- 					      &freq);
- 		chan_nr = ieee80211_frequency_to_channel(freq);
- 		af_params->channel = cpu_to_le32(chan_nr);
--
-+		af_params->dwell_time = cpu_to_le32(params->wait);
- 		memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
- 		       le16_to_cpu(action_frame->len));
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 6fc2752..054840a 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -1738,7 +1738,7 @@ static s32 brcmf_p2p_pub_af_tx(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
--static bool brcmf_p2p_check_dwell_overflow(s32 requested_dwell,
-+static bool brcmf_p2p_check_dwell_overflow(u32 requested_dwell,
- 					   unsigned long dwell_jiffies)
- {
- 	if ((requested_dwell & CUSTOM_RETRY_MASK) &&
-@@ -1779,8 +1779,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	unsigned long dwell_jiffies = 0;
- 	bool dwell_overflow = false;
- 
--	s32 requested_dwell = af_params->dwell_time;
--
-+	u32 requested_dwell = le32_to_cpu(af_params->dwell_time);
- 	action_frame = &af_params->action_frame;
- 	action_frame_len = le16_to_cpu(action_frame->len);
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0113-non-upstream-free-eventmask_msg-after-updating-event.patch b/patches/cypress/brcmfmac/0113-non-upstream-free-eventmask_msg-after-updating-event.patch
deleted file mode 100644
index 645fdf1208579f7ab4fc68dc25dabde72fc25294..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0113-non-upstream-free-eventmask_msg-after-updating-event.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 9a209c1ca3a61b3b6408906c374bd69bc85468cf Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 22 May 2020 03:52:01 -0500
-Subject: [PATCH 113/138] non-upstream: free eventmask_msg after updating event
- mask
-
-To avoid memory leak, we should free eventmask_msg after updating
-event mask.
-
-Memory leak is detected by kmemleak
-unreferenced object 0xa94436c0 (size 64):
-  comm "kworker/0:1", pid 1242, jiffies 208818 (age 20.650s)
-  hex dump (first 32 bytes):
-    01 03 13 15 00 00 00 00 00 00 40 00 00 04 00 00  ..........@.....
-    00 00 00 80 00 00 04 00 00 00 00 00 00 00 00 00  ................
-  backtrace:
-    [<7f3d0f9c>] 0x7f3d0f9c
-    [<7f3dd3c8>] 0x7f3dd3c8
-    [<7f3d2444>] 0x7f3d2444
-    [<80536630>] request_firmware_work_func+0x3c/0x64
-    [<80144dd4>] process_one_work+0x1d8/0x414
-    [<80145a08>] worker_thread+0x38/0x574
-    [<8014a82c>] kthread+0x124/0x154
-    [<801077c8>] ret_from_fork+0x14/0x2c
-    [<ffffffff>] 0xffffffff
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index 6f12d03..f2f6d46 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -370,8 +370,10 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- 					       eventmask_msg, msglen);
- 		if (err) {
- 			brcmf_err("Set event_msgs_ext error (%d)\n", err);
-+			kfree(eventmask_msg);
- 			goto done;
- 		}
-+		kfree(eventmask_msg);
- 	}
- 	/* Setup default scan channel time */
- 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0114-brcmfmac-fix-invalid-address-access-when-enabling-SC.patch b/patches/cypress/brcmfmac/0114-brcmfmac-fix-invalid-address-access-when-enabling-SC.patch
deleted file mode 100644
index 10620fa12a424dd3d159d36292ec512f20416b53..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0114-brcmfmac-fix-invalid-address-access-when-enabling-SC.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From 38d595994cd2cd3262ca67de53f82f3a9636b013 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Mon, 22 Jun 2020 22:06:15 -0500
-Subject: [PATCH 114/138] brcmfmac: fix invalid address access when enabling
- SCAN log level
-
-The variable i is changed when setting random MAC address and causes
-invalid address access when printing the value of pi->reqs[i]->reqid.
-
-We replace reqs index with ri to fix the issue.
-
-[  136.726473] Unable to handle kernel access to user memory outside uaccess routines at virtual address 0000000000000000
-[  136.737365] Mem abort info:
-[  136.740172]   ESR = 0x96000004
-[  136.743359]   Exception class = DABT (current EL), IL = 32 bits
-[  136.749294]   SET = 0, FnV = 0
-[  136.752481]   EA = 0, S1PTW = 0
-[  136.755635] Data abort info:
-[  136.758514]   ISV = 0, ISS = 0x00000004
-[  136.762487]   CM = 0, WnR = 0
-[  136.765522] user pgtable: 4k pages, 48-bit VAs, pgdp = 000000005c4e2577
-[  136.772265] [0000000000000000] pgd=0000000000000000
-[  136.777160] Internal error: Oops: 96000004 [#1] PREEMPT SMP
-[  136.782732] Modules linked in: brcmfmac(O) brcmutil(O) cfg80211(O) compat(O)
-[  136.789788] Process wificond (pid: 3175, stack limit = 0x00000000053048fb)
-[  136.796664] CPU: 3 PID: 3175 Comm: wificond Tainted: G           O      4.19.42-00001-g531a5f5 #1
-[  136.805532] Hardware name: Freescale i.MX8MQ EVK (DT)
-[  136.810584] pstate: 60400005 (nZCv daif +PAN -UAO)
-[  136.815429] pc : brcmf_pno_config_sched_scans+0x6cc/0xa80 [brcmfmac]
-[  136.821811] lr : brcmf_pno_config_sched_scans+0x67c/0xa80 [brcmfmac]
-[  136.828162] sp : ffff00000e9a3880
-[  136.831475] x29: ffff00000e9a3890 x28: ffff800020543400
-[  136.836786] x27: ffff8000b1008880 x26: ffff0000012bf6a0
-[  136.842098] x25: ffff80002054345c x24: ffff800088d22400
-[  136.847409] x23: ffff0000012bf638 x22: ffff0000012bf6d8
-[  136.852721] x21: ffff8000aced8fc0 x20: ffff8000ac164400
-[  136.858032] x19: ffff00000e9a3946 x18: 0000000000000000
-[  136.863343] x17: 0000000000000000 x16: 0000000000000000
-[  136.868655] x15: ffff0000093f3b37 x14: 0000000000000050
-[  136.873966] x13: 0000000000003135 x12: 0000000000000000
-[  136.879277] x11: 0000000000000000 x10: ffff000009a61888
-[  136.884589] x9 : 000000000000000f x8 : 0000000000000008
-[  136.889900] x7 : 303a32303d726464 x6 : ffff00000a1f957d
-[  136.895211] x5 : 0000000000000000 x4 : ffff00000e9a3942
-[  136.900523] x3 : 0000000000000000 x2 : ffff0000012cead8
-[  136.905834] x1 : ffff0000012bf6d8 x0 : 0000000000000000
-[  136.911146] Call trace:
-[  136.913623]  brcmf_pno_config_sched_scans+0x6cc/0xa80 [brcmfmac]
-[  136.919658]  brcmf_pno_start_sched_scan+0xa4/0x118 [brcmfmac]
-[  136.925430]  brcmf_cfg80211_sched_scan_start+0x80/0xe0 [brcmfmac]
-[  136.931636]  nl80211_start_sched_scan+0x140/0x308 [cfg80211]
-[  136.937298]  genl_rcv_msg+0x358/0x3f4
-[  136.940960]  netlink_rcv_skb+0xb4/0x118
-[  136.944795]  genl_rcv+0x34/0x48
-[  136.947935]  netlink_unicast+0x264/0x300
-[  136.951856]  netlink_sendmsg+0x2e4/0x33c
-[  136.955781]  __sys_sendto+0x120/0x19c
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-index 14e5306..7ec1630 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
-@@ -154,12 +154,12 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
- 	struct brcmf_pno_macaddr_le pfn_mac;
- 	u8 *mac_addr = NULL;
- 	u8 *mac_mask = NULL;
--	int err, i;
-+	int err, i, ri;
- 
--	for (i = 0; i < pi->n_reqs; i++)
--		if (pi->reqs[i]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
--			mac_addr = pi->reqs[i]->mac_addr;
--			mac_mask = pi->reqs[i]->mac_addr_mask;
-+	for (ri = 0; ri < pi->n_reqs; ri++)
-+		if (pi->reqs[ri]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
-+			mac_addr = pi->reqs[ri]->mac_addr;
-+			mac_mask = pi->reqs[ri]->mac_addr_mask;
- 			break;
- 		}
- 
-@@ -181,7 +181,7 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
- 	pfn_mac.mac[0] |= 0x02;
- 
- 	brcmf_dbg(SCAN, "enabling random mac: reqid=%llu mac=%pM\n",
--		  pi->reqs[i]->reqid, pfn_mac.mac);
-+		  pi->reqs[ri]->reqid, pfn_mac.mac);
- 	err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
- 				       sizeof(pfn_mac));
- 	if (err)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0115-brcmfmac-calling-brcmf_free-when-removing-SDIO-devic.patch b/patches/cypress/brcmfmac/0115-brcmfmac-calling-brcmf_free-when-removing-SDIO-devic.patch
deleted file mode 100644
index 2016581e1f27cfa646a96afe06ed5d223a6eea72..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0115-brcmfmac-calling-brcmf_free-when-removing-SDIO-devic.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From fab6c6e5b7d4e16006255d36f83d24ba69e47acd Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 22 May 2020 02:00:40 -0500
-Subject: [PATCH 115/138] brcmfmac: calling brcmf_free when removing SDIO
- device
-
-To avoid memory leakage, we should free cfg80211 ops and wiphy when
-removing bus device. Brcmfmac calls brcmf_free when removing PCIE and
-USB, but not do the same in SDIO flow. Therefore, we add brcmf_free in
-brcmf_sdio_remove function.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 94edc41..bd4c2bc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -4758,6 +4758,7 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
- 		brcmf_sdiod_intr_unregister(bus->sdiodev);
- 
- 		brcmf_detach(bus->sdiodev->dev);
-+		brcmf_free(bus->sdiodev->dev);
- 
- 		cancel_work_sync(&bus->datawork);
- 		if (bus->brcmf_wq)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0116-brcmfmac-add-a-timer-to-read-console-periodically-in.patch b/patches/cypress/brcmfmac/0116-brcmfmac-add-a-timer-to-read-console-periodically-in.patch
deleted file mode 100644
index 64e41b1b4512bcf591a5e1e658a5b384e64def76..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0116-brcmfmac-add-a-timer-to-read-console-periodically-in.patch
+++ /dev/null
@@ -1,260 +0,0 @@
-From 3787c1884088ae88b441eb9ed6d450b1d06c218e Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 10 Jul 2020 04:37:31 -0500
-Subject: [PATCH 116/138] brcmfmac: add a timer to read console periodically in
- PCIE bus
-
-Currently, host only reads console buffer when receiving mailbox data or
-hit crash with PCIE bus. Therefore, we add timer in PCIE code to read
-console buffer periodically to help developer and user check firmware
-message when there is no data transmission between host and dongle.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |   6 +
- .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 127 +++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    |   2 -
- 3 files changed, 133 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-index 9e765c2..ea0524b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -22,6 +22,12 @@
- #define BRCMF_NROF_COMMON_MSGRINGS	(BRCMF_NROF_H2D_COMMON_MSGRINGS + \
- 					 BRCMF_NROF_D2H_COMMON_MSGRINGS)
- 
-+/* The interval to poll console */
-+#define BRCMF_CONSOLE	10
-+
-+/* The maximum console interval value (5 mins) */
-+#define MAX_CONSOLE_INTERVAL	(5 * 60)
-+
- /* The level of bus communication with the dongle */
- enum brcmf_bus_state {
- 	BRCMF_BUS_DOWN,		/* Not ready for frame transfers */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 1dd076c..cdd7389 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -12,6 +12,8 @@
- #include <linux/interrupt.h>
- #include <linux/bcma/bcma.h>
- #include <linux/sched.h>
-+#include <linux/sched/signal.h>
-+#include <linux/kthread.h>
- #include <asm/unaligned.h>
- 
- #include <soc.h>
-@@ -277,6 +279,11 @@ struct brcmf_pciedev_info {
- #ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
- 	ulong bar1_size;
- #endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-+#ifdef DEBUG
-+	u32 console_interval;
-+	bool console_active;
-+	struct timer_list timer;
-+#endif
- };
- 
- struct brcmf_pcie_ringbuf {
-@@ -348,6 +355,10 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- static struct brcmf_fw_request *
- brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
- 
-+static void
-+brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active);
-+static void brcmf_pcie_debugfs_create(struct device *dev);
-+
- #ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
- DEFINE_RAW_SPINLOCK(pcie_lock);
- #endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
-@@ -1576,6 +1587,11 @@ static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
- 
- static void brcmf_pcie_down(struct device *dev)
- {
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
-+
-+	brcmf_pcie_fwcon_timer(devinfo, false);
- }
- 
- 
-@@ -1704,6 +1720,7 @@ static int brcmf_pcie_reset(struct device *dev)
- 	.get_memdump = brcmf_pcie_get_memdump,
- 	.get_fwname = brcmf_pcie_get_fwname,
- 	.reset = brcmf_pcie_reset,
-+	.debugfs_create = brcmf_pcie_debugfs_create,
- };
- 
- 
-@@ -2077,6 +2094,8 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 
- 	brcmf_pcie_bus_console_read(devinfo, false);
- 
-+	brcmf_pcie_fwcon_timer(devinfo, true);
-+
- 	return;
- 
- fail:
-@@ -2116,6 +2135,105 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	return fwreq;
- }
- 
-+#ifdef DEBUG
-+static void
-+brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
-+{
-+	if (!active) {
-+		if (devinfo->console_active) {
-+			del_timer_sync(&devinfo->timer);
-+			devinfo->console_active = false;
-+		}
-+		return;
-+	}
-+
-+	/* don't start the timer */
-+	if (devinfo->state != BRCMFMAC_PCIE_STATE_UP ||
-+	    !devinfo->console_interval || !BRCMF_FWCON_ON())
-+		return;
-+
-+	if (!devinfo->console_active) {
-+		devinfo->timer.expires = jiffies + devinfo->console_interval;
-+		add_timer(&devinfo->timer);
-+		devinfo->console_active = true;
-+	} else {
-+		/* Reschedule the timer */
-+		mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
-+	}
-+}
-+
-+static void
-+brcmf_pcie_fwcon(struct timer_list *t)
-+{
-+	struct brcmf_pciedev_info *devinfo = from_timer(devinfo, t, timer);
-+
-+	if (!devinfo->console_active)
-+		return;
-+
-+	brcmf_pcie_bus_console_read(devinfo, false);
-+
-+	/* Reschedule the timer if console interval is not zero */
-+	mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
-+}
-+
-+static int brcmf_pcie_console_interval_get(void *data, u64 *val)
-+{
-+	struct brcmf_pciedev_info *devinfo = data;
-+
-+	*val = devinfo->console_interval;
-+
-+	return 0;
-+}
-+
-+static int brcmf_pcie_console_interval_set(void *data, u64 val)
-+{
-+	struct brcmf_pciedev_info *devinfo = data;
-+
-+	if (val > MAX_CONSOLE_INTERVAL)
-+		return -EINVAL;
-+
-+	devinfo->console_interval = val;
-+
-+	if (!val && devinfo->console_active)
-+		brcmf_pcie_fwcon_timer(devinfo, false);
-+	else if (val)
-+		brcmf_pcie_fwcon_timer(devinfo, true);
-+
-+	return 0;
-+}
-+
-+DEFINE_SIMPLE_ATTRIBUTE(brcmf_pcie_console_interval_fops,
-+			brcmf_pcie_console_interval_get,
-+			brcmf_pcie_console_interval_set,
-+			"%llu\n");
-+
-+static void brcmf_pcie_debugfs_create(struct device *dev)
-+{
-+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+	struct brcmf_pub *drvr = bus_if->drvr;
-+	struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
-+	struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
-+	struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
-+
-+	if (IS_ERR_OR_NULL(dentry))
-+		return;
-+
-+	devinfo->console_interval = BRCMF_CONSOLE;
-+
-+	debugfs_create_file("console_interval", 0644, dentry, devinfo,
-+			    &brcmf_pcie_console_interval_fops);
-+}
-+
-+#else
-+void brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
-+{
-+}
-+
-+static void brcmf_pcie_debugfs_create(struct device *dev)
-+{
-+}
-+#endif
-+
- static int
- brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
- {
-@@ -2183,6 +2301,10 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	if (ret)
- 		goto fail_bus;
- 
-+#ifdef DEBUG
-+	/* Set up the fwcon timer */
-+	timer_setup(&devinfo->timer, brcmf_pcie_fwcon, 0);
-+#endif
- 	fwreq = brcmf_pcie_prepare_fw_request(devinfo);
- 	if (!fwreq) {
- 		ret = -ENOMEM;
-@@ -2226,6 +2348,8 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 
- 	devinfo = bus->bus_priv.pcie->devinfo;
- 
-+	brcmf_pcie_fwcon_timer(devinfo, false);
-+
- 	devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
- 	if (devinfo->ci)
- 		brcmf_pcie_intr_disable(devinfo);
-@@ -2278,6 +2402,8 @@ static int brcmf_pcie_pm_enter_D3(struct device *dev)
- 	if (!retry && config->pm_state == BRCMF_CFG80211_PM_STATE_SUSPENDING)
- 		brcmf_err(bus, "timed out wait for cfg80211 suspended\n");
- 
-+	brcmf_pcie_fwcon_timer(devinfo, false);
-+
- 	brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
- 
- 	devinfo->mbdata_completed = false;
-@@ -2321,6 +2447,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
- 		brcmf_bus_change_state(bus, BRCMF_BUS_UP);
- 		brcmf_pcie_intr_enable(devinfo);
- 		brcmf_pcie_hostready(devinfo);
-+		brcmf_pcie_fwcon_timer(devinfo, true);
- 		return 0;
- 	}
- 
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index bd4c2bc..5fdef08 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -136,8 +136,6 @@ struct rte_console {
- 
- #define BRCMF_FIRSTREAD	(1 << 6)
- 
--#define BRCMF_CONSOLE	10	/* watchdog interval to poll console */
--
- /* SBSDIO_DEVICE_CTL */
- 
- /* 1: device will assert busy signal when receiving CMD53 */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0117-brcmfmac-return-error-when-getting-invalid-max_flowr.patch b/patches/cypress/brcmfmac/0117-brcmfmac-return-error-when-getting-invalid-max_flowr.patch
deleted file mode 100644
index 33f215a74d93ae6b712038de24922cc97a0d07dd..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0117-brcmfmac-return-error-when-getting-invalid-max_flowr.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 593f9b6d7b2e2e4c8da5c8c0a209bbc5afbc1ed7 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 10 Jul 2020 04:38:46 -0500
-Subject: [PATCH 117/138] brcmfmac: return error when getting invalid
- max_flowrings from dongle
-
-When firmware hit trap at initialization, host will read abnormal
-max_flowrings number from dongle, and it will causes kernel panic when
-doing iowrite to initialize dongle ring.
-To detect this error at early stage, we directly return error when getting
-invalid max_flowrings(>256).
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index cdd7389..41c8667 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -1386,6 +1386,10 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
- 				BRCMF_NROF_H2D_COMMON_MSGRINGS;
- 		max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS;
- 	}
-+	if (max_flowrings > 256) {
-+		brcmf_err(bus, "invalid max_flowrings(%d)\n", max_flowrings);
-+		return -EIO;
-+	}
- 
- 	if (devinfo->dma_idx_sz != 0) {
- 		bufsz = (max_submissionrings + max_completionrings) *
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0118-brcmfmac-Fix-to-add-skb-free-for-TIM-update-info-whe.patch b/patches/cypress/brcmfmac/0118-brcmfmac-Fix-to-add-skb-free-for-TIM-update-info-whe.patch
deleted file mode 100644
index be60879bcb471e7aaf25d56787fc9de594c8bddc..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0118-brcmfmac-Fix-to-add-skb-free-for-TIM-update-info-whe.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 9c63cfd64f640e5b9a6abe816f23f871ffb38eb5 Mon Sep 17 00:00:00 2001
-From: Wataru Gohda <wataru.gohda@cypress.com>
-Date: Fri, 19 Jun 2020 01:49:53 -0500
-Subject: [PATCH 118/138] brcmfmac: Fix to add skb free for TIM update info
- when tx is completed
-
-The skb will be allocated to send TIM update info in brcmf_fws_tim_update.
-Currently the skb will be freed when tx is failed but it will not be freed
-when tx is completed successfully. The fix is to free the skb when tx is
-completed always.
-
-Signed-off-by: Wataru Gohda <wataru.gohda@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c   |  3 +--
- .../net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c   | 15 +++++++++------
- .../net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h   |  3 ++-
- 3 files changed, 12 insertions(+), 9 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-index 705130c..9ec0c60 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
-@@ -370,8 +370,7 @@ void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state)
- 
- 	/* await txstatus signal for firmware if active */
- 	if (brcmf_fws_fc_active(bcdc->fws)) {
--		if (!success)
--			brcmf_fws_bustxfail(bcdc->fws, txp);
-+		brcmf_fws_bustxcomplete(bcdc->fws, txp, success);
- 	} else {
- 		if (brcmf_proto_bcdc_hdrpull(bus_if->drvr, false, txp, &ifp))
- 			brcmu_pkt_buf_free_skb(txp);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 8b2a929b..1a20c2f 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -2529,7 +2529,8 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
- 	return fws->fcmode != BRCMF_FWS_FCMODE_NONE;
- }
- 
--void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
-+void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb,
-+			     bool success)
- {
- 	u32 hslot;
- 
-@@ -2537,11 +2538,13 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
- 		brcmu_pkt_buf_free_skb(skb);
- 		return;
- 	}
--	brcmf_fws_lock(fws);
--	hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
--	brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0,
--			      1);
--	brcmf_fws_unlock(fws);
-+	if (!success) {
-+		brcmf_fws_lock(fws);
-+		hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
-+		brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED,
-+				      hslot, 0, 0, 1);
-+		brcmf_fws_unlock(fws);
-+	}
- }
- 
- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-index b16a9d1..f9c36cd 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
-@@ -40,7 +40,8 @@ enum brcmf_fws_fifo {
- void brcmf_fws_reset_interface(struct brcmf_if *ifp);
- void brcmf_fws_add_interface(struct brcmf_if *ifp);
- void brcmf_fws_del_interface(struct brcmf_if *ifp);
--void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb);
-+void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb,
-+			     bool success);
- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked);
- void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb);
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0119-brcmfmac-Fix-to-add-brcmf_clear_assoc_ies-when-rmmod.patch b/patches/cypress/brcmfmac/0119-brcmfmac-Fix-to-add-brcmf_clear_assoc_ies-when-rmmod.patch
deleted file mode 100644
index d9150d718a3613f08a4d49bc2c5f91af50b96dcf..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0119-brcmfmac-Fix-to-add-brcmf_clear_assoc_ies-when-rmmod.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From c0ca856e38bcd0f24bcd368495234227c589d2ca Mon Sep 17 00:00:00 2001
-From: Wataru Gohda <wataru.gohda@cypress.com>
-Date: Fri, 19 Jun 2020 01:16:09 -0500
-Subject: [PATCH 119/138] brcmfmac: Fix to add brcmf_clear_assoc_ies when rmmod
-
-Conn_info->req_ie/resp_ie is used to indicate the assoc_req_ies /
-assoc_resp_ies to cfg80211 layer when connection is done. The buffer is
-freed and allocated again at next connection establishment. The buffers
-also needs to be freed at the timing of rmmod as well.
-
-Signed-off-by: Wataru Gohda <wataru.gohda@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 1f13ad3..88f9f1e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6456,6 +6456,7 @@ static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
- 	cfg->dongle_up = false;	/* dongle down */
- 	brcmf_abort_scanning(cfg);
- 	brcmf_deinit_priv_mem(cfg);
-+	brcmf_clear_assoc_ies(cfg);
- }
- 
- static void init_vif_event(struct brcmf_cfg80211_vif_event *event)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0120-brcmfmac-dump-dongle-memory-when-attaching-failed.patch b/patches/cypress/brcmfmac/0120-brcmfmac-dump-dongle-memory-when-attaching-failed.patch
deleted file mode 100644
index dd8fe561109645bb5459b1eaeb02dfb3792c085d..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0120-brcmfmac-dump-dongle-memory-when-attaching-failed.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 977239d710e934340e7c780d11237e24b2fab09b Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 10 Jul 2020 04:46:05 -0500
-Subject: [PATCH 120/138] brcmfmac: dump dongle memory when attaching failed
-
-To enhance FW debugging, we add dongle memory dump when hitting attaching
-failure with PCIE bus. It can help developer to get more information
-about dongle trap reason and root cause.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |  3 ++-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 10 +++++++---
- 2 files changed, 9 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index add27fb..d38003c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1351,7 +1351,8 @@ void brcmf_fw_crashed(struct device *dev)
- 
- 	brcmf_dev_coredump(dev);
- 
--	schedule_work(&drvr->bus_reset);
-+	if (drvr->bus_reset.func)
-+		schedule_work(&drvr->bus_reset);
- }
- 
- void brcmf_detach(struct device *dev)
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 41c8667..e72756c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -2023,13 +2023,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	struct brcmf_commonring **flowrings;
- 	u32 i, nvram_len;
- 
-+	bus = dev_get_drvdata(dev);
-+	pcie_bus_dev = bus->bus_priv.pcie;
-+	devinfo = pcie_bus_dev->devinfo;
-+
- 	/* check firmware loading result */
- 	if (ret)
- 		goto fail;
- 
--	bus = dev_get_drvdata(dev);
--	pcie_bus_dev = bus->bus_priv.pcie;
--	devinfo = pcie_bus_dev->devinfo;
- 	brcmf_pcie_attach(devinfo);
- 
- 	fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
-@@ -2103,6 +2104,9 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	return;
- 
- fail:
-+	brcmf_err(bus, "Dongle setup failed\n");
-+	brcmf_pcie_bus_console_read(devinfo, true);
-+	brcmf_fw_crashed(dev);
- 	device_release_driver(dev);
- }
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0121-brcmfmac-update-address-mode-via-test-tool-for-AP-mo.patch b/patches/cypress/brcmfmac/0121-brcmfmac-update-address-mode-via-test-tool-for-AP-mo.patch
deleted file mode 100644
index 00c54319bfbabbb80f395a1b2ccb4683909ecee5..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0121-brcmfmac-update-address-mode-via-test-tool-for-AP-mo.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From e2e1ada80fad1250ba73e2de8b607fd6e8c9840e Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Mon, 20 Jul 2020 02:44:36 -0500
-Subject: [PATCH 121/138] brcmfmac: update address mode via test tool for AP
- mode
-
-When setting interface type to AP mode via IOCTL test tool, we should
-update proto address mode as well. Without it, the firmware creates
-flowing type to STA and get incorrect flowing ID. In softAP mode, it
-causes device cannot ping to other STAs which are in power saving mode.
-
-Fixes: 65b06108e57a ("brcmfmac: set net carrier on via test tool for AP mode")
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +-
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c   | 1 +
- 3 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 88f9f1e..3604afc 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -489,7 +489,7 @@ static void convert_key_from_CPU(struct brcmf_wsec_key *key,
- 	return err;
- }
- 
--static void
-+void
- brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
- {
- 	struct brcmf_cfg80211_vif *vif;
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-index 96a5ec9..7db8735 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
-@@ -481,5 +481,5 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
- void brcmf_cfg80211_free_netdev(struct net_device *ndev);
- bool brcmf_is_apmode_operating(struct wiphy *wiphy);
--
-+void brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev);
- #endif /* BRCMFMAC_CFG80211_H */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-index 0bad78d..bf425d2 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor.c
-@@ -71,6 +71,7 @@ static int brcmf_cfg80211_vndr_cmds_dcmd_handler(struct wiphy *wiphy,
- 		} else {
- 			ifp->vif->wdev.iftype = NL80211_IFTYPE_STATION;
- 		}
-+		brcmf_cfg80211_update_proto_addr_mode(&vif->wdev);
- 	}
- 
- 	if (cmdhdr->set)
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0122-brcmfmac-load-54591-firmware-for-chip-ID-0x4355.patch b/patches/cypress/brcmfmac/0122-brcmfmac-load-54591-firmware-for-chip-ID-0x4355.patch
deleted file mode 100644
index 05ee8320368e1a6ac856eae79ed8c4f82c113b7e..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0122-brcmfmac-load-54591-firmware-for-chip-ID-0x4355.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 7e3bee2b3a500e635b865c711cbf8882a6383779 Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Wed, 29 Jul 2020 04:53:49 -0500
-Subject: [PATCH 122/138] brcmfmac: load 54591 firmware for chip ID 0x4355
-
-Use 54591 firmware for chip ID 0x4355.
-
-Signed-off-by: Double Lo <double.lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 17 +++--------------
- .../wireless/broadcom/brcm80211/include/brcm_hw_ids.h   |  1 -
- 2 files changed, 3 insertions(+), 15 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index e72756c..0b6ba8d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -60,8 +60,7 @@ enum brcmf_pcie_state {
- BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
- BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
- BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
--CY_FW_DEF(4355, "cyfmac89459-pcie");
--CY_FW_DEF(54591, "cyfmac54591-pcie");
-+CY_FW_DEF(4355, "cyfmac54591-pcie");
- 
- static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
- 	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
-@@ -82,7 +81,6 @@ enum brcmf_pcie_state {
- 	BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
- 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
- 	BRCMF_FW_ENTRY(CY_CC_89459_CHIP_ID, 0xFFFFFFFF, 4355),
--	BRCMF_FW_ENTRY(CY_CC_54591_CHIP_ID, 0xFFFFFFFF, 54591),
- };
- 
- #define BRCMF_PCIE_FW_UP_TIMEOUT		5000 /* msec */
-@@ -1663,12 +1661,7 @@ int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
- 	};
- 	u32 chip;
- 
--	if (devinfo->ci->chip == CY_CC_89459_CHIP_ID &&
--	    devinfo->pdev->device == CY_PCIE_54591_DEVICE_ID)
--		chip = CY_CC_54591_CHIP_ID;
--	else
--		chip = bus_if->chip;
--
-+	chip = bus_if->chip;
- 	fwreq = brcmf_fw_alloc_request(chip, bus_if->chiprev,
- 				       brcmf_pcie_fwnames,
- 				       ARRAY_SIZE(brcmf_pcie_fwnames),
-@@ -2120,11 +2113,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- 	};
- 	u32 chip;
- 
--	if (devinfo->ci->chip == CY_CC_89459_CHIP_ID &&
--	    devinfo->pdev->device == CY_PCIE_54591_DEVICE_ID)
--		chip = CY_CC_54591_CHIP_ID;
--	else
--		chip = devinfo->ci->chip;
-+	chip = devinfo->ci->chip;
- 	fwreq = brcmf_fw_alloc_request(chip, devinfo->ci->chiprev,
- 				       brcmf_pcie_fwnames,
- 				       ARRAY_SIZE(brcmf_pcie_fwnames),
-diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-index 1a04157..01da8f8 100644
---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
-@@ -51,7 +51,6 @@
- #define CY_CC_4373_CHIP_ID		0x4373
- #define CY_CC_43012_CHIP_ID		43012
- #define CY_CC_89459_CHIP_ID             0x4355
--#define CY_CC_54591_CHIP_ID             0x54591
- 
- /* USB Device IDs */
- #define BRCM_USB_43143_DEVICE_ID	0xbd1e
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0123-brcmfmac-reserve-tx-credit-only-when-txctl-is-ready-.patch b/patches/cypress/brcmfmac/0123-brcmfmac-reserve-tx-credit-only-when-txctl-is-ready-.patch
deleted file mode 100644
index c83ef9ea4174aed02d79835fbe29282079f49031..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0123-brcmfmac-reserve-tx-credit-only-when-txctl-is-ready-.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 33c481b98aaf0ee0fab79762d9a6594b5cd26129 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 12 Aug 2020 21:44:03 -0500
-Subject: [PATCH 123/138] brcmfmac: reserve tx credit only when txctl is ready
- to send
-
-commit 9a2a0862d973c9eab6a1f3efa0d4d18dcedbaf1a upstream.
-
-The 4329 throughput drops from 40.2 Mbits/sec to 190 Kbits/sec in 2G
-11n mode because the commit b41c232d33666 ("brcmfmac: reserve 2 credits
-for host tx control path"). To fix the issue, host driver only reserves
-tx control credit when there is a txctl frame is pending to send. And
-we also check available credit by using "not equal to 0" instead of
-"greater than 0" because tx_max and tx_seq are circled positive numbers.
-
-Fixes: b41c232d33666 ("brcmfmac: reserve 2 credits for host tx control path")
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Tested-by: Dmitry Osipenko <digetx@gmail.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 14 +++++++++-----
- 1 file changed, 9 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 5fdef08..916694b 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -669,13 +669,17 @@ static void pkt_align(struct sk_buff *p, int len, int align)
- 	__skb_trim(p, len);
- }
- 
--/* To check if there's window offered
-- * Reserve 3 credits for txctl
-- */
-+/* To check if there's window offered */
- static bool data_ok(struct brcmf_sdio *bus)
- {
--	return (u8)(bus->tx_max - bus->tx_seq) > TXCTL_CREDITS &&
--	       ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0;
-+	u8 tx_rsv = 0;
-+
-+	/* Reserve TXCTL_CREDITS credits for txctl when it is ready to send */
-+	if (bus->ctrl_frame_stat)
-+		tx_rsv = TXCTL_CREDITS;
-+
-+	return (bus->tx_max - bus->tx_seq - tx_rsv) != 0 &&
-+	       ((bus->tx_max - bus->tx_seq - tx_rsv) & 0x80) == 0;
- }
- 
- /* To check if there's window offered */
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0124-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch b/patches/cypress/brcmfmac/0124-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch
deleted file mode 100644
index 7b28a75dc5674f5686211593b3cd5c003a4c4bc0..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0124-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From 6097c642eedd0015cf1ef69a4d6f24a0c63daa37 Mon Sep 17 00:00:00 2001
-From: Kurt Lee <kurt.lee@cypress.com>
-Date: Thu, 20 Aug 2020 03:07:02 -0500
-Subject: [PATCH 124/138] brcmfmac: Fix interoperating DPP and other encryption
- network access
-
-1. If firmware supports 4-way handshake offload but not supports DPP
-4-way offload, when user first connects encryption network, driver will
-set "sup_wpa 1" to firmware, but it will further result in DPP
-connection failure since firmware won't send EAPOL frame to host.
-
-2. Fix DPP AP mode handling action frames.
-
-3. For some firmware without fwsup support, the join procedure will be
-skipped due to "sup_wpa" iovar returning not-support. Check the fwsup
-feature before do such iovar.
-
-Signed-off-by: Kurt Lee <kurt.lee@cypress.com>
-Signed-off-by: Double Lo <double.lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 67 ++++++++++++----------
- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c |  5 ++
- 2 files changed, 42 insertions(+), 30 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 3604afc..b9e5e2e 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2062,43 +2062,50 @@ static void brcmf_set_join_pref(struct brcmf_if *ifp,
- 		goto done;
- 	}
- 
--	if (sme->crypto.psk &&
--	    profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
--		if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
--			err = -EINVAL;
--			goto done;
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWSUP)) {
-+		if (sme->crypto.psk) {
-+			if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
-+				if (WARN_ON(profile->use_fwsup !=
-+					BRCMF_PROFILE_FWSUP_NONE)) {
-+					err = -EINVAL;
-+					goto done;
-+				}
-+				brcmf_dbg(INFO, "using PSK offload\n");
-+				profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
-+			}
-+		} else {
-+			profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
- 		}
--		brcmf_dbg(INFO, "using PSK offload\n");
--		profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
--	}
- 
--	if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
--		/* enable firmware supplicant for this interface */
--		err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
--		if (err < 0) {
--			bphy_err(drvr, "failed to enable fw supplicant\n");
--			goto done;
-+		if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
-+			/* enable firmware supplicant for this interface */
-+			err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
-+			if (err < 0) {
-+				bphy_err(drvr, "failed to enable fw supplicant\n");
-+				goto done;
-+			}
-+		} else {
-+			err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 0);
- 		}
--	}
- 
--	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
--		err = brcmf_set_pmk(ifp, sme->crypto.psk,
--				    BRCMF_WSEC_MAX_PSK_LEN);
--	else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
--		/* clean up user-space RSNE */
--		if (brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0)) {
--			bphy_err(drvr, "failed to clean up user-space RSNE\n");
--			goto done;
--		}
--		err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
--					     sme->crypto.sae_pwd_len);
--		if (!err && sme->crypto.psk)
-+		if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
- 			err = brcmf_set_pmk(ifp, sme->crypto.psk,
- 					    BRCMF_WSEC_MAX_PSK_LEN);
-+		else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
-+			/* clean up user-space RSNE */
-+			if (brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0)) {
-+				bphy_err(drvr, "failed to clean up user-space RSNE\n");
-+				goto done;
-+			}
-+			err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
-+						     sme->crypto.sae_pwd_len);
-+			if (!err && sme->crypto.psk)
-+				err = brcmf_set_pmk(ifp, sme->crypto.psk,
-+						    BRCMF_WSEC_MAX_PSK_LEN);
-+		}
-+		if (err)
-+			goto done;
- 	}
--	if (err)
--		goto done;
--
- 	/* Join with specific BSSID and cached SSID
- 	 * If SSID is zero join based on BSSID only
- 	 */
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 054840a..2615df6 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -1322,6 +1322,10 @@ static s32 brcmf_p2p_abort_action_frame(struct brcmf_cfg80211_info *cfg)
- 	brcmf_dbg(TRACE, "Enter\n");
- 
- 	vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
-+
-+	if (!vif)
-+		vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
-+
- 	err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe_abort", &int_val,
- 					sizeof(s32));
- 	if (err)
-@@ -1872,6 +1876,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
- 	/* validate channel and p2p ies */
- 	if (config_af_params.search_channel &&
- 	    IS_P2P_SOCIAL_CHANNEL(le32_to_cpu(af_params->channel)) &&
-+	    p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif &&
- 	    p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif->saved_ie.probe_req_ie_len) {
- 		afx_hdl = &p2p->afx_hdl;
- 		afx_hdl->peer_listen_chan = le32_to_cpu(af_params->channel);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0125-brcmfmac-fix-SDIO-bus-errors-during-high-temp-tests.patch b/patches/cypress/brcmfmac/0125-brcmfmac-fix-SDIO-bus-errors-during-high-temp-tests.patch
deleted file mode 100644
index fb24e24f5df50363e01247c3b51529911eeebeb5..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0125-brcmfmac-fix-SDIO-bus-errors-during-high-temp-tests.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From f81a1d38a798062269551887fa6376c30637f93e Mon Sep 17 00:00:00 2001
-From: Raveendran Somu <raveendran.somu@cypress.com>
-Date: Tue, 11 Aug 2020 20:30:23 -0500
-Subject: [PATCH 125/138] brcmfmac: fix SDIO bus errors during high-temp tests
-
-Below error message was observed during the 85degC test runs.
-
-brcmf_sdio_readframes: read 104 bytes from channel 2 failed: -84
-
-Setting appropriate sdio watermark to address the issue.
-
-Also fix the error "brcmf_fws_hanger_poppkt: entry not in use" during
-the test, this is due to the state was updated before retrieving the skb
-to free it.
-
-Signed-off-by: Raveendran Somu <raveendran.somu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 1 -
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c     | 8 +++++---
- 2 files changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 1a20c2f..6a824a3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -646,7 +646,6 @@ static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
- 			hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
- 			hi = &fws->hanger.items[hslot];
- 			WARN_ON(skb != hi->pkt);
--			hi->state = BRCMF_FWS_HANGER_ITEM_STATE_FREE;
- 			brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
- 						true);
- 			brcmu_pkt_buf_free_skb(skb);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-index 916694b..d85f1aa 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-@@ -44,7 +44,10 @@
- 
- /* watermark expressed in number of words */
- #define DEFAULT_F2_WATERMARK    0x8
--#define CY_4373_F2_WATERMARK    0x40
-+#define CY_4373_F2_WATERMARK    0x4C
-+#define CY_4373_MES_WATERMARK    0x44
-+#define CY_4373_MESBUSYCTRL    (CY_4373_MES_WATERMARK | \
-+				 SBSDIO_MESBUSYCTRL_ENAB)
- #define CY_43012_F2_WATERMARK    0x60
- #define CY_43012_MES_WATERMARK  0x50
- #define CY_43012_MESBUSYCTRL    (CY_43012_MES_WATERMARK | \
-@@ -4463,8 +4466,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
- 					   &err);
- 			brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
--					   CY_4373_F2_WATERMARK |
--					   SBSDIO_MESBUSYCTRL_ENAB, &err);
-+					   CY_4373_MESBUSYCTRL, &err);
- 			break;
- 		case SDIO_DEVICE_ID_CYPRESS_43012:
- 			brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0126-brcmfmac-Add-dump_survey-cfg80211-ops-for-HostApd-Au.patch b/patches/cypress/brcmfmac/0126-brcmfmac-Add-dump_survey-cfg80211-ops-for-HostApd-Au.patch
deleted file mode 100644
index 9dfc8ca441c94b5b9198a284cf6a8980d6df3b23..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0126-brcmfmac-Add-dump_survey-cfg80211-ops-for-HostApd-Au.patch
+++ /dev/null
@@ -1,349 +0,0 @@
-From c0de3af031cf407331ce14739fa68f68be2146d1 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Mon, 24 Aug 2020 02:51:00 -0500
-Subject: [PATCH 126/138] brcmfmac: Add dump_survey cfg80211 ops for HostApd
- AutoChannelSelection
-
-To enable ACS feature in Hostap daemon, dump_survey cfg80211 ops and dump
-obss survey command in firwmare side are needed. This patch is for adding
-dump_survey feature and adding DUMP_OBSS feature flag to check if
-firmware supports dump_obss iovar.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 256 +++++++++++++++++++++
- .../wireless/broadcom/brcm80211/brcmfmac/feature.c |   3 +-
- .../wireless/broadcom/brcm80211/brcmfmac/feature.h |   4 +-
- 3 files changed, 261 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index b9e5e2e..eebb80c 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -87,9 +87,39 @@
- 
- #define BRCMF_ND_INFO_TIMEOUT		msecs_to_jiffies(2000)
- 
-+/* Dump obss definitions */
-+#define ACS_MSRMNT_DELAY		100
-+#define CHAN_NOISE_DUMMY		(-80)
-+#define OBSS_TOKEN_IDX			15
-+#define IBSS_TOKEN_IDX			15
-+#define TX_TOKEN_IDX			14
-+#define CTG_TOKEN_IDX			13
-+#define PKT_TOKEN_IDX			15
-+#define IDLE_TOKEN_IDX			12
-+
- #define BRCMF_ASSOC_PARAMS_FIXED_SIZE \
- 	(sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
- 
-+struct brcmf_dump_survey {
-+	u32 obss;
-+	u32 ibss;
-+	u32 no_ctg;
-+	u32 no_pckt;
-+	u32 tx;
-+	u32 idle;
-+};
-+
-+struct cca_stats_n_flags {
-+	u32 msrmnt_time; /* Time for Measurement (msec) */
-+	u32 msrmnt_done; /* flag set when measurement complete */
-+	char buf[1];
-+};
-+
-+struct cca_msrmnt_query {
-+	u32 msrmnt_query;
-+	u32 time_req;
-+};
-+
- static bool check_vif_up(struct brcmf_cfg80211_vif *vif)
- {
- 	if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) {
-@@ -7600,6 +7630,227 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	return 0;
- }
- 
-+static int
-+brcmf_parse_dump_obss(char *buf, struct brcmf_dump_survey *survey)
-+{
-+	int i;
-+	char *token;
-+	char delim[] = "\n ";
-+	unsigned long val;
-+	int err = 0;
-+
-+	token = strsep(&buf, delim);
-+	while (token) {
-+		if (!strcmp(token, "OBSS")) {
-+			for (i = 0; i < OBSS_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->obss = val;
-+		}
-+
-+		if (!strcmp(token, "IBSS")) {
-+			for (i = 0; i < IBSS_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->ibss = val;
-+		}
-+
-+		if (!strcmp(token, "TXDur")) {
-+			for (i = 0; i < TX_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->tx = val;
-+		}
-+
-+		if (!strcmp(token, "Category")) {
-+			for (i = 0; i < CTG_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->no_ctg = val;
-+		}
-+
-+		if (!strcmp(token, "Packet")) {
-+			for (i = 0; i < PKT_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->no_pckt = val;
-+		}
-+
-+		if (!strcmp(token, "Opp(time):")) {
-+			for (i = 0; i < IDLE_TOKEN_IDX; i++)
-+				token = strsep(&buf, delim);
-+			err = kstrtoul(token, 10, &val);
-+			survey->idle = val;
-+		}
-+
-+		token = strsep(&buf, delim);
-+
-+		if (err)
-+			return err;
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+brcmf_dump_obss(struct brcmf_if *ifp, struct cca_msrmnt_query req,
-+		struct brcmf_dump_survey *survey)
-+{
-+	struct cca_stats_n_flags *results;
-+	char *buf;
-+	int err;
-+
-+	buf = kzalloc(sizeof(char) * BRCMF_DCMD_MEDLEN, GFP_KERNEL);
-+	if (unlikely(!buf)) {
-+		brcmf_err("%s: buf alloc failed\n", __func__);
-+		return -ENOMEM;
-+	}
-+
-+	memcpy(buf, &req, sizeof(struct cca_msrmnt_query));
-+	err = brcmf_fil_iovar_data_get(ifp, "dump_obss",
-+				       buf, BRCMF_DCMD_MEDLEN);
-+	if (err < 0) {
-+		brcmf_err("dump_obss error (%d)\n", err);
-+		goto exit;
-+	}
-+	results = (struct cca_stats_n_flags *)(buf);
-+
-+	if (req.msrmnt_query)
-+		brcmf_parse_dump_obss(results->buf, survey);
-+
-+	kfree(buf);
-+	return 0;
-+exit:
-+	kfree(buf);
-+	return -EINVAL;
-+}
-+
-+static s32
-+cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
-+		     struct ieee80211_channel *chan,
-+		     enum nl80211_channel_type channel_type)
-+{
-+	u16 chspec = 0;
-+	int err = 0;
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-+
-+	/* set_channel */
-+	chspec = channel_to_chanspec(&cfg->d11inf, chan);
-+	if (chspec != INVCHANSPEC) {
-+		err = brcmf_fil_iovar_int_set(ifp, "chanspec", chspec);
-+		if (err)
-+			err = -EINVAL;
-+	} else {
-+		brcmf_err("failed to convert host chanspec to fw chanspec\n");
-+		err = -EINVAL;
-+	}
-+
-+	return err;
-+}
-+
-+static int
-+brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
-+			   int idx, struct survey_info *info)
-+{
-+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
-+	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-+	struct brcmf_dump_survey *survey;
-+	struct ieee80211_supported_band *band;
-+	struct ieee80211_channel *chan;
-+	struct cca_msrmnt_query req;
-+	u32 val, noise;
-+	int err;
-+
-+	brcmf_dbg(TRACE, "Enter: channel idx=%d\n", idx);
-+
-+	band = wiphy->bands[NL80211_BAND_2GHZ];
-+	if (band && idx >= band->n_channels) {
-+		idx -= band->n_channels;
-+		band = NULL;
-+	}
-+
-+	if (!band || idx >= band->n_channels) {
-+		band = wiphy->bands[NL80211_BAND_5GHZ];
-+		if (idx >= band->n_channels)
-+			return -ENOENT;
-+	}
-+
-+	/* Setting current channel to the requested channel */
-+	chan = &band->channels[idx];
-+	err = cfg80211_set_channel(wiphy, ndev, chan, NL80211_CHAN_HT20);
-+	if (err) {
-+		info->channel = chan;
-+		info->filled = 0;
-+		return 0;
-+	}
-+
-+	if (!idx) {
-+		/* Disable mpc */
-+		val = 0;
-+		brcmf_set_mpc(ifp, val);
-+		/* Set interface up, explicitly. */
-+		val = 1;
-+		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, val);
-+		if (err) {
-+			brcmf_err("BRCMF_C_UP error (%d)\n", err);
-+			return -EIO;
-+		}
-+	}
-+
-+	/* Get noise value */
-+	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
-+	if (err) {
-+		brcmf_err("Get Phy Noise failed, error = %d\n", err);
-+		noise = CHAN_NOISE_DUMMY;
-+	}
-+
-+	survey = kzalloc(sizeof(*survey), GFP_KERNEL);
-+	if (unlikely(!survey)) {
-+		brcmf_err("%s: alloc failed\n", __func__);
-+		return -ENOMEM;
-+	}
-+
-+	/* Start Measurement for obss stats on current channel */
-+	req.msrmnt_query = 0;
-+	req.time_req = ACS_MSRMNT_DELAY;
-+	err = brcmf_dump_obss(ifp, req, survey);
-+	if (err)
-+		goto exit;
-+
-+	/* Add 10 ms for IOVAR completion */
-+	msleep(ACS_MSRMNT_DELAY + 10);
-+
-+	/* Issue IOVAR to collect measurement results */
-+	req.msrmnt_query = 1;
-+	err = brcmf_dump_obss(ifp, req, survey);
-+	if (err < 0)
-+		goto exit;
-+
-+	info->channel = chan;
-+	info->noise = noise;
-+	info->time = ACS_MSRMNT_DELAY;
-+	info->time_busy = ACS_MSRMNT_DELAY - survey->idle;
-+	info->time_rx = survey->obss + survey->ibss + survey->no_ctg +
-+		survey->no_pckt;
-+	info->time_tx = survey->tx;
-+	info->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME |
-+		SURVEY_INFO_TIME_BUSY | SURVEY_INFO_TIME_RX |
-+		SURVEY_INFO_TIME_TX;
-+
-+	brcmf_dbg(INFO, "OBSS dump: channel %d: survey duraion %d\n",
-+		  ieee80211_frequency_to_channel(chan->center_freq),
-+		  ACS_MSRMNT_DELAY);
-+	brcmf_dbg(INFO, "noise(%d) busy(%llu) rx(%llu) tx(%llu)\n",
-+		  info->noise, info->time_busy, info->time_rx, info->time_tx);
-+
-+	kfree(survey);
-+	return 0;
-+exit:
-+	kfree(survey);
-+	return err;
-+}
-+
- static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
- 					struct regulatory_request *req)
- {
-@@ -7753,6 +8004,11 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
- 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
- 		ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
- #endif
-+	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_DUMP_OBSS))
-+		ops->dump_survey = brcmf_cfg80211_dump_survey;
-+	else
-+		ops->dump_survey = NULL;
-+
- 	err = wiphy_register(wiphy);
- 	if (err < 0) {
- 		bphy_err(drvr, "Could not register wiphy device (%d)\n", err);
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-index b9ae778..e22a7c314 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
-@@ -141,7 +141,7 @@ static void brcmf_feat_iovar_int_get(struct brcmf_if *ifp,
- 	ifp->fwil_fwerr = true;
- 
- 	err = brcmf_fil_iovar_int_get(ifp, name, &data);
--	if (err == 0) {
-+	if (err != -BRCMF_FW_UNSUPPORTED) {
- 		brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]);
- 		ifp->drvr->feat_flags |= BIT(id);
- 	} else {
-@@ -277,6 +277,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
- 	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp");
-+	brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_DUMP_OBSS, "dump_obss");
- 
- 	pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
- 	err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac,
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-index 56d991c..8bd4b75 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
-@@ -28,6 +28,7 @@
-  * DOT11H: firmware supports 802.11h
-  * SAE: simultaneous authentication of equals
-  * FWAUTH: Firmware authenticator
-+ * DUMP_OBSS: Firmware has capable to dump obss info to support ACS
-  */
- #define BRCMF_FEAT_LIST \
- 	BRCMF_FEAT_DEF(MBSS) \
-@@ -49,7 +50,8 @@
- 	BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
- 	BRCMF_FEAT_DEF(DOT11H) \
- 	BRCMF_FEAT_DEF(SAE) \
--	BRCMF_FEAT_DEF(FWAUTH)
-+	BRCMF_FEAT_DEF(FWAUTH) \
-+	BRCMF_FEAT_DEF(DUMP_OBSS)
- 
- /*
-  * Quirks:
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0127-brcmfmac-Fix-warning-message-after-dongle-setup-fail.patch b/patches/cypress/brcmfmac/0127-brcmfmac-Fix-warning-message-after-dongle-setup-fail.patch
deleted file mode 100644
index 3633c0287e844fbeffc5bcc9ff4f017f7052f98c..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0127-brcmfmac-Fix-warning-message-after-dongle-setup-fail.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From e17abf2d211e210bba1024628b7ca52552ad7a49 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 25 Aug 2020 01:23:58 -0500
-Subject: [PATCH 127/138] brcmfmac: Fix warning message after dongle setup
- failed
-
-Brcmfmac showed warning message in fweh.c when checking the size of event
-queue which is not initialized. Therefore, we only cancel the worker and
-reset event handler only when they are initialized.
-
-[  145.505899] brcmfmac 0000:02:00.0: brcmf_pcie_setup: Dongle setup
-[  145.929970] ------------[ cut here ]------------
-[  145.929994] WARNING: CPU: 0 PID: 288 at drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c:312
-brcmf_fweh_detach+0xbc/0xd0 [brcmfmac]
-...
-[  145.930029] Call Trace:
-[  145.930036]  brcmf_detach+0x77/0x100 [brcmfmac]
-[  145.930043]  brcmf_pcie_remove+0x79/0x130 [brcmfmac]
-[  145.930046]  pci_device_remove+0x39/0xc0
-[  145.930048]  device_release_driver_internal+0x141/0x200
-[  145.930049]  device_release_driver+0x12/0x20
-[  145.930054]  brcmf_pcie_setup+0x101/0x3c0 [brcmfmac]
-[  145.930060]  brcmf_fw_request_done+0x11d/0x1f0 [brcmfmac]
-[  145.930062]  ? lock_timer_base+0x7d/0xa0
-[  145.930063]  ? internal_add_timer+0x1f/0xa0
-[  145.930064]  ? add_timer+0x11a/0x1d0
-[  145.930066]  ? __kmalloc_track_caller+0x18c/0x230
-[  145.930068]  ? kstrdup_const+0x23/0x30
-[  145.930069]  ? add_dr+0x46/0x80
-[  145.930070]  ? devres_add+0x3f/0x50
-[  145.930072]  ? usermodehelper_read_unlock+0x15/0x20
-[  145.930073]  ? _request_firmware+0x288/0xa20
-[  145.930075]  request_firmware_work_func+0x36/0x60
-[  145.930077]  process_one_work+0x144/0x360
-[  145.930078]  worker_thread+0x4d/0x3c0
-[  145.930079]  kthread+0x112/0x150
-[  145.930080]  ? rescuer_thread+0x340/0x340
-[  145.930081]  ? kthread_park+0x60/0x60
-[  145.930083]  ret_from_fork+0x25/0x30
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c | 10 ++++++----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |  2 +-
- 2 files changed, 7 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-index 79c8a85..a30fcfb 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
-@@ -304,10 +304,12 @@ void brcmf_fweh_detach(struct brcmf_pub *drvr)
- {
- 	struct brcmf_fweh_info *fweh = &drvr->fweh;
- 
--	/* cancel the worker */
--	cancel_work_sync(&fweh->event_work);
--	WARN_ON(!list_empty(&fweh->event_q));
--	memset(fweh->evt_handler, 0, sizeof(fweh->evt_handler));
-+	/* cancel the worker if initialized */
-+	if (fweh->event_work.func) {
-+		cancel_work_sync(&fweh->event_work);
-+		WARN_ON(!list_empty(&fweh->event_q));
-+		memset(fweh->evt_handler, 0, sizeof(fweh->evt_handler));
-+	}
- }
- 
- /**
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index 0b6ba8d..13126b4 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -2099,7 +2099,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
- fail:
- 	brcmf_err(bus, "Dongle setup failed\n");
- 	brcmf_pcie_bus_console_read(devinfo, true);
--	brcmf_fw_crashed(dev);
-+	brcmf_dev_coredump(dev);
- 	device_release_driver(dev);
- }
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0128-revert-brcmfmac-set-state-of-hanger-slot-to-FREE-whe.patch b/patches/cypress/brcmfmac/0128-revert-brcmfmac-set-state-of-hanger-slot-to-FREE-whe.patch
deleted file mode 100644
index c86ccd1eb04344cc706b70712db99a3e9ea3190c..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0128-revert-brcmfmac-set-state-of-hanger-slot-to-FREE-whe.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 6b0d34dab60ab10a78dac96fbe2d020ad93c5f42 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 26 Aug 2020 02:06:19 -0500
-Subject: [PATCH 128/138] revert: brcmfmac: set state of hanger slot to FREE
- when flushing PSQ
-
-Revert this change because it is conflict with upstream
-commit c80d26e81ef1 ("brcmfmac: fix WARNING during USB disconnect in
-case of unempty psq")
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 3 ---
- 1 file changed, 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-index 6a824a3..c29eb94 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
-@@ -632,7 +632,6 @@ static inline int brcmf_fws_hanger_poppkt(struct brcmf_fws_hanger *h,
- static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
- 				int ifidx)
- {
--	struct brcmf_fws_hanger_item *hi;
- 	bool (*matchfn)(struct sk_buff *, void *) = NULL;
- 	struct sk_buff *skb;
- 	int prec;
-@@ -644,8 +643,6 @@ static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
- 		skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx);
- 		while (skb) {
- 			hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
--			hi = &fws->hanger.items[hslot];
--			WARN_ON(skb != hi->pkt);
- 			brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
- 						true);
- 			brcmu_pkt_buf_free_skb(skb);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0129-brcmfmac-Fix-warning-when-hitting-FW-crash-with-flow.patch b/patches/cypress/brcmfmac/0129-brcmfmac-Fix-warning-when-hitting-FW-crash-with-flow.patch
deleted file mode 100644
index 032534024fda424ed0e9a0013342c93e45d8a073..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0129-brcmfmac-Fix-warning-when-hitting-FW-crash-with-flow.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From c25d4b739772cf14fa86d73b0e8dc6ac8b24c886 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 28 Aug 2020 02:32:56 -0500
-Subject: [PATCH 129/138] brcmfmac: Fix warning when hitting FW crash with flow
- control feature
-
-Brcmfmac got warning message when hitting FW crash in TX throughput test
-with fcmode=2. It's caused by FMAC flushed TXQ in brcmf_sdio_bus_stop
-but without doing hanger slot cleanup. Therefore, we move
-brcmf_remove_interface before brcmf_bus_stop to make sure the hanger
-slot is clean when flushing TXQ.
-
-[ 1891.512234] WARNING: CPU: 1 PID: 2765 at drivers/net/wireless/broadcom/brcm80211/brcmutil/utils.c:49 brcmu_pkt_buf_free_skb+0x21/0x30 [brcmutil]
-[ 1891.512234] Modules linked in: brcmfmac(OE-) brcmutil(OE)
-cfg80211(OE) compat(OE) rfkill mmc_block(OE) sdhci_pci(OE) sdhci(OE)
-mmc_core(OE) ip6table_filter ip6_tables ebtable_nat ebtables
-dns_resolver fscache e1000e ppdev iTCO_wdt iTCO_vendor_support tpm_tis
-tpm_tis_core tpm mei_me mei pcspkr lpc_ich i2c_i801 mfd_core ptp
-pps_core parport_pc parport wmi tcp_bic uinput i915 iosf_mbi
-i2c_algo_bit drm_kms_helper drm i2c_core video [last unloaded: brcmfmac]
-[ 1891.512247] CPU: 1 PID: 2765 Comm: rmmod Tainted: G        W  OE
-4.12.0 #1
-[ 1891.512247] Hardware name:                  /DH77EB, BIOS
-EBH7710H.86A.0100.2013.0312.1351 03/12/2013
-[ 1891.512248] task: ffff880118f08000 task.stack: ffffc90001180000
-[ 1891.512249] RIP: 0010:brcmu_pkt_buf_free_skb+0x21/0x30 [brcmutil]
-[ 1891.512249] RSP: 0018:ffffc90001183cc0 EFLAGS: 00010086
-[ 1891.512250] RAX: 0000000000000000 RBX: 0000000000000000 RCX:
-0000000000000006
-[ 1891.512251] RDX: 0000000000000000 RSI: 0000000000000086 RDI:
-ffff880118e3ab00
-[ 1891.512251] RBP: ffffc90001183cc0 R08: 0000000000000000 R09:
-000000000000a050
-[ 1891.512252] R10: 0000000000000001 R11: 0000000000aaaaaa R12:
-00000000000000bc
-[ 1891.512253] R13: ffff880118b40c78 R14: 0000000000000002 R15:
-ffff880118e3ab00
-[ 1891.512253] FS:  00007f2a49760740(0000) GS:ffff88011f280000(0000)
-knlGS:0000000000000000
-[ 1891.512254] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-[ 1891.512254] CR2: 00000000012994a8 CR3: 000000011a3c4000 CR4:
-00000000001406e0
-[ 1891.512255] Call Trace:
-[ 1891.512259]  brcmf_fws_cleanup+0x1ea/0x240 [brcmfmac]
-[ 1891.512264]  brcmf_fws_detach+0x42/0x60 [brcmfmac]
-[ 1891.512268]  brcmf_proto_bcdc_detach+0x26/0x40 [brcmfmac]
-[ 1891.512273]  brcmf_proto_detach+0x57/0x70 [brcmfmac]
-[ 1891.512277]  brcmf_detach+0x89/0x100 [brcmfmac]
-[ 1891.512282]  brcmf_sdio_remove+0x76/0x180 [brcmfmac]
-[ 1891.512286]  brcmf_sdiod_remove+0x25/0xb0 [brcmfmac]
-[ 1891.512291]  brcmf_ops_sdio_remove+0xbd/0x120 [brcmfmac]
-[ 1891.512294]  sdio_bus_remove+0x33/0x100 [mmc_core]
-[ 1891.512295]  device_release_driver_internal+0x141/0x200
-[ 1891.512297]  driver_detach+0x38/0x70
-[ 1891.512298]  bus_remove_driver+0x55/0xd0
-[ 1891.512299]  driver_unregister+0x2c/0x50
-[ 1891.512303]  sdio_unregister_driver+0x1a/0x20 [mmc_core]
-[ 1891.512307]  brcmf_sdio_exit+0x2f/0x40 [brcmfmac]
-[ 1891.512312]  brcmf_core_exit+0x15/0xd7 [brcmfmac]
-[ 1891.512316]  __exit_compat+0x9/0x2b [brcmfmac]
-[ 1891.512318]  SyS_delete_module+0x155/0x230
-[ 1891.512319]  ? exit_to_usermode_loop+0x70/0x99
-[ 1891.512321]  do_syscall_64+0x54/0xc0
-[ 1891.512322]  entry_SYSCALL64_slow_path+0x25/0x25
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 11 +++++------
- 1 file changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-index d38003c..b2d5b1fa 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1375,6 +1375,11 @@ void brcmf_detach(struct device *dev)
- #endif
- 
- 	brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
-+	/* make sure primary interface removed last */
-+	for (i = BRCMF_MAX_IFS - 1; i > -1; i--) {
-+		if (drvr->iflist[i])
-+			brcmf_remove_interface(drvr->iflist[i], false);
-+	}
- 	brcmf_bus_stop(drvr->bus_if);
- 
- 	brcmf_fweh_detach(drvr);
-@@ -1385,12 +1390,6 @@ void brcmf_detach(struct device *dev)
- 		drvr->mon_if = NULL;
- 	}
- 
--	/* make sure primary interface removed last */
--	for (i = BRCMF_MAX_IFS - 1; i > -1; i--) {
--		if (drvr->iflist[i])
--			brcmf_del_if(drvr, drvr->iflist[i]->bsscfgidx, false);
--	}
--
- 	if (drvr->config) {
- 		brcmf_p2p_detach(&drvr->config->p2p);
- 		brcmf_cfg80211_detach(drvr->config);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0130-brcmfmac-correctly-remove-all-p2p-vif.patch b/patches/cypress/brcmfmac/0130-brcmfmac-correctly-remove-all-p2p-vif.patch
deleted file mode 100644
index 9f8beb4a630816b5bed7802f73db0c090fd7eb22..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0130-brcmfmac-correctly-remove-all-p2p-vif.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From cb67da1afb79415c7b1afd9f688b05fff3cfed5a Mon Sep 17 00:00:00 2001
-From: Brian Henriquez <brian.henriquez@cypress.com>
-Date: Wed, 21 Oct 2020 23:50:23 -0500
-Subject: [PATCH 130/138] brcmfmac: correctly remove all p2p vif
-
-When deleting a P2P AGO interface we should make sure that
-relevant entry in bss_idx[] array is removed. We were always
-removing only 'vif' at P2PAPI_BSSCFG_CONNECTION before,
-regardless of the number of created P2P AGO interfaces.
-brcmfmac: correctly remove all p2p vif
-
-Signed-off-by: Brian Henriquez <brian.henriquez@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-index 2615df6..c4a5f9d 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
-@@ -2474,8 +2474,12 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
- 	brcmf_remove_interface(vif->ifp, true);
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, NULL);
--	if (iftype != NL80211_IFTYPE_P2P_DEVICE)
--		p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
-+	if (iftype != NL80211_IFTYPE_P2P_DEVICE) {
-+		if (vif == p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif)
-+			p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
-+		if (vif == p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION2].vif)
-+			p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION2].vif = NULL;
-+	}
- 
- 	return err;
- }
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0131-brcmfmac-use-firmware_request_nowarn-for-the-board-s.patch b/patches/cypress/brcmfmac/0131-brcmfmac-use-firmware_request_nowarn-for-the-board-s.patch
deleted file mode 100644
index e4916103cbbaf803ae21128004959cd763fa71fb..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0131-brcmfmac-use-firmware_request_nowarn-for-the-board-s.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 561fe3cb65e01ba60d0c59c698aa6efc87add008 Mon Sep 17 00:00:00 2001
-From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Date: Mon, 5 Oct 2020 04:15:51 -0500
-Subject: [PATCH 131/138] brcmfmac: use firmware_request_nowarn for the
- board-specific nvram
-
-Loading a board-specific nvram file is optional. If the file is not
-present, we will get a warning "Direct firmware load for ... failed with
-error ..." and fall back to a common one. However, users may treat the
-warning as some type of side effects and the file is required.
-
-This commit switches to firmware_request_nowarn() and leaves an info
-message in place to avoid confusion.
-
-Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-index 3aed4c4..33bfcdb 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-@@ -613,8 +613,11 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
- 		strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN);
- 		strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN);
- 
--		ret = request_firmware(fw, alt_path, fwctx->dev);
--		if (ret == 0)
-+		ret = firmware_request_nowarn(fw, alt_path, fwctx->dev);
-+		if (ret)
-+			brcmf_info("no board-specific nvram available (err=%d), device will use %s\n",
-+				   ret, cur->path);
-+		else
- 			return ret;
- 	}
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0132-brcmfmac-fix-firmware-trap-while-dumping-obss-stats.patch b/patches/cypress/brcmfmac/0132-brcmfmac-fix-firmware-trap-while-dumping-obss-stats.patch
deleted file mode 100644
index 2644a804e7cd6fe7a971fa2a37bf7e29fd45d20c..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0132-brcmfmac-fix-firmware-trap-while-dumping-obss-stats.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From d97554f60898fc971ab587c8e534bd961f5e3b77 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Fri, 23 Oct 2020 03:27:49 -0500
-Subject: [PATCH 132/138] brcmfmac: fix firmware trap while dumping obss stats
-
-When doing dump_survey, host will call "dump_obss" iovar to firmware
-side. Host need to make sure the HW clock in dongle is on, or there is
-high probability that firmware gets trap because register or shared
-memory access failed. To fix this, we disable mpc when doing dump obss
-and set it back after that.
-
-[28350.512799] brcmfmac: brcmf_dump_obss: dump_obss error (-52)
-[28743.402314] ieee80211 phy0: brcmf_fw_crashed: Firmware has halted or
-crashed
-[28745.869430] brcmfmac: brcmf_sdio_bus_rxctl: resumed on timeout
-[28745.877546] brcmfmac: brcmf_sdio_checkdied: firmware trap in dongle
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 49 ++++++++++------------
- 1 file changed, 21 insertions(+), 28 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index eebb80c..7f383db 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -7701,16 +7701,15 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	int err;
- 
- 	buf = kzalloc(sizeof(char) * BRCMF_DCMD_MEDLEN, GFP_KERNEL);
--	if (unlikely(!buf)) {
--		brcmf_err("%s: buf alloc failed\n", __func__);
-+	if (!buf)
- 		return -ENOMEM;
--	}
- 
- 	memcpy(buf, &req, sizeof(struct cca_msrmnt_query));
- 	err = brcmf_fil_iovar_data_get(ifp, "dump_obss",
- 				       buf, BRCMF_DCMD_MEDLEN);
--	if (err < 0) {
-+	if (err) {
- 		brcmf_err("dump_obss error (%d)\n", err);
-+		err = -EINVAL;
- 		goto exit;
- 	}
- 	results = (struct cca_stats_n_flags *)(buf);
-@@ -7718,11 +7717,9 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	if (req.msrmnt_query)
- 		brcmf_parse_dump_obss(results->buf, survey);
- 
--	kfree(buf);
--	return 0;
- exit:
- 	kfree(buf);
--	return -EINVAL;
-+	return err;
- }
- 
- static s32
-@@ -7759,7 +7756,7 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	struct ieee80211_supported_band *band;
- 	struct ieee80211_channel *chan;
- 	struct cca_msrmnt_query req;
--	u32 val, noise;
-+	u32 noise;
- 	int err;
- 
- 	brcmf_dbg(TRACE, "Enter: channel idx=%d\n", idx);
-@@ -7785,31 +7782,27 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 		return 0;
- 	}
- 
--	if (!idx) {
--		/* Disable mpc */
--		val = 0;
--		brcmf_set_mpc(ifp, val);
--		/* Set interface up, explicitly. */
--		val = 1;
--		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, val);
--		if (err) {
--			brcmf_err("BRCMF_C_UP error (%d)\n", err);
--			return -EIO;
--		}
-+	survey = kzalloc(sizeof(*survey), GFP_KERNEL);
-+	if (!survey)
-+		return -ENOMEM;
-+
-+	/* Disable mpc */
-+	brcmf_set_mpc(ifp, 0);
-+
-+	/* Set interface up, explicitly. */
-+	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
-+	if (err) {
-+		brcmf_err("set interface up failed, err = %d\n", err);
-+		goto exit;
- 	}
- 
- 	/* Get noise value */
- 	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
- 	if (err) {
--		brcmf_err("Get Phy Noise failed, error = %d\n", err);
-+		brcmf_err("Get Phy Noise failed, use dummy value\n");
- 		noise = CHAN_NOISE_DUMMY;
- 	}
- 
--	survey = kzalloc(sizeof(*survey), GFP_KERNEL);
--	if (unlikely(!survey)) {
--		brcmf_err("%s: alloc failed\n", __func__);
--		return -ENOMEM;
--	}
- 
- 	/* Start Measurement for obss stats on current channel */
- 	req.msrmnt_query = 0;
-@@ -7824,7 +7817,7 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	/* Issue IOVAR to collect measurement results */
- 	req.msrmnt_query = 1;
- 	err = brcmf_dump_obss(ifp, req, survey);
--	if (err < 0)
-+	if (err)
- 		goto exit;
- 
- 	info->channel = chan;
-@@ -7844,9 +7837,9 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 	brcmf_dbg(INFO, "noise(%d) busy(%llu) rx(%llu) tx(%llu)\n",
- 		  info->noise, info->time_busy, info->time_rx, info->time_tx);
- 
--	kfree(survey);
--	return 0;
- exit:
-+	if (!brcmf_is_apmode(ifp->vif))
-+		brcmf_set_mpc(ifp, 1);
- 	kfree(survey);
- 	return err;
- }
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0133-brcmfmac-add-creating-station-interface-support.patch b/patches/cypress/brcmfmac/0133-brcmfmac-add-creating-station-interface-support.patch
deleted file mode 100644
index 9baa91a03a6db648c2b37d7db6693ce49a201b74..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0133-brcmfmac-add-creating-station-interface-support.patch
+++ /dev/null
@@ -1,191 +0,0 @@
-From 4a4fc472f5f70e46adf8760f26612b0d3e1e7f2f Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Tue, 26 Jun 2018 22:19:31 -0500
-Subject: [PATCH 133/138] brcmfmac: add creating station interface support
-
-With RSDB device, it is able to control two station interfaces
-concurrently. So we add creating station interface support and
-allow user to create it via cfg80211.
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 80 ++++++++++++++++++----
- .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  1 +
- 2 files changed, 69 insertions(+), 12 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 7f383db..a1b94cd 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -266,6 +266,19 @@ struct parsed_vndr_ies {
- #define WLC_E_IF_ROLE_STA		0	/* Infra STA */
- #define WLC_E_IF_ROLE_AP		1	/* Access Point */
- 
-+#define WL_INTERFACE_MAC_DONT_USE	0x0
-+#define WL_INTERFACE_MAC_USE		0x2
-+
-+#define WL_INTERFACE_CREATE_STA		0x0
-+#define WL_INTERFACE_CREATE_AP		0x1
-+
-+struct wl_interface_create {
-+	u16	ver;
-+	u32	flags;
-+	u8	mac_addr[ETH_ALEN];
-+	u8	pad[13];
-+};
-+
- static u8 nl80211_band_to_fwil(enum nl80211_band band)
- {
- 	switch (band) {
-@@ -553,6 +566,42 @@ static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr)
- 	return -ENOMEM;
- }
- 
-+static void brcmf_set_sta_iface_macaddr(struct brcmf_if *ifp,
-+					struct wl_interface_create *iface)
-+{
-+	u8 mac_idx = ifp->drvr->sta_mac_idx;
-+
-+	/* set difference MAC address with locally administered bit */
-+	iface->flags |= WL_INTERFACE_MAC_USE;
-+	memcpy(iface->mac_addr, ifp->mac_addr, ETH_ALEN);
-+	iface->mac_addr[0] |= 0x02;
-+	iface->mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0;
-+	mac_idx++;
-+	mac_idx = mac_idx % 2;
-+	ifp->drvr->sta_mac_idx = mac_idx;
-+}
-+
-+static int brcmf_cfg80211_request_sta_if(struct brcmf_if *ifp, u8 *macaddr)
-+{
-+	struct wl_interface_create iface;
-+	int err;
-+
-+	memset(&iface, 0, sizeof(iface));
-+
-+	iface.ver = 0;
-+	iface.flags = WL_INTERFACE_CREATE_STA;
-+	if (!is_zero_ether_addr(macaddr)) {
-+		/* set MAC address in cfg80211 params */
-+		memcpy(iface.mac_addr, macaddr, ETH_ALEN);
-+	} else {
-+		brcmf_set_sta_iface_macaddr(ifp, &iface);
-+	}
-+
-+	err = brcmf_fil_iovar_data_get(ifp, "interface_create", &iface,
-+				       sizeof(iface));
-+	return err;
-+}
-+
- static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = ifp->drvr;
-@@ -578,15 +627,16 @@ static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
- }
- 
- /**
-- * brcmf_ap_add_vif() - create a new AP virtual interface for multiple BSS
-+ * brcmf_ap_add_vif() - create a new AP or STA virtual interface
-  *
-  * @wiphy: wiphy device of new interface.
-  * @name: name of the new interface.
-- * @params: contains mac address for AP device.
-+ * @params: contains mac address for AP or STA device.
-  */
- static
--struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
--				      struct vif_params *params)
-+struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name,
-+					 struct vif_params *params,
-+					 enum nl80211_iftype type)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
-@@ -594,18 +644,24 @@ struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
- 	struct brcmf_cfg80211_vif *vif;
- 	int err;
- 
-+	if (type != NL80211_IFTYPE_STATION && type != NL80211_IFTYPE_AP)
-+		return ERR_PTR(-EINVAL);
-+
- 	if (brcmf_cfg80211_vif_event_armed(cfg))
- 		return ERR_PTR(-EBUSY);
- 
- 	brcmf_dbg(INFO, "Adding vif \"%s\"\n", name);
- 
--	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP);
-+	vif = brcmf_alloc_vif(cfg, type);
- 	if (IS_ERR(vif))
- 		return (struct wireless_dev *)vif;
- 
- 	brcmf_cfg80211_arm_vif_event(cfg, vif);
- 
--	err = brcmf_cfg80211_request_ap_if(ifp);
-+	if (type == NL80211_IFTYPE_STATION)
-+		err = brcmf_cfg80211_request_sta_if(ifp, params->macaddr);
-+	else
-+		err = brcmf_cfg80211_request_ap_if(ifp);
- 	if (err) {
- 		brcmf_cfg80211_arm_vif_event(cfg, NULL);
- 		goto fail;
-@@ -676,14 +732,14 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
- 	}
- 	switch (type) {
- 	case NL80211_IFTYPE_ADHOC:
--	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP_VLAN:
- 	case NL80211_IFTYPE_WDS:
- 	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_MESH_POINT:
- 		return ERR_PTR(-EOPNOTSUPP);
-+	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP:
--		wdev = brcmf_ap_add_vif(wiphy, name, params);
-+		wdev = brcmf_apsta_add_vif(wiphy, name, params, type);
- 		break;
- 	case NL80211_IFTYPE_P2P_CLIENT:
- 	case NL80211_IFTYPE_P2P_GO:
-@@ -818,8 +874,8 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
- 	return err;
- }
- 
--static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy,
--				       struct wireless_dev *wdev)
-+static int brcmf_cfg80211_del_apsta_iface(struct wiphy *wiphy,
-+					  struct wireless_dev *wdev)
- {
- 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
- 	struct net_device *ndev = wdev->netdev;
-@@ -876,14 +932,14 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
- 
- 	switch (wdev->iftype) {
- 	case NL80211_IFTYPE_ADHOC:
--	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP_VLAN:
- 	case NL80211_IFTYPE_WDS:
- 	case NL80211_IFTYPE_MONITOR:
- 	case NL80211_IFTYPE_MESH_POINT:
- 		return -EOPNOTSUPP;
-+	case NL80211_IFTYPE_STATION:
- 	case NL80211_IFTYPE_AP:
--		return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
-+		return brcmf_cfg80211_del_apsta_iface(wiphy, wdev);
- 	case NL80211_IFTYPE_P2P_CLIENT:
- 	case NL80211_IFTYPE_P2P_GO:
- 	case NL80211_IFTYPE_P2P_DEVICE:
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-index 29c931b..3b91b97 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -138,6 +138,7 @@ struct brcmf_pub {
- 
- 	u8 clmver[BRCMF_DCMD_SMLEN];
- 	struct brcmf_pkt_filter_enable_le pkt_filter[MAX_PKT_FILTER_COUNT];
-+	u8 sta_mac_idx;
- 
- };
- 
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0134-brcmfmac-support-station-interface-creation-version-.patch b/patches/cypress/brcmfmac/0134-brcmfmac-support-station-interface-creation-version-.patch
deleted file mode 100644
index 0796886df52045959f4bf6ab339a28de095e2033..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0134-brcmfmac-support-station-interface-creation-version-.patch
+++ /dev/null
@@ -1,258 +0,0 @@
-From 7e63950f002ae8630c250e1cb516a70595ff72b4 Mon Sep 17 00:00:00 2001
-From: Wright Feng <wright.feng@cypress.com>
-Date: Wed, 7 Nov 2018 21:27:46 -0600
-Subject: [PATCH 134/138] brcmfmac: support station interface creation version
- 1, 2 and 3
-
-To create virtual station interface for RSDB and VSDB, we add interface
-creation version 1, 2 and 3 supports
-The structures of each version are different and only version 3 and
-later version are able to get interface creating version from firmware
-side.
-
-The patch has been verified two concurrent stations pings test with
- interface create version 1:
-          89342(4359b1)-PCIE: 9.40.100
- interface create version 2:
-         4373a0-sdio: 13.10.271
- interface create version 3:
-         4373a0-sdio: 13.35.48
-
-Signed-off-by: Wright Feng <wright.feng@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 160 +++++++++++++++++----
- 1 file changed, 132 insertions(+), 28 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index a1b94cd..80ca7e7 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -266,17 +266,46 @@ struct parsed_vndr_ies {
- #define WLC_E_IF_ROLE_STA		0	/* Infra STA */
- #define WLC_E_IF_ROLE_AP		1	/* Access Point */
- 
-+#define WL_INTERFACE_CREATE_VER_1		1
-+#define WL_INTERFACE_CREATE_VER_2		2
-+#define WL_INTERFACE_CREATE_VER_3		3
-+#define WL_INTERFACE_CREATE_VER_MAX		WL_INTERFACE_CREATE_VER_3
-+
- #define WL_INTERFACE_MAC_DONT_USE	0x0
- #define WL_INTERFACE_MAC_USE		0x2
- 
- #define WL_INTERFACE_CREATE_STA		0x0
- #define WL_INTERFACE_CREATE_AP		0x1
- 
--struct wl_interface_create {
--	u16	ver;
--	u32	flags;
--	u8	mac_addr[ETH_ALEN];
--	u8	pad[13];
-+struct wl_interface_create_v1 {
-+	u16	ver;			/* structure version */
-+	u32	flags;			/* flags for operation */
-+	u8	mac_addr[ETH_ALEN];	/* MAC address */
-+	u32	wlc_index;		/* optional for wlc index */
-+};
-+
-+struct wl_interface_create_v2 {
-+	u16	ver;			/* structure version */
-+	u8	pad1[2];
-+	u32	flags;			/* flags for operation */
-+	u8	mac_addr[ETH_ALEN];	/* MAC address */
-+	u8	iftype;			/* type of interface created */
-+	u8	pad2;
-+	u32	wlc_index;		/* optional for wlc index */
-+};
-+
-+struct wl_interface_create_v3 {
-+	u16 ver;			/* structure version */
-+	u16 len;			/* length of structure + data */
-+	u16 fixed_len;			/* length of structure */
-+	u8 iftype;			/* type of interface created */
-+	u8 wlc_index;			/* optional for wlc index */
-+	u32 flags;			/* flags for operation */
-+	u8 mac_addr[ETH_ALEN];		/* MAC address */
-+	u8 bssid[ETH_ALEN];		/* optional for BSSID */
-+	u8 if_index;			/* interface index request */
-+	u8 pad[3];
-+	u8 data[];			/* Optional for specific data */
- };
- 
- static u8 nl80211_band_to_fwil(enum nl80211_band band)
-@@ -566,16 +595,14 @@ static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr)
- 	return -ENOMEM;
- }
- 
--static void brcmf_set_sta_iface_macaddr(struct brcmf_if *ifp,
--					struct wl_interface_create *iface)
-+static void brcmf_set_vif_sta_macaddr(struct brcmf_if *ifp, u8 *mac_addr)
- {
- 	u8 mac_idx = ifp->drvr->sta_mac_idx;
- 
- 	/* set difference MAC address with locally administered bit */
--	iface->flags |= WL_INTERFACE_MAC_USE;
--	memcpy(iface->mac_addr, ifp->mac_addr, ETH_ALEN);
--	iface->mac_addr[0] |= 0x02;
--	iface->mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0;
-+	memcpy(mac_addr, ifp->mac_addr, ETH_ALEN);
-+	mac_addr[0] |= 0x02;
-+	mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0;
- 	mac_idx++;
- 	mac_idx = mac_idx % 2;
- 	ifp->drvr->sta_mac_idx = mac_idx;
-@@ -583,23 +610,96 @@ static void brcmf_set_sta_iface_macaddr(struct brcmf_if *ifp,
- 
- static int brcmf_cfg80211_request_sta_if(struct brcmf_if *ifp, u8 *macaddr)
- {
--	struct wl_interface_create iface;
-+	struct wl_interface_create_v1 iface_v1;
-+	struct wl_interface_create_v2 iface_v2;
-+	struct wl_interface_create_v3 iface_v3;
-+	u32 iface_create_ver;
- 	int err;
- 
--	memset(&iface, 0, sizeof(iface));
-+	/* interface_create version 1 */
-+	memset(&iface_v1, 0, sizeof(iface_v1));
-+	iface_v1.ver = WL_INTERFACE_CREATE_VER_1;
-+	iface_v1.flags = WL_INTERFACE_CREATE_STA |
-+			 WL_INTERFACE_MAC_USE;
-+	if (!is_zero_ether_addr(macaddr))
-+		memcpy(iface_v1.mac_addr, macaddr, ETH_ALEN);
-+	else
-+		brcmf_set_vif_sta_macaddr(ifp, iface_v1.mac_addr);
- 
--	iface.ver = 0;
--	iface.flags = WL_INTERFACE_CREATE_STA;
--	if (!is_zero_ether_addr(macaddr)) {
--		/* set MAC address in cfg80211 params */
--		memcpy(iface.mac_addr, macaddr, ETH_ALEN);
-+	err = brcmf_fil_iovar_data_get(ifp, "interface_create",
-+				       &iface_v1,
-+				       sizeof(iface_v1));
-+	if (err) {
-+		brcmf_info("failed to create interface(v1), err=%d\n",
-+			   err);
- 	} else {
--		brcmf_set_sta_iface_macaddr(ifp, &iface);
-+		brcmf_dbg(INFO, "interface created(v1)\n");
-+		return 0;
- 	}
- 
--	err = brcmf_fil_iovar_data_get(ifp, "interface_create", &iface,
--				       sizeof(iface));
--	return err;
-+	/* interface_create version 2 */
-+	memset(&iface_v2, 0, sizeof(iface_v2));
-+	iface_v2.ver = WL_INTERFACE_CREATE_VER_2;
-+	iface_v2.flags = WL_INTERFACE_MAC_USE;
-+	iface_v2.iftype = WL_INTERFACE_CREATE_STA;
-+	if (!is_zero_ether_addr(macaddr))
-+		memcpy(iface_v2.mac_addr, macaddr, ETH_ALEN);
-+	else
-+		brcmf_set_vif_sta_macaddr(ifp, iface_v2.mac_addr);
-+
-+	err = brcmf_fil_iovar_data_get(ifp, "interface_create",
-+				       &iface_v2,
-+				       sizeof(iface_v2));
-+	if (err) {
-+		brcmf_info("failed to create interface(v2), err=%d\n",
-+			   err);
-+	} else {
-+		brcmf_dbg(INFO, "interface created(v2)\n");
-+		return 0;
-+	}
-+
-+	/* interface_create version 3+ */
-+	/* get supported version from firmware side */
-+	iface_create_ver = 0;
-+	err = brcmf_fil_bsscfg_int_get(ifp, "interface_create",
-+				       &iface_create_ver);
-+	if (err) {
-+		brcmf_err("fail to get supported version, err=%d\n", err);
-+		return -EOPNOTSUPP;
-+	}
-+
-+	switch (iface_create_ver) {
-+	case WL_INTERFACE_CREATE_VER_3:
-+		memset(&iface_v3, 0, sizeof(iface_v3));
-+		iface_v3.ver = WL_INTERFACE_CREATE_VER_3;
-+		iface_v3.flags = WL_INTERFACE_MAC_USE;
-+		iface_v3.iftype = WL_INTERFACE_CREATE_STA;
-+		if (!is_zero_ether_addr(macaddr))
-+			memcpy(iface_v3.mac_addr, macaddr, ETH_ALEN);
-+		else
-+			brcmf_set_vif_sta_macaddr(ifp, iface_v3.mac_addr);
-+
-+		err = brcmf_fil_iovar_data_get(ifp, "interface_create",
-+					       &iface_v3,
-+					       sizeof(iface_v3));
-+
-+		if (!err)
-+			brcmf_dbg(INFO, "interface created(v3)\n");
-+		break;
-+	default:
-+		brcmf_err("not support interface create(v%d)\n",
-+			  iface_create_ver);
-+		err = -EOPNOTSUPP;
-+		break;
-+	}
-+
-+	if (err) {
-+		brcmf_info("station interface creation failed (%d)\n",
-+			   err);
-+		return -EIO;
-+	}
-+
-+	return 0;
- }
- 
- static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
-@@ -7114,7 +7214,7 @@ static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
-  *
-  * p2p, mchan, and mbss:
-  *
-- *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-+ *	#STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
-  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
-  *	#AP <= 4, matching BI, channels = 1, 4 total
-  *
-@@ -7134,12 +7234,13 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 	struct ieee80211_iface_limit *c0_limits = NULL;
- 	struct ieee80211_iface_limit *p2p_limits = NULL;
- 	struct ieee80211_iface_limit *mbss_limits = NULL;
--	bool mbss, p2p, rsdb;
-+	bool mbss, p2p, rsdb, mchan;
- 	int i, c, n_combos;
- 
- 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
- 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
- 	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
-+	mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
- 
- 	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
- 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
-@@ -7176,12 +7277,15 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
- 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
- 		combo[c].max_interfaces = 4;
- 	} else if (p2p) {
--		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
-+		if (mchan) {
- 			combo[c].num_different_channels = 2;
--		else
-+			c0_limits[i].max = 2;
-+			c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		} else {
- 			combo[c].num_different_channels = 1;
--		c0_limits[i].max = 1;
--		c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+			c0_limits[i].max = 1;
-+			c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
-+		}
- 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
- 					  BIT(NL80211_IFTYPE_P2P_GO) |
- 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0135-brcmfmac-To-fix-crash-when-platform-does-not-contain.patch b/patches/cypress/brcmfmac/0135-brcmfmac-To-fix-crash-when-platform-does-not-contain.patch
deleted file mode 100644
index 71b2ca7327e1bb5d79dd8ecbfdc3c6a0ef7e34fe..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0135-brcmfmac-To-fix-crash-when-platform-does-not-contain.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From c4265cb013238c402026abb4b0f1248c72d3420c Mon Sep 17 00:00:00 2001
-From: Prasanna Kerekoppa <prasanna.kerekoppa@cypress.com>
-Date: Wed, 4 Nov 2020 22:37:13 -0600
-Subject: [PATCH 135/138] brcmfmac: To fix crash when platform does not contain
- platform data/DTS
-
-dev_get_platdata() will return NULL in this case which causes the NULL access
-Some snippet of the dump below
-[  298.890591] Hardware name: Freescale i.MX8QXP MEK (DT)	22
-[  298.895734] task: ffff80083662a880 task.stack: ffff000028358000	23
-[  298.901865] PC is at brcmf_common_pd_probe+0x2c/0x68 [brcmfmac]	24
-[  298.907963] LR is at brcmf_common_pd_probe+0x24/0x68 [brcmfmac]	25
-[  298.913883] pc : [<ffff000000eee02c>] lr : [<ffff000000eee024>] pstate: 40000145	26
-[  298.921283] sp : ffff00002835baa0
-
-Signed-off-by: Prasanna Kerekoppa <prasanna.kerekoppa@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-index f2f6d46..2825d65 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-@@ -534,7 +534,7 @@ static int __init brcmf_common_pd_probe(struct platform_device *pdev)
- 
- 	brcmfmac_pdata = dev_get_platdata(&pdev->dev);
- 
--	if (brcmfmac_pdata->power_on)
-+	if (brcmfmac_pdata && brcmfmac_pdata->power_on)
- 		brcmfmac_pdata->power_on();
- 
- 	return 0;
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0136-brcmfmac-Remove-the-call-to-dtim_assoc-IOVAR.patch b/patches/cypress/brcmfmac/0136-brcmfmac-Remove-the-call-to-dtim_assoc-IOVAR.patch
deleted file mode 100644
index 9395d0ba4bee912a6da0e470069c61e0e745b65d..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0136-brcmfmac-Remove-the-call-to-dtim_assoc-IOVAR.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From e97fc03f5f008c5e76bb6b0b2f8268a6759bfe55 Mon Sep 17 00:00:00 2001
-From: Ramesh Rangavittal <ramesh.rangavittal@infineon.com>
-Date: Fri, 13 Nov 2020 09:48:26 -0600
-Subject: [PATCH 136/138] brcmfmac: Remove the call to "dtim_assoc" IOVAR
-
-When STA roams from one AP to another, after roam is complete, host
-driver tries to get TIM information from firmware. This is no longer
-supported in the firmware & hence, this call will always fail.
-This failure results in the below message being displayed on the
-console all the time when roam is done.
-
-ieee80211 phy0: brcmf_update_bss_info: wl dtim_assoc failed (-52)
-
-Changes ensure that the host driver will no longer try to get TIM
-information from firmware.
-
-Signed-off-by: Ramesh Rangavittal <ramesh.rangavittal@infineon.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 +---------------------
- 1 file changed, 1 insertion(+), 25 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index 80ca7e7..d25f9c0 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -3278,10 +3278,7 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
- 				 struct brcmf_if *ifp)
- {
- 	struct brcmf_pub *drvr = cfg->pub;
--	struct brcmf_bss_info_le *bi;
--	const struct brcmf_tlv *tim;
--	size_t ie_len;
--	u8 *ie;
-+	struct brcmf_bss_info_le *bi = NULL;
- 	s32 err = 0;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
-@@ -3295,29 +3292,8 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
- 		bphy_err(drvr, "Could not get bss info %d\n", err);
- 		goto update_bss_info_out;
- 	}
--
- 	bi = (struct brcmf_bss_info_le *)(cfg->extra_buf + 4);
- 	err = brcmf_inform_single_bss(cfg, bi);
--	if (err)
--		goto update_bss_info_out;
--
--	ie = ((u8 *)bi) + le16_to_cpu(bi->ie_offset);
--	ie_len = le32_to_cpu(bi->ie_length);
--
--	tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
--	if (!tim) {
--		/*
--		* active scan was done so we could not get dtim
--		* information out of probe response.
--		* so we speficially query dtim information to dongle.
--		*/
--		u32 var;
--		err = brcmf_fil_iovar_int_get(ifp, "dtim_assoc", &var);
--		if (err) {
--			bphy_err(drvr, "wl dtim_assoc failed (%d)\n", err);
--			goto update_bss_info_out;
--		}
--	}
- 
- update_bss_info_out:
- 	brcmf_dbg(TRACE, "Exit");
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0137-brcmfmac-fix-CERT-P2P-5.1.10-failure.patch b/patches/cypress/brcmfmac/0137-brcmfmac-fix-CERT-P2P-5.1.10-failure.patch
deleted file mode 100644
index cdb6df1fe137ea75ea7baba544a6e1f693c5344a..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0137-brcmfmac-fix-CERT-P2P-5.1.10-failure.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 56b286cae4a525d88b91a971e4592d0f43969c2f Mon Sep 17 00:00:00 2001
-From: Double Lo <double.lo@cypress.com>
-Date: Tue, 15 Dec 2020 20:36:43 -0600
-Subject: [PATCH 137/138] brcmfmac: fix CERT-P2P:5.1.10 failure
-
-This patch fix CERT-P2P:5.1.10 failure at step 18 Group formation failed
-due to chip is under dump survey. Decrease the dump survery duration to
-pass this certification case.
-
-Signed-off-by: Double Lo <Double.Lo@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index d25f9c0..c3479cd 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -88,7 +88,7 @@
- #define BRCMF_ND_INFO_TIMEOUT		msecs_to_jiffies(2000)
- 
- /* Dump obss definitions */
--#define ACS_MSRMNT_DELAY		100
-+#define ACS_MSRMNT_DELAY		80
- #define CHAN_NOISE_DUMMY		(-80)
- #define OBSS_TOKEN_IDX			15
- #define IBSS_TOKEN_IDX			15
-@@ -7967,7 +7967,7 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
- 		SURVEY_INFO_TIME_BUSY | SURVEY_INFO_TIME_RX |
- 		SURVEY_INFO_TIME_TX;
- 
--	brcmf_dbg(INFO, "OBSS dump: channel %d: survey duraion %d\n",
-+	brcmf_dbg(INFO, "OBSS dump: channel %d: survey duration %d\n",
- 		  ieee80211_frequency_to_channel(chan->center_freq),
- 		  ACS_MSRMNT_DELAY);
- 	brcmf_dbg(INFO, "noise(%d) busy(%llu) rx(%llu) tx(%llu)\n",
--- 
-1.9.1
-
diff --git a/patches/cypress/brcmfmac/0138-brcmfmac-Fix-for-when-connect-request-is-not-success.patch b/patches/cypress/brcmfmac/0138-brcmfmac-Fix-for-when-connect-request-is-not-success.patch
deleted file mode 100644
index c7729f9d1cbaf84e33fb5a1a3201499659eb51a6..0000000000000000000000000000000000000000
--- a/patches/cypress/brcmfmac/0138-brcmfmac-Fix-for-when-connect-request-is-not-success.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 42f8c382306fc6cdc074ca8c6bb65d650653c87a Mon Sep 17 00:00:00 2001
-From: Wataru Gohda <wataru.gohda@cypress.com>
-Date: Thu, 17 Dec 2020 01:02:23 -0600
-Subject: [PATCH 138/138] brcmfmac: Fix for when connect request is not success
-
-Currently brcmfmac is expecting to be set for both
-BRCMF_VIF_STATUS_EAP_SUCCESS and BRCMF_VIF_STATUS_EAP status bit based
-on dongle event and those bits are cleared to complete connect request
-successfully.
-
-But when connect request is finished unsuccessfully, either
-BRCMF_VIF_STATUS_EAP_SUCCESS / BRCMF_VIF_STATUS_EAP bits are not
-cleared depending on how the connect fail event happens. These status
-bits are carried over to following new connect request and this will lead
-to generate below kernel warning for some case. Worst case status
-mismatch happens between dongle and wpa_supplicant.
-
-WARNING: CPU: 0 PID: 3086 at /opt/FMAC/cypress-fmac-v5.4.18-2020_0402/v5.4.18-backports_cypatch/net/wireless/sme.c:756 __cfg80211_connect_result+0x42c/0x4a0 [cfg80211]
-
-The fix is to clear the BRCMF_VIF_STATUS_EAP_SUCCESS /
-BRCMF_VIF_STATUS_EAP bits during the link down process and add to call
-link down process when link down event received during
-BRCMF_VIF_STATUS_CONNECTING as well as BRCMF_VIF_STATUS_CONNECTED
-state.
-
-Signed-off-by: Wataru Gohda <wataru.gohda@cypress.com>
-Signed-off-by: Chi-hsien Lin <chi-hsien.lin@infineon.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c    | 18 +++++++++++++++---
- 1 file changed, 15 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index c3479cd..d38c215 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -1537,6 +1537,8 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason,
- 					      locally_generated, GFP_KERNEL);
- 	}
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
- 	clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
- 	brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
- 	if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
-@@ -2401,6 +2403,8 @@ static void brcmf_set_join_pref(struct brcmf_if *ifp,
- 
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
- 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &ifp->vif->sme_state);
-+	clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &ifp->vif->sme_state);
- 	cfg80211_disconnected(ndev, reason_code, NULL, 0, true, GFP_KERNEL);
- 
- 	memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
-@@ -6248,6 +6252,10 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 				&ifp->vif->sme_state);
- 			conn_params.status = WLAN_STATUS_SUCCESS;
- 		} else {
-+			clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS,
-+				  &ifp->vif->sme_state);
-+			clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS,
-+				  &ifp->vif->sme_state);
- 			conn_params.status = WLAN_STATUS_AUTH_TIMEOUT;
- 		}
- 		conn_params.bssid = profile->bssid;
-@@ -6358,9 +6366,13 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
- 	} else if (brcmf_is_linkdown(e)) {
- 		brcmf_dbg(CONN, "Linkdown\n");
- 		if (!brcmf_is_ibssmode(ifp->vif) &&
--		    test_bit(BRCMF_VIF_STATUS_CONNECTED,
--			     &ifp->vif->sme_state)) {
--			if (memcmp(profile->bssid, e->addr, ETH_ALEN))
-+		    (test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+			      &ifp->vif->sme_state) ||
-+		     test_bit(BRCMF_VIF_STATUS_CONNECTING,
-+			      &ifp->vif->sme_state))) {
-+			if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
-+				     &ifp->vif->sme_state) &&
-+			    memcmp(profile->bssid, e->addr, ETH_ALEN))
- 				return err;
- 
- 			brcmf_bss_connect_done(cfg, ndev, e, false);
--- 
-1.9.1
-
diff --git a/patches/cypress/fixes/0001-v5.6.x-remove-ioremap_nocache-and-devm_ioremap_nocac.patch b/patches/cypress/fixes/0001-v5.6.x-remove-ioremap_nocache-and-devm_ioremap_nocac.patch
deleted file mode 100644
index bee1dda512b3933d222ccea6b3526017f6b1bf3a..0000000000000000000000000000000000000000
--- a/patches/cypress/fixes/0001-v5.6.x-remove-ioremap_nocache-and-devm_ioremap_nocac.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From b4292098a766038580442003bf68e121e323926b Mon Sep 17 00:00:00 2001
-From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 21 Apr 2020 17:25:11 -0500
-Subject: [PATCH] v5.6.x: remove ioremap_nocache and devm_ioremap_nocache
-
-Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
----
- drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-index d8ab8fb04d16..c21774a526d3 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -1886,8 +1886,8 @@ static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
- 		return -EINVAL;
- 	}
- 
--	devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
--	devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
-+	devinfo->regs = ioremap(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
-+	devinfo->tcm = ioremap(bar1_addr, bar1_size);
- #ifdef CONFIG_BRCMFMAC_PCIE_BARWIN_SZ
- 	devinfo->bar1_size = bar1_size;
- #endif /* CONFIG_BRCMFMAC_PCIE_BARWIN_SZ */
--- 
-2.26.1
-
diff --git a/patches/drivers/mikrobus/0003-drivers-misc-mikrobus-add-support-alternate-Click-ID.patch b/patches/drivers/mikrobus/0003-drivers-misc-mikrobus-add-support-alternate-Click-ID.patch
new file mode 100644
index 0000000000000000000000000000000000000000..2df996702d4869162fec14cabcb54a0212f41bd5
--- /dev/null
+++ b/patches/drivers/mikrobus/0003-drivers-misc-mikrobus-add-support-alternate-Click-ID.patch
@@ -0,0 +1,343 @@
+From 3363f1da1dc7fb5c3926051ab9dc6d05d7c83334 Mon Sep 17 00:00:00 2001
+From: vaishnav98 <vaishnav@beagleboard.org>
+Date: Tue, 23 Nov 2021 12:24:04 +0530
+Subject: [PATCH] drivers: misc: mikrobus add support alternate Click ID EEPROM
+
+Add support for Alternate Click ID EEPROM Part No. DS28E36
+
+Signed-off-by: vaishnav <vaishnav@beagleboard.org>
+---
+ drivers/misc/mikrobus/mikrobus_core.c |  31 +----
+ drivers/misc/mikrobus/mikrobus_id.c   | 171 +++++++++++++++-----------
+ 2 files changed, 103 insertions(+), 99 deletions(-)
+
+diff --git a/drivers/misc/mikrobus/mikrobus_core.c b/drivers/misc/mikrobus/mikrobus_core.c
+index 5700396b83e4..c4511bc2846c 100644
+--- a/drivers/misc/mikrobus/mikrobus_core.c
++++ b/drivers/misc/mikrobus/mikrobus_core.c
+@@ -78,7 +78,7 @@ int mikrobus_port_scan_eeprom(struct mikrobus_port *port)
+ 	if (retval != 1) {
+ 		dev_err(&port->dev, "failed to fetch manifest start address %d\n",
+ 			retval);
+-		return -EINVAL;
++		header[0] = 0;
+ 	}
+ 	manifest_start_addr = header[0] << 8;
+ 	pr_info("manifest start address is 0x%x \n", manifest_start_addr);
+@@ -255,7 +255,7 @@ int mikrobus_port_pinctrl_select(struct mikrobus_port *port)
+ 						port->pinctrl_selected[i]);
+ 		if (!IS_ERR(state)) {
+ 			retval = pinctrl_select_state(port->pinctrl, state);
+-			pr_info("setting pinctrl %s\n",
++			pr_debug("setting pinctrl %s\n",
+ 					port->pinctrl_selected[i]);
+ 			if (retval != 0) {
+ 				dev_err(&port->dev, "failed to select state %s\n",
+@@ -400,26 +400,6 @@ static void mikrobus_board_device_release_all(struct addon_board_info *info)
+ 	}
+ }
+ 
+-static struct software_node *software_node_alloc(const struct property_entry *properties)
+-{
+-	struct property_entry *props;
+-	struct software_node *node;
+-
+-	props = property_entries_dup(properties);
+-	if (IS_ERR(props))
+-		return ERR_CAST(props);
+-
+-	node = kzalloc(sizeof(*node), GFP_KERNEL);
+-	if (!node) {
+-		property_entries_free(props);
+-		return ERR_PTR(-ENOMEM);
+-	}
+-
+-	node->properties = props;
+-
+-	return node;
+-}
+-
+ static int mikrobus_device_register(struct mikrobus_port *port,
+ 					struct board_device_info *dev, char *board_name)
+ {
+@@ -515,7 +495,7 @@ static int mikrobus_device_register(struct mikrobus_port *port,
+ 		if (dev->irq)
+ 			i2c->irq = mikrobus_irq_get(port, dev->irq, dev->irq_type);
+ 		if (dev->properties)
+-			i2c->swnode = software_node_alloc(dev->properties);
++			i2c->fwnode = fwnode_create_software_node(dev->properties, NULL);
+ 		i2c->addr = dev->reg;
+ 		dev->dev_client = (void *) i2c_new_client_device(port->i2c_adap, i2c);
+ 		break;
+@@ -625,7 +605,6 @@ static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port)
+ 	char devname[MIKROBUS_NAME_SIZE];
+ 	char drvname[MIKROBUS_NAME_SIZE] = "w1-gpio";
+ 	int retval;
+-	int i;
+ 
+ 	mikrobus_id_eeprom_w1_device = kzalloc(sizeof(*mikrobus_id_eeprom_w1_device), GFP_KERNEL);
+ 	if (!mikrobus_id_eeprom_w1_device)
+@@ -773,7 +752,7 @@ int mikrobus_port_gb_register(struct gbphy_host *host, void *manifest_blob, size
+ 	struct gb_connection *spi_connection;
+ 	struct gb_gpio_controller *ggc;
+ 	struct mikrobus_port *port;
+-	struct gpio_desc *desc;
++	// struct gpio_desc *desc;
+ 	struct gpio_descs *descs;
+ 	int retval;
+ 
+@@ -827,7 +806,7 @@ int mikrobus_port_gb_register(struct gbphy_host *host, void *manifest_blob, size
+ 	INIT_LIST_HEAD(&board->devices);
+ 	retval = mikrobus_manifest_parse(board, manifest_blob, manifest_size);
+ 	if (!retval) {
+-		dev_err(&port->dev, "failed to parse manifest, size %lu\n",
++		dev_err(&port->dev, "failed to parse manifest, size %u\n",
+ 			manifest_size);
+ 		retval = -EINVAL;
+ 		goto err_free_board;
+diff --git a/drivers/misc/mikrobus/mikrobus_id.c b/drivers/misc/mikrobus/mikrobus_id.c
+index 2b97342327d9..d8e9b3660b6b 100644
+--- a/drivers/misc/mikrobus/mikrobus_id.c
++++ b/drivers/misc/mikrobus/mikrobus_id.c
+@@ -16,18 +16,19 @@
+ 
+ #include <linux/mikrobus.h>
+ 
++#define W1_EEPROM_MIKROBUS_SECONDARY_ID	0x4C
+ #define W1_EEPROM_MIKROBUS_ID	0x43
+-
+-#define W1_MIKROBUS_ID_EEPROM_SIZE	0x0A00
++#define W1_MIKROBUS_ID_EEPROM_SIZE	 0x0A00
++#define W1_MIKROBUS_ID_EEPROM_SECONDARY_SIZE	 0x0200
++#define W1_MIKROBUS_ID_EEPROM_SECONDARY_PAGE_SIZE	32
+ #define W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE	32
+ #define W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE	35
+ #define W1_MIKROBUS_ID_READ_EEPROM	0xF0
++#define W1_MIKROBUS_ID_READ_SECONDARY_EEPROM 0x69
++#define W1_MIKROBUS_ID_RELEASE_SECONDARY_EEPROM 0xAA
+ #define W1_MIKROBUS_ID_EEPROM_READ_RETRIES	10
+-#define W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES	5
+-#define W1_MIKROBUS_ID_EEPROM_WRITE_SCRATCH	0x0F
+-#define W1_MIKROBUS_ID_EEPROM_READ_SCRATCH	0xAA
+-#define W1_MIKROBUS_ID_EEPROM_COPY_SCRATCH	0x55
+ #define W1_MIKROBUS_ID_EEPROM_TPROG_MS		20
++#define MIKROBUS_ID_USER_EEPROM_ADDR	0x0A0A
+ 
+ static int w1_mikrobus_id_readblock(struct w1_slave *sl, int off, int count, char *buf)
+ {
+@@ -64,90 +65,80 @@ static int w1_mikrobus_id_readblock(struct w1_slave *sl, int off, int count, cha
+ 	return -EIO;
+ }
+ 
+-static int w1_mikrobus_id_movescratch(struct w1_slave *sl, int addr, char *buf)
++static int w1_mikrobus_id_readpage_secondary(struct w1_slave *sl, int pageaddr, char *buf)
+ {
+-	u8 wrbuf[4];
+-	u8 scratchpad_verify[W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE];
+-	u8 TA1, TA2, ES;
+-	int verify_status;
+-	int tries;
+-
+-	wrbuf[0] = W1_MIKROBUS_ID_EEPROM_WRITE_SCRATCH;
+-	wrbuf[1] = addr & 0xFF;
+-	wrbuf[2] = addr >> 8;
++	u8 crc_rdbuf[2];
+ 
+-	tries = W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES;
+-	do {
+-		if (w1_reset_select_slave(sl))
+-			return -1;
+-		w1_write_block(sl->master, wrbuf, 3);
+-		w1_write_block(sl->master, buf, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE);
+-		if (w1_reset_select_slave(sl))
+-			return -1;
+-		w1_write_8(sl->master, W1_MIKROBUS_ID_EEPROM_READ_SCRATCH);
+-		TA1 = w1_read_8(sl->master);
+-		TA2 = w1_read_8(sl->master);
+-		ES = w1_read_8(sl->master);
+-		w1_read_block(sl->master, scratchpad_verify, W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE);
+-		verify_status = memcmp(buf, scratchpad_verify, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE);
+-	} while(verify_status && --tries);
+-
+-	if(!tries && verify_status){
+-		dev_err(&sl->dev, "verify scratchpad failed %d times\n",
+-			W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES);
+-		return -EIO;
+-	}
+-		
+-	wrbuf[0] = W1_MIKROBUS_ID_EEPROM_COPY_SCRATCH;
+-	wrbuf[1] = addr & 0xFF;
+-	wrbuf[2] = addr >> 8;
+-	wrbuf[3] = ES;
+ 	if (w1_reset_select_slave(sl))
+-			return -1;
+-	w1_write_block(sl->master, wrbuf, 4);
+-	msleep(W1_MIKROBUS_ID_EEPROM_TPROG_MS);
++				return -1;
++	w1_write_8(sl->master, W1_MIKROBUS_ID_READ_SECONDARY_EEPROM);
++	w1_write_8(sl->master, pageaddr);
++	w1_read_block(sl->master, crc_rdbuf, 2);
++	w1_write_8(sl->master, W1_MIKROBUS_ID_RELEASE_SECONDARY_EEPROM);
++	msleep(10);
++	w1_read_block(sl->master, crc_rdbuf, 1);
++	w1_read_block(sl->master, buf, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE);
++	w1_read_block(sl->master, crc_rdbuf, 2);
+ 	return 0;
+ }
+ 
+-static int w1_mikrobus_id_writeblock(struct w1_slave *sl, int off, int count, char *buf)
++static int w1_mikrobus_id_readbuf_secondary(struct w1_slave *sl, int count, char *buf)
+ {
+-	u16 wraddr = 0;
+-	u16 len = count - (count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE);
+-	u8 scratchpad_write[W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE] = {0};
+-
+-	while(len > 0) {
+-		w1_mikrobus_id_movescratch(sl, wraddr + off, buf + wraddr);
+-		wraddr += W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE;
+-		len -= W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE;
++	u8 pageaddr = 0;
++	int iter, index, ret;
++	int	len = count - (count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE);
++	u8 temp_rdbuf[W1_MIKROBUS_ID_EEPROM_SECONDARY_PAGE_SIZE];
++
++	while(len > 0) {			
++			ret = w1_mikrobus_id_readpage_secondary(sl, pageaddr, buf + (W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE*pageaddr));
++			pageaddr += 1;
++			len -= W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE;
+ 	}
+ 
+ 	if(count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE){
+-		memcpy(scratchpad_write, buf + wraddr, count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE);
+-		w1_mikrobus_id_movescratch(sl, wraddr + off, scratchpad_write);
++			ret = w1_mikrobus_id_readpage_secondary(sl, pageaddr, temp_rdbuf);
++			for(iter = W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE*pageaddr, index=0; iter < count; iter++, index++)
++				buf[iter] = temp_rdbuf[index];
+ 	}
+-
+-	return 0;
++	return ret;
+ }
+ 
+-static int w1_mikrobus_id_nvmem_read(void *priv, unsigned int off, void *buf, size_t count)
++static int w1_mikrobus_id_readblock_secondary(struct w1_slave *sl, int off, int count, char *buf)
+ {
+-	struct w1_slave *sl = priv;
+-	int ret;
++	u8 *cmp;
++	int tries = W1_MIKROBUS_ID_EEPROM_READ_RETRIES;
+ 
+-	mutex_lock(&sl->master->bus_mutex);
+-	ret = w1_mikrobus_id_readblock(sl, off, count, buf);
+-	mutex_unlock(&sl->master->bus_mutex);
+-	
+-	return ret;
++	if(off == MIKROBUS_ID_USER_EEPROM_ADDR && count == 1) {
++		buf[0] = 0;
++		return 0;
++	}
++
++	do {	
++		w1_mikrobus_id_readbuf_secondary(sl, count, buf);
++		cmp = kzalloc(count, GFP_KERNEL);
++		if (!cmp)
++			return -ENOMEM;		
++		w1_mikrobus_id_readbuf_secondary(sl, count, cmp);
++		if (!memcmp(cmp, buf, count)){
++			kfree(cmp);
++			return 0;
++		}
++	} while (--tries);
++
++	kfree(cmp);
++	return -EINVAL;
+ }
+ 
+-static int w1_mikrobus_id_nvmem_write(void *priv, unsigned int off, void *buf, size_t count)
++static int w1_mikrobus_id_nvmem_read(void *priv, unsigned int off, void *buf, size_t count)
+ {
+ 	struct w1_slave *sl = priv;
+ 	int ret;
+ 
+ 	mutex_lock(&sl->master->bus_mutex);
+-	ret = w1_mikrobus_id_writeblock(sl, off, count, buf);
++	if (sl->family->fid == W1_EEPROM_MIKROBUS_SECONDARY_ID)
++		ret = w1_mikrobus_id_readblock_secondary(sl, off, count, buf);
++	else
++		ret = w1_mikrobus_id_readblock(sl, off, count, buf);
+ 	mutex_unlock(&sl->master->bus_mutex);
+ 	
+ 	return ret;
+@@ -160,12 +151,12 @@ static int w1_mikrobus_id_add_slave(struct w1_slave *sl)
+ 	struct nvmem_config nvmem_cfg = {
+ 		.dev = &sl->dev,
+ 		.reg_read = w1_mikrobus_id_nvmem_read,
+-		.reg_write = w1_mikrobus_id_nvmem_write,
+ 		.type = NVMEM_TYPE_EEPROM,
+-		.read_only = false,
++		.read_only = true,
+ 		.word_size = 1,
+ 		.stride = 1,
+-		.size = W1_MIKROBUS_ID_EEPROM_SIZE,
++		.size = (sl->family->fid == W1_EEPROM_MIKROBUS_SECONDARY_ID) ? 
++		 W1_MIKROBUS_ID_EEPROM_SECONDARY_SIZE: W1_MIKROBUS_ID_EEPROM_SIZE,
+ 		.priv = sl,
+ 	};
+ 
+@@ -181,7 +172,7 @@ static int w1_mikrobus_id_add_slave(struct w1_slave *sl)
+ 	return PTR_ERR_OR_ZERO(nvmem);
+ }
+ 
+-static const struct w1_family_ops w1_family_mikrobus_id_fops = {
++static struct w1_family_ops w1_family_mikrobus_id_fops = {
+ 	.add_slave		= w1_mikrobus_id_add_slave,
+ };
+ 
+@@ -189,9 +180,43 @@ static struct w1_family w1_family_mikrobus_id = {
+ 	.fid = W1_EEPROM_MIKROBUS_ID,
+ 	.fops = &w1_family_mikrobus_id_fops,
+ };
+-module_w1_family(w1_family_mikrobus_id);
++
++static struct w1_family w1_family_mikrobus_id_alternate = {
++	.fid = W1_EEPROM_MIKROBUS_SECONDARY_ID,
++	.fops = &w1_family_mikrobus_id_fops,
++};
++
++static int __init w1_mikrobusid_init(void)
++{
++	int err;
++
++	err = w1_register_family(&w1_family_mikrobus_id);
++	if (err)
++		return err;
++
++	err = w1_register_family(&w1_family_mikrobus_id_alternate);
++	if (err)
++		goto err_mikrobusidinit;
++
++
++	return 0;
++
++err_mikrobusidinit:
++	w1_unregister_family(&w1_family_mikrobus_id);
++	return err;
++}
++
++static void __exit w1_mikrobusid_exit(void)
++{
++	w1_unregister_family(&w1_family_mikrobus_id);
++	w1_unregister_family(&w1_family_mikrobus_id_alternate);
++}
++
++module_init(w1_mikrobusid_init);
++module_exit(w1_mikrobusid_exit);
+ 
+ MODULE_AUTHOR("Vaishnav M A <vaishnav@beagleboard.org>");
+ MODULE_DESCRIPTION("w1 family ac driver for mikroBUS ID EEPROM");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_MIKROBUS_ID));
++MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_MIKROBUS_SECONDARY_ID));
+-- 
+2.25.1
+
diff --git a/patches/git/BBDTBS b/patches/git/BBDTBS
index 527e99fee3b776fd8925f53b139263720dfb2ccf..56568cce48f6c96c19a7778ee54eeeca64a3dfdf 100644
--- a/patches/git/BBDTBS
+++ b/patches/git/BBDTBS
@@ -1 +1 @@
-BBDTBS: https://github.com/beagleboard/BeagleBoard-DeviceTrees/commit/493a8c35752815a30a3b0c34c130054a0f546d27
+BBDTBS: https://github.com/beagleboard/BeagleBoard-DeviceTrees/commit/b96282ce4a53623db3ead627726e12ff22d0fab7
diff --git a/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch b/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
index 0f84fcc4b50f4006d38f3fa5c4c49809486a56ba..bdf28b5874dab2f38eca07207597079bcfaabc0d 100644
--- a/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
+++ b/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
@@ -1,14 +1,14 @@
-From 4463eb8dd961c13fb3cd087c7373efcdf141bad3 Mon Sep 17 00:00:00 2001
+From dd2555fc7b09e6b002950eefd1ed5aaa6c32beae Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Dec 2021 13:30:14 -0600
+Date: Tue, 7 Dec 2021 19:16:16 -0600
 Subject: [PATCH] Add BeagleBoard.org Device Tree Changes
 
 https://github.com/beagleboard/BeagleBoard-DeviceTrees/tree/v5.16.x
 
-https://github.com/beagleboard/BeagleBoard-DeviceTrees/commit/493a8c35752815a30a3b0c34c130054a0f546d27
+https://github.com/beagleboard/BeagleBoard-DeviceTrees/commit/b96282ce4a53623db3ead627726e12ff22d0fab7
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
- arch/arm/boot/dts/Makefile                    |    4 +
+ arch/arm/boot/dts/Makefile                    |    5 +
  arch/arm/boot/dts/am335x-bbb-bone-buses.dtsi  |   85 +
  .../arm/boot/dts/am335x-bone-common-univ.dtsi | 2909 +++++++++++++++++
  arch/arm/boot/dts/am335x-bone-common.dtsi     |   25 +-
@@ -27,7 +27,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  arch/arm/boot/dts/am335x-bonegreen.dts        |    5 +
  arch/arm/boot/dts/am335x-osd3358-sm-red.dts   |  147 +-
  arch/arm/boot/dts/am335x-osd335x-common.dtsi  |    1 +
- arch/arm/boot/dts/am335x-pocketbeagle.dts     |  971 +++++-
+ arch/arm/boot/dts/am335x-pocketbeagle.dts     | 2167 +++++++++++-
  .../arm/boot/dts/am335x-sancloud-bbe-lite.dts |    6 +
  arch/arm/boot/dts/am335x-sancloud-bbe.dts     |    5 +
  arch/arm/boot/dts/am33xx-l4.dtsi              |    4 +-
@@ -56,11 +56,11 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  arch/arm/boot/dts/overlays/BONE-ADC.dts       |   28 +
  arch/arm/boot/dts/overlays/M-BB-BBG-00A0.dts  |   21 +
  arch/arm/boot/dts/overlays/M-BB-BBGG-00A0.dts |   24 +
- arch/arm/boot/dts/overlays/Makefile           |   31 +
- arch/arm/boot/dts/overlays/PB-MIKROBUS-0.dts  |  112 +
+ arch/arm/boot/dts/overlays/Makefile           |   29 +
+ arch/arm/boot/dts/overlays/PB-MIKROBUS-0.dts  |  107 +
  arch/arm/boot/dts/overlays/PB-MIKROBUS-1.dts  |  108 +
  include/dt-bindings/pinctrl/omap.h            |    4 +-
- 52 files changed, 9841 insertions(+), 266 deletions(-)
+ 52 files changed, 10972 insertions(+), 325 deletions(-)
  create mode 100644 arch/arm/boot/dts/am335x-bbb-bone-buses.dtsi
  create mode 100644 arch/arm/boot/dts/am335x-bone-common-univ.dtsi
  create mode 100644 arch/arm/boot/dts/am335x-bone-uboot-univ.dts
@@ -92,13 +92,14 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  create mode 100644 arch/arm/boot/dts/overlays/PB-MIKROBUS-1.dts
 
 diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
-index 0de64f237cd8..db7ae3d79585 100644
+index 0de64f237cd8..5b8da6de7228 100644
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -857,6 +857,10 @@ dtb-$(CONFIG_SOC_AM33XX) += \
+@@ -857,6 +857,11 @@ dtb-$(CONFIG_SOC_AM33XX) += \
  	am335x-base0033.dtb \
  	am335x-bone.dtb \
  	am335x-boneblack.dtb \
++	am335x-bonegreen-wireless-uboot-univ.dtb \
 +	am335x-boneblack-uboot-univ.dtb \
 +	am335x-bone-uboot-univ.dtb \
 +	am335x-boneblack-uboot.dtb \
@@ -7052,7 +7053,7 @@ index 2888b15999ee..49ba87edadbb 100644
  	tps: tps@24 {
  		reg = <0x24>;
 diff --git a/arch/arm/boot/dts/am335x-pocketbeagle.dts b/arch/arm/boot/dts/am335x-pocketbeagle.dts
-index 5e415d8ffdd8..6e4c2c7672d0 100644
+index 5e415d8ffdd8..62f6fafc3db3 100644
 --- a/arch/arm/boot/dts/am335x-pocketbeagle.dts
 +++ b/arch/arm/boot/dts/am335x-pocketbeagle.dts
 @@ -15,6 +15,8 @@ / {
@@ -7064,22 +7065,25 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
  	};
  
  	leds {
-@@ -205,130 +207,830 @@ &gpio3 {
+@@ -204,150 +206,24 @@ &gpio3 {
+ };
  
  &am33xx_pinmux {
++//	i2c2_pins: pinmux-i2c2-pins {
++//		pinctrl-single,pins = <
++//			AM33XX_PADCONF(AM335X_PIN_UART1_RTSN, PIN_INPUT_PULLUP, MUX_MODE3)	/* (D17) uart1_rtsn.I2C2_SCL */
++//			AM33XX_PADCONF(AM335X_PIN_UART1_CTSN, PIN_INPUT_PULLUP, MUX_MODE3)	/* (D18) uart1_ctsn.I2C2_SDA */
++//		>;
++//	};
  
 -	compatible = "pinconf-single";
 -	pinctrl-names = "default";
-+/************************/
-+	/* P1 Header */
-+	/************************/
- 
+-
 -	pinctrl-0 =   < &P2_03_gpio &P1_34_gpio &P2_19_gpio &P2_24_gpio
 -			&P2_33_gpio &P2_22_gpio &P2_18_gpio &P2_10_gpio
 -			&P2_06_gpio &P2_04_gpio &P2_02_gpio &P2_08_gpio
 -			&P2_17_gpio >;
-+	/* P1_01                VIN-AC */
- 
+-
 -	/* P2_03 (ZCZ ball T10) gpio0_23 0x824 PIN 9 */
 -	P2_03_gpio: pinmux_P2_03_gpio {
 -		pinctrl-single,pins = <
@@ -7088,22 +7092,7 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 -		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
 -		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
 -	};
-+	/* P1_02 (ZCZ ball R5) gpio2_23 */
-+	P1_02_default_pin: pinmux_P1_02_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_INPUT | MUX_MODE7) >; };			/* lcd_hsync.gpio2_23 */
-+	P1_02_gpio_pin: pinmux_P1_02_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* lcd_hsync.gpio2_23 */
-+	P1_02_gpio_pu_pin: pinmux_P1_02_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* lcd_hsync.gpio2_23 */
-+	P1_02_gpio_pd_pin: pinmux_P1_02_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_hsync.gpio2_23 */
-+	P1_02_gpio_input_pin: pinmux_P1_02_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_INPUT | MUX_MODE7) >; };			/* lcd_hsync.gpio2_23 */
-+	P1_02_pruout_pin: pinmux_P1_02_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* lcd_hsync.pru1_out9 */
-+	P1_02_pruin_pin: pinmux_P1_02_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e4, PIN_INPUT | MUX_MODE6) >; };			/* lcd_hsync.pru1_in9 */
- 
+-
 -	/* P1_34 (ZCZ ball T11) gpio0_26 0x828 PIN 10 */
 -	P1_34_gpio: pinmux_P1_34_gpio {
 -		pinctrl-single,pins = <
@@ -7112,8 +7101,7 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 -		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
 -		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
 -	};
-+	/* P1_03 (ZCZ ball F15)  usb1_vbus_out         */
- 
+-
 -	/* P2_19 (ZCZ ball U12) gpio0_27 0x82c PIN 11 */
 -	P2_19_gpio: pinmux_P2_19_gpio {
 -		pinctrl-single,pins = <
@@ -7122,22 +7110,7 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 -		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
 -		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
 -	};
-+	/* P1_04 (ZCZ ball R6) gpio2_25 */
-+	P1_04_default_pin: pinmux_P1_04_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_ac_bias_en.gpio2_25 */
-+	P1_04_gpio_pin: pinmux_P1_04_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* lcd_ac_bias_en.gpio2_25 */
-+	P1_04_gpio_pu_pin: pinmux_P1_04_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* lcd_ac_bias_en.gpio2_25 */
-+	P1_04_gpio_pd_pin: pinmux_P1_04_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_ac_bias_en.gpio2_25 */
-+	P1_04_gpio_input_pin: pinmux_P1_04_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_INPUT | MUX_MODE7) >; };			/* lcd_ac_bias_en.gpio2_25 */
-+	P1_04_pruout_pin: pinmux_P1_04_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* lcd_ac_bias_en.pru1_out11 */
-+	P1_04_pruin_pin: pinmux_P1_04_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08ec, PIN_INPUT | MUX_MODE6) >; };			/* lcd_ac_bias_en.pru1_in11 */
- 
+-
 -	/* P2_24 (ZCZ ball T12) gpio1_12 0x830 PIN 12 */
 -	P2_24_gpio: pinmux_P2_24_gpio {
 -		pinctrl-single,pins = <
@@ -7146,8 +7119,7 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 -		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
 -		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
 -	};
-+	/* P1_05 (ZCZ ball T18)  usb1_vbus_in         */
- 
+-
 -	/* P2_33 (ZCZ ball R12) gpio1_13 0x834 PIN 13 */
 -	P2_33_gpio: pinmux_P2_33_gpio {
 -		pinctrl-single,pins = <
@@ -7156,6 +7128,209 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 -		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
 -		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
 -	};
+-
+-	/* P2_22 (ZCZ ball V13) gpio1_14 0x838 PIN 14 */
+-	P2_22_gpio: pinmux_P2_22_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_AD14, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_18 (ZCZ ball U13) gpio1_15 0x83c PIN 15 */
+-	P2_18_gpio: pinmux_P2_18_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_AD15, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_10 (ZCZ ball R14) gpio1_20 0x850 PIN 20 */
+-	P2_10_gpio: pinmux_P2_10_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_A4, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_06 (ZCZ ball U16) gpio1_25 0x864 PIN 25 */
+-	P2_06_gpio: pinmux_P2_06_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_A9, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_04 (ZCZ ball T16) gpio1_26 0x868 PIN 26 */
+-	P2_04_gpio: pinmux_P2_04_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_A10, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_02 (ZCZ ball V17) gpio1_27 0x86c PIN 27 */
+-	P2_02_gpio: pinmux_P2_02_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_08 (ZCZ ball U18) gpio1_28 0x878 PIN 30 */
+-	P2_08_gpio: pinmux_P2_08_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_BEN1, PIN_INPUT_PULLDOWN, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x00  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x00  0x00  0x10  0x18>;
+-	};
+-
+-	/* P2_17 (ZCZ ball V12) gpio2_1 0x88c PIN 35 */
+-	P2_17_gpio: pinmux_P2_17_gpio {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_CLK, PIN_INPUT_PULLUP, MUX_MODE7)
+-		>;
+-		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
+-		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
+-	};
+-
+-	i2c2_pins: pinmux-i2c2-pins {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_UART1_RTSN, PIN_INPUT_PULLUP, MUX_MODE3)	/* (D17) uart1_rtsn.I2C2_SCL */
+-			AM33XX_PADCONF(AM335X_PIN_UART1_CTSN, PIN_INPUT_PULLUP, MUX_MODE3)	/* (D18) uart1_ctsn.I2C2_SDA */
+-		>;
+-	};
++//	ehrpwm0_pins: pinmux-ehrpwm0-pins {
++//		pinctrl-single,pins = <
++//			AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE1)	/* (A13) mcasp0_aclkx.ehrpwm0A */
++//		>;
++//	};
+ 
+-	ehrpwm0_pins: pinmux-ehrpwm0-pins {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE1)	/* (A13) mcasp0_aclkx.ehrpwm0A */
+-		>;
+-	};
+-
+-	ehrpwm1_pins: pinmux-ehrpwm1-pins {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_A2, PIN_OUTPUT_PULLDOWN, MUX_MODE6)	/* (U14) gpmc_a2.ehrpwm1A */
+-		>;
+-	};
++//	ehrpwm1_pins: pinmux-ehrpwm1-pins {
++//		pinctrl-single,pins = <
++//			AM33XX_PADCONF(AM335X_PIN_GPMC_A2, PIN_OUTPUT_PULLDOWN, MUX_MODE6)	/* (U14) gpmc_a2.ehrpwm1A */
++//		>;
++//	};
+ 
+ 	mmc0_pins: pinmux-mmc0-pins {
+ 		pinctrl-single,pins = <
+@@ -361,23 +237,23 @@ AM33XX_PADCONF(AM335X_PIN_MMC0_CLK, PIN_INPUT_PULLUP, MUX_MODE0)
+ 		>;
+ 	};
+ 
+-	spi0_pins: pinmux-spi0-pins {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_SPI0_SCLK, PIN_INPUT_PULLUP, MUX_MODE0)
+-			AM33XX_PADCONF(AM335X_PIN_SPI0_D0, PIN_INPUT_PULLUP, MUX_MODE0)
+-			AM33XX_PADCONF(AM335X_PIN_SPI0_D1, PIN_INPUT_PULLUP, MUX_MODE0)
+-			AM33XX_PADCONF(AM335X_PIN_SPI0_CS0, PIN_INPUT_PULLUP, MUX_MODE0)
+-		>;
+-	};
++//	spi0_pins: pinmux-spi0-pins {
++//		pinctrl-single,pins = <
++//			AM33XX_PADCONF(AM335X_PIN_SPI0_SCLK, PIN_INPUT_PULLUP, MUX_MODE0)	/* (A17) spi0_sclk.spi0_sclk */
++//			AM33XX_PADCONF(AM335X_PIN_SPI0_D0, PIN_INPUT_PULLUP, MUX_MODE0)	/* (B17) spi0_d0.spi0_d0 */
++//			AM33XX_PADCONF(AM335X_PIN_SPI0_D1, PIN_INPUT_PULLUP, MUX_MODE0)	/* (B16) spi0_d1.spi0_d1 */
++//			AM33XX_PADCONF(AM335X_PIN_SPI0_CS0, PIN_INPUT_PULLUP, MUX_MODE0)	/* (A16) spi0_cs0.spi0_cs0 */
++//		>;
++//	};
+ 
+-	spi1_pins: pinmux-spi1-pins {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_ECAP0_IN_PWM0_OUT, PIN_INPUT_PULLUP, MUX_MODE4)	/* (C18) eCAP0_in_PWM0_out.spi1_sclk */
+-			AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_INPUT_PULLUP, MUX_MODE4)	/* (E18) uart0_ctsn.spi1_d0 */
+-			AM33XX_PADCONF(AM335X_PIN_UART0_RTSN, PIN_INPUT_PULLUP, MUX_MODE4)	/* (E17) uart0_rtsn.spi1_d1 */
+-			AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_INPUT_PULLUP, MUX_MODE4)	/* (A15) xdma_event_intr0.spi1_cs1 */
+-		>;
+-	};
++//	spi1_pins: pinmux-spi1-pins {
++//		pinctrl-single,pins = <
++//			AM33XX_PADCONF(AM335X_PIN_ECAP0_IN_PWM0_OUT, PIN_INPUT_PULLUP, MUX_MODE4)	/* (C18) eCAP0_in_PWM0_out.spi1_sclk */
++//			AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_INPUT_PULLUP, MUX_MODE4)	/* (E18) uart0_ctsn.spi1_d0 */
++//			AM33XX_PADCONF(AM335X_PIN_UART0_RTSN, PIN_INPUT_PULLUP, MUX_MODE4)	/* (E17) uart0_rtsn.spi1_d1 */
++//			AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_INPUT_PULLUP, MUX_MODE4)	/* (A15) xdma_event_intr0.spi1_cs1 */
++//		>;
++//	};
+ 
+ 	usr_leds_pins: pinmux-usr-leds-pins {
+ 		pinctrl-single,pins = <
+@@ -395,12 +271,839 @@ AM33XX_PADCONF(AM335X_PIN_UART0_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+ 		>;
+ 	};
+ 
+-	uart4_pins: pinmux-uart4-pins {
+-		pinctrl-single,pins = <
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_WAIT0, PIN_INPUT_PULLUP, MUX_MODE6)	/* (T17) gpmc_wait0.uart4_rxd */
+-			AM33XX_PADCONF(AM335X_PIN_GPMC_WPN, PIN_OUTPUT_PULLDOWN, MUX_MODE6)	/* (U17) gpmc_wpn.uart4_txd */
+-		>;
+-	};
++//	uart4_pins: pinmux-uart4-pins {
++//		pinctrl-single,pins = <
++//			AM33XX_PADCONF(AM335X_PIN_GPMC_WAIT0, PIN_INPUT_PULLUP, MUX_MODE6)	/* (T17) gpmc_wait0.uart4_rxd */
++//			AM33XX_PADCONF(AM335X_PIN_GPMC_WPN, PIN_OUTPUT_PULLDOWN, MUX_MODE6)	/* (U17) gpmc_wpn.uart4_txd */
++//		>;
++//	};
++
++	/************************/
++	/* P1 Header */
++	/************************/
++
++	/* P1_01                VIN-AC */
++
++	/* P1_02 (ZCZ ball R5) gpio2_23 */
++	P1_02_default_pin: pinmux_P1_02_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_INPUT | MUX_MODE7) >; };			/* lcd_hsync.gpio2_23 */
++	P1_02_gpio_pin: pinmux_P1_02_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* lcd_hsync.gpio2_23 */
++	P1_02_gpio_pu_pin: pinmux_P1_02_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* lcd_hsync.gpio2_23 */
++	P1_02_gpio_pd_pin: pinmux_P1_02_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_hsync.gpio2_23 */
++	P1_02_gpio_input_pin: pinmux_P1_02_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_INPUT | MUX_MODE7) >; };			/* lcd_hsync.gpio2_23 */
++	P1_02_pruout_pin: pinmux_P1_02_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* lcd_hsync.pru1_out9 */
++	P1_02_pruin_pin: pinmux_P1_02_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e4, PIN_INPUT | MUX_MODE6) >; };			/* lcd_hsync.pru1_in9 */
++
++	/* P1_03 (ZCZ ball F15)  usb1_vbus_out         */
++
++	/* P1_04 (ZCZ ball R6) gpio2_25 */
++	P1_04_default_pin: pinmux_P1_04_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_ac_bias_en.gpio2_25 */
++	P1_04_gpio_pin: pinmux_P1_04_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* lcd_ac_bias_en.gpio2_25 */
++	P1_04_gpio_pu_pin: pinmux_P1_04_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* lcd_ac_bias_en.gpio2_25 */
++	P1_04_gpio_pd_pin: pinmux_P1_04_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_ac_bias_en.gpio2_25 */
++	P1_04_gpio_input_pin: pinmux_P1_04_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_INPUT | MUX_MODE7) >; };			/* lcd_ac_bias_en.gpio2_25 */
++	P1_04_pruout_pin: pinmux_P1_04_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* lcd_ac_bias_en.pru1_out11 */
++	P1_04_pruin_pin: pinmux_P1_04_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08ec, PIN_INPUT | MUX_MODE6) >; };			/* lcd_ac_bias_en.pru1_in11 */
++
++	/* P1_05 (ZCZ ball T18)  usb1_vbus_in         */
++
 +	/* P1_06 (ZCZ ball A16) spi0_cs0 */
 +	P1_06_default_pin: pinmux_P1_06_default_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x095c, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE0) >; };	/* spi0_cs0.spi0_cs0 */
@@ -7175,25 +7350,9 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 +		AM33XX_IOPAD(0x095c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE3) >; };	/* spi0_cs0.ehrpwm0_synci */
 +	P1_06_pru_uart_pin: pinmux_P1_06_pru_uart_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x095c, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* spi0_cs0.pr1_uart0_txd */
- 
--	/* P2_22 (ZCZ ball V13) gpio1_14 0x838 PIN 14 */
--	P2_22_gpio: pinmux_P2_22_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_AD14, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_07                VIN-USB */
- 
--	/* P2_18 (ZCZ ball U13) gpio1_15 0x83c PIN 15 */
--	P2_18_gpio: pinmux_P2_18_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_AD15, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_08 (ZCZ ball A17) spi0_sclk */
 +	P1_08_default_pin: pinmux_P1_08_default_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0950, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE0) >; };	/* spi0_sclk.spi0_sclk */
@@ -7215,25 +7374,9 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 +		AM33XX_IOPAD(0x0950, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE3) >; };	/* spi0_sclk.ehrpwm0a */
 +	P1_08_pru_uart_pin: pinmux_P1_08_pru_uart_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0950, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* spi0_sclk.pr1_uart0_cts_n */
- 
--	/* P2_10 (ZCZ ball R14) gpio1_20 0x850 PIN 20 */
--	P2_10_gpio: pinmux_P2_10_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_A4, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_09 (ZCZ ball R18)  USB1-DN         */
- 
--	/* P2_06 (ZCZ ball U16) gpio1_25 0x864 PIN 25 */
--	P2_06_gpio: pinmux_P2_06_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_A9, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_10 (ZCZ ball B17) spi0_d0 */
 +	P1_10_default_pin: pinmux_P1_10_default_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0954, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE0) >; };	/* spi0_d0.spi0_d0 */
@@ -7255,25 +7398,9 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 +		AM33XX_IOPAD(0x0954, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE3) >; };	/* spi0_d0.ehrpwm0b */
 +	P1_10_pru_uart_pin: pinmux_P1_10_pru_uart_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0954, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* spi0_d0.pr1_uart0_rts_n */
- 
--	/* P2_04 (ZCZ ball T16) gpio1_26 0x868 PIN 26 */
--	P2_04_gpio: pinmux_P2_04_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_A10, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_11 (ZCZ ball R17)  USB1-DP         */
- 
--	/* P2_02 (ZCZ ball V17) gpio1_27 0x86c PIN 27 */
--	P2_02_gpio: pinmux_P2_02_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_12 (ZCZ ball B16) spi0_d1 */
 +	P1_12_default_pin: pinmux_P1_12_default_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0958, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE0) >; };	/* spi0_d1.spi0_d1 */
@@ -7293,25 +7420,9 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 +		AM33XX_IOPAD(0x0958, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE3) >; };	/* spi0_d1.ehrpwm0_tripzone_input */
 +	P1_12_pru_uart_pin: pinmux_P1_12_pru_uart_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0958, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* spi0_d1.pr1_uart0_rxd */
- 
--	/* P2_08 (ZCZ ball U18) gpio1_28 0x878 PIN 30 */
--	P2_08_gpio: pinmux_P2_08_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_BEN1, PIN_INPUT_PULLDOWN, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x00  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x00  0x00  0x10  0x18>;
--	};
++
 +	/* P1_13 (ZCZ ball P17)  USB1-ID         */
- 
--	/* P2_17 (ZCZ ball V12) gpio2_1 0x88c PIN 35 */
--	P2_17_gpio: pinmux_P2_17_gpio {
--		pinctrl-single,pins = <
--			AM33XX_PADCONF(AM335X_PIN_GPMC_CLK, PIN_INPUT_PULLUP, MUX_MODE7)
--		>;
--		pinctrl-single,bias-pullup   =   < 0x10  0x10  0x00  0x18>;
--		pinctrl-single,bias-pulldown   = < 0x10  0x00  0x10  0x18>;
--	};
++
 +	/* P1_14                VOUT-3.3V */
 +
 +	/* P1_15                GND */
@@ -7857,205 +7968,1330 @@ index 5e415d8ffdd8..6e4c2c7672d0 100644
 +	P2_27_spi_pin: pinmux_P2_27_spi_pin { pinctrl-single,pins = <
 +		AM33XX_IOPAD(0x0968, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* uart0_ctsn.spi1_d0 */
 +
-+	/* P2_28 (ZCZ ball D13) pru0_in6 */
-+	P2_28_default_pin: pinmux_P2_28_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr1.pru0_in6 */
-+	P2_28_gpio_pin: pinmux_P2_28_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_axr1.gpio3_20 */
-+	P2_28_gpio_pu_pin: pinmux_P2_28_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr1.gpio3_20 */
-+	P2_28_gpio_pd_pin: pinmux_P2_28_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr1.gpio3_20 */
-+	P2_28_gpio_input_pin: pinmux_P2_28_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_axr1.gpio3_20 */
-+	P2_28_qep_pin: pinmux_P2_28_qep_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_axr1.eqep0_index */
-+	P2_28_pruout_pin: pinmux_P2_28_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_axr1.pru0_out6 */
-+	P2_28_pruin_pin: pinmux_P2_28_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a8, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr1.pru0_in6 */
++	/* P2_28 (ZCZ ball D13) pru0_in6 */
++	P2_28_default_pin: pinmux_P2_28_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr1.pru0_in6 */
++	P2_28_gpio_pin: pinmux_P2_28_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_axr1.gpio3_20 */
++	P2_28_gpio_pu_pin: pinmux_P2_28_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr1.gpio3_20 */
++	P2_28_gpio_pd_pin: pinmux_P2_28_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr1.gpio3_20 */
++	P2_28_gpio_input_pin: pinmux_P2_28_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_axr1.gpio3_20 */
++	P2_28_qep_pin: pinmux_P2_28_qep_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_axr1.eqep0_index */
++	P2_28_pruout_pin: pinmux_P2_28_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_axr1.pru0_out6 */
++	P2_28_pruin_pin: pinmux_P2_28_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a8, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr1.pru0_in6 */
++
++	/* P2_29 (ZCZ ball C18) spi1_sclk */
++	P2_29_default_pin: pinmux_P2_29_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* eCAP0_in_PWM0_out.spi1_sclk */
++	P2_29_gpio_pin: pinmux_P2_29_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* eCAP0_in_PWM0_out.gpio0_7 */
++	P2_29_gpio_pu_pin: pinmux_P2_29_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* eCAP0_in_PWM0_out.gpio0_7 */
++	P2_29_gpio_pd_pin: pinmux_P2_29_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* eCAP0_in_PWM0_out.gpio0_7 */
++	P2_29_gpio_input_pin: pinmux_P2_29_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_INPUT | MUX_MODE7) >; };			/* eCAP0_in_PWM0_out.gpio0_7 */
++	P2_29_pwm_pin: pinmux_P2_29_pwm_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE0) >; };	/* eCAP0_in_PWM0_out.ecap0_in_pwm0_out */
++	P2_29_uart_pin: pinmux_P2_29_uart_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE1) >; };	/* eCAP0_in_PWM0_out.uart3_txd */
++	P2_29_spi_cs_pin: pinmux_P2_29_spi_cs_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE2) >; };	/* eCAP0_in_PWM0_out.spi1_cs1 */
++	P2_29_pru_ecap_pin: pinmux_P2_29_pru_ecap_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE3) >; };	/* eCAP0_in_PWM0_out.pr1_ecap0_ecap_capin_apwm_o */
++	P2_29_spi_sclk_pin: pinmux_P2_29_spi_sclk_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* eCAP0_in_PWM0_out.spi1_sclk */
++
++	/* P2_30 (ZCZ ball C12) pru0_in3 */
++	P2_30_default_pin: pinmux_P2_30_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_ahclkr.pru0_in3 */
++	P2_30_gpio_pin: pinmux_P2_30_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_ahclkr.gpio3_17 */
++	P2_30_gpio_pu_pin: pinmux_P2_30_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_ahclkr.gpio3_17 */
++	P2_30_gpio_pd_pin: pinmux_P2_30_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_ahclkr.gpio3_17 */
++	P2_30_gpio_input_pin: pinmux_P2_30_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_ahclkr.gpio3_17 */
++	P2_30_pwm_pin: pinmux_P2_30_pwm_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_ahclkr.ehrpwm0_synci */
++	P2_30_spi_cs_pin: pinmux_P2_30_spi_cs_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE3) >; };	/* mcasp0_ahclkr.spi1_cs0 */
++	P2_30_pruout_pin: pinmux_P2_30_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_ahclkr.pru0_out3 */
++	P2_30_pruin_pin: pinmux_P2_30_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x099c, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_ahclkr.pru0_in3 */
++
++	/* P2_31 (ZCZ ball A15) spi1_cs1 */
++	P2_31_default_pin: pinmux_P2_31_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* xdma_event_intr0.spi1_cs1 */
++	P2_31_gpio_pin: pinmux_P2_31_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* xdma_event_intr0.gpio0_19 */
++	P2_31_gpio_pu_pin: pinmux_P2_31_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* xdma_event_intr0.gpio0_19 */
++	P2_31_gpio_pd_pin: pinmux_P2_31_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* xdma_event_intr0.gpio0_19 */
++	P2_31_gpio_input_pin: pinmux_P2_31_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_INPUT | MUX_MODE7) >; };			/* xdma_event_intr0.gpio0_19 */
++	P2_31_spi_cs_pin: pinmux_P2_31_spi_cs_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* xdma_event_intr0.spi1_cs1 */
++	P2_31_pruin_pin: pinmux_P2_31_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09b0, PIN_INPUT | MUX_MODE5) >; };			/* xdma_event_intr0.pru1_in16 */
++
++	/* P2_32 (ZCZ ball D12) pru0_in2 */
++	P2_32_default_pin: pinmux_P2_32_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr0.pru0_in2 */
++	P2_32_gpio_pin: pinmux_P2_32_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_axr0.gpio3_16 */
++	P2_32_gpio_pu_pin: pinmux_P2_32_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr0.gpio3_16 */
++	P2_32_gpio_pd_pin: pinmux_P2_32_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr0.gpio3_16 */
++	P2_32_gpio_input_pin: pinmux_P2_32_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_axr0.gpio3_16 */
++	P2_32_pwm_pin: pinmux_P2_32_pwm_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_axr0.ehrpwm0_tripzone_input */
++	P2_32_spi_pin: pinmux_P2_32_spi_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE3) >; };	/* mcasp0_axr0.spi1_d1 */
++	P2_32_pruout_pin: pinmux_P2_32_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_axr0.pru0_out2 */
++	P2_32_pruin_pin: pinmux_P2_32_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0998, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr0.pru0_in2 */
++
++	/* P2_33 (ZCZ ball R12) gpio1_13 */
++	P2_33_default_pin: pinmux_P2_33_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* gpmc_ad13.gpio1_13 */
++	P2_33_gpio_pin: pinmux_P2_33_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* gpmc_ad13.gpio1_13 */
++	P2_33_gpio_pu_pin: pinmux_P2_33_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* gpmc_ad13.gpio1_13 */
++	P2_33_gpio_pd_pin: pinmux_P2_33_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* gpmc_ad13.gpio1_13 */
++	P2_33_gpio_input_pin: pinmux_P2_33_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_INPUT | MUX_MODE7) >; };			/* gpmc_ad13.gpio1_13 */
++	P2_33_qep_pin: pinmux_P2_33_qep_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* gpmc_ad13.eqep2b_in */
++	P2_33_pruout_pin: pinmux_P2_33_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE6) >; };	/* gpmc_ad13.pru0_out15 */
++
++	/* P2_34 (ZCZ ball C13) pru0_in5 */
++	P2_34_default_pin: pinmux_P2_34_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_fsr.pru0_in5 */
++	P2_34_gpio_pin: pinmux_P2_34_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_fsr.gpio3_19 */
++	P2_34_gpio_pu_pin: pinmux_P2_34_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_fsr.gpio3_19 */
++	P2_34_gpio_pd_pin: pinmux_P2_34_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_fsr.gpio3_19 */
++	P2_34_gpio_input_pin: pinmux_P2_34_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_fsr.gpio3_19 */
++	P2_34_qep_pin: pinmux_P2_34_qep_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_fsr.eqep0b_in */
++	P2_34_pruout_pin: pinmux_P2_34_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_fsr.pru0_out5 */
++	P2_34_pruin_pin: pinmux_P2_34_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x09a4, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_fsr.pru0_in5 */
++
++	/* P2_35 (ZCZ ball U5) gpio2_22 */
++	P2_35_default_pin: pinmux_P2_35_default_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_INPUT | MUX_MODE7) >; };			/* lcd_vsync.gpio2_22 */
++	P2_35_gpio_pin: pinmux_P2_35_gpio_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* lcd_vsync.gpio2_22 */
++	P2_35_gpio_pu_pin: pinmux_P2_35_gpio_pu_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* lcd_vsync.gpio2_22 */
++	P2_35_gpio_pd_pin: pinmux_P2_35_gpio_pd_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_vsync.gpio2_22 */
++	P2_35_gpio_input_pin: pinmux_P2_35_gpio_input_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_INPUT | MUX_MODE7) >; };			/* lcd_vsync.gpio2_22 */
++	P2_35_pruout_pin: pinmux_P2_35_pruout_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* lcd_vsync.pru1_out8 */
++	P2_35_pruin_pin: pinmux_P2_35_pruin_pin { pinctrl-single,pins = <
++		AM33XX_IOPAD(0x08e0, PIN_INPUT | MUX_MODE6) >; };			/* lcd_vsync.pru1_in8 */
++
++	/* P2_36 (ZCZ ball C9)  AIN7         */
+ };
+ 
+ &epwmss0 {
+@@ -410,7 +1113,8 @@ &epwmss0 {
+ &ehrpwm0 {
+ 	status = "okay";
+ 	pinctrl-names = "default";
+-	pinctrl-0 = <&ehrpwm0_pins>;
++	//pinctrl-0 = <&ehrpwm0_pins>;
++	pinctrl-0 = <>;
+ };
+ 
+ &epwmss1 {
+@@ -420,7 +1124,18 @@ &epwmss1 {
+ &ehrpwm1 {
+ 	status = "okay";
+ 	pinctrl-names = "default";
+-	pinctrl-0 = <&ehrpwm1_pins>;
++	//pinctrl-0 = <&ehrpwm1_pins>;
++	pinctrl-0 = <>;
++};
++
++&epwmss2 {
++	status = "okay";
++};
++
++&ehrpwm2 {
++	status = "okay";
++	pinctrl-names = "default";
++	pinctrl-0 = <>;
+ };
+ 
+ &i2c0 {
+@@ -430,9 +1145,18 @@ eeprom: eeprom@50 {
+ 	};
+ };
+ 
++&i2c1 {
++	pinctrl-names = "default";
++	pinctrl-0 = <>;
++
++	status = "okay";
++	clock-frequency = <400000>;
++};
++
+ &i2c2 {
+ 	pinctrl-names = "default";
+-	pinctrl-0 = <&i2c2_pins>;
++//	pinctrl-0 = <&i2c2_pins>;
++	pinctrl-0 = <>;
+ 
+ 	status = "okay";
+ 	clock-frequency = <400000>;
+@@ -463,14 +1187,30 @@ adc {
+ 
+ &uart0 {
+ 	pinctrl-names = "default";
+-	pinctrl-0 = <&uart0_pins>;
++	//pinctrl-0 = <&uart0_pins>;
++	pinctrl-0 = <>;
++
++	status = "okay";
++};
++
++&uart1 {
++	pinctrl-names = "default";
++	pinctrl-0 = <>;
++
++	status = "okay";
++};
++
++&uart2 {
++	pinctrl-names = "default";
++	pinctrl-0 = <>;
+ 
+ 	status = "okay";
+ };
+ 
+ &uart4 {
+ 	pinctrl-names = "default";
+-	pinctrl-0 = <&uart4_pins>;
++	//pinctrl-0 = <&uart4_pins>;
++	pinctrl-0 = <>;
+ 
+ 	status = "okay";
+ };
+@@ -482,3 +1222,1092 @@ &usb0 {
+ &usb1 {
+ 	dr_mode = "host";
+ };
++
++&spi0 {
++	#address-cells = <1>;
++	#size-cells = <0>;
++	status = "okay";
++
++	channel@0 {
++		#address-cells = <1>;
++		#size-cells = <0>;
++		compatible = "spidev";
++		symlink = "bone/spi/0.0";
++		reg = <0>;
++		spi-max-frequency = <24000000>;
++	};
++
++	channel@1 {
++		#address-cells = <1>;
++		#size-cells = <0>;
++		compatible = "spidev";
++		symlink = "bone/spi/0.1";
++		reg = <1>;
++		spi-max-frequency = <24000000>;
++		status = "disabled";
++	};
++};
++
++&spi1 {
++	#address-cells = <1>;
++	#size-cells = <0>;
++	status = "okay";
++
++	channel@0 {
++		#address-cells = <1>;
++		#size-cells = <0>;
++		compatible = "spidev";
++		symlink = "bone/spi/1.0";
++		reg = <0>;
++		spi-max-frequency = <24000000>;
++	};
++
++	channel@1 {
++		#address-cells = <1>;
++		#size-cells = <0>;
++		compatible = "spidev";
++		symlink = "bone/spi/1.1";
++		reg = <1>;
++		spi-max-frequency = <24000000>;
++	};
++};
++
++&dcan0 {
++	status = "okay";
++	pinctrl-names = "default";
++	pinctrl-0 = <>;
++};
++
++&dcan1 {
++	status = "okay";
++	pinctrl-names = "default";
++	pinctrl-0 = <>;
++};
++
++&ocp {
++	/************************/
++	/* P1 Header */
++	/************************/
++
++	/* P1_01                VIN-AC */
++
++	/* P1_02 (ZCZ ball R5) gpio_input */
++	P1_02_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pruout", "pruin";
++		pinctrl-0 = <&P1_02_default_pin>;
++		pinctrl-1 = <&P1_02_gpio_pin>;
++		pinctrl-2 = <&P1_02_gpio_pu_pin>;
++		pinctrl-3 = <&P1_02_gpio_pd_pin>;
++		pinctrl-4 = <&P1_02_gpio_input_pin>;
++		pinctrl-5 = <&P1_02_pruout_pin>;
++		pinctrl-6 = <&P1_02_pruin_pin>;
++	};
++
++	/* P1_03 (ZCZ ball F15)  usb1_vbus_out         */
++
++	/* P1_04 (ZCZ ball R6) */
++	P1_04_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pruout", "pruin";
++		pinctrl-0 = <&P1_04_default_pin>;
++		pinctrl-1 = <&P1_04_gpio_pin>;
++		pinctrl-2 = <&P1_04_gpio_pu_pin>;
++		pinctrl-3 = <&P1_04_gpio_pd_pin>;
++		pinctrl-4 = <&P1_04_gpio_input_pin>;
++		pinctrl-5 = <&P1_04_pruout_pin>;
++		pinctrl-6 = <&P1_04_pruin_pin>;
++	};
++
++	/* P1_05 (ZCZ ball T18)  usb1_vbus_in         */
++
++	/* P1_06 (ZCZ ball A16) spi_cs */
++	P1_06_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "i2c", "pwm", "pru_uart";
++		pinctrl-0 = <&P1_06_default_pin>;
++		pinctrl-1 = <&P1_06_gpio_pin>;
++		pinctrl-2 = <&P1_06_gpio_pu_pin>;
++		pinctrl-3 = <&P1_06_gpio_pd_pin>;
++		pinctrl-4 = <&P1_06_gpio_input_pin>;
++		pinctrl-5 = <&P1_06_spi_cs_pin>;
++		pinctrl-6 = <&P1_06_i2c_pin>;
++		pinctrl-7 = <&P1_06_pwm_pin>;
++		pinctrl-8 = <&P1_06_pru_uart_pin>;
++	};
++
++	/* P1_07                VIN-USB */
++
++	/* P1_08 (ZCZ ball A17) spi_sclk */
++	P1_08_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_sclk", "uart", "i2c", "pwm", "pru_uart";
++		pinctrl-0 = <&P1_08_default_pin>;
++		pinctrl-1 = <&P1_08_gpio_pin>;
++		pinctrl-2 = <&P1_08_gpio_pu_pin>;
++		pinctrl-3 = <&P1_08_gpio_pd_pin>;
++		pinctrl-4 = <&P1_08_gpio_input_pin>;
++		pinctrl-5 = <&P1_08_spi_sclk_pin>;
++		pinctrl-6 = <&P1_08_uart_pin>;
++		pinctrl-7 = <&P1_08_i2c_pin>;
++		pinctrl-8 = <&P1_08_pwm_pin>;
++		pinctrl-9 = <&P1_08_pru_uart_pin>;
++	};
++
++	/* P1_09 (ZCZ ball R18)  USB1-DN         */
++
++	/* P1_10 (ZCZ ball B17) spi */
++	P1_10_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi", "uart", "i2c", "pwm", "pru_uart";
++		pinctrl-0 = <&P1_10_default_pin>;
++		pinctrl-1 = <&P1_10_gpio_pin>;
++		pinctrl-2 = <&P1_10_gpio_pu_pin>;
++		pinctrl-3 = <&P1_10_gpio_pd_pin>;
++		pinctrl-4 = <&P1_10_gpio_input_pin>;
++		pinctrl-5 = <&P1_10_spi_pin>;
++		pinctrl-6 = <&P1_10_uart_pin>;
++		pinctrl-7 = <&P1_10_i2c_pin>;
++		pinctrl-8 = <&P1_10_pwm_pin>;
++		pinctrl-9 = <&P1_10_pru_uart_pin>;
++	};
++
++	/* P1_11 (ZCZ ball R17)  USB1-DP         */
++
++	/* P1_12 (ZCZ ball B16) spi */
++	P1_12_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi", "i2c", "pwm", "pru_uart";
++		pinctrl-0 = <&P1_12_default_pin>;
++		pinctrl-1 = <&P1_12_gpio_pin>;
++		pinctrl-2 = <&P1_12_gpio_pu_pin>;
++		pinctrl-3 = <&P1_12_gpio_pd_pin>;
++		pinctrl-4 = <&P1_12_gpio_input_pin>;
++		pinctrl-5 = <&P1_12_spi_pin>;
++		pinctrl-6 = <&P1_12_i2c_pin>;
++		pinctrl-7 = <&P1_12_pwm_pin>;
++		pinctrl-8 = <&P1_12_pru_uart_pin>;
++	};
++
++	/* P1_13 (ZCZ ball P17)  USB1-ID         */
++
++	/* P1_14                VOUT-3.3V */
++
++	/* P1_15                GND */
++
++	/* P1_16                GND */
++
++	/* P1_17 (ZCZ ball A9)  VREFN         */
++
++	/* P1_18 (ZCZ ball B9)  VREFP         */
++
++	/* P1_19 (ZCZ ball B6)  AIN0         */
++
++	/* P1_20 (ZCZ ball D14) */
++	P1_20_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pruin";
++		pinctrl-0 = <&P1_20_default_pin>;
++		pinctrl-1 = <&P1_20_gpio_pin>;
++		pinctrl-2 = <&P1_20_gpio_pu_pin>;
++		pinctrl-3 = <&P1_20_gpio_pd_pin>;
++		pinctrl-4 = <&P1_20_gpio_input_pin>;
++		pinctrl-5 = <&P1_20_pruin_pin>;
++	};
++
++	/* P1_21 (ZCZ ball C7)  AIN1         */
++
++	/* P1_22                GND */
++
++	/* P1_23 (ZCZ ball B7)  AIN2         */
++
++	/* P1_24                VOUT-5V */
++
++	/* P1_25 (ZCZ ball A7)  AIN3         */
++
++	/* P1_26 (ZCZ ball D18) i2c */
++	P1_26_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "can", "i2c", "pru_uart";
++		pinctrl-0 = <&P1_26_default_pin>;
++		pinctrl-1 = <&P1_26_gpio_pin>;
++		pinctrl-2 = <&P1_26_gpio_pu_pin>;
++		pinctrl-3 = <&P1_26_gpio_pd_pin>;
++		pinctrl-4 = <&P1_26_gpio_input_pin>;
++		pinctrl-5 = <&P1_26_spi_cs_pin>;
++		pinctrl-6 = <&P1_26_can_pin>;
++		pinctrl-7 = <&P1_26_i2c_pin>;
++		pinctrl-8 = <&P1_26_pru_uart_pin>;
++	};
++
++	/* P1_27 (ZCZ ball C8)  AIN4         */
++
++	/* P1_28 (ZCZ ball D17) i2c */
++	P1_28_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "can", "i2c", "pru_uart";
++		pinctrl-0 = <&P1_28_default_pin>;
++		pinctrl-1 = <&P1_28_gpio_pin>;
++		pinctrl-2 = <&P1_28_gpio_pu_pin>;
++		pinctrl-3 = <&P1_28_gpio_pd_pin>;
++		pinctrl-4 = <&P1_28_gpio_input_pin>;
++		pinctrl-5 = <&P1_28_spi_cs_pin>;
++		pinctrl-6 = <&P1_28_can_pin>;
++		pinctrl-7 = <&P1_28_i2c_pin>;
++		pinctrl-8 = <&P1_28_pru_uart_pin>;
++	};
++
++	/* P1_29 (ZCZ ball A14) pruin */
++	P1_29_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruout", "pruin";
++		pinctrl-0 = <&P1_29_default_pin>;
++		pinctrl-1 = <&P1_29_gpio_pin>;
++		pinctrl-2 = <&P1_29_gpio_pu_pin>;
++		pinctrl-3 = <&P1_29_gpio_pd_pin>;
++		pinctrl-4 = <&P1_29_gpio_input_pin>;
++		pinctrl-5 = <&P1_29_qep_pin>;
++		pinctrl-6 = <&P1_29_pruout_pin>;
++		pinctrl-7 = <&P1_29_pruin_pin>;
++	};
++
++	/* P1_30 (ZCZ ball E16) uart */
++	P1_30_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "uart", "can", "i2c", "pruout", "pruin";
++		pinctrl-0 = <&P1_30_default_pin>;
++		pinctrl-1 = <&P1_30_gpio_pin>;
++		pinctrl-2 = <&P1_30_gpio_pu_pin>;
++		pinctrl-3 = <&P1_30_gpio_pd_pin>;
++		pinctrl-4 = <&P1_30_gpio_input_pin>;
++		pinctrl-5 = <&P1_30_spi_cs_pin>;
++		pinctrl-6 = <&P1_30_uart_pin>;
++		pinctrl-7 = <&P1_30_can_pin>;
++		pinctrl-8 = <&P1_30_i2c_pin>;
++		pinctrl-9 = <&P1_30_pruout_pin>;
++		pinctrl-10 = <&P1_30_pruin_pin>;
++	};
++
++	/* P1_31 (ZCZ ball B12) pruin */
++	P1_31_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruout", "pruin";
++		pinctrl-0 = <&P1_31_default_pin>;
++		pinctrl-1 = <&P1_31_gpio_pin>;
++		pinctrl-2 = <&P1_31_gpio_pu_pin>;
++		pinctrl-3 = <&P1_31_gpio_pd_pin>;
++		pinctrl-4 = <&P1_31_gpio_input_pin>;
++		pinctrl-5 = <&P1_31_qep_pin>;
++		pinctrl-6 = <&P1_31_pruout_pin>;
++		pinctrl-7 = <&P1_31_pruin_pin>;
++	};
++
++	/* P1_32 (ZCZ ball E15) uart */
++	P1_32_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "uart", "can", "i2c", "pruout", "pruin";
++		pinctrl-0 = <&P1_32_default_pin>;
++		pinctrl-1 = <&P1_32_gpio_pin>;
++		pinctrl-2 = <&P1_32_gpio_pu_pin>;
++		pinctrl-3 = <&P1_32_gpio_pd_pin>;
++		pinctrl-4 = <&P1_32_gpio_input_pin>;
++		pinctrl-5 = <&P1_32_spi_cs_pin>;
++		pinctrl-6 = <&P1_32_uart_pin>;
++		pinctrl-7 = <&P1_32_can_pin>;
++		pinctrl-8 = <&P1_32_i2c_pin>;
++		pinctrl-9 = <&P1_32_pruout_pin>;
++		pinctrl-10 = <&P1_32_pruin_pin>;
++	};
++
++	/* P1_33 (ZCZ ball B13) pruin */
++	P1_33_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi", "pwm", "pruout", "pruin";
++		pinctrl-0 = <&P1_33_default_pin>;
++		pinctrl-1 = <&P1_33_gpio_pin>;
++		pinctrl-2 = <&P1_33_gpio_pu_pin>;
++		pinctrl-3 = <&P1_33_gpio_pd_pin>;
++		pinctrl-4 = <&P1_33_gpio_input_pin>;
++		pinctrl-5 = <&P1_33_spi_pin>;
++		pinctrl-6 = <&P1_33_pwm_pin>;
++		pinctrl-7 = <&P1_33_pruout_pin>;
++		pinctrl-8 = <&P1_33_pruin_pin>;
++	};
++
++	/* P1_34 (ZCZ ball T11) */
++	P1_34_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pwm";
++		pinctrl-0 = <&P1_34_default_pin>;
++		pinctrl-1 = <&P1_34_gpio_pin>;
++		pinctrl-2 = <&P1_34_gpio_pu_pin>;
++		pinctrl-3 = <&P1_34_gpio_pd_pin>;
++		pinctrl-4 = <&P1_34_gpio_input_pin>;
++		pinctrl-5 = <&P1_34_pwm_pin>;
++	};
++
++	/* P1_35 (ZCZ ball V5) pruin */
++	P1_35_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pruout", "pruin";
++		pinctrl-0 = <&P1_35_default_pin>;
++		pinctrl-1 = <&P1_35_gpio_pin>;
++		pinctrl-2 = <&P1_35_gpio_pu_pin>;
++		pinctrl-3 = <&P1_35_gpio_pd_pin>;
++		pinctrl-4 = <&P1_35_gpio_input_pin>;
++		pinctrl-5 = <&P1_35_pruout_pin>;
++		pinctrl-6 = <&P1_35_pruin_pin>;
++	};
++
++	/* P1_36 (ZCZ ball A13) pwm */
++	P1_36_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_sclk", "pwm", "pruout", "pruin";
++		pinctrl-0 = <&P1_36_default_pin>;
++		pinctrl-1 = <&P1_36_gpio_pin>;
++		pinctrl-2 = <&P1_36_gpio_pu_pin>;
++		pinctrl-3 = <&P1_36_gpio_pd_pin>;
++		pinctrl-4 = <&P1_36_gpio_input_pin>;
++		pinctrl-5 = <&P1_36_spi_sclk_pin>;
++		pinctrl-6 = <&P1_36_pwm_pin>;
++		pinctrl-7 = <&P1_36_pruout_pin>;
++		pinctrl-8 = <&P1_36_pruin_pin>;
++	};
++
++
++	/************************/
++	/* P2 Header */
++	/************************/
++
++	/* P2_01 (ZCZ ball U14) pwm */
++	P2_01_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pwm";
++		pinctrl-0 = <&P2_01_default_pin>;
++		pinctrl-1 = <&P2_01_gpio_pin>;
++		pinctrl-2 = <&P2_01_gpio_pu_pin>;
++		pinctrl-3 = <&P2_01_gpio_pd_pin>;
++		pinctrl-4 = <&P2_01_gpio_input_pin>;
++		pinctrl-5 = <&P2_01_pwm_pin>;
++	};
++
++	/* P2_02 (ZCZ ball V17) */
++	P2_02_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input";
++		pinctrl-0 = <&P2_02_default_pin>;
++		pinctrl-1 = <&P2_02_gpio_pin>;
++		pinctrl-2 = <&P2_02_gpio_pu_pin>;
++		pinctrl-3 = <&P2_02_gpio_pd_pin>;
++		pinctrl-4 = <&P2_02_gpio_input_pin>;
++	};
++
++	/* P2_03 (ZCZ ball T10) */
++	P2_03_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pwm";
++		pinctrl-0 = <&P2_03_default_pin>;
++		pinctrl-1 = <&P2_03_gpio_pin>;
++		pinctrl-2 = <&P2_03_gpio_pu_pin>;
++		pinctrl-3 = <&P2_03_gpio_pd_pin>;
++		pinctrl-4 = <&P2_03_gpio_input_pin>;
++		pinctrl-5 = <&P2_03_pwm_pin>;
++	};
++
++	/* P2_04 (ZCZ ball T16) */
++	P2_04_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input";
++		pinctrl-0 = <&P2_04_default_pin>;
++		pinctrl-1 = <&P2_04_gpio_pin>;
++		pinctrl-2 = <&P2_04_gpio_pu_pin>;
++		pinctrl-3 = <&P2_04_gpio_pd_pin>;
++		pinctrl-4 = <&P2_04_gpio_input_pin>;
++	};
++
++	/* P2_05 (ZCZ ball T17) uart */
++	P2_05_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "uart";
++		pinctrl-0 = <&P2_05_default_pin>;
++		pinctrl-1 = <&P2_05_gpio_pin>;
++		pinctrl-2 = <&P2_05_gpio_pu_pin>;
++		pinctrl-3 = <&P2_05_gpio_pd_pin>;
++		pinctrl-4 = <&P2_05_gpio_input_pin>;
++		pinctrl-5 = <&P2_05_uart_pin>;
++	};
++
++	/* P2_06 (ZCZ ball U16) */
++	P2_06_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input";
++		pinctrl-0 = <&P2_06_default_pin>;
++		pinctrl-1 = <&P2_06_gpio_pin>;
++		pinctrl-2 = <&P2_06_gpio_pu_pin>;
++		pinctrl-3 = <&P2_06_gpio_pd_pin>;
++		pinctrl-4 = <&P2_06_gpio_input_pin>;
++	};
++
++	/* P2_07 (ZCZ ball U17) uart */
++	P2_07_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "uart";
++		pinctrl-0 = <&P2_07_default_pin>;
++		pinctrl-1 = <&P2_07_gpio_pin>;
++		pinctrl-2 = <&P2_07_gpio_pu_pin>;
++		pinctrl-3 = <&P2_07_gpio_pd_pin>;
++		pinctrl-4 = <&P2_07_gpio_input_pin>;
++		pinctrl-5 = <&P2_07_uart_pin>;
++	};
++
++	/* P2_08 (ZCZ ball U18) */
++	P2_08_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input";
++		pinctrl-0 = <&P2_08_default_pin>;
++		pinctrl-1 = <&P2_08_gpio_pin>;
++		pinctrl-2 = <&P2_08_gpio_pu_pin>;
++		pinctrl-3 = <&P2_08_gpio_pd_pin>;
++		pinctrl-4 = <&P2_08_gpio_input_pin>;
++	};
++
++	/* P2_09 (ZCZ ball D15) i2c */
++	P2_09_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "uart", "can", "i2c", "pru_uart", "pruin";
++		pinctrl-0 = <&P2_09_default_pin>;
++		pinctrl-1 = <&P2_09_gpio_pin>;
++		pinctrl-2 = <&P2_09_gpio_pu_pin>;
++		pinctrl-3 = <&P2_09_gpio_pd_pin>;
++		pinctrl-4 = <&P2_09_gpio_input_pin>;
++		pinctrl-5 = <&P2_09_uart_pin>;
++		pinctrl-6 = <&P2_09_can_pin>;
++		pinctrl-7 = <&P2_09_i2c_pin>;
++		pinctrl-8 = <&P2_09_pru_uart_pin>;
++		pinctrl-9 = <&P2_09_pruin_pin>;
++	};
++
++	/* P2_10 (ZCZ ball R14) */
++	P2_10_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep";
++		pinctrl-0 = <&P2_10_default_pin>;
++		pinctrl-1 = <&P2_10_gpio_pin>;
++		pinctrl-2 = <&P2_10_gpio_pu_pin>;
++		pinctrl-3 = <&P2_10_gpio_pd_pin>;
++		pinctrl-4 = <&P2_10_gpio_input_pin>;
++		pinctrl-5 = <&P2_10_qep_pin>;
++	};
++
++	/* P2_11 (ZCZ ball D16) i2c */
++	P2_11_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "uart", "can", "i2c", "pru_uart", "pruin";
++		pinctrl-0 = <&P2_11_default_pin>;
++		pinctrl-1 = <&P2_11_gpio_pin>;
++		pinctrl-2 = <&P2_11_gpio_pu_pin>;
++		pinctrl-3 = <&P2_11_gpio_pd_pin>;
++		pinctrl-4 = <&P2_11_gpio_input_pin>;
++		pinctrl-5 = <&P2_11_uart_pin>;
++		pinctrl-6 = <&P2_11_can_pin>;
++		pinctrl-7 = <&P2_11_i2c_pin>;
++		pinctrl-8 = <&P2_11_pru_uart_pin>;
++		pinctrl-9 = <&P2_11_pruin_pin>;
++	};
++
++	/* P2_12                POWER_BUTTON */
++
++	/* P2_13                VOUT-5V */
++
++	/* P2_14                BAT-VIN */
++
++	/* P2_15                GND */
++
++	/* P2_16                BAT-TEMP */
++
++	/* P2_17 (ZCZ ball V12) */
++	P2_17_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input";
++		pinctrl-0 = <&P2_17_default_pin>;
++		pinctrl-1 = <&P2_17_gpio_pin>;
++		pinctrl-2 = <&P2_17_gpio_pu_pin>;
++		pinctrl-3 = <&P2_17_gpio_pd_pin>;
++		pinctrl-4 = <&P2_17_gpio_input_pin>;
++	};
++
++	/* P2_18 (ZCZ ball U13) */
++	P2_18_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pru_ecap", "pruin";
++		pinctrl-0 = <&P2_18_default_pin>;
++		pinctrl-1 = <&P2_18_gpio_pin>;
++		pinctrl-2 = <&P2_18_gpio_pu_pin>;
++		pinctrl-3 = <&P2_18_gpio_pd_pin>;
++		pinctrl-4 = <&P2_18_gpio_input_pin>;
++		pinctrl-5 = <&P2_18_qep_pin>;
++		pinctrl-6 = <&P2_18_pru_ecap_pin>;
++		pinctrl-7 = <&P2_18_pruin_pin>;
++	};
++
++	/* P2_19 (ZCZ ball U12) */
++	P2_19_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pwm";
++		pinctrl-0 = <&P2_19_default_pin>;
++		pinctrl-1 = <&P2_19_gpio_pin>;
++		pinctrl-2 = <&P2_19_gpio_pu_pin>;
++		pinctrl-3 = <&P2_19_gpio_pd_pin>;
++		pinctrl-4 = <&P2_19_gpio_input_pin>;
++		pinctrl-5 = <&P2_19_pwm_pin>;
++	};
++
++	/* P2_20 (ZCZ ball T13) */
++	P2_20_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input";
++		pinctrl-0 = <&P2_20_default_pin>;
++		pinctrl-1 = <&P2_20_gpio_pin>;
++		pinctrl-2 = <&P2_20_gpio_pu_pin>;
++		pinctrl-3 = <&P2_20_gpio_pd_pin>;
++		pinctrl-4 = <&P2_20_gpio_input_pin>;
++	};
++
++	/* P2_21                GND */
++
++	/* P2_22 (ZCZ ball V13) */
++	P2_22_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruin";
++		pinctrl-0 = <&P2_22_default_pin>;
++		pinctrl-1 = <&P2_22_gpio_pin>;
++		pinctrl-2 = <&P2_22_gpio_pu_pin>;
++		pinctrl-3 = <&P2_22_gpio_pd_pin>;
++		pinctrl-4 = <&P2_22_gpio_input_pin>;
++		pinctrl-5 = <&P2_22_qep_pin>;
++		pinctrl-6 = <&P2_22_pruin_pin>;
++	};
++
++	/* P2_23                VOUT-3.3V */
++
++	/* P2_24 (ZCZ ball T12) */
++	P2_24_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruout";
++		pinctrl-0 = <&P2_24_default_pin>;
++		pinctrl-1 = <&P2_24_gpio_pin>;
++		pinctrl-2 = <&P2_24_gpio_pu_pin>;
++		pinctrl-3 = <&P2_24_gpio_pd_pin>;
++		pinctrl-4 = <&P2_24_gpio_input_pin>;
++		pinctrl-5 = <&P2_24_qep_pin>;
++		pinctrl-6 = <&P2_24_pruout_pin>;
++	};
++
++	/* P2_25 (ZCZ ball E17) spi */
++	P2_25_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi", "spi_cs", "uart", "can", "i2c";
++		pinctrl-0 = <&P2_25_default_pin>;
++		pinctrl-1 = <&P2_25_gpio_pin>;
++		pinctrl-2 = <&P2_25_gpio_pu_pin>;
++		pinctrl-3 = <&P2_25_gpio_pd_pin>;
++		pinctrl-4 = <&P2_25_gpio_input_pin>;
++		pinctrl-5 = <&P2_25_spi_pin>;
++		pinctrl-6 = <&P2_25_spi_cs_pin>;
++		pinctrl-7 = <&P2_25_uart_pin>;
++		pinctrl-8 = <&P2_25_can_pin>;
++		pinctrl-9 = <&P2_25_i2c_pin>;
++	};
++
++	/* P2_26                RESET# */
++
++	/* P2_27 (ZCZ ball E18) spi */
++	P2_27_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi", "uart", "can", "i2c";
++		pinctrl-0 = <&P2_27_default_pin>;
++		pinctrl-1 = <&P2_27_gpio_pin>;
++		pinctrl-2 = <&P2_27_gpio_pu_pin>;
++		pinctrl-3 = <&P2_27_gpio_pd_pin>;
++		pinctrl-4 = <&P2_27_gpio_input_pin>;
++		pinctrl-5 = <&P2_27_spi_pin>;
++		pinctrl-6 = <&P2_27_uart_pin>;
++		pinctrl-7 = <&P2_27_can_pin>;
++		pinctrl-8 = <&P2_27_i2c_pin>;
++	};
++
++	/* P2_28 (ZCZ ball D13) pruin */
++	P2_28_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruout", "pruin";
++		pinctrl-0 = <&P2_28_default_pin>;
++		pinctrl-1 = <&P2_28_gpio_pin>;
++		pinctrl-2 = <&P2_28_gpio_pu_pin>;
++		pinctrl-3 = <&P2_28_gpio_pd_pin>;
++		pinctrl-4 = <&P2_28_gpio_input_pin>;
++		pinctrl-5 = <&P2_28_qep_pin>;
++		pinctrl-6 = <&P2_28_pruout_pin>;
++		pinctrl-7 = <&P2_28_pruin_pin>;
++	};
++
++	/* P2_29 (ZCZ ball C18) spi_sclk */
++	P2_29_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "spi_sclk", "uart", "pwm", "pru_ecap";
++		pinctrl-0 = <&P2_29_default_pin>;
++		pinctrl-1 = <&P2_29_gpio_pin>;
++		pinctrl-2 = <&P2_29_gpio_pu_pin>;
++		pinctrl-3 = <&P2_29_gpio_pd_pin>;
++		pinctrl-4 = <&P2_29_gpio_input_pin>;
++		pinctrl-5 = <&P2_29_spi_cs_pin>;
++		pinctrl-6 = <&P2_29_spi_sclk_pin>;
++		pinctrl-7 = <&P2_29_uart_pin>;
++		pinctrl-8 = <&P2_29_pwm_pin>;
++		pinctrl-9 = <&P2_29_pru_ecap_pin>;
++	};
++
++	/* P2_30 (ZCZ ball C12) pruin */
++	P2_30_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "pwm", "pruout", "pruin";
++		pinctrl-0 = <&P2_30_default_pin>;
++		pinctrl-1 = <&P2_30_gpio_pin>;
++		pinctrl-2 = <&P2_30_gpio_pu_pin>;
++		pinctrl-3 = <&P2_30_gpio_pd_pin>;
++		pinctrl-4 = <&P2_30_gpio_input_pin>;
++		pinctrl-5 = <&P2_30_spi_cs_pin>;
++		pinctrl-6 = <&P2_30_pwm_pin>;
++		pinctrl-7 = <&P2_30_pruout_pin>;
++		pinctrl-8 = <&P2_30_pruin_pin>;
++	};
++
++	/* P2_31 (ZCZ ball A15) spi_cs */
++	P2_31_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi_cs", "pruin";
++		pinctrl-0 = <&P2_31_default_pin>;
++		pinctrl-1 = <&P2_31_gpio_pin>;
++		pinctrl-2 = <&P2_31_gpio_pu_pin>;
++		pinctrl-3 = <&P2_31_gpio_pd_pin>;
++		pinctrl-4 = <&P2_31_gpio_input_pin>;
++		pinctrl-5 = <&P2_31_spi_cs_pin>;
++		pinctrl-6 = <&P2_31_pruin_pin>;
++	};
++
++	/* P2_32 (ZCZ ball D12) pruin */
++	P2_32_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "spi", "pwm", "pruout", "pruin";
++		pinctrl-0 = <&P2_32_default_pin>;
++		pinctrl-1 = <&P2_32_gpio_pin>;
++		pinctrl-2 = <&P2_32_gpio_pu_pin>;
++		pinctrl-3 = <&P2_32_gpio_pd_pin>;
++		pinctrl-4 = <&P2_32_gpio_input_pin>;
++		pinctrl-5 = <&P2_32_spi_pin>;
++		pinctrl-6 = <&P2_32_pwm_pin>;
++		pinctrl-7 = <&P2_32_pruout_pin>;
++		pinctrl-8 = <&P2_32_pruin_pin>;
++	};
++
++	/* P2_33 (ZCZ ball R12) */
++	P2_33_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruout";
++		pinctrl-0 = <&P2_33_default_pin>;
++		pinctrl-1 = <&P2_33_gpio_pin>;
++		pinctrl-2 = <&P2_33_gpio_pu_pin>;
++		pinctrl-3 = <&P2_33_gpio_pd_pin>;
++		pinctrl-4 = <&P2_33_gpio_input_pin>;
++		pinctrl-5 = <&P2_33_qep_pin>;
++		pinctrl-6 = <&P2_33_pruout_pin>;
++	};
++
++	/* P2_34 (ZCZ ball C13) pruin */
++	P2_34_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "qep", "pruout", "pruin";
++		pinctrl-0 = <&P2_34_default_pin>;
++		pinctrl-1 = <&P2_34_gpio_pin>;
++		pinctrl-2 = <&P2_34_gpio_pu_pin>;
++		pinctrl-3 = <&P2_34_gpio_pd_pin>;
++		pinctrl-4 = <&P2_34_gpio_input_pin>;
++		pinctrl-5 = <&P2_34_qep_pin>;
++		pinctrl-6 = <&P2_34_pruout_pin>;
++		pinctrl-7 = <&P2_34_pruin_pin>;
++	};
++
++	/* P2_35 (ZCZ ball U5) gpio_input */
++	P2_35_pinmux {
++		compatible = "bone-pinmux-helper";
++		status = "okay";
++		pinctrl-names = "default", "gpio", "gpio_pu", "gpio_pd", "gpio_input", "pruout", "pruin";
++		pinctrl-0 = <&P2_35_default_pin>;
++		pinctrl-1 = <&P2_35_gpio_pin>;
++		pinctrl-2 = <&P2_35_gpio_pu_pin>;
++		pinctrl-3 = <&P2_35_gpio_pd_pin>;
++		pinctrl-4 = <&P2_35_gpio_input_pin>;
++		pinctrl-5 = <&P2_35_pruout_pin>;
++		pinctrl-6 = <&P2_35_pruin_pin>;
++	};
++
++	/* P2_36 (ZCZ ball C9)  AIN7         */
++
++	cape-universal {
++		compatible = "gpio-of-helper";
++		status = "okay";
++		pinctrl-names = "default";
++		pinctrl-0 = <>;
++
++		P1_02 {
++			gpio-name = "P1_02";
++			gpio = <&gpio2 23 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_04 {
++			gpio-name = "P1_04";
++			gpio = <&gpio2 25 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_06 {
++			gpio-name = "P1_06";
++			gpio = <&gpio0 5 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_08 {
++			gpio-name = "P1_08";
++			gpio = <&gpio0 2 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_10 {
++			gpio-name = "P1_10";
++			gpio = <&gpio0 3 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_12 {
++			gpio-name = "P1_12";
++			gpio = <&gpio0 4 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_20 {
++			gpio-name = "P1_20";
++			gpio = <&gpio0 20 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_26 {
++			gpio-name = "P1_26";
++			gpio = <&gpio0 12 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_28 {
++			gpio-name = "P1_28";
++			gpio = <&gpio0 13 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_29 {
++			gpio-name = "P1_29";
++			gpio = <&gpio3 21 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_30 {
++			gpio-name = "P1_30";
++			gpio = <&gpio1 11 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_31 {
++			gpio-name = "P1_31";
++			gpio = <&gpio3 18 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_32 {
++			gpio-name = "P1_32";
++			gpio = <&gpio1 10 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_33 {
++			gpio-name = "P1_33";
++			gpio = <&gpio3 15 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_34 {
++			gpio-name = "P1_34";
++			gpio = <&gpio0 26 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_35 {
++			gpio-name = "P1_35";
++			gpio = <&gpio2 24 0>;
++			input;
++			dir-changeable;
++		};
++
++		P1_36 {
++			gpio-name = "P1_36";
++			gpio = <&gpio3 14 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_01 {
++			gpio-name = "P2_01";
++			gpio = <&gpio1 18 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_02 {
++			gpio-name = "P2_02";
++			gpio = <&gpio1 27 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_03 {
++			gpio-name = "P2_03";
++			gpio = <&gpio0 23 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_04 {
++			gpio-name = "P2_04";
++			gpio = <&gpio1 26 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_05 {
++			gpio-name = "P2_05";
++			gpio = <&gpio0 30 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_06 {
++			gpio-name = "P2_06";
++			gpio = <&gpio1 25 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_07 {
++			gpio-name = "P2_07";
++			gpio = <&gpio0 31 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_08 {
++			gpio-name = "P2_08";
++			gpio = <&gpio1 28 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_09 {
++			gpio-name = "P2_09";
++			gpio = <&gpio0 15 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_10 {
++			gpio-name = "P2_10";
++			gpio = <&gpio1 20 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_11 {
++			gpio-name = "P2_11";
++			gpio = <&gpio0 14 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_17 {
++			gpio-name = "P2_17";
++			gpio = <&gpio2 1 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_29 (ZCZ ball C18) spi1_sclk */
-+	P2_29_default_pin: pinmux_P2_29_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* eCAP0_in_PWM0_out.spi1_sclk */
-+	P2_29_gpio_pin: pinmux_P2_29_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* eCAP0_in_PWM0_out.gpio0_7 */
-+	P2_29_gpio_pu_pin: pinmux_P2_29_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* eCAP0_in_PWM0_out.gpio0_7 */
-+	P2_29_gpio_pd_pin: pinmux_P2_29_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* eCAP0_in_PWM0_out.gpio0_7 */
-+	P2_29_gpio_input_pin: pinmux_P2_29_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_INPUT | MUX_MODE7) >; };			/* eCAP0_in_PWM0_out.gpio0_7 */
-+	P2_29_pwm_pin: pinmux_P2_29_pwm_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE0) >; };	/* eCAP0_in_PWM0_out.ecap0_in_pwm0_out */
-+	P2_29_uart_pin: pinmux_P2_29_uart_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE1) >; };	/* eCAP0_in_PWM0_out.uart3_txd */
-+	P2_29_spi_cs_pin: pinmux_P2_29_spi_cs_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE2) >; };	/* eCAP0_in_PWM0_out.spi1_cs1 */
-+	P2_29_pru_ecap_pin: pinmux_P2_29_pru_ecap_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE3) >; };	/* eCAP0_in_PWM0_out.pr1_ecap0_ecap_capin_apwm_o */
-+	P2_29_spi_sclk_pin: pinmux_P2_29_spi_sclk_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0964, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* eCAP0_in_PWM0_out.spi1_sclk */
++		P2_18 {
++			gpio-name = "P2_18";
++			gpio = <&gpio1 15 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_30 (ZCZ ball C12) pru0_in3 */
-+	P2_30_default_pin: pinmux_P2_30_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_ahclkr.pru0_in3 */
-+	P2_30_gpio_pin: pinmux_P2_30_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_ahclkr.gpio3_17 */
-+	P2_30_gpio_pu_pin: pinmux_P2_30_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_ahclkr.gpio3_17 */
-+	P2_30_gpio_pd_pin: pinmux_P2_30_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_ahclkr.gpio3_17 */
-+	P2_30_gpio_input_pin: pinmux_P2_30_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_ahclkr.gpio3_17 */
-+	P2_30_pwm_pin: pinmux_P2_30_pwm_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_ahclkr.ehrpwm0_synci */
-+	P2_30_spi_cs_pin: pinmux_P2_30_spi_cs_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE3) >; };	/* mcasp0_ahclkr.spi1_cs0 */
-+	P2_30_pruout_pin: pinmux_P2_30_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_ahclkr.pru0_out3 */
-+	P2_30_pruin_pin: pinmux_P2_30_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x099c, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_ahclkr.pru0_in3 */
++		P2_19 {
++			gpio-name = "P2_19";
++			gpio = <&gpio0 27 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_31 (ZCZ ball A15) spi1_cs1 */
-+	P2_31_default_pin: pinmux_P2_31_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* xdma_event_intr0.spi1_cs1 */
-+	P2_31_gpio_pin: pinmux_P2_31_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* xdma_event_intr0.gpio0_19 */
-+	P2_31_gpio_pu_pin: pinmux_P2_31_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* xdma_event_intr0.gpio0_19 */
-+	P2_31_gpio_pd_pin: pinmux_P2_31_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* xdma_event_intr0.gpio0_19 */
-+	P2_31_gpio_input_pin: pinmux_P2_31_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_INPUT | MUX_MODE7) >; };			/* xdma_event_intr0.gpio0_19 */
-+	P2_31_spi_cs_pin: pinmux_P2_31_spi_cs_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* xdma_event_intr0.spi1_cs1 */
-+	P2_31_pruin_pin: pinmux_P2_31_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09b0, PIN_INPUT | MUX_MODE5) >; };			/* xdma_event_intr0.pru1_in16 */
++		P2_20 {
++			gpio-name = "P2_20";
++			gpio = <&gpio2 0 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_32 (ZCZ ball D12) pru0_in2 */
-+	P2_32_default_pin: pinmux_P2_32_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr0.pru0_in2 */
-+	P2_32_gpio_pin: pinmux_P2_32_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_axr0.gpio3_16 */
-+	P2_32_gpio_pu_pin: pinmux_P2_32_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr0.gpio3_16 */
-+	P2_32_gpio_pd_pin: pinmux_P2_32_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_axr0.gpio3_16 */
-+	P2_32_gpio_input_pin: pinmux_P2_32_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_axr0.gpio3_16 */
-+	P2_32_pwm_pin: pinmux_P2_32_pwm_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_axr0.ehrpwm0_tripzone_input */
-+	P2_32_spi_pin: pinmux_P2_32_spi_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE3) >; };	/* mcasp0_axr0.spi1_d1 */
-+	P2_32_pruout_pin: pinmux_P2_32_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_axr0.pru0_out2 */
-+	P2_32_pruin_pin: pinmux_P2_32_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0998, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_axr0.pru0_in2 */
++		P2_22 {
++			gpio-name = "P2_22";
++			gpio = <&gpio1 14 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_33 (ZCZ ball R12) gpio1_13 */
-+	P2_33_default_pin: pinmux_P2_33_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* gpmc_ad13.gpio1_13 */
-+	P2_33_gpio_pin: pinmux_P2_33_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* gpmc_ad13.gpio1_13 */
-+	P2_33_gpio_pu_pin: pinmux_P2_33_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* gpmc_ad13.gpio1_13 */
-+	P2_33_gpio_pd_pin: pinmux_P2_33_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* gpmc_ad13.gpio1_13 */
-+	P2_33_gpio_input_pin: pinmux_P2_33_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_INPUT | MUX_MODE7) >; };			/* gpmc_ad13.gpio1_13 */
-+	P2_33_qep_pin: pinmux_P2_33_qep_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE4) >; };	/* gpmc_ad13.eqep2b_in */
-+	P2_33_pruout_pin: pinmux_P2_33_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x0834, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE6) >; };	/* gpmc_ad13.pru0_out15 */
++		P2_24 {
++			gpio-name = "P2_24";
++			gpio = <&gpio1 12 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_34 (ZCZ ball C13) pru0_in5 */
-+	P2_34_default_pin: pinmux_P2_34_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_fsr.pru0_in5 */
-+	P2_34_gpio_pin: pinmux_P2_34_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* mcasp0_fsr.gpio3_19 */
-+	P2_34_gpio_pu_pin: pinmux_P2_34_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_fsr.gpio3_19 */
-+	P2_34_gpio_pd_pin: pinmux_P2_34_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* mcasp0_fsr.gpio3_19 */
-+	P2_34_gpio_input_pin: pinmux_P2_34_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_INPUT | MUX_MODE7) >; };			/* mcasp0_fsr.gpio3_19 */
-+	P2_34_qep_pin: pinmux_P2_34_qep_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE1) >; };	/* mcasp0_fsr.eqep0b_in */
-+	P2_34_pruout_pin: pinmux_P2_34_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* mcasp0_fsr.pru0_out5 */
-+	P2_34_pruin_pin: pinmux_P2_34_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x09a4, PIN_INPUT | MUX_MODE6) >; };			/* mcasp0_fsr.pru0_in5 */
++		P2_25 {
++			gpio-name = "P2_25";
++			gpio = <&gpio1 9 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	/* P2_35 (ZCZ ball U5) gpio2_22 */
-+	P2_35_default_pin: pinmux_P2_35_default_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_INPUT | MUX_MODE7) >; };			/* lcd_vsync.gpio2_22 */
-+	P2_35_gpio_pin: pinmux_P2_35_gpio_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_OUTPUT | INPUT_EN | MUX_MODE7) >; };		/* lcd_vsync.gpio2_22 */
-+	P2_35_gpio_pu_pin: pinmux_P2_35_gpio_pu_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_OUTPUT_PULLUP | INPUT_EN | MUX_MODE7) >; };	/* lcd_vsync.gpio2_22 */
-+	P2_35_gpio_pd_pin: pinmux_P2_35_gpio_pd_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE7) >; };	/* lcd_vsync.gpio2_22 */
-+	P2_35_gpio_input_pin: pinmux_P2_35_gpio_input_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_INPUT | MUX_MODE7) >; };			/* lcd_vsync.gpio2_22 */
-+	P2_35_pruout_pin: pinmux_P2_35_pruout_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_OUTPUT_PULLDOWN | INPUT_EN | MUX_MODE5) >; };	/* lcd_vsync.pru1_out8 */
-+	P2_35_pruin_pin: pinmux_P2_35_pruin_pin { pinctrl-single,pins = <
-+		AM33XX_IOPAD(0x08e0, PIN_INPUT | MUX_MODE6) >; };			/* lcd_vsync.pru1_in8 */
- 
- 	i2c2_pins: pinmux-i2c2-pins {
- 		pinctrl-single,pins = <
-@@ -482,3 +1184,52 @@ &usb0 {
- &usb1 {
- 	dr_mode = "host";
- };
++		P2_27 {
++			gpio-name = "P2_27";
++			gpio = <&gpio1 8 0>;
++			input;
++			dir-changeable;
++		};
 +
-+&spi0 {
-+	#address-cells = <1>;
-+	#size-cells = <0>;
-+	status = "okay";
++		P2_28 {
++			gpio-name = "P2_28";
++			gpio = <&gpio3 20 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	channel@0 {
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		compatible = "spidev";
-+		symlink = "bone/spi/0.0";
-+		reg = <0>;
-+		spi-max-frequency = <24000000>;
-+	};
++		P2_29 {
++			gpio-name = "P2_29";
++			gpio = <&gpio0 7 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	channel@1 {
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		compatible = "spidev";
-+		symlink = "bone/spi/0.1";
-+		reg = <1>;
-+		spi-max-frequency = <24000000>;
-+		status = "disabled";
-+	};
-+};
++		P2_30 {
++			gpio-name = "P2_30";
++			gpio = <&gpio3 17 0>;
++			input;
++			dir-changeable;
++		};
 +
-+&spi1 {
-+	#address-cells = <1>;
-+	#size-cells = <0>;
-+	status = "okay";
++		P2_31 {
++			gpio-name = "P2_31";
++			gpio = <&gpio0 19 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	channel@0 {
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		compatible = "spidev";
-+		symlink = "bone/spi/1.0";
-+		reg = <0>;
-+		spi-max-frequency = <24000000>;
-+	};
++		P2_32 {
++			gpio-name = "P2_32";
++			gpio = <&gpio3 16 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_33 {
++			gpio-name = "P2_33";
++			gpio = <&gpio1 13 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_34 {
++			gpio-name = "P2_34";
++			gpio = <&gpio3 19 0>;
++			input;
++			dir-changeable;
++		};
++
++		P2_35 {
++			gpio-name = "P2_35";
++			gpio = <&gpio2 22 0>;
++			input;
++			dir-changeable;
++		};
 +
-+	channel@1 {
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		compatible = "spidev";
-+		symlink = "bone/spi/1.1";
-+		reg = <1>;
-+		spi-max-frequency = <24000000>;
 +	};
 +};
 diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe-lite.dts b/arch/arm/boot/dts/am335x-sancloud-bbe-lite.dts
@@ -10501,10 +11737,10 @@ index 000000000000..6dc003082c03
 +};
 diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile
 new file mode 100644
-index 000000000000..eadf164c5f1e
+index 000000000000..95d48dd72eee
 --- /dev/null
 +++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -0,0 +1,31 @@
+@@ -0,0 +1,29 @@
 +# Overlays for the BeagleBone platform
 +
 +dtbo-$(CONFIG_ARCH_OMAP2PLUS) += \
@@ -10529,8 +11765,6 @@ index 000000000000..eadf164c5f1e
 +	PB-MIKROBUS-0.dtbo	\
 +	PB-MIKROBUS-1.dtbo
 +
-+
-+
 +targets += dtbs dtbs_install
 +targets += $(dtbo-y)
 +
@@ -10538,10 +11772,10 @@ index 000000000000..eadf164c5f1e
 +clean-files	:= *.dtbo
 diff --git a/arch/arm/boot/dts/overlays/PB-MIKROBUS-0.dts b/arch/arm/boot/dts/overlays/PB-MIKROBUS-0.dts
 new file mode 100644
-index 000000000000..8a63234b005c
+index 000000000000..b516cf58c595
 --- /dev/null
 +++ b/arch/arm/boot/dts/overlays/PB-MIKROBUS-0.dts
-@@ -0,0 +1,112 @@
+@@ -0,0 +1,107 @@
 +// SPDX-License-Identifier: GPL-2.0-only
 +/*
 + * Copyright 2020 Vaishnav M A, BeagleBoard.org Foundation.
@@ -10647,13 +11881,8 @@ index 000000000000..8a63234b005c
 +
 +&uart4 {
 +	status = "okay";
-+	pinctrl-0 = <>;
 +	force-empty-serdev-controller;
 +};
-+
-+&ehrpwm1 {
-+	pinctrl-0 = <>;
-+};
 diff --git a/arch/arm/boot/dts/overlays/PB-MIKROBUS-1.dts b/arch/arm/boot/dts/overlays/PB-MIKROBUS-1.dts
 new file mode 100644
 index 000000000000..23236ee7c938
diff --git a/patches/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch b/patches/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch
index 233cb57b57699bee31e30240d0360c842cfdd946..0f594520b5307fffc99b5c2eb6fdf7b9166d76e2 100644
--- a/patches/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch
+++ b/patches/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch
@@ -1,6 +1,6 @@
-From 2f90f157ffbed232431ca640d1c177d2442abad5 Mon Sep 17 00:00:00 2001
+From 716ede88bc26da1dbc1b6c160fcf571976137b2e Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Dec 2021 13:28:42 -0600
+Date: Tue, 7 Dec 2021 19:15:59 -0600
 Subject: [PATCH] Add wireless-regdb regulatory database file
 
 https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/commit/?id=47007d0169c4c6c855a3fc5333c142489a43e89e
diff --git a/patches/wpanusb/0001-merge-wpanusb-https-github.com-statropy-wpanusb.patch b/patches/wpanusb/0001-merge-wpanusb-https-github.com-statropy-wpanusb.patch
index e0387fc5e95c04993755649b00f8a211d9e4771d..743a2781f68be1e4c7f18c67e12bc66f63788d06 100644
--- a/patches/wpanusb/0001-merge-wpanusb-https-github.com-statropy-wpanusb.patch
+++ b/patches/wpanusb/0001-merge-wpanusb-https-github.com-statropy-wpanusb.patch
@@ -1,6 +1,6 @@
-From 7e2fc32d08e6af2d20618e56966274072598f7bf Mon Sep 17 00:00:00 2001
+From 740c4388bd519152863c5cb58b5f09703c609dcb Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 7 Dec 2021 13:26:24 -0600
+Date: Tue, 7 Dec 2021 19:15:24 -0600
 Subject: [PATCH] merge: wpanusb: https://github.com/statropy/wpanusb
 
 https://github.com/statropy/wpanusb/commit/251f0167545bf2dcaa3cad991a59dbf5ab05490a
diff --git a/version.sh b/version.sh
index c3f33658c7ca2e513a8c09a9df2f44a68e8ede0a..3aa0ba6c90beae90e96d39da7f35220575ea1e83 100644
--- a/version.sh
+++ b/version.sh
@@ -41,7 +41,7 @@ KERNEL_REL=5.16
 KERNEL_TAG=${KERNEL_REL}-rc4
 kernel_rt=".X-rtY"
 #Kernel Build
-BUILD=${build_prefix}2.1
+BUILD=${build_prefix}2.2
 
 #v5.X-rcX + upto SHA
 #prev_KERNEL_SHA=""