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=""